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    }