View Javadoc
1   /*
2    * The contents of this file are subject to the terms of the Common Development and
3    * Distribution License (the License). You may not use this file except in compliance with the
4    * License.
5    *
6    * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the
7    * specific language governing permission and limitations under the License.
8    *
9    * When distributing Covered Software, include this CDDL Header Notice in each file and include
10   * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL
11   * Header, with the fields enclosed by brackets [] replaced by your own identifying
12   * information: "Portions copyright [year] [name of copyright owner]".
13   *
14   * Copyright 2012-2016 ForgeRock AS.
15   */
16  
17  package org.forgerock.json.resource;
18  
19  import org.forgerock.api.models.ApiDescription;
20  import org.forgerock.http.ApiProducer;
21  import org.forgerock.services.context.Context;
22  import org.forgerock.services.descriptor.Describable;
23  import org.forgerock.util.Function;
24  import org.forgerock.util.promise.Promise;
25  
26  final class InternalConnection extends AbstractAsynchronousConnection
27          implements Describable<ApiDescription, Request> {
28      private final RequestHandler requestHandler;
29  
30      InternalConnection(final RequestHandler handler) {
31          this.requestHandler = handler;
32      }
33  
34      @Override
35      public Promise<ActionResponse, ResourceException> actionAsync(final Context context,
36              final ActionRequest request) {
37          return requestHandler.handleAction(context, request);
38      }
39  
40      @Override
41      public void close() {
42          // Do nothing.
43      }
44  
45      @Override
46      public Promise<ResourceResponse, ResourceException> createAsync(final Context context,
47              final CreateRequest request) {
48          return requestHandler.handleCreate(context, request)
49                               .then(filterResponse(request));
50      }
51  
52      @Override
53      public Promise<ResourceResponse, ResourceException> deleteAsync(final Context context,
54              final DeleteRequest request) {
55          return requestHandler.handleDelete(context, request)
56                               .then(filterResponse(request));
57  
58      }
59  
60      @Override
61      public boolean isClosed() {
62          // Always open.
63          return false;
64      }
65  
66      @Override
67      public boolean isValid() {
68          // Always valid.
69          return true;
70      }
71  
72      @Override
73      public Promise<ResourceResponse, ResourceException> patchAsync(final Context context, final PatchRequest request) {
74          return requestHandler.handlePatch(context, request)
75                               .then(filterResponse(request));
76  
77      }
78  
79      @Override
80      public Promise<QueryResponse, ResourceException> queryAsync(final Context context,
81              final QueryRequest request, final QueryResourceHandler handler) {
82          return requestHandler.handleQuery(context, request,
83                  new QueryResourceHandler() {
84                      @Override
85                      public boolean handleResource(ResourceResponse resource) {
86                          return handler.handleResource(Resources.filterResource(resource, request.getFields()));
87                      }
88                  });
89      }
90  
91      @Override
92      public Promise<ResourceResponse, ResourceException> readAsync(final Context context, final ReadRequest request) {
93          return requestHandler.handleRead(context, request)
94                               .then(filterResponse(request));
95      }
96  
97      @Override
98      public Promise<ResourceResponse, ResourceException> updateAsync(final Context context,
99              final UpdateRequest request) {
100         return requestHandler.handleUpdate(context, request)
101                              .then(filterResponse(request));
102     }
103 
104     private Function<ResourceResponse, ResourceResponse, ResourceException> filterResponse(final Request request) {
105         return new Function<ResourceResponse, ResourceResponse, ResourceException>() {
106             @Override
107             public ResourceResponse apply(final ResourceResponse response)
108                     throws ResourceException {
109                 return Resources.filterResource(response, request.getFields());
110             }
111         };
112     }
113 
114     @Override
115     @SuppressWarnings("unchecked")
116     public ApiDescription api(ApiProducer<ApiDescription> producer) {
117         return requestHandler instanceof Describable
118                 ? ((Describable<ApiDescription, Request>) requestHandler).api(producer)
119                 : null;
120     }
121 
122     @Override
123     @SuppressWarnings("unchecked")
124     public ApiDescription handleApiRequest(Context context, Request request) {
125         if (requestHandler instanceof Describable) {
126             return ((Describable<ApiDescription, Request>) requestHandler)
127                     .handleApiRequest(context, request);
128         }
129         throw new UnsupportedOperationException("Wrapped RequestHandler is not describable");
130     }
131 
132     @Override
133     public void addDescriptorListener(Describable.Listener listener) {
134         if (requestHandler instanceof Describable) {
135             ((Describable) requestHandler).addDescriptorListener(listener);
136         }
137     }
138 
139     @Override
140     public void removeDescriptorListener(Describable.Listener listener) {
141         if (requestHandler instanceof Describable) {
142             ((Describable) requestHandler).removeDescriptorListener(listener);
143         }
144     }
145 }