001/*
002 * The contents of this file are subject to the terms of the Common Development and
003 * Distribution License (the License). You may not use this file except in compliance with the
004 * License.
005 *
006 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
007 * specific language governing permission and limitations under the License.
008 *
009 * When distributing Covered Software, include this CDDL Header Notice in each file and include
010 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
011 * Header, with the fields enclosed by brackets [] replaced by your own identifying
012 * information: "Portions copyright [year] [name of copyright owner]".
013 *
014 * Copyright 2016 ForgeRock AS.
015 */
016package org.forgerock.opendj.rest2ldap;
017
018import org.forgerock.api.models.ApiDescription;
019import org.forgerock.http.ApiProducer;
020import org.forgerock.json.resource.ActionRequest;
021import org.forgerock.json.resource.ActionResponse;
022import org.forgerock.json.resource.CreateRequest;
023import org.forgerock.json.resource.DeleteRequest;
024import org.forgerock.json.resource.NotSupportedException;
025import org.forgerock.json.resource.PatchRequest;
026import org.forgerock.json.resource.QueryRequest;
027import org.forgerock.json.resource.QueryResourceHandler;
028import org.forgerock.json.resource.QueryResponse;
029import org.forgerock.json.resource.ReadRequest;
030import org.forgerock.json.resource.Request;
031import org.forgerock.json.resource.RequestHandler;
032import org.forgerock.json.resource.ResourceException;
033import org.forgerock.json.resource.ResourceResponse;
034import org.forgerock.json.resource.UpdateRequest;
035import org.forgerock.services.context.Context;
036import org.forgerock.services.descriptor.Describable;
037import org.forgerock.util.promise.Promise;
038
039/**
040 * An abstract base class from which request handlers may be easily implemented. The default implementation of each
041 * method is to invoke the {@link #handleRequest(Context, Request)} method.
042 */
043public abstract class AbstractRequestHandler implements RequestHandler, Describable<ApiDescription, Request> {
044    /** Creates a new {@code AbstractRequestHandler}. */
045    protected AbstractRequestHandler() {
046        // Nothing to do.
047    }
048
049    @Override
050    public Promise<ActionResponse, ResourceException> handleAction(final Context context, final ActionRequest request) {
051        return handleRequest(context, request);
052    }
053
054    @Override
055    public Promise<ResourceResponse, ResourceException> handleCreate(final Context context,
056                                                                     final CreateRequest request) {
057        return handleRequest(context, request);
058    }
059
060    @Override
061    public Promise<ResourceResponse, ResourceException> handleDelete(final Context context,
062                                                                     final DeleteRequest request) {
063        return handleRequest(context, request);
064    }
065
066    @Override
067    public Promise<ResourceResponse, ResourceException> handlePatch(final Context context, final PatchRequest request) {
068        return handleRequest(context, request);
069    }
070
071    @Override
072    public Promise<QueryResponse, ResourceException> handleQuery(final Context context, final QueryRequest request,
073                                                                 final QueryResourceHandler handler) {
074        return handleRequest(context, request);
075    }
076
077    @Override
078    public Promise<ResourceResponse, ResourceException> handleRead(final Context context, final ReadRequest request) {
079        return handleRequest(context, request);
080    }
081
082    @Override
083    public Promise<ResourceResponse, ResourceException> handleUpdate(final Context context,
084                                                                     final UpdateRequest request) {
085        return handleRequest(context, request);
086    }
087
088    /**
089     * Implement this method in order to provide a default behavior when processing requests.
090     *
091     * @param <V>
092     *         The type of response.
093     * @param context
094     *         The request context.
095     * @param request
096     *         The request.
097     * @return A {@code Promise} containing the result of the operation.
098     */
099    protected <V> Promise<V, ResourceException> handleRequest(final Context context, final Request request) {
100        return new NotSupportedException().asPromise();
101    }
102
103    @Override
104    public ApiDescription api(ApiProducer<ApiDescription> producer) {
105        // api descriptions that are null will be ignored
106        return null;
107    }
108
109    @Override
110    public ApiDescription handleApiRequest(Context context, Request request) {
111        // api requests are handled at a higher level by org.forgerock.opendj.rest2ldap.DescribableRequestHandler.
112        // So this code is never reached.
113        throw new UnsupportedOperationException("This should be handled by "
114            + "org.forgerock.opendj.rest2ldap.DescribableRequestHandler.handleApiRequest()");
115    }
116
117    @Override
118    public void addDescriptorListener(Describable.Listener listener) {
119        // nothing to do
120    }
121
122    @Override
123    public void removeDescriptorListener(Describable.Listener listener) {
124        // nothing to do
125    }
126}