001    /*
002     * Copyright 2011-2012 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    
018    package com.unboundid.scim.wink;
019    
020    import com.unboundid.scim.schema.ResourceDescriptor;
021    import com.unboundid.scim.sdk.SCIMBackend;
022    
023    import javax.servlet.ServletContext;
024    import javax.ws.rs.Consumes;
025    import javax.ws.rs.DELETE;
026    import javax.ws.rs.GET;
027    import javax.ws.rs.POST;
028    import javax.ws.rs.PUT;
029    import javax.ws.rs.Path;
030    import javax.ws.rs.PathParam;
031    import javax.ws.rs.Produces;
032    import javax.ws.rs.QueryParam;
033    import javax.ws.rs.core.Context;
034    import javax.ws.rs.core.HttpHeaders;
035    import javax.ws.rs.core.MediaType;
036    import javax.ws.rs.core.Response;
037    import javax.ws.rs.core.SecurityContext;
038    import javax.ws.rs.core.UriInfo;
039    import java.io.InputStream;
040    
041    import static com.unboundid.scim.sdk.SCIMConstants.QUERY_PARAMETER_FILTER;
042    import static com.unboundid.scim.sdk.SCIMConstants.QUERY_PARAMETER_PAGE_SIZE;
043    import static com.unboundid.scim.sdk.SCIMConstants.
044        QUERY_PARAMETER_PAGE_START_INDEX;
045    import static com.unboundid.scim.sdk.SCIMConstants.QUERY_PARAMETER_SORT_BY;
046    import static com.unboundid.scim.sdk.SCIMConstants.QUERY_PARAMETER_SORT_ORDER;
047    
048    
049    
050    /**
051     * This class is a Wink dynamic resource implementation for operations
052     * on a SCIM resource. The set of supported resources and their endpoints
053     * are not known until run-time hence it must be implemented as a dynamic
054     * resource.
055     */
056    public class SCIMResource extends AbstractSCIMResource
057    {
058      /**
059       * Create a new SCIM wink resource for operations on a SCIM endpoint.
060       *
061       * @param resourceDescriptor  The resource descriptor to use.
062       * @param resourceStats       The ResourceStats instance to use.
063       * @param backend             The SCIMBackend to use to process requests.
064       */
065      public SCIMResource(final ResourceDescriptor resourceDescriptor,
066                          final ResourceStats resourceStats,
067                          final SCIMBackend backend)
068      {
069        super(resourceDescriptor.getEndpoint(), resourceDescriptor,
070              resourceStats, backend);
071      }
072    
073    
074    
075      /**
076       * Implement the GET query operation producing JSON format.
077       *
078       * @param servletContext   The servlet context of the current request.
079       * @param securityContext  The security context of the current request.
080       * @param headers          The request headers.
081       * @param uriInfo          The URI info for the request.
082       * @param filterString     The filter query parameter, or {@code null}.
083       * @param sortBy           The sortBy query parameter, or {@code null}.
084       * @param sortOrder        The sortOrder query parameter, or {@code null}.
085       * @param pageStartIndex   The startIndex query parameter, or {@code null}.
086       * @param pageSize         The count query parameter, or {@code null}.
087       *
088       * @return  The response to the request.
089       */
090      @GET
091      @Produces(MediaType.APPLICATION_JSON)
092      public Response doJsonGet(@Context final ServletContext servletContext,
093                                @Context final SecurityContext securityContext,
094                                @Context final HttpHeaders headers,
095                                @Context final UriInfo uriInfo,
096                                @QueryParam(QUERY_PARAMETER_FILTER)
097                                final String filterString,
098                                @QueryParam(QUERY_PARAMETER_SORT_BY)
099                                final String sortBy,
100                                @QueryParam(QUERY_PARAMETER_SORT_ORDER)
101                                final String sortOrder,
102                                @QueryParam(QUERY_PARAMETER_PAGE_START_INDEX)
103                                final String pageStartIndex,
104                                @QueryParam(QUERY_PARAMETER_PAGE_SIZE)
105                                final String pageSize)
106      {
107        final RequestContext requestContext =
108            new RequestContext(servletContext, securityContext, headers, uriInfo,
109                               MediaType.APPLICATION_JSON_TYPE,
110                               MediaType.APPLICATION_JSON_TYPE);
111    
112        return getUsers(requestContext, filterString, sortBy, sortOrder,
113                        pageStartIndex, pageSize);
114      }
115    
116    
117    
118      /**
119       * Implement the GET query operation producing XML format.
120       *
121       * @param servletContext   The servlet context of the current request.
122       * @param securityContext  The security context of the current request.
123       * @param headers          The request headers.
124       * @param uriInfo          The URI info for the request.
125       * @param filterString     The filter query parameter, or {@code null}.
126       * @param sortBy           The sortBy query parameter, or {@code null}.
127       * @param sortOrder        The sortOrder query parameter, or {@code null}.
128       * @param pageStartIndex   The startIndex query parameter, or {@code null}.
129       * @param pageSize         The count query parameter, or {@code null}.
130       *
131       * @return  The response to the request.
132       */
133      @GET
134      @Produces(MediaType.APPLICATION_XML)
135      public Response doXmlGet(@Context final ServletContext servletContext,
136                               @Context final SecurityContext securityContext,
137                               @Context final HttpHeaders headers,
138                               @Context final UriInfo uriInfo,
139                               @QueryParam(QUERY_PARAMETER_FILTER)
140                               final String filterString,
141                               @QueryParam(QUERY_PARAMETER_SORT_BY)
142                               final String sortBy,
143                               @QueryParam(QUERY_PARAMETER_SORT_ORDER)
144                               final String sortOrder,
145                               @QueryParam(QUERY_PARAMETER_PAGE_START_INDEX)
146                               final String pageStartIndex,
147                               @QueryParam(QUERY_PARAMETER_PAGE_SIZE)
148                               final String pageSize)
149      {
150        final RequestContext requestContext =
151            new RequestContext(servletContext, securityContext, headers, uriInfo,
152                               MediaType.APPLICATION_XML_TYPE,
153                               MediaType.APPLICATION_XML_TYPE);
154    
155        return getUsers(requestContext, filterString, sortBy, sortOrder,
156                        pageStartIndex, pageSize);
157      }
158    
159    
160    
161      /**
162       * Implement the GET operation on a specified user resource producing
163       * JSON format.
164       *
165       * @param userID           The requested user ID.
166       * @param servletContext   The servlet context for the request.
167       * @param securityContext  The security context for the request.
168       * @param headers          The request headers.
169       * @param uriInfo          The URI info for the request.
170       *
171       * @return  The response to the request.
172       */
173      @GET
174      @Path("{userID}")
175      @Produces(MediaType.APPLICATION_JSON)
176      public Response doJsonGet(@PathParam("userID") final String userID,
177                                @Context final ServletContext servletContext,
178                                @Context final SecurityContext securityContext,
179                                @Context final HttpHeaders headers,
180                                @Context final UriInfo uriInfo)
181      {
182        final RequestContext requestContext =
183            new RequestContext(servletContext, securityContext, headers, uriInfo,
184                               MediaType.APPLICATION_JSON_TYPE,
185                               MediaType.APPLICATION_JSON_TYPE);
186        return getUser(requestContext, userID);
187      }
188    
189    
190    
191      /**
192       * Implement the GET operation on a specified user resource producing
193       * XML format.
194       *
195       * @param userID           The requested user ID.
196       * @param servletContext   The servlet context for the request.
197       * @param securityContext  The security context for the request.
198       * @param headers          The request headers.
199       * @param uriInfo          The URI info for the request.
200       *
201       * @return  The response to the request.
202       */
203      @GET
204      @Path("{userID}")
205      @Produces(MediaType.APPLICATION_XML)
206      public Response doXmlGet(@PathParam("userID") final String userID,
207                               @Context final ServletContext servletContext,
208                               @Context final SecurityContext securityContext,
209                               @Context final HttpHeaders headers,
210                               @Context final UriInfo uriInfo)
211      {
212        final RequestContext requestContext =
213            new RequestContext(servletContext, securityContext, headers, uriInfo,
214                               MediaType.APPLICATION_XML_TYPE,
215                               MediaType.APPLICATION_XML_TYPE);
216        return getUser(requestContext, userID);
217      }
218    
219    
220    
221      /**
222       * Implement the GET operation on a specified user resource where the URL
223       * specifies JSON content type.
224       *
225       * @param userID           The requested user ID.
226       * @param servletContext   The servlet context for the request.
227       * @param securityContext  The security context for the request.
228       * @param headers          The request headers.
229       * @param uriInfo          The URI info for the request.
230       *
231       * @return  The response to the request.
232       */
233      @GET
234      @Path("{userID}.json")
235      @Produces(MediaType.APPLICATION_JSON)
236      public Response doDotJsonGet(@PathParam("userID") final String userID,
237                                   @Context final ServletContext servletContext,
238                                   @Context final SecurityContext securityContext,
239                                   @Context final HttpHeaders headers,
240                                   @Context final UriInfo uriInfo)
241      {
242        final RequestContext requestContext =
243            new RequestContext(servletContext, securityContext, headers, uriInfo,
244                               MediaType.APPLICATION_JSON_TYPE,
245                               MediaType.APPLICATION_JSON_TYPE);
246        return getUser(requestContext, userID);
247      }
248    
249    
250    
251      /**
252       * Implement the GET operation on a specified user resource where the URL
253       * specifies XML content type.
254       *
255       * @param userID           The requested user ID.
256       * @param servletContext   The servlet context for the request.
257       * @param securityContext  The security context for the request.
258       * @param headers          The request headers.
259       * @param uriInfo          The URI info for the request.
260       *
261       * @return  The response to the request.
262       */
263      @GET
264      @Path("{userID}.xml")
265      @Produces(MediaType.APPLICATION_XML)
266      public Response doDotXmlGet(@PathParam("userID") final String userID,
267                                  @Context final ServletContext servletContext,
268                                  @Context final SecurityContext securityContext,
269                                  @Context final HttpHeaders headers,
270                                  @Context final UriInfo uriInfo)
271      {
272        final RequestContext requestContext =
273            new RequestContext(servletContext, securityContext, headers, uriInfo,
274                               MediaType.APPLICATION_XML_TYPE,
275                               MediaType.APPLICATION_XML_TYPE);
276        return getUser(requestContext, userID);
277      }
278    
279    
280    
281      /**
282       * Implement the POST operation consuming and producing JSON format.
283       *
284       * @param inputStream      The content to be consumed.
285       * @param servletContext   The servlet context for the request.
286       * @param securityContext  The security context for the request.
287       * @param headers          The request headers.
288       * @param uriInfo          The URI info for the request.
289       *
290       * @return  The response to the request.
291       */
292      @POST
293      @Consumes(MediaType.APPLICATION_JSON)
294      @Produces(MediaType.APPLICATION_JSON)
295      public Response doJsonJsonPost(final InputStream inputStream,
296                                     @Context final ServletContext servletContext,
297                                     @Context final SecurityContext securityContext,
298                                     @Context final HttpHeaders headers,
299                                     @Context final UriInfo uriInfo)
300      {
301        final RequestContext requestContext =
302            new RequestContext(servletContext, securityContext, headers, uriInfo,
303                               MediaType.APPLICATION_JSON_TYPE,
304                               MediaType.APPLICATION_JSON_TYPE);
305        return postUser(requestContext, inputStream);
306      }
307    
308    
309    
310      /**
311       * Implement the POST operation consuming and producing XML format.
312       *
313       * @param inputStream      The content to be consumed.
314       * @param servletContext   The servlet context for the request.
315       * @param securityContext  The security context for the request.
316       * @param headers          The request headers.
317       * @param uriInfo          The URI info for the request.
318       *
319       * @return  The response to the request.
320       */
321      @POST
322      @Consumes(MediaType.APPLICATION_XML)
323      @Produces(MediaType.APPLICATION_XML)
324      public Response doXmlXmlPost(final InputStream inputStream,
325                                   @Context final ServletContext servletContext,
326                                   @Context final SecurityContext securityContext,
327                                   @Context final HttpHeaders headers,
328                                   @Context final UriInfo uriInfo)
329      {
330        final RequestContext requestContext =
331            new RequestContext(servletContext, securityContext, headers, uriInfo,
332                               MediaType.APPLICATION_XML_TYPE,
333                               MediaType.APPLICATION_XML_TYPE);
334        return postUser(requestContext, inputStream);
335      }
336    
337    
338    
339      /**
340       * Implement the POST operation consuming XML format and producing JSON
341       * format.
342       *
343       * @param inputStream      The content to be consumed.
344       * @param servletContext   The servlet context for the request.
345       * @param securityContext  The security context for the request.
346       * @param headers          The request headers.
347       * @param uriInfo          The URI info for the request.
348       *
349       * @return  The response to the request.
350       */
351      @POST
352      @Consumes(MediaType.APPLICATION_XML)
353      @Produces(MediaType.APPLICATION_JSON)
354      public Response doXmlJsonPost(final InputStream inputStream,
355                                    @Context final ServletContext servletContext,
356                                    @Context final SecurityContext securityContext,
357                                    @Context final HttpHeaders headers,
358                                    @Context final UriInfo uriInfo)
359      {
360        final RequestContext requestContext =
361            new RequestContext(servletContext, securityContext, headers, uriInfo,
362                               MediaType.APPLICATION_XML_TYPE,
363                               MediaType.APPLICATION_JSON_TYPE);
364        return postUser(requestContext, inputStream);
365      }
366    
367    
368    
369      /**
370       * Implement the POST operation consuming JSON format and producing XML
371       * format.
372       *
373       * @param inputStream      The content to be consumed.
374       * @param servletContext   The servlet context for the request.
375       * @param securityContext  The security context for the request.
376       * @param headers          The request headers.
377       * @param uriInfo          The URI info for the request.
378       *
379       * @return  The response to the request.
380       */
381      @POST
382      @Consumes(MediaType.APPLICATION_JSON)
383      @Produces(MediaType.APPLICATION_XML)
384      public Response doJsonXmlPost(final InputStream inputStream,
385                                    @Context final ServletContext servletContext,
386                                    @Context final SecurityContext securityContext,
387                                    @Context final HttpHeaders headers,
388                                    @Context final UriInfo uriInfo)
389      {
390        final RequestContext requestContext =
391            new RequestContext(servletContext, securityContext, headers, uriInfo,
392                               MediaType.APPLICATION_JSON_TYPE,
393                               MediaType.APPLICATION_XML_TYPE);
394        return postUser(requestContext, inputStream);
395      }
396    
397    
398    
399      /**
400       * Implement the PUT operation consuming and producing JSON format.
401       *
402       * @param inputStream      The content to be consumed.
403       * @param userID           The target user ID.
404       * @param servletContext   The servlet context for the request.
405       * @param securityContext  The security context for the request.
406       * @param headers          The request headers.
407       * @param uriInfo          The URI info for the request.
408       *
409       * @return  The response to the request.
410       */
411      @PUT
412      @Path("{userID}")
413      @Consumes(MediaType.APPLICATION_JSON)
414      @Produces(MediaType.APPLICATION_JSON)
415      public Response doJsonJsonPut(final InputStream inputStream,
416                                    @PathParam("userID") final String userID,
417                                    @Context final ServletContext servletContext,
418                                    @Context final SecurityContext securityContext,
419                                    @Context final HttpHeaders headers,
420                                    @Context final UriInfo uriInfo)
421      {
422        final RequestContext requestContext =
423            new RequestContext(servletContext, securityContext, headers, uriInfo,
424                               MediaType.APPLICATION_JSON_TYPE,
425                               MediaType.APPLICATION_JSON_TYPE);
426        return putUser(requestContext, userID, inputStream);
427      }
428    
429    
430    
431      /**
432       * Implement the PUT operation where the URL specifies JSON format.
433       *
434       * @param inputStream      The content to be consumed.
435       * @param userID           The target user ID.
436       * @param servletContext   The servlet context for the request.
437       * @param securityContext  The security context for the request.
438       * @param headers          The request headers.
439       * @param uriInfo          The URI info for the request.
440       *
441       * @return  The response to the request.
442       */
443      @PUT
444      @Path("{userID}.json")
445      @Consumes(MediaType.APPLICATION_JSON)
446      @Produces(MediaType.APPLICATION_JSON)
447      public Response doDotJsonPut(final InputStream inputStream,
448                                   @PathParam("userID") final String userID,
449                                   @Context final ServletContext servletContext,
450                                   @Context final SecurityContext securityContext,
451                                   @Context final HttpHeaders headers,
452                                   @Context final UriInfo uriInfo)
453      {
454        final RequestContext requestContext =
455            new RequestContext(servletContext, securityContext, headers, uriInfo,
456                               MediaType.APPLICATION_JSON_TYPE,
457                               MediaType.APPLICATION_JSON_TYPE);
458        return putUser(requestContext,
459                       userID,
460                       inputStream);
461      }
462    
463    
464    
465      /**
466       * Implement the PUT operation where the URL specifies XML format.
467       *
468       * @param inputStream      The content to be consumed.
469       * @param userID           The target user ID.
470       * @param servletContext   The servlet context for the request.
471       * @param securityContext  The security context for the request.
472       * @param headers          The request headers.
473       * @param uriInfo          The URI info for the request.
474       *
475       * @return  The response to the request.
476       */
477      @PUT
478      @Path("{userID}.xml")
479      @Consumes(MediaType.APPLICATION_XML)
480      @Produces(MediaType.APPLICATION_XML)
481      public Response doDotXmlPut(final InputStream inputStream,
482                                  @PathParam("userID") final String userID,
483                                  @Context final ServletContext servletContext,
484                                  @Context final SecurityContext securityContext,
485                                  @Context final HttpHeaders headers,
486                                  @Context final UriInfo uriInfo)
487      {
488        final RequestContext requestContext =
489            new RequestContext(servletContext, securityContext, headers, uriInfo,
490                               MediaType.APPLICATION_XML_TYPE,
491                               MediaType.APPLICATION_XML_TYPE);
492        return putUser(requestContext,
493                       userID,
494                       inputStream);
495      }
496    
497    
498    
499      /**
500       * Implement the PUT operation consuming and producing XML format.
501       *
502       * @param inputStream      The content to be consumed.
503       * @param userID           The target user ID.
504       * @param servletContext   The servlet context for the request.
505       * @param securityContext  The security context for the request.
506       * @param headers          The request headers.
507       * @param uriInfo          The URI info for the request.
508       *
509       * @return  The response to the request.
510       */
511      @PUT
512      @Path("{userID}")
513      @Consumes(MediaType.APPLICATION_XML)
514      @Produces(MediaType.APPLICATION_XML)
515      public Response doXmlXmlPut(final InputStream inputStream,
516                                  @PathParam("userID") final String userID,
517                                  @Context final ServletContext servletContext,
518                                  @Context final SecurityContext securityContext,
519                                  @Context final HttpHeaders headers,
520                                  @Context final UriInfo uriInfo)
521      {
522        final RequestContext requestContext =
523            new RequestContext(servletContext, securityContext, headers, uriInfo,
524                               MediaType.APPLICATION_XML_TYPE,
525                               MediaType.APPLICATION_XML_TYPE);
526        return putUser(requestContext, userID, inputStream);
527      }
528    
529    
530    
531      /**
532       * Implement the PUT operation consuming XML format and producing JSON
533       * format.
534       *
535       * @param inputStream      The content to be consumed.
536       * @param userID           The target user ID.
537       * @param servletContext   The servlet context for the request.
538       * @param securityContext  The security context for the request.
539       * @param headers          The request headers.
540       * @param uriInfo          The URI info for the request.
541       *
542       * @return  The response to the request.
543       */
544      @PUT
545      @Path("{userID}")
546      @Consumes(MediaType.APPLICATION_XML)
547      @Produces(MediaType.APPLICATION_JSON)
548      public Response doXmlJsonPut(final InputStream inputStream,
549                                   @PathParam("userID") final String userID,
550                                   @Context final ServletContext servletContext,
551                                   @Context final SecurityContext securityContext,
552                                   @Context final HttpHeaders headers,
553                                   @Context final UriInfo uriInfo)
554      {
555        final RequestContext requestContext =
556            new RequestContext(servletContext, securityContext, headers, uriInfo,
557                               MediaType.APPLICATION_XML_TYPE,
558                               MediaType.APPLICATION_JSON_TYPE);
559        return putUser(requestContext, userID, inputStream);
560      }
561    
562    
563    
564      /**
565       * Implement the PUT operation consuming JSON format and producing XML
566       * format.
567       *
568       * @param inputStream      The content to be consumed.
569       * @param userID           The target user ID.
570       * @param servletContext   The servlet context for the request.
571       * @param securityContext  The security context for the request.
572       * @param headers          The request headers.
573       * @param uriInfo          The URI info for the request.
574       *
575       * @return  The response to the request.
576       */
577      @PUT
578      @Path("{userID}")
579      @Consumes(MediaType.APPLICATION_JSON)
580      @Produces(MediaType.APPLICATION_XML)
581      public Response doJsonXmlPut(final InputStream inputStream,
582                                   @PathParam("userID") final String userID,
583                                   @Context final ServletContext servletContext,
584                                   @Context final SecurityContext securityContext,
585                                   @Context final HttpHeaders headers,
586                                   @Context final UriInfo uriInfo)
587      {
588        final RequestContext requestContext =
589            new RequestContext(servletContext, securityContext, headers, uriInfo,
590                               MediaType.APPLICATION_JSON_TYPE,
591                               MediaType.APPLICATION_XML_TYPE);
592        return putUser(requestContext, userID, inputStream);
593      }
594    
595    
596    
597      /**
598       * Implement the DELETE operation on a specified user resource producing
599       * JSON format.
600       *
601       * @param userID           The target user ID.
602       * @param servletContext   The servlet context for the request.
603       * @param securityContext  The security context for the request.
604       * @param headers          The request headers.
605       * @param uriInfo          The URI info for the request.
606       *
607       * @return  The response to the request.
608       */
609      @DELETE
610      @Path("{userID}")
611      @Produces(MediaType.APPLICATION_JSON)
612      public Response doJsonDelete(@PathParam("userID") final String userID,
613                                   @Context final ServletContext servletContext,
614                                   @Context final SecurityContext securityContext,
615                                   @Context final HttpHeaders headers,
616                                   @Context final UriInfo uriInfo)
617      {
618        final RequestContext requestContext =
619            new RequestContext(servletContext, securityContext, headers, uriInfo,
620                               MediaType.APPLICATION_JSON_TYPE,
621                               MediaType.APPLICATION_JSON_TYPE);
622        return deleteUser(requestContext, userID);
623      }
624    
625    
626    
627      /**
628       * Implement the DELETE operation on a specified user resource producing
629       * XML format.
630       *
631       * @param userID           The target user ID.
632       * @param servletContext   The servlet context for the request.
633       * @param securityContext  The security context for the request.
634       * @param headers          The request headers.
635       * @param uriInfo          The URI info for the request.
636       *
637       * @return  The response to the request.
638       */
639      @DELETE
640      @Path("{userID}")
641      @Produces(MediaType.APPLICATION_XML)
642      public Response doXmlDelete(@PathParam("userID") final String userID,
643                                  @Context final ServletContext servletContext,
644                                  @Context final SecurityContext securityContext,
645                                  @Context final HttpHeaders headers,
646                                  @Context final UriInfo uriInfo)
647      {
648        final RequestContext requestContext =
649            new RequestContext(servletContext, securityContext, headers, uriInfo,
650                               MediaType.APPLICATION_XML_TYPE,
651                               MediaType.APPLICATION_XML_TYPE);
652        return deleteUser(requestContext, userID);
653      }
654    
655    
656    
657      /**
658       * Implement the DELETE operation on a specified user resource where the URL
659       * specifies JSON content type.
660       *
661       * @param userID           The target user ID.
662       * @param servletContext   The servlet context for the request.
663       * @param securityContext  The security context for the request.
664       * @param headers          The request headers.
665       * @param uriInfo          The URI info for the request.
666       *
667       * @return  The response to the request.
668       */
669      @DELETE
670      @Path("{userID}.json")
671      @Produces(MediaType.APPLICATION_JSON)
672      public Response doDotJsonDelete(@PathParam("userID") final String userID,
673                                      @Context
674                                      final ServletContext servletContext,
675                                      @Context
676                                      final SecurityContext securityContext,
677                                      @Context final HttpHeaders headers,
678                                      @Context final UriInfo uriInfo)
679      {
680        final RequestContext requestContext =
681            new RequestContext(servletContext, securityContext, headers, uriInfo,
682                               MediaType.APPLICATION_JSON_TYPE,
683                               MediaType.APPLICATION_JSON_TYPE);
684        return deleteUser(requestContext, userID);
685      }
686    
687    
688    
689      /**
690       * Implement the DELETE operation on a specified user resource where the URL
691       * specifies XML content type.
692       *
693       * @param userID           The target user ID.
694       * @param servletContext   The servlet context for the request.
695       * @param securityContext  The security context for the request.
696       * @param headers          The request headers.
697       * @param uriInfo          The URI info for the request.
698       *
699       * @return  The response to the request.
700       */
701      @DELETE
702      @Path("{userID}.xml")
703      @Produces(MediaType.APPLICATION_XML)
704      public Response doDotXmlDelete(@PathParam("userID") final String userID,
705                                     @Context final ServletContext servletContext,
706                                     @Context final SecurityContext securityContext,
707                                     @Context final HttpHeaders headers,
708                                     @Context final UriInfo uriInfo)
709      {
710        final RequestContext requestContext =
711            new RequestContext(servletContext, securityContext, headers, uriInfo,
712                               MediaType.APPLICATION_XML_TYPE,
713                               MediaType.APPLICATION_XML_TYPE);
714        return deleteUser(requestContext, userID);
715      }
716    }