001 /*
002 * Cumulus4j - Securing your data in the cloud - http://cumulus4j.org
003 * Copyright (C) 2011 NightLabs Consulting GmbH
004 *
005 * This program is free software: you can redistribute it and/or modify
006 * it under the terms of the GNU Affero General Public License as
007 * published by the Free Software Foundation, either version 3 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013 * GNU Affero General Public License for more details.
014 *
015 * You should have received a copy of the GNU Affero General Public License
016 * along with this program. If not, see <http://www.gnu.org/licenses/>.
017 */
018 package org.cumulus4j.keymanager.channel;
019
020 import org.cumulus4j.keymanager.back.shared.ErrorResponse;
021 import org.cumulus4j.keymanager.back.shared.NullResponse;
022 import org.cumulus4j.keymanager.back.shared.Request;
023 import org.cumulus4j.keymanager.back.shared.Response;
024
025 /**
026 * <p>
027 * Handler processing and replying requests coming from the application server.
028 * </p>
029 * <p>
030 * The so-called "key manager channel" is - as shown in the document
031 * <a target="_blank" href="http://cumulus4j.org/1.2.0-SNAPSHOT/documentation/deployment-scenarios.html">Deployment scenarios</a> - an
032 * HTTP(S) connection from the key-manager to the application server with an inverse request-response-cycle.
033 * This means, the application server sends a {@link Request},
034 * the key manager handles it and then sends a {@link Response} back.
035 * </p>
036 * <p>
037 * For every {@link Request} type (i.e. subclass), there's one implementation of <code>RequestHandler</code>
038 * registered in the {@link KeyManagerChannelManager}. For every incoming <code>Request</code>, the
039 * <code>KeyManagerChannelManager</code> instantiates an appropriate <code>RequestHandler</code> implementation,
040 * initialises it (i.e. calls {@link #setKeyManagerChannelManager(KeyManagerChannelManager)}) and then calls
041 * {@link #handle(Request)}.
042 * </p>
043 * <p>
044 * If handling a request fails, an {@link ErrorResponse} is sent to the server.
045 * </p>
046 * <p>
047 * <b>Important:</b> You should not directly implement this interface but instead subclass {@link AbstractRequestHandler}!
048 * </p>
049 *
050 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de
051 *
052 * @param <R> the request type for which this request handler is responsible.
053 */
054 public interface RequestHandler<R extends Request>
055 {
056 /**
057 * Get the {@link KeyManagerChannelManager}.
058 * @return the {@link KeyManagerChannelManager} or <code>null</code>, if it has not yet been set.
059 */
060 KeyManagerChannelManager getKeyManagerChannelManager();
061
062 /**
063 * Set the {@link KeyManagerChannelManager}. This method is called by the <code>KeyManagerChannelManager</code>
064 * after instantiating a new <code>RequestHandler</code> instance and before invoking {@link #handle(Request)}.
065 * @param keyManagerChannelManager the {@link KeyManagerChannelManager}
066 */
067 void setKeyManagerChannelManager(KeyManagerChannelManager keyManagerChannelManager);
068
069 /**
070 * Handle the given request.
071 * @param request the request to be handled; never <code>null</code>.
072 * @return the response for the given request; can be <code>null</code>, which is sent
073 * as {@link NullResponse} to the server.
074 */
075 Response handle(R request) throws Throwable;
076 }