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 java.io.Closeable;
20  import java.util.Collection;
21  
22  import org.forgerock.services.context.Context;
23  import org.forgerock.util.promise.Promise;
24  
25  /**
26   * A client connection to a JSON resource provider over which read and update
27   * requests may be performed.
28   */
29  public interface Connection extends Closeable {
30  
31      /**
32       * Performs an action against a specific resource, or set of resources. Bulk
33       * updates are an example of an action request.
34       *
35       * @param context
36       *            The request context, such as associated principal.
37       * @param request
38       *            The action request.
39       * @return A JSON object containing the result of the action, the content of
40       *         which is specified by the action.
41       * @throws ResourceException
42       *             If the action could not be performed.
43       * @throws UnsupportedOperationException
44       *             If this connection does not support action requests.
45       * @throws IllegalStateException
46       *             If this connection has already been closed, i.e. if
47       *             {@code isClosed() == true}.
48       */
49      ActionResponse action(Context context, ActionRequest request) throws ResourceException;
50  
51      /**
52       * Asynchronously performs an action against a specific resource, or set of
53       * resources. Bulk updates are an example of an action request.
54       *
55       * @param context
56       *            The request context, such as associated principal.
57       * @param request
58       *            The action request.
59       * @return A future representing the result of the request.
60       * @throws UnsupportedOperationException
61       *             If this connection does not support action requests.
62       * @throws IllegalStateException
63       *             If this connection has already been closed, i.e. if
64       *             {@code isClosed() == true}.
65       */
66      Promise<ActionResponse, ResourceException> actionAsync(Context context, ActionRequest request);
67  
68      /**
69       * Releases any resources associated with this connection. For physical
70       * connections to a server this will mean that the underlying socket is
71       * closed.
72       * <p>
73       * Other connection implementations may behave differently. For example, a
74       * pooled connection will be released and returned to its connection pool.
75       * <p>
76       * Calling {@code close} on a connection that is already closed has no
77       * effect.
78       */
79      void close();
80  
81      /**
82       * Adds a new JSON resource.
83       *
84       * @param context
85       *            The request context, such as associated principal.
86       * @param request
87       *            The create request.
88       * @return The newly created JSON resource.
89       * @throws ResourceException
90       *             If the JSON resource could not be created.
91       * @throws UnsupportedOperationException
92       *             If this connection does not support create requests.
93       * @throws IllegalStateException
94       *             If this connection has already been closed, i.e. if
95       *             {@code isClosed() == true}.
96       */
97      ResourceResponse create(Context context, CreateRequest request) throws ResourceException;
98  
99      /**
100      * Asynchronously adds a new JSON resource.
101      *
102      * @param context
103      *            The request context, such as associated principal.
104      * @param request
105      *            The create request.
106      * @return A future representing the result of the request.
107      * @throws UnsupportedOperationException
108      *             If this connection does not support create requests.
109      * @throws IllegalStateException
110      *             If this connection has already been closed, i.e. if
111      *             {@code isClosed() == true}.
112      */
113     Promise<ResourceResponse, ResourceException> createAsync(Context context, CreateRequest request);
114 
115     /**
116      * Deletes a JSON resource.
117      *
118      * @param context
119      *            The request context, such as associated principal.
120      * @param request
121      *            The delete request.
122      * @return The deleted JSON resource.
123      * @throws ResourceException
124      *             If the JSON resource could not be deleted.
125      * @throws UnsupportedOperationException
126      *             If this connection does not support delete requests.
127      * @throws IllegalStateException
128      *             If this connection has already been closed, i.e. if
129      *             {@code isClosed() == true}.
130      */
131     ResourceResponse delete(Context context, DeleteRequest request) throws ResourceException;
132 
133     /**
134      * Asynchronously deletes a JSON resource.
135      *
136      * @param context
137      *            The request context, such as associated principal.
138      * @param request
139      *            The delete request.
140      * @return A future representing the result of the request.
141      * @throws UnsupportedOperationException
142      *             If this connection does not support delete requests.
143      * @throws IllegalStateException
144      *             If this connection has already been closed, i.e. if
145      *             {@code isClosed() == true}.
146      */
147     Promise<ResourceResponse, ResourceException> deleteAsync(Context context, DeleteRequest request);
148 
149     /**
150      * Indicates whether or not this connection has been explicitly closed by
151      * calling {@code close}. This method will not return {@code true} if a
152      * fatal error has occurred on the connection unless {@code close} has been
153      * called.
154      *
155      * @return {@code true} if this connection has been explicitly closed by
156      *         calling {@code close}, or {@code false} otherwise.
157      */
158     boolean isClosed();
159 
160     /**
161      * Returns {@code true} if this connection has not been closed and no fatal
162      * errors have been detected. This method is guaranteed to return
163      * {@code false} only when it is called after the method {@code close} has
164      * been called.
165      *
166      * @return {@code true} if this connection is valid, {@code false}
167      *         otherwise.
168      */
169     boolean isValid();
170 
171     /**
172      * Updates a JSON resource by applying a set of changes to its existing
173      * content.
174      *
175      * @param context
176      *            The request context, such as associated principal.
177      * @param request
178      *            The update request.
179      * @return The updated JSON resource.
180      * @throws ResourceException
181      *             If the JSON resource could not be updated.
182      * @throws UnsupportedOperationException
183      *             If this connection does not support patch requests.
184      * @throws IllegalStateException
185      *             If this connection has already been closed, i.e. if
186      *             {@code isClosed() == true}.
187      */
188     ResourceResponse patch(Context context, PatchRequest request) throws ResourceException;
189 
190     /**
191      * Asynchronously updates a JSON resource by applying a set of changes to
192      * its existing content.
193      *
194      * @param context
195      *            The request context, such as associated principal.
196      * @param request
197      *            The patch request.
198      * @return A future representing the result of the request.
199      * @throws UnsupportedOperationException
200      *             If this connection does not support patch requests.
201      * @throws IllegalStateException
202      *             If this connection has already been closed, i.e. if
203      *             {@code isClosed() == true}.
204      */
205     Promise<ResourceResponse, ResourceException> patchAsync(Context context, PatchRequest request);
206 
207     /**
208      * Searches for all JSON resources matching a user specified set of
209      * criteria, and returns a {@code Promise} that will be completed with the
210      * results of the search.
211      * <p>
212      * Result processing <b><i>happens-before</i></b> this method returns to the
213      * caller.
214      *
215      * @param context
216      *            The request context, such as associated principal.
217      * @param request
218      *            The query request.
219      * @param handler
220      *            A query resource handler which can be used to process
221      *            matching resources as they are received.
222      * @return The query result.
223      * @throws ResourceException
224      *             If the query could not be performed.
225      * @throws UnsupportedOperationException
226      *             If this connection does not support query requests.
227      * @throws IllegalStateException
228      *             If this connection has already been closed, i.e. if
229      *             {@code isClosed() == true}.
230      */
231     QueryResponse query(Context context, QueryRequest request, QueryResourceHandler handler)
232             throws ResourceException;
233 
234     /**
235      * Searches for all JSON resources matching a user specified set of
236      * criteria, and places the results in the provided collection.
237      *
238      * @param context
239      *            The request context, such as associated principal.
240      * @param request
241      *            The query request.
242      * @param results
243      *            A collection into which matching resources will be added as
244      *            they are received.
245      * @return The query result.
246      * @throws ResourceException
247      *             If the query could not be performed.
248      * @throws UnsupportedOperationException
249      *             If this connection does not support query requests.
250      * @throws IllegalStateException
251      *             If this connection has already been closed, i.e. if
252      *             {@code isClosed() == true}.
253      */
254     QueryResponse query(Context context, QueryRequest request, Collection<? super ResourceResponse> results)
255             throws ResourceException;
256 
257     /**
258      * Asynchronously searches for all JSON resources matching a user specified
259      * set of criteria, and returns a {@code Promise} that will be completed with the
260      * results of the search.
261      * <p>
262      * Result processing <b><i>happens-before</i></b> the returned future
263      * completes.
264      *
265      * @param context
266      *            The request context, such as associated principal.
267      * @param request
268      *            The create request.
269      * @param handler
270      *            A non-{@code null} query resource handler which should be
271      *            used to process matching resources as they are received.
272      * @return A future representing the result of the request.
273      * @throws UnsupportedOperationException
274      *             If this connection does not support query requests.
275      * @throws IllegalStateException
276      *             If this connection has already been closed, i.e. if
277      *             {@code isClosed() == true}.
278      */
279     Promise<QueryResponse, ResourceException> queryAsync(Context context, QueryRequest request,
280             QueryResourceHandler handler);
281 
282     /**
283      * Reads a JSON resource.
284      *
285      * @param context
286      *            The request context, such as associated principal.
287      * @param request
288      *            The read request.
289      * @return The JSON resource.
290      * @throws ResourceException
291      *             If the JSON resource could not be read.
292      * @throws UnsupportedOperationException
293      *             If this connection does not support read requests.
294      * @throws IllegalStateException
295      *             If this connection has already been closed, i.e. if
296      *             {@code isClosed() == true}.
297      */
298     ResourceResponse read(Context context, ReadRequest request) throws ResourceException;
299 
300     /**
301      * Asynchronously reads a JSON resource.
302      *
303      * @param context
304      *            The request context, such as associated principal.
305      * @param request
306      *            The read request.
307      * @return A future representing the result of the request.
308      * @throws UnsupportedOperationException
309      *             If this connection does not support read requests.
310      * @throws IllegalStateException
311      *             If this connection has already been closed, i.e. if
312      *             {@code isClosed() == true}.
313      */
314     Promise<ResourceResponse, ResourceException> readAsync(Context context, ReadRequest request);
315 
316     /**
317      * Updates a JSON resource by replacing its existing content with new
318      * content.
319      *
320      * @param context
321      *            The request context, such as associated principal.
322      * @param request
323      *            The update request.
324      * @return The updated JSON resource.
325      * @throws ResourceException
326      *             If the JSON resource could not be updated.
327      * @throws UnsupportedOperationException
328      *             If this connection does not support update requests.
329      * @throws IllegalStateException
330      *             If this connection has already been closed, i.e. if
331      *             {@code isClosed() == true}.
332      */
333     ResourceResponse update(Context context, UpdateRequest request) throws ResourceException;
334 
335     /**
336      * Asynchronously updates a JSON resource by replacing its existing content
337      * with new content.
338      *
339      * @param context
340      *            The request context, such as associated principal.
341      * @param request
342      *            The update request.
343      * @return A future representing the result of the request.
344      * @throws UnsupportedOperationException
345      *             If this connection does not support update requests.
346      * @throws IllegalStateException
347      *             If this connection has already been closed, i.e. if
348      *             {@code isClosed() == true}.
349      */
350     Promise<ResourceResponse, ResourceException> updateAsync(Context context, UpdateRequest request);
351 }