001/*
002 * Copyright 2011-2013 UnboundID Corp.
003 *
004 * This program is free software; you can redistribute it and/or modify
005 * it under the terms of the GNU General Public License (GPLv2 only)
006 * or the terms of the GNU Lesser General Public License (LGPLv2.1 only)
007 * as published by the Free Software Foundation.
008 *
009 * This program is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
012 * GNU General Public License for more details.
013 *
014 * You should have received a copy of the GNU General Public License
015 * along with this program; if not, see <http://www.gnu.org/licenses>.
016 */
017
018package com.unboundid.scim.wink;
019
020import com.unboundid.scim.sdk.OAuthTokenHandler;
021
022import javax.servlet.http.HttpServletRequest;
023import javax.ws.rs.Consumes;
024import javax.ws.rs.DELETE;
025import javax.ws.rs.GET;
026import javax.ws.rs.POST;
027import javax.ws.rs.PUT;
028import javax.ws.rs.Path;
029import javax.ws.rs.PathParam;
030import javax.ws.rs.Produces;
031import javax.ws.rs.QueryParam;
032import javax.ws.rs.core.Context;
033import javax.ws.rs.core.HttpHeaders;
034import javax.ws.rs.core.MediaType;
035import javax.ws.rs.core.Response;
036import javax.ws.rs.core.SecurityContext;
037import javax.ws.rs.core.UriInfo;
038import java.io.InputStream;
039
040import static com.unboundid.scim.sdk.SCIMConstants.QUERY_PARAMETER_BASE_ID;
041import static com.unboundid.scim.sdk.SCIMConstants.QUERY_PARAMETER_FILTER;
042import static com.unboundid.scim.sdk.SCIMConstants.QUERY_PARAMETER_PAGE_SIZE;
043import static com.unboundid.scim.sdk.SCIMConstants.
044    QUERY_PARAMETER_PAGE_START_INDEX;
045import static com.unboundid.scim.sdk.SCIMConstants.QUERY_PARAMETER_SCOPE;
046import static com.unboundid.scim.sdk.SCIMConstants.QUERY_PARAMETER_SORT_BY;
047import static com.unboundid.scim.sdk.SCIMConstants.QUERY_PARAMETER_SORT_ORDER;
048
049
050
051/**
052 * This class is a Wink resource implementation for operations
053 * on a SCIM resource.
054 */
055@Path("{endpoint}")
056public class SCIMResource extends AbstractSCIMResource
057{
058  /**
059   * Create a new SCIM wink resource for operations on a SCIM endpoint.
060   *
061   * @param application         The SCIMApplication initializing this reosurce.
062   * @param tokenHandler        The token handler to use for OAuth
063   *                            authentication.
064   */
065  public SCIMResource(final SCIMApplication application,
066                      final OAuthTokenHandler tokenHandler)
067  {
068    super(application, tokenHandler);
069  }
070
071
072
073  /**
074   * Implement the GET query operation producing JSON format.
075   *
076   * @param endpoint         The resource endpoint.
077   * @param request          The current HTTP servlet request.
078   * @param securityContext  The security context of the current request.
079   * @param headers          The request headers.
080   * @param uriInfo          The URI info for the request.
081   * @param filterString     The filter query parameter, or {@code null}.
082   * @param baseID           The SCIM resource ID of the search base entry,
083   *                         or {@code null}.
084   * @param searchScope      The LDAP search scope to use, or {@code null}.
085   * @param sortBy           The sortBy query parameter, or {@code null}.
086   * @param sortOrder        The sortOrder query parameter, or {@code null}.
087   * @param pageStartIndex   The startIndex query parameter, or {@code null}.
088   * @param pageSize         The count query parameter, or {@code null}.
089   *
090   * @return  The response to the request.
091   */
092  @GET
093  @Produces(MediaType.APPLICATION_JSON)
094  public Response doJsonGet(@PathParam("endpoint") final String endpoint,
095                            @Context final HttpServletRequest request,
096                            @Context final SecurityContext securityContext,
097                            @Context final HttpHeaders headers,
098                            @Context final UriInfo uriInfo,
099                            @QueryParam(QUERY_PARAMETER_FILTER)
100                            final String filterString,
101                            @QueryParam(QUERY_PARAMETER_BASE_ID)
102                            final String baseID,
103                            @QueryParam(QUERY_PARAMETER_SCOPE)
104                            final String searchScope,
105                            @QueryParam(QUERY_PARAMETER_SORT_BY)
106                            final String sortBy,
107                            @QueryParam(QUERY_PARAMETER_SORT_ORDER)
108                            final String sortOrder,
109                            @QueryParam(QUERY_PARAMETER_PAGE_START_INDEX)
110                            final String pageStartIndex,
111                            @QueryParam(QUERY_PARAMETER_PAGE_SIZE)
112                            final String pageSize)
113  {
114    final RequestContext requestContext =
115        new RequestContext(request, securityContext, headers, uriInfo,
116                           MediaType.APPLICATION_JSON_TYPE,
117                           MediaType.APPLICATION_JSON_TYPE);
118
119    return getUsers(requestContext, endpoint, filterString, baseID, searchScope,
120                    sortBy, sortOrder, pageStartIndex, pageSize);
121  }
122
123
124
125  /**
126   * Implement the GET query operation producing XML format.
127   *
128   * @param endpoint         The resource endpoint.
129   * @param request          The current HTTP servlet request.
130   * @param securityContext  The security context of the current request.
131   * @param headers          The request headers.
132   * @param uriInfo          The URI info for the request.
133   * @param filterString     The filter query parameter, or {@code null}.
134   * @param baseID           The SCIM resource ID of the search base entry,
135   *                         or {@code null}.
136   * @param searchScope      The LDAP search scope to use, or {@code null}.
137   * @param sortBy           The sortBy query parameter, or {@code null}.
138   * @param sortOrder        The sortOrder query parameter, or {@code null}.
139   * @param pageStartIndex   The startIndex query parameter, or {@code null}.
140   * @param pageSize         The count query parameter, or {@code null}.
141   *
142   * @return  The response to the request.
143   */
144  @GET
145  @Produces(MediaType.APPLICATION_XML)
146  public Response doXmlGet(@PathParam("endpoint") final String endpoint,
147                           @Context final HttpServletRequest request,
148                           @Context final SecurityContext securityContext,
149                           @Context final HttpHeaders headers,
150                           @Context final UriInfo uriInfo,
151                           @QueryParam(QUERY_PARAMETER_FILTER)
152                           final String filterString,
153                           @QueryParam(QUERY_PARAMETER_BASE_ID)
154                           final String baseID,
155                           @QueryParam(QUERY_PARAMETER_SCOPE)
156                           final String searchScope,
157                           @QueryParam(QUERY_PARAMETER_SORT_BY)
158                           final String sortBy,
159                           @QueryParam(QUERY_PARAMETER_SORT_ORDER)
160                           final String sortOrder,
161                           @QueryParam(QUERY_PARAMETER_PAGE_START_INDEX)
162                           final String pageStartIndex,
163                           @QueryParam(QUERY_PARAMETER_PAGE_SIZE)
164                           final String pageSize)
165  {
166    final RequestContext requestContext =
167        new RequestContext(request, securityContext, headers, uriInfo,
168                           MediaType.APPLICATION_XML_TYPE,
169                           MediaType.APPLICATION_XML_TYPE);
170
171    return getUsers(requestContext, endpoint, filterString, baseID, searchScope,
172                    sortBy, sortOrder, pageStartIndex, pageSize);
173  }
174
175
176
177  /**
178   * Implement the GET operation on a specified user resource producing
179   * JSON format.
180   *
181   * @param endpoint         The resource endpoint.
182   * @param userID           The requested user ID.
183   * @param request          The current HTTP servlet request.
184   * @param securityContext  The security context for the request.
185   * @param headers          The request headers.
186   * @param uriInfo          The URI info for the request.
187   *
188   * @return  The response to the request.
189   */
190  @GET
191  @Path("{userID}")
192  @Produces(MediaType.APPLICATION_JSON)
193  public Response doJsonGet(@PathParam("endpoint") final String endpoint,
194                            @PathParam("userID") final String userID,
195                            @Context final HttpServletRequest request,
196                            @Context final SecurityContext securityContext,
197                            @Context final HttpHeaders headers,
198                            @Context final UriInfo uriInfo)
199  {
200    final RequestContext requestContext =
201        new RequestContext(request, securityContext, headers, uriInfo,
202                           MediaType.APPLICATION_JSON_TYPE,
203                           MediaType.APPLICATION_JSON_TYPE);
204    return getUser(requestContext, endpoint, userID);
205  }
206
207
208
209  /**
210   * Implement the GET operation on a specified user resource producing
211   * XML format.
212   *
213   * @param endpoint         The resource endpoint.
214   * @param userID           The requested user ID.
215   * @param request          The current HTTP servlet request.
216   * @param securityContext  The security context for the request.
217   * @param headers          The request headers.
218   * @param uriInfo          The URI info for the request.
219   *
220   * @return  The response to the request.
221   */
222  @GET
223  @Path("{userID}")
224  @Produces(MediaType.APPLICATION_XML)
225  public Response doXmlGet(@PathParam("endpoint") final String endpoint,
226                           @PathParam("userID") final String userID,
227                           @Context final HttpServletRequest request,
228                           @Context final SecurityContext securityContext,
229                           @Context final HttpHeaders headers,
230                           @Context final UriInfo uriInfo)
231  {
232    final RequestContext requestContext =
233        new RequestContext(request, securityContext, headers, uriInfo,
234                           MediaType.APPLICATION_XML_TYPE,
235                           MediaType.APPLICATION_XML_TYPE);
236    return getUser(requestContext, endpoint, userID);
237  }
238
239
240
241  /**
242   * Implement the GET operation on a specified user resource where the URL
243   * specifies JSON content type.
244   *
245   * @param endpoint         The resource endpoint.
246   * @param userID           The requested user ID.
247   * @param request          The current HTTP servlet request.
248   * @param securityContext  The security context for the request.
249   * @param headers          The request headers.
250   * @param uriInfo          The URI info for the request.
251   *
252   * @return  The response to the request.
253   */
254  @GET
255  @Path("{userID}.json")
256  @Produces(MediaType.APPLICATION_JSON)
257  public Response doDotJsonGet(@PathParam("endpoint") final String endpoint,
258                               @PathParam("userID") final String userID,
259                               @Context final HttpServletRequest request,
260                               @Context final SecurityContext securityContext,
261                               @Context final HttpHeaders headers,
262                               @Context final UriInfo uriInfo)
263  {
264    final RequestContext requestContext =
265        new RequestContext(request, securityContext, headers, uriInfo,
266                           MediaType.APPLICATION_JSON_TYPE,
267                           MediaType.APPLICATION_JSON_TYPE);
268    return getUser(requestContext, endpoint, userID);
269  }
270
271
272
273  /**
274   * Implement the GET operation on a specified user resource where the URL
275   * specifies XML content type.
276   *
277   * @param endpoint         The resource endpoint.
278   * @param userID           The requested user ID.
279   * @param request          The current HTTP servlet request.
280   * @param securityContext  The security context for the request.
281   * @param headers          The request headers.
282   * @param uriInfo          The URI info for the request.
283   *
284   * @return  The response to the request.
285   */
286  @GET
287  @Path("{userID}.xml")
288  @Produces(MediaType.APPLICATION_XML)
289  public Response doDotXmlGet(@PathParam("endpoint") final String endpoint,
290                              @PathParam("userID") final String userID,
291                              @Context final HttpServletRequest request,
292                              @Context final SecurityContext securityContext,
293                              @Context final HttpHeaders headers,
294                              @Context final UriInfo uriInfo)
295  {
296    final RequestContext requestContext =
297        new RequestContext(request, securityContext, headers, uriInfo,
298                           MediaType.APPLICATION_XML_TYPE,
299                           MediaType.APPLICATION_XML_TYPE);
300    return getUser(requestContext, endpoint, userID);
301  }
302
303
304
305  /**
306   * Implement the POST operation consuming and producing JSON format.
307   *
308   * @param inputStream      The content to be consumed.
309   * @param endpoint         The resource endpoint.
310   * @param request          The current HTTP servlet request.
311   * @param securityContext  The security context for the request.
312   * @param headers          The request headers.
313   * @param uriInfo          The URI info for the request.
314   *
315   * @return  The response to the request.
316   */
317  @POST
318  @Consumes(MediaType.APPLICATION_JSON)
319  @Produces(MediaType.APPLICATION_JSON)
320  public Response doJsonJsonPost(final InputStream inputStream,
321                                 @PathParam("endpoint") final String endpoint,
322                                 @Context final HttpServletRequest request,
323                                 @Context final SecurityContext securityContext,
324                                 @Context final HttpHeaders headers,
325                                 @Context final UriInfo uriInfo)
326  {
327    final RequestContext requestContext =
328        new RequestContext(request, securityContext, headers, uriInfo,
329                           MediaType.APPLICATION_JSON_TYPE,
330                           MediaType.APPLICATION_JSON_TYPE);
331    return postUser(requestContext, endpoint, inputStream);
332  }
333
334
335
336  /**
337   * Implement the POST operation consuming and producing XML format.
338   *
339   * @param inputStream      The content to be consumed.
340   * @param endpoint         The resource endpoint.
341   * @param request          The current HTTP servlet request.
342   * @param securityContext  The security context for the request.
343   * @param headers          The request headers.
344   * @param uriInfo          The URI info for the request.
345   *
346   * @return  The response to the request.
347   */
348  @POST
349  @Consumes(MediaType.APPLICATION_XML)
350  @Produces(MediaType.APPLICATION_XML)
351  public Response doXmlXmlPost(final InputStream inputStream,
352                               @PathParam("endpoint") final String endpoint,
353                               @Context final HttpServletRequest request,
354                               @Context final SecurityContext securityContext,
355                               @Context final HttpHeaders headers,
356                               @Context final UriInfo uriInfo)
357  {
358    final RequestContext requestContext =
359        new RequestContext(request, securityContext, headers, uriInfo,
360                           MediaType.APPLICATION_XML_TYPE,
361                           MediaType.APPLICATION_XML_TYPE);
362    return postUser(requestContext, endpoint, inputStream);
363  }
364
365
366
367  /**
368   * Implement the POST operation consuming XML format and producing JSON
369   * format.
370   *
371   * @param inputStream      The content to be consumed.
372   * @param endpoint         The resource endpoint.
373   * @param request          The current HTTP servlet request.
374   * @param securityContext  The security context for the request.
375   * @param headers          The request headers.
376   * @param uriInfo          The URI info for the request.
377   *
378   * @return  The response to the request.
379   */
380  @POST
381  @Consumes(MediaType.APPLICATION_XML)
382  @Produces(MediaType.APPLICATION_JSON)
383  public Response doXmlJsonPost(final InputStream inputStream,
384                                @PathParam("endpoint") final String endpoint,
385                                @Context final HttpServletRequest request,
386                                @Context final SecurityContext securityContext,
387                                @Context final HttpHeaders headers,
388                                @Context final UriInfo uriInfo)
389  {
390    final RequestContext requestContext =
391        new RequestContext(request, securityContext, headers, uriInfo,
392                           MediaType.APPLICATION_XML_TYPE,
393                           MediaType.APPLICATION_JSON_TYPE);
394    return postUser(requestContext, endpoint, inputStream);
395  }
396
397
398
399  /**
400   * Implement the POST operation consuming JSON format and producing XML
401   * format.
402   *
403   * @param inputStream      The content to be consumed.
404   * @param endpoint         The resource endpoint.
405   * @param request          The current HTTP servlet request.
406   * @param securityContext  The security context for the request.
407   * @param headers          The request headers.
408   * @param uriInfo          The URI info for the request.
409   *
410   * @return  The response to the request.
411   */
412  @POST
413  @Consumes(MediaType.APPLICATION_JSON)
414  @Produces(MediaType.APPLICATION_XML)
415  public Response doJsonXmlPost(final InputStream inputStream,
416                                @PathParam("endpoint") final String endpoint,
417                                @Context final HttpServletRequest request,
418                                @Context final SecurityContext securityContext,
419                                @Context final HttpHeaders headers,
420                                @Context final UriInfo uriInfo)
421  {
422    final RequestContext requestContext =
423        new RequestContext(request, securityContext, headers, uriInfo,
424                           MediaType.APPLICATION_JSON_TYPE,
425                           MediaType.APPLICATION_XML_TYPE);
426    return postUser(requestContext, endpoint, inputStream);
427  }
428
429
430
431  /**
432   * Implement the PUT operation consuming and producing JSON format.
433   *
434   * @param inputStream      The content to be consumed.
435   * @param endpoint         The resource endpoint.
436   * @param userID           The target user ID.
437   * @param request          The current HTTP servlet request.
438   * @param securityContext  The security context for the request.
439   * @param headers          The request headers.
440   * @param uriInfo          The URI info for the request.
441   *
442   * @return  The response to the request.
443   */
444  @PUT
445  @Path("{userID}")
446  @Consumes(MediaType.APPLICATION_JSON)
447  @Produces(MediaType.APPLICATION_JSON)
448  public Response doJsonJsonPut(final InputStream inputStream,
449                                @PathParam("endpoint") final String endpoint,
450                                @PathParam("userID") final String userID,
451                                @Context final HttpServletRequest request,
452                                @Context final SecurityContext securityContext,
453                                @Context final HttpHeaders headers,
454                                @Context final UriInfo uriInfo)
455  {
456    final RequestContext requestContext =
457        new RequestContext(request, securityContext, headers, uriInfo,
458                           MediaType.APPLICATION_JSON_TYPE,
459                           MediaType.APPLICATION_JSON_TYPE);
460    return putUser(requestContext, endpoint, userID, inputStream);
461  }
462
463
464
465  /**
466   * Implement the PUT operation where the URL specifies JSON format.
467   *
468   * @param inputStream      The content to be consumed.
469   * @param endpoint         The resource endpoint.
470   * @param userID           The target user ID.
471   * @param request          The current HTTP servlet request.
472   * @param securityContext  The security context for the request.
473   * @param headers          The request headers.
474   * @param uriInfo          The URI info for the request.
475   *
476   * @return  The response to the request.
477   */
478  @PUT
479  @Path("{userID}.json")
480  @Consumes(MediaType.APPLICATION_JSON)
481  @Produces(MediaType.APPLICATION_JSON)
482  public Response doDotJsonPut(final InputStream inputStream,
483                               @PathParam("endpoint") final String endpoint,
484                               @PathParam("userID") final String userID,
485                               @Context final HttpServletRequest request,
486                               @Context final SecurityContext securityContext,
487                               @Context final HttpHeaders headers,
488                               @Context final UriInfo uriInfo)
489  {
490    final RequestContext requestContext =
491        new RequestContext(request, securityContext, headers, uriInfo,
492                           MediaType.APPLICATION_JSON_TYPE,
493                           MediaType.APPLICATION_JSON_TYPE);
494    return putUser(requestContext,
495                   endpoint,
496                   userID,
497                   inputStream);
498  }
499
500
501
502  /**
503   * Implement the PUT operation where the URL specifies XML format.
504   *
505   * @param inputStream      The content to be consumed.
506   * @param endpoint         The resource endpoint.
507   * @param userID           The target user ID.
508   * @param request          The current HTTP servlet request.
509   * @param securityContext  The security context for the request.
510   * @param headers          The request headers.
511   * @param uriInfo          The URI info for the request.
512   *
513   * @return  The response to the request.
514   */
515  @PUT
516  @Path("{userID}.xml")
517  @Consumes(MediaType.APPLICATION_XML)
518  @Produces(MediaType.APPLICATION_XML)
519  public Response doDotXmlPut(final InputStream inputStream,
520                              @PathParam("endpoint") final String endpoint,
521                              @PathParam("userID") final String userID,
522                              @Context final HttpServletRequest request,
523                              @Context final SecurityContext securityContext,
524                              @Context final HttpHeaders headers,
525                              @Context final UriInfo uriInfo)
526  {
527    final RequestContext requestContext =
528        new RequestContext(request, securityContext, headers, uriInfo,
529                           MediaType.APPLICATION_XML_TYPE,
530                           MediaType.APPLICATION_XML_TYPE);
531    return putUser(requestContext,
532                   endpoint,
533                   userID,
534                   inputStream);
535  }
536
537
538
539  /**
540   * Implement the PUT operation consuming and producing XML format.
541   *
542   * @param inputStream      The content to be consumed.
543   * @param endpoint         The resource endpoint.
544   * @param userID           The target user ID.
545   * @param request          The current HTTP servlet request.
546   * @param securityContext  The security context for the request.
547   * @param headers          The request headers.
548   * @param uriInfo          The URI info for the request.
549   *
550   * @return  The response to the request.
551   */
552  @PUT
553  @Path("{userID}")
554  @Consumes(MediaType.APPLICATION_XML)
555  @Produces(MediaType.APPLICATION_XML)
556  public Response doXmlXmlPut(final InputStream inputStream,
557                              @PathParam("endpoint") final String endpoint,
558                              @PathParam("userID") final String userID,
559                              @Context final HttpServletRequest request,
560                              @Context final SecurityContext securityContext,
561                              @Context final HttpHeaders headers,
562                              @Context final UriInfo uriInfo)
563  {
564    final RequestContext requestContext =
565        new RequestContext(request, securityContext, headers, uriInfo,
566                           MediaType.APPLICATION_XML_TYPE,
567                           MediaType.APPLICATION_XML_TYPE);
568    return putUser(requestContext, endpoint, userID, inputStream);
569  }
570
571
572
573  /**
574   * Implement the PUT operation consuming XML format and producing JSON
575   * format.
576   *
577   * @param inputStream      The content to be consumed.
578   * @param endpoint         The resource endpoint.
579   * @param userID           The target user ID.
580   * @param request          The current HTTP servlet request.
581   * @param securityContext  The security context for the request.
582   * @param headers          The request headers.
583   * @param uriInfo          The URI info for the request.
584   *
585   * @return  The response to the request.
586   */
587  @PUT
588  @Path("{userID}")
589  @Consumes(MediaType.APPLICATION_XML)
590  @Produces(MediaType.APPLICATION_JSON)
591  public Response doXmlJsonPut(final InputStream inputStream,
592                               @PathParam("endpoint") final String endpoint,
593                               @PathParam("userID") final String userID,
594                               @Context final HttpServletRequest request,
595                               @Context final SecurityContext securityContext,
596                               @Context final HttpHeaders headers,
597                               @Context final UriInfo uriInfo)
598  {
599    final RequestContext requestContext =
600        new RequestContext(request, securityContext, headers, uriInfo,
601                           MediaType.APPLICATION_XML_TYPE,
602                           MediaType.APPLICATION_JSON_TYPE);
603    return putUser(requestContext, endpoint, userID, inputStream);
604  }
605
606
607
608  /**
609   * Implement the PUT operation consuming JSON format and producing XML
610   * format.
611   *
612   * @param inputStream      The content to be consumed.
613   * @param endpoint         The resource endpoint.
614   * @param userID           The target user ID.
615   * @param request          The current HTTP servlet request.
616   * @param securityContext  The security context for the request.
617   * @param headers          The request headers.
618   * @param uriInfo          The URI info for the request.
619   *
620   * @return  The response to the request.
621   */
622  @PUT
623  @Path("{userID}")
624  @Consumes(MediaType.APPLICATION_JSON)
625  @Produces(MediaType.APPLICATION_XML)
626  public Response doJsonXmlPut(final InputStream inputStream,
627                               @PathParam("endpoint") final String endpoint,
628                               @PathParam("userID") final String userID,
629                               @Context final HttpServletRequest request,
630                               @Context final SecurityContext securityContext,
631                               @Context final HttpHeaders headers,
632                               @Context final UriInfo uriInfo)
633  {
634    final RequestContext requestContext =
635        new RequestContext(request, securityContext, headers, uriInfo,
636                           MediaType.APPLICATION_JSON_TYPE,
637                           MediaType.APPLICATION_XML_TYPE);
638    return putUser(requestContext, endpoint, userID, inputStream);
639  }
640
641
642
643  /**
644   * Implement the PATCH operation consuming and producing JSON format.
645   *
646   * @param inputStream      The content to be consumed.
647   * @param endpoint         The resource endpoint.
648   * @param userID           The target user ID.
649   * @param request          The current HTTP servlet request.
650   * @param securityContext  The security context for the request.
651   * @param headers          The request headers.
652   * @param uriInfo          The URI info for the request.
653   *
654   * @return  The response to the request.
655   */
656  @PATCH
657  @Path("{userID}")
658  @Consumes(MediaType.APPLICATION_JSON)
659  @Produces(MediaType.APPLICATION_JSON)
660  public Response doJsonJsonPatch(final InputStream inputStream,
661                                 @PathParam("endpoint") final String endpoint,
662                                 @PathParam("userID") final String userID,
663                                 @Context final HttpServletRequest request,
664                                 @Context final SecurityContext securityContext,
665                                 @Context final HttpHeaders headers,
666                                 @Context final UriInfo uriInfo)
667  {
668    final RequestContext requestContext =
669           new RequestContext(request, securityContext, headers, uriInfo,
670                    MediaType.APPLICATION_JSON_TYPE,
671                    MediaType.APPLICATION_JSON_TYPE);
672    return patchUser(requestContext, endpoint, userID, inputStream);
673  }
674
675
676
677  /**
678   * Implement the PATCH operation consuming and producing XML format.
679   *
680   * @param inputStream      The content to be consumed.
681   * @param endpoint         The resource endpoint.
682   * @param userID           The target user ID.
683   * @param request          The current HTTP servlet request.
684   * @param securityContext  The security context for the request.
685   * @param headers          The request headers.
686   * @param uriInfo          The URI info for the request.
687   *
688   * @return  The response to the request.
689   */
690  @PATCH
691  @Path("{userID}")
692  @Consumes(MediaType.APPLICATION_XML)
693  @Produces(MediaType.APPLICATION_XML)
694  public Response doXmlXmlPatch(final InputStream inputStream,
695                               @PathParam("endpoint") final String endpoint,
696                               @PathParam("userID") final String userID,
697                               @Context final HttpServletRequest request,
698                               @Context final SecurityContext securityContext,
699                               @Context final HttpHeaders headers,
700                               @Context final UriInfo uriInfo)
701  {
702    final RequestContext requestContext =
703           new RequestContext(request, securityContext, headers, uriInfo,
704                    MediaType.APPLICATION_XML_TYPE,
705                    MediaType.APPLICATION_XML_TYPE);
706    return patchUser(requestContext, endpoint, userID, inputStream);
707  }
708
709
710
711  /**
712   * Implement the PATCH operation consuming XML format and producing JSON
713   * format.
714   *
715   * @param inputStream      The content to be consumed.
716   * @param endpoint         The resource endpoint.
717   * @param userID           The target user ID.
718   * @param request          The current HTTP servlet request.
719   * @param securityContext  The security context for the request.
720   * @param headers          The request headers.
721   * @param uriInfo          The URI info for the request.
722   *
723   * @return  The response to the request.
724   */
725  @PATCH
726  @Path("{userID}")
727  @Consumes(MediaType.APPLICATION_XML)
728  @Produces(MediaType.APPLICATION_JSON)
729  public Response doXmlJsonPatch(final InputStream inputStream,
730                                @PathParam("endpoint") final String endpoint,
731                                @PathParam("userID") final String userID,
732                                @Context final HttpServletRequest request,
733                                @Context final SecurityContext securityContext,
734                                @Context final HttpHeaders headers,
735                                @Context final UriInfo uriInfo)
736  {
737    final RequestContext requestContext =
738           new RequestContext(request, securityContext, headers, uriInfo,
739                    MediaType.APPLICATION_XML_TYPE,
740                    MediaType.APPLICATION_JSON_TYPE);
741    return patchUser(requestContext, endpoint, userID, inputStream);
742  }
743
744
745
746  /**
747   * Implement the PATCH operation consuming JSON format and producing XML
748   * format.
749   *
750   * @param inputStream      The content to be consumed.
751   * @param endpoint         The resource endpoint.
752   * @param userID           The target user ID.
753   * @param request          The current HTTP servlet request.
754   * @param securityContext  The security context for the request.
755   * @param headers          The request headers.
756   * @param uriInfo          The URI info for the request.
757   *
758   * @return  The response to the request.
759   */
760  @PATCH
761  @Path("{userID}")
762  @Consumes(MediaType.APPLICATION_JSON)
763  @Produces(MediaType.APPLICATION_XML)
764  public Response doJsonXmlPatch(final InputStream inputStream,
765                                @PathParam("endpoint") final String endpoint,
766                                @PathParam("userID") final String userID,
767                                @Context final HttpServletRequest request,
768                                @Context final SecurityContext securityContext,
769                                @Context final HttpHeaders headers,
770                                @Context final UriInfo uriInfo)
771  {
772    final RequestContext requestContext =
773           new RequestContext(request, securityContext, headers, uriInfo,
774                    MediaType.APPLICATION_JSON_TYPE,
775                    MediaType.APPLICATION_XML_TYPE);
776    return patchUser(requestContext, endpoint, userID, inputStream);
777  }
778
779
780
781  /**
782   * Implement the DELETE operation on a specified user resource producing
783   * JSON format.
784   *
785   * @param endpoint         The resource endpoint.
786   * @param userID           The target user ID.
787   * @param request          The current HTTP servlet request.
788   * @param securityContext  The security context for the request.
789   * @param headers          The request headers.
790   * @param uriInfo          The URI info for the request.
791   *
792   * @return  The response to the request.
793   */
794  @DELETE
795  @Path("{userID}")
796  @Produces(MediaType.APPLICATION_JSON)
797  public Response doJsonDelete(
798                               @PathParam("endpoint") final String endpoint,
799                               @PathParam("userID") final String userID,
800                               @Context final HttpServletRequest request,
801                               @Context final SecurityContext securityContext,
802                               @Context final HttpHeaders headers,
803                               @Context final UriInfo uriInfo)
804  {
805    final RequestContext requestContext =
806        new RequestContext(request, securityContext, headers, uriInfo,
807                           MediaType.APPLICATION_JSON_TYPE,
808                           MediaType.APPLICATION_JSON_TYPE);
809    return deleteUser(requestContext,endpoint, userID);
810  }
811
812
813
814  /**
815   * Implement the DELETE operation on a specified user resource producing
816   * XML format.
817   *
818   * @param endpoint         The resource endpoint.
819   * @param userID           The target user ID.
820   * @param request          The current HTTP servlet request.
821   * @param securityContext  The security context for the request.
822   * @param headers          The request headers.
823   * @param uriInfo          The URI info for the request.
824   *
825   * @return  The response to the request.
826   */
827  @DELETE
828  @Path("{userID}")
829  @Produces(MediaType.APPLICATION_XML)
830  public Response doXmlDelete(
831                              @PathParam("endpoint") final String endpoint,
832                              @PathParam("userID") final String userID,
833                              @Context final HttpServletRequest request,
834                              @Context final SecurityContext securityContext,
835                              @Context final HttpHeaders headers,
836                              @Context final UriInfo uriInfo)
837  {
838    final RequestContext requestContext =
839        new RequestContext(request, securityContext, headers, uriInfo,
840                           MediaType.APPLICATION_XML_TYPE,
841                           MediaType.APPLICATION_XML_TYPE);
842    return deleteUser(requestContext, endpoint, userID);
843  }
844
845
846
847  /**
848   * Implement the DELETE operation on a specified user resource where the URL
849   * specifies JSON content type.
850   *
851   * @param endpoint         The resource endpoint.
852   * @param userID           The target user ID.
853   * @param request          The current HTTP servlet request.
854   * @param securityContext  The security context for the request.
855   * @param headers          The request headers.
856   * @param uriInfo          The URI info for the request.
857   *
858   * @return  The response to the request.
859   */
860  @DELETE
861  @Path("{userID}.json")
862  @Produces(MediaType.APPLICATION_JSON)
863  public Response doDotJsonDelete(@PathParam("endpoint") final String endpoint,
864                                  @PathParam("userID") final String userID,
865                                  @Context final HttpServletRequest request,
866                                  @Context
867                                  final SecurityContext securityContext,
868                                  @Context final HttpHeaders headers,
869                                  @Context final UriInfo uriInfo)
870  {
871    final RequestContext requestContext =
872        new RequestContext(request, securityContext, headers, uriInfo,
873                           MediaType.APPLICATION_JSON_TYPE,
874                           MediaType.APPLICATION_JSON_TYPE);
875    return deleteUser(requestContext, endpoint, userID);
876  }
877
878
879
880  /**
881   * Implement the DELETE operation on a specified user resource where the URL
882   * specifies XML content type.
883   *
884   * @param endpoint         The resource endpoint.
885   * @param userID           The target user ID.
886   * @param request          The current HTTP servlet request.
887   * @param securityContext  The security context for the request.
888   * @param headers          The request headers.
889   * @param uriInfo          The URI info for the request.
890   *
891   * @return  The response to the request.
892   */
893  @DELETE
894  @Path("{userID}.xml")
895  @Produces(MediaType.APPLICATION_XML)
896  public Response doDotXmlDelete(@PathParam("endpoint") final String endpoint,
897                                 @PathParam("userID") final String userID,
898                                 @Context final HttpServletRequest request,
899                                 @Context final SecurityContext securityContext,
900                                 @Context final HttpHeaders headers,
901                                 @Context final UriInfo uriInfo)
902  {
903    final RequestContext requestContext =
904        new RequestContext(request, securityContext, headers, uriInfo,
905                           MediaType.APPLICATION_XML_TYPE,
906                           MediaType.APPLICATION_XML_TYPE);
907    return deleteUser(requestContext, endpoint, userID);
908  }
909}