1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
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
63 return false;
64 }
65
66 @Override
67 public boolean isValid() {
68
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 }