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-2015 ForgeRock AS. 15 */ 16 17 package org.forgerock.json.resource; 18 19 import java.util.List; 20 import java.util.Map; 21 22 import org.forgerock.http.routing.Version; 23 import org.forgerock.json.JsonPointer; 24 import org.forgerock.json.JsonValue; 25 import org.forgerock.util.i18n.PreferredLocales; 26 27 /** 28 * Common attributes of all JSON resource requests. 29 */ 30 public interface Request { 31 32 // TODO: many of these fields are not used by action requests. Perhaps they 33 // should be pushed down? For example, a bulk update operation would not use 34 // any of these parameters. 35 36 // TODO: include support for something similar to LDAP controls? 37 38 /** 39 * The name of the field which contains the additional query parameters in the JSON representation. 40 */ 41 String FIELD_ADDITIONAL_PARAMETERS = "additionalParameters"; 42 /** 43 * The name of the field which contains the fields in the JSON representation. 44 */ 45 String FIELD_FIELDS = "fields"; 46 /** 47 * The name of the field which contains the resource name in the JSON representation. 48 */ 49 String FIELD_RESOURCE_PATH = "resourcePath"; 50 51 /** 52 * Applies a {@code RequestVisitor} to this {@code Request}. 53 * 54 * @param <R> 55 * The return type of the visitor's methods. 56 * @param <P> 57 * The type of the additional parameters to the visitor's methods. 58 * @param v 59 * The request visitor. 60 * @param p 61 * Optional additional visitor parameter. 62 * @return A result as specified by the visitor. 63 */ 64 <R, P> R accept(final RequestVisitor<R, P> v, final P p); 65 66 /** 67 * Adds one or more fields which should be included with each JSON resource returned by this request. 68 * 69 * @param fields 70 * The fields which should be included with each JSON resource returned by this request. 71 * @return This request. 72 * @throws UnsupportedOperationException 73 * If this request does not permit changes to the fields. 74 */ 75 Request addField(JsonPointer... fields); 76 77 /** 78 * Adds one or more fields which should be included with each JSON resource returned by this request. 79 * 80 * @param fields 81 * The fields which should be included with each JSON resource returned by this request. 82 * @return This request. 83 * @throws IllegalArgumentException 84 * If one or more of the provided field identifiers could not be parsed as a JSON pointer. 85 * @throws UnsupportedOperationException 86 * If this request does not permit changes to the fields. 87 */ 88 Request addField(String... fields); 89 90 /** 91 * Returns the additional parameter which should be used to control the behavior of this action request. 92 * 93 * @param name 94 * The name of the additional parameter. 95 * @return The additional parameter which should be used to control the behavior of this action request 96 */ 97 String getAdditionalParameter(String name); 98 99 /** 100 * Returns the additional parameters which should be used to control the behavior of this action request. The 101 * returned map may be modified if permitted by this action request. 102 * 103 * @return The additional parameters which should be used to control the behavior of this action request (never 104 * {@code null}). 105 */ 106 Map<String, String> getAdditionalParameters(); 107 108 /** 109 * Returns the list of fields which should be included with each JSON resource returned by this request. The 110 * returned list may be modified if permitted by this query request. An empty list indicates that all fields should 111 * be included. 112 * <p> 113 * <b>NOTE:</b> field filtering alters the structure of a JSON resource and MUST only be performed once while 114 * processing a request. It is therefore the responsibility of front-end implementations (e.g. HTTP listeners, 115 * Servlets, etc) to perform field filtering. Request handler and resource provider implementations SHOULD NOT 116 * filter fields, but MAY choose to optimise their processing in order to return a resource containing only the 117 * fields targeted by the field filters. 118 * 119 * @return The list of fields which should be included with each JSON resource returned by this request (never 120 * {@code null}). 121 */ 122 List<JsonPointer> getFields(); 123 124 /** 125 * Get the locale preference for the request. 126 * 127 * @return The {@code PreferredLocales} instance for the request. 128 */ 129 PreferredLocales getPreferredLocales(); 130 131 /** 132 * Returns the type of this request. 133 * 134 * @return The type of this request. 135 */ 136 RequestType getRequestType(); 137 138 /** 139 * Returns the non-{@code null} path of the JSON resource to which this request should be targeted. The resource 140 * path is relative and never begins or ends with a forward slash, but may be empty. 141 * <p> 142 * <b>NOTE</b>: for resource provider implementations the resource path is relative to the current resource being 143 * accessed. See the description of {@link org.forgerock.http.routing.UriRouterContext} for more information. 144 * 145 * @return The non-{@code null} path of the JSON resource to which this request should be targeted, which may be the 146 * empty string. 147 */ 148 String getResourcePath(); 149 150 /** 151 * Returns the non-{@code null} path of the JSON resource to which this request should be targeted. The resource 152 * path is relative and never begins or ends with a forward slash, but may be empty. 153 * <p> 154 * <b>NOTE</b>: for resource provider implementations the resource path is relative to the current resource being 155 * accessed. See the description of {@link org.forgerock.http.routing.UriRouterContext} for more information. 156 * 157 * @return The non-{@code null} path of the JSON resource to which this request should be targeted, which may be the 158 * empty string. 159 */ 160 ResourcePath getResourcePathObject(); 161 162 /** 163 * Gets the requested API version of the resource. 164 * 165 * @return The requested API version of the resource. 166 */ 167 Version getResourceVersion(); 168 169 /** 170 * Sets an additional parameter which should be used to control the behavior of this action request. 171 * 172 * @param name 173 * The name of the additional parameter. 174 * @param value 175 * The additional parameter's value. 176 * @return This request. 177 * @throws BadRequestException 178 * If this request does not permit the additional parameter to be set. 179 * @throws UnsupportedOperationException 180 * If this request does not permit changes to the additional parameters. 181 */ 182 Request setAdditionalParameter(String name, String value) throws BadRequestException; 183 184 /** 185 * Set the locale preference for the request. 186 * 187 * @param preferredLocales 188 * The {@code PreferredLocales} instance for the request. 189 * @return This request. 190 */ 191 Request setPreferredLocales(PreferredLocales preferredLocales); 192 193 /** 194 * Sets the non-{@code null} path of the JSON resource to which this request should be targeted. The resource path 195 * is relative and never begins or ends with a forward slash, but may be empty. 196 * <p> 197 * <b>NOTE</b>: for resource provider implementations the resource path is relative to the current resource being 198 * accessed. See the description of {@link org.forgerock.http.routing.UriRouterContext} for more information. 199 * 200 * @param path 201 * The non-{@code null} path of the JSON resource to which this request should be targeted, which may be the 202 * empty string. The path should be URL-encoded. 203 * @return This request. 204 * @throws UnsupportedOperationException 205 * If this request does not permit changes to the JSON resource path. 206 */ 207 Request setResourcePath(String path); 208 209 /** 210 * Sets the non-{@code null} path of the JSON resource to which this request should be targeted. The resource path 211 * is relative and never begins or ends with a forward slash, but may be empty. 212 * <p> 213 * <b>NOTE</b>: for resource provider implementations the resource path is relative to the current resource being 214 * accessed. See the description of {@link org.forgerock.http.routing.UriRouterContext} for more information. 215 * 216 * @param path 217 * The non-{@code null} path of the JSON resource to which this request should be targeted, which may be the 218 * empty string. 219 * @return This request. 220 * @throws UnsupportedOperationException 221 * If this request does not permit changes to the JSON resource path. 222 */ 223 Request setResourcePath(ResourcePath path); 224 225 /** 226 * Sets the requested API version of the resource. 227 * 228 * @param resourceVersion 229 * The requested API version of the resource. 230 * @return This request. 231 */ 232 Request setResourceVersion(Version resourceVersion); 233 234 /** 235 * Return a JsonValue representation of this request. 236 * 237 * @return this request as a JsonValue 238 */ 239 JsonValue toJsonValue(); 240 }