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}