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 Copyrighted [year] [name of copyright owner]".
13   *
14   * Copyright 2012-2015 ForgeRock AS.
15   */
16  
17  package org.forgerock.json.resource;
18  
19  import org.forgerock.services.context.Context;
20  import org.forgerock.util.promise.Promise;
21  
22  /**
23   * An implementation interface for resource providers which exposes a collection
24   * of resource instances. The resource collection supports the following
25   * operations:
26   * <ul>
27   * <li>action
28   * <li>create - with an optional client provided resource ID as part of the
29   * request itself
30   * <li>query
31   * </ul>
32   * Whereas resource instances within the collection support the following
33   * operations:
34   * <ul>
35   * <li>action
36   * <li>delete
37   * <li>patch
38   * <li>read
39   * <li>update
40   * </ul>
41   * <p>
42   * <b>NOTE:</b> field filtering alters the structure of a JSON resource and MUST
43   * only be performed once while processing a request. It is therefore the
44   * responsibility of front-end implementations (e.g. HTTP listeners, Servlets,
45   * etc) to perform field filtering. Request handler and resource provider
46   * implementations SHOULD NOT filter fields, but MAY choose to optimise their
47   * processing in order to return a resource containing only the fields targeted
48   * by the field filters.
49   */
50  public interface CollectionResourceProvider {
51  
52      /**
53       * Performs the provided
54       * {@link RequestHandler#handleAction(Context, ActionRequest) action}
55       * against the resource collection.
56       *
57       * @param context
58       *            The request server context.
59       * @param request
60       *            The action request.
61       * @return A {@code Promise} containing the result of the operation.
62       * @see RequestHandler#handleAction(Context, ActionRequest)
63       */
64      Promise<ActionResponse, ResourceException> actionCollection(Context context, ActionRequest request);
65  
66      /**
67       * Performs the provided
68       * {@link RequestHandler#handleAction(Context, ActionRequest)
69       * action} against a resource within the collection.
70       *
71       * @param context
72       *            The request server context.
73       * @param resourceId
74       *            The ID of the targeted resource within the collection.
75       * @param request
76       *            The action request.
77       * @return A {@code Promise} containing the result of the operation.
78       * @see RequestHandler#handleAction(Context, ActionRequest)
79       */
80      Promise<ActionResponse, ResourceException> actionInstance(Context context, String resourceId,
81              ActionRequest request);
82  
83      /**
84       * {@link RequestHandler#handleCreate(Context, CreateRequest)
85       * Adds} a new resource instance to the collection.
86       * <p>
87       * Create requests are targeted at the collection itself and may include a
88       * user-provided resource ID for the new resource as part of the request
89       * itself. The user-provider resource ID may be accessed using the method
90       * {@link CreateRequest#getNewResourceId()}.
91       *
92       * @param context
93       *            The request server context.
94       * @param request
95       *            The create request.
96       * @return A {@code Promise} containing the result of the operation.
97       * @see RequestHandler#handleCreate(Context, CreateRequest)
98       * @see CreateRequest#getNewResourceId()
99       */
100     Promise<ResourceResponse, ResourceException> createInstance(Context context, CreateRequest request);
101 
102     /**
103      * {@link RequestHandler#handleDelete(Context, DeleteRequest)
104      * Removes} a resource instance from the collection.
105      *
106      * @param context
107      *            The request server context.
108      * @param resourceId
109      *            The ID of the targeted resource within the collection.
110      * @param request
111      *            The delete request.
112      * @return A {@code Promise} containing the result of the operation.
113      * @see RequestHandler#handleDelete(Context, DeleteRequest)
114      */
115     Promise<ResourceResponse, ResourceException> deleteInstance(Context context, String resourceId,
116             DeleteRequest request);
117 
118     /**
119      * {@link RequestHandler#handlePatch(Context, PatchRequest)
120      * Patches} an existing resource within the collection.
121      *
122      * @param context
123      *            The request server context.
124      * @param resourceId
125      *            The ID of the targeted resource within the collection.
126      * @param request
127      *            The patch request.
128      * @return A {@code Promise} containing the result of the operation.
129      * @see RequestHandler#handlePatch(Context, PatchRequest)
130      */
131     Promise<ResourceResponse, ResourceException> patchInstance(Context context, String resourceId,
132             PatchRequest request);
133 
134     /**
135      * {@link RequestHandler#handleQuery(Context, QueryRequest, QueryResourceHandler)
136      * Searches} the collection for all resources which match the query request
137      * criteria.
138      * <p>
139      * Implementations must invoke
140      * {@link QueryResourceHandler#handleResource(ResourceResponse)} for each resource
141      * which matches the query criteria. Once all matching resources have been
142      * returned implementations are required to return either a
143      * {@link QueryResponse} if the query has completed successfully, or
144      * {@link ResourceException} if the query did not complete successfully
145      * (even if some matching resources were returned).
146      *
147      * @param context
148      *            The request server context.
149      * @param request
150      *            The query request.
151      * @param handler
152      *            The query resource handler to be notified for each matching
153      *            resource.
154      * @return A {@code Promise} containing the result of the operation.
155      * @see RequestHandler#handleQuery(Context, QueryRequest, QueryResourceHandler)
156      */
157     Promise<QueryResponse, ResourceException> queryCollection(Context context, QueryRequest request,
158             QueryResourceHandler handler);
159 
160     /**
161      * {@link RequestHandler#handleRead(Context, ReadRequest)
162      * Reads} an existing resource within the collection.
163      *
164      * @param context
165      *            The request server context.
166      * @param resourceId
167      *            The ID of the targeted resource within the collection.
168      * @param request
169      *            The read request.
170      * @return A {@code Promise} containing the result of the operation.
171      * @see RequestHandler#handleRead(Context, ReadRequest)
172      */
173     Promise<ResourceResponse, ResourceException> readInstance(Context context, String resourceId,
174             ReadRequest request);
175 
176     /**
177      * {@link RequestHandler#handleUpdate(Context, UpdateRequest)
178      * Updates} an existing resource within the collection.
179      *
180      * @param context
181      *            The request server context.
182      * @param resourceId
183      *            The ID of the targeted resource within the collection.
184      * @param request
185      *            The update request.
186      * @return A {@code Promise} containing the result of the operation.
187      * @see RequestHandler#handleUpdate(Context, UpdateRequest)
188      */
189     Promise<ResourceResponse, ResourceException> updateInstance(Context context, String resourceId,
190             UpdateRequest request);
191 }