2 * This document is a part of the source code and related artifacts
3 * for CollectionSpace, an open source collections management system
4 * for museums and related institutions:
6 * http://www.collectionspace.org
7 * http://wiki.collectionspace.org
9 * Copyright 2009 University of California at Berkeley
11 * Licensed under the Educational Community License (ECL), Version 2.0.
12 * You may not use this file except in compliance with this License.
14 * You may obtain a copy of the ECL 2.0 License at
16 * https://source.collectionspace.org/collection-space/LICENSE.txt
18 * Unless required by applicable law or agreed to in writing, software
19 * distributed under the License is distributed on an "AS IS" BASIS,
20 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21 * See the License for the specific language governing permissions and
22 * limitations under the License.
24 package org.collectionspace.services.person;
26 import java.util.List;
28 import javax.ws.rs.Consumes;
29 import javax.ws.rs.DELETE;
30 import javax.ws.rs.GET;
31 import javax.ws.rs.POST;
32 import javax.ws.rs.PUT;
33 import javax.ws.rs.Path;
34 import javax.ws.rs.PathParam;
35 import javax.ws.rs.Produces;
36 import javax.ws.rs.QueryParam;
37 import javax.ws.rs.WebApplicationException;
38 import javax.ws.rs.core.Context;
39 import javax.ws.rs.core.MultivaluedMap;
40 import javax.ws.rs.core.Response;
41 import javax.ws.rs.core.UriBuilder;
42 import javax.ws.rs.core.UriInfo;
44 import org.collectionspace.services.PersonAuthorityJAXBSchema;
45 import org.collectionspace.services.PersonJAXBSchema;
46 import org.collectionspace.services.common.AbstractMultiPartCollectionSpaceResourceImpl;
47 import org.collectionspace.services.common.ClientType;
48 import org.collectionspace.services.common.ServiceMain;
49 import org.collectionspace.services.common.authorityref.AuthorityRefDocList;
50 import org.collectionspace.services.common.context.ServiceBindingUtils;
51 import org.collectionspace.services.common.context.ServiceContext;
52 import org.collectionspace.services.common.document.BadRequestException;
53 import org.collectionspace.services.common.document.DocumentFilter;
54 import org.collectionspace.services.common.document.DocumentHandler;
55 import org.collectionspace.services.common.document.DocumentNotFoundException;
56 import org.collectionspace.services.common.document.DocumentWrapper;
57 import org.collectionspace.services.common.repository.RepositoryClient;
58 import org.collectionspace.services.common.security.UnauthorizedException;
59 import org.collectionspace.services.common.vocabulary.RefNameServiceUtils;
60 import org.collectionspace.services.common.query.IQueryManager;
61 import org.collectionspace.services.contact.ContactResource;
62 import org.collectionspace.services.contact.ContactsCommon;
63 import org.collectionspace.services.contact.ContactsCommonList;
64 import org.collectionspace.services.contact.ContactJAXBSchema;
65 import org.collectionspace.services.contact.nuxeo.ContactDocumentModelHandler;
66 import org.collectionspace.services.person.nuxeo.PersonDocumentModelHandler;
68 import org.jboss.resteasy.plugins.providers.multipart.MultipartInput;
69 import org.jboss.resteasy.plugins.providers.multipart.MultipartOutput;
70 import org.jboss.resteasy.util.HttpResponseCodes;
72 import org.nuxeo.ecm.core.api.DocumentModel;
74 import org.slf4j.Logger;
75 import org.slf4j.LoggerFactory;
78 * The Class PersonAuthorityResource.
80 @Path("/personauthorities")
81 @Consumes("multipart/mixed")
82 @Produces("multipart/mixed")
83 public class PersonAuthorityResource extends
84 AbstractMultiPartCollectionSpaceResourceImpl {
86 /** The Constant personAuthorityServiceName. */
87 private final static String personAuthorityServiceName = "personauthorities";
89 /** The Constant personServiceName. */
90 private final static String personServiceName = "persons";
93 final Logger logger = LoggerFactory.getLogger(PersonAuthorityResource.class);
94 //FIXME retrieve client type from configuration
95 /** The Constant CLIENT_TYPE. */
96 final static ClientType CLIENT_TYPE = ServiceMain.getInstance().getClientType();
98 /** The contact resource. */
99 private ContactResource contactResource = new ContactResource();
102 * Instantiates a new person authority resource.
104 public PersonAuthorityResource() {
109 * @see org.collectionspace.services.common.AbstractCollectionSpaceResourceImpl#getVersionString()
112 protected String getVersionString() {
113 /** The last change revision. */
114 final String lastChangeRevision = "$LastChangedRevision$";
115 return lastChangeRevision;
119 * @see org.collectionspace.services.common.AbstractCollectionSpaceResourceImpl#getServiceName()
122 public String getServiceName() {
123 return personAuthorityServiceName;
127 public Class<PersonauthoritiesCommon> getCommonPartClass() {
128 return PersonauthoritiesCommon.class;
132 * Gets the item service name.
134 * @return the item service name
136 public String getItemServiceName() {
137 return personServiceName;
141 * Gets the contact service name.
143 * @return the contact service name
145 public String getContactServiceName() {
146 return contactResource.getServiceName();
150 * Creates the item document handler.
153 * @param inAuthority the in authority
155 * @return the document handler
157 * @throws Exception the exception
159 private DocumentHandler createItemDocumentHandler(ServiceContext<MultipartInput, MultipartOutput> ctx,
160 String inAuthority) throws Exception {
161 PersonDocumentModelHandler docHandler = (PersonDocumentModelHandler)createDocumentHandler(ctx,
162 ctx.getCommonPartLabel(getItemServiceName()),
163 PersonsCommon.class);
164 docHandler.setInAuthority(inAuthority);
170 * Creates the contact document handler.
173 * @param inAuthority the in authority
174 * @param inItem the in item
176 * @return the document handler
178 * @throws Exception the exception
180 private DocumentHandler createContactDocumentHandler(
181 ServiceContext<MultipartInput, MultipartOutput> ctx, String inAuthority,
182 String inItem) throws Exception {
183 ContactDocumentModelHandler docHandler = (ContactDocumentModelHandler)createDocumentHandler(ctx,
184 ctx.getCommonPartLabel(getContactServiceName()),
185 ContactsCommon.class);
186 docHandler.setInAuthority(inAuthority);
187 docHandler.setInItem(inItem);
193 * Creates the person authority.
195 * @param input the input
197 * @return the response
200 public Response createPersonAuthority(MultipartInput input) {
202 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext(input);
203 DocumentHandler handler = createDocumentHandler(ctx);
204 String csid = getRepositoryClient(ctx).create(ctx, handler);
205 //personAuthorityObject.setCsid(csid);
206 UriBuilder path = UriBuilder.fromResource(PersonAuthorityResource.class);
207 path.path("" + csid);
208 Response response = Response.created(path.build()).build();
210 } catch (BadRequestException bre) {
211 Response response = Response.status(
212 Response.Status.BAD_REQUEST).entity("Create failed reason " + bre.getErrorReason()).type("text/plain").build();
213 throw new WebApplicationException(response);
214 } catch (UnauthorizedException ue) {
215 Response response = Response.status(
216 Response.Status.UNAUTHORIZED).entity("Create failed reason " + ue.getErrorReason()).type("text/plain").build();
217 throw new WebApplicationException(response);
218 } catch (Exception e) {
219 if (logger.isDebugEnabled()) {
220 logger.debug("Caught exception in createPersonAuthority", e);
222 Response response = Response.status(
223 Response.Status.INTERNAL_SERVER_ERROR).entity("Create failed").type("text/plain").build();
224 throw new WebApplicationException(response);
229 * Gets the person authority by name.
231 * @param specifier the specifier
233 * @return the person authority by name
236 @Path("urn:cspace:name({specifier})")
237 public MultipartOutput getPersonAuthorityByName(@PathParam("specifier") String specifier) {
238 if (specifier == null) {
239 logger.error("getPersonAuthority: missing name!");
240 Response response = Response.status(Response.Status.BAD_REQUEST).entity(
241 "get failed on PersonAuthority (missing specifier)").type(
242 "text/plain").build();
243 throw new WebApplicationException(response);
246 PersonAuthorityJAXBSchema.PERSONAUTHORITIES_COMMON+
247 ":"+PersonAuthorityJAXBSchema.DISPLAY_NAME+
249 // We only get a single doc - if there are multiple,
250 // it is an error in use.
252 if (logger.isDebugEnabled()) {
253 logger.debug("getPersonAuthority with name=" + specifier);
255 MultipartOutput result = null;
257 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext();
258 DocumentHandler handler = createDocumentHandler(ctx);
259 DocumentFilter myFilter = new DocumentFilter(whereClause, 0, 1);
260 handler.setDocumentFilter(myFilter);
261 getRepositoryClient(ctx).get(ctx, handler);
262 result = (MultipartOutput) ctx.getOutput();
263 } catch (UnauthorizedException ue) {
264 Response response = Response.status(
265 Response.Status.UNAUTHORIZED).entity("Get failed reason " + ue.getErrorReason()).type("text/plain").build();
266 throw new WebApplicationException(response);
267 } catch (DocumentNotFoundException dnfe) {
268 if (logger.isDebugEnabled()) {
269 logger.debug("getPersonAuthority", dnfe);
271 Response response = Response.status(Response.Status.NOT_FOUND).entity(
272 "Get failed on PersonAuthority spec=" + specifier).type(
273 "text/plain").build();
274 throw new WebApplicationException(response);
275 } catch (Exception e) {
276 if (logger.isDebugEnabled()) {
277 logger.debug("getPersonAuthority", e);
279 Response response = Response.status(
280 Response.Status.INTERNAL_SERVER_ERROR).entity("Get failed").type("text/plain").build();
281 throw new WebApplicationException(response);
283 if (result == null) {
284 Response response = Response.status(Response.Status.NOT_FOUND).entity(
285 "Get failed, the requested PersonAuthority spec:" + specifier + ": was not found.").type(
286 "text/plain").build();
287 throw new WebApplicationException(response);
293 * Gets the entities referencing this Person instance. The service type
294 * can be passed as a query param "type", and must match a configured type
295 * for the service bindings. If not set, the type defaults to
296 * ServiceBindingUtils.SERVICE_TYPE_PROCEDURE.
299 * @param csid the parent csid
300 * @param itemcsid the person csid
303 * @return the info for the referencing objects
306 @Path("{csid}/items/{itemcsid}/refObjs")
307 @Produces("application/xml") //FIXME: REM do this for CSPACE-1079 in Org authority.
308 public AuthorityRefDocList getReferencingObjects(
309 @PathParam("csid") String parentcsid,
310 @PathParam("itemcsid") String itemcsid,
311 @Context UriInfo ui) {
312 AuthorityRefDocList authRefDocList = null;
313 if (logger.isDebugEnabled()) {
314 logger.debug("getReferencingObjects with parentcsid="
315 + parentcsid + " and itemcsid=" + itemcsid);
317 if (parentcsid == null || "".equals(parentcsid)
318 || itemcsid == null || "".equals(itemcsid)) {
319 logger.error("getPerson: missing parentcsid or itemcsid!");
320 Response response = Response.status(Response.Status.BAD_REQUEST).entity(
321 "get failed on Person with parentcsid="
322 + parentcsid + " and itemcsid=" + itemcsid).type(
323 "text/plain").build();
324 throw new WebApplicationException(response);
327 MultivaluedMap<String, String> queryParams = ui.getQueryParameters();
328 // Note that we have to create the service context for the Items, not the main service
329 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext(getItemServiceName(),
331 DocumentHandler handler = createItemDocumentHandler(ctx, parentcsid);
332 RepositoryClient repoClient = getRepositoryClient(ctx);
333 DocumentFilter myFilter = handler.getDocumentFilter();
334 String serviceType = ServiceBindingUtils.SERVICE_TYPE_PROCEDURE;
335 List<String> list = queryParams.remove(ServiceBindingUtils.SERVICE_TYPE_PROP);
337 serviceType = list.get(0);
339 DocumentWrapper<DocumentModel> docWrapper = repoClient.getDoc(ctx, itemcsid);
340 DocumentModel docModel = docWrapper.getWrappedObject();
341 String refName = (String)docModel.getPropertyValue(PersonJAXBSchema.REF_NAME);
343 authRefDocList = RefNameServiceUtils.getAuthorityRefDocs(ctx,
347 myFilter.getPageSize(), myFilter.getStartPage(), true /*computeTotal*/ );
348 } catch (UnauthorizedException ue) {
349 Response response = Response.status(
350 Response.Status.UNAUTHORIZED).entity("Get failed reason " + ue.getErrorReason()).type("text/plain").build();
351 throw new WebApplicationException(response);
352 } catch (DocumentNotFoundException dnfe) {
353 if (logger.isDebugEnabled()) {
354 logger.debug("getReferencingObjects", dnfe);
356 Response response = Response.status(Response.Status.NOT_FOUND).entity(
357 "GetReferencingObjects failed with parentcsid="
358 + parentcsid + " and itemcsid=" + itemcsid).type(
359 "text/plain").build();
360 throw new WebApplicationException(response);
361 } catch (Exception e) { // Includes DocumentException
362 if (logger.isDebugEnabled()) {
363 logger.debug("GetReferencingObjects", e);
365 Response response = Response.status(
366 Response.Status.INTERNAL_SERVER_ERROR).entity("Get failed").type("text/plain").build();
367 throw new WebApplicationException(response);
369 if (authRefDocList == null) {
370 Response response = Response.status(Response.Status.NOT_FOUND).entity(
371 "Get failed, the requested Person CSID:" + itemcsid + ": was not found.").type(
372 "text/plain").build();
373 throw new WebApplicationException(response);
375 return authRefDocList;
380 public MultipartOutput getPersonAuthority(@PathParam("csid") String csid) {
382 logger.error("getPersonAuthority: missing csid!");
383 Response response = Response.status(Response.Status.BAD_REQUEST).entity(
384 "get failed on PersonAuthority csid=" + csid).type(
385 "text/plain").build();
386 throw new WebApplicationException(response);
388 if (logger.isDebugEnabled()) {
389 logger.debug("getPersonAuthority with path(id)=" + csid);
391 MultipartOutput result = null;
393 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext();
394 DocumentHandler handler = createDocumentHandler(ctx);
395 getRepositoryClient(ctx).get(ctx, csid, handler);
396 result = (MultipartOutput) ctx.getOutput();
397 } catch (UnauthorizedException ue) {
398 Response response = Response.status(
399 Response.Status.UNAUTHORIZED).entity("Get failed reason " + ue.getErrorReason()).type("text/plain").build();
400 throw new WebApplicationException(response);
401 } catch (DocumentNotFoundException dnfe) {
402 if (logger.isDebugEnabled()) {
403 logger.debug("getPersonAuthority", dnfe);
405 Response response = Response.status(Response.Status.NOT_FOUND).entity(
406 "Get failed on PersonAuthority csid=" + csid).type(
407 "text/plain").build();
408 throw new WebApplicationException(response);
409 } catch (Exception e) {
410 if (logger.isDebugEnabled()) {
411 logger.debug("getPersonAuthority", e);
413 Response response = Response.status(
414 Response.Status.INTERNAL_SERVER_ERROR).entity("Get failed").type("text/plain").build();
415 throw new WebApplicationException(response);
417 if (result == null) {
418 Response response = Response.status(Response.Status.NOT_FOUND).entity(
419 "Get failed, the requested PersonAuthority CSID:" + csid + ": was not found.").type(
420 "text/plain").build();
421 throw new WebApplicationException(response);
427 * Gets the person authority list.
431 * @return the person authority list
434 @Produces("application/xml")
435 public PersonauthoritiesCommonList getPersonAuthorityList(@Context UriInfo ui) {
436 PersonauthoritiesCommonList personAuthorityObjectList = new PersonauthoritiesCommonList();
438 MultivaluedMap<String, String> queryParams = ui.getQueryParameters();
439 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext(queryParams);
440 DocumentHandler handler = createDocumentHandler(ctx);
441 String nameQ = queryParams.getFirst("refName");
443 handler.getDocumentFilter().setWhereClause("personauthorities_common:refName='" + nameQ + "'");
445 getRepositoryClient(ctx).getFiltered(ctx, handler);
446 personAuthorityObjectList = (PersonauthoritiesCommonList) handler.getCommonPartList();
447 } catch (UnauthorizedException ue) {
448 Response response = Response.status(
449 Response.Status.UNAUTHORIZED).entity("Index failed reason " + ue.getErrorReason()).type("text/plain").build();
450 throw new WebApplicationException(response);
451 } catch (Exception e) {
452 if (logger.isDebugEnabled()) {
453 logger.debug("Caught exception in getPersonAuthorityList", e);
455 Response response = Response.status(
456 Response.Status.INTERNAL_SERVER_ERROR).entity("Index failed").type("text/plain").build();
457 throw new WebApplicationException(response);
459 return personAuthorityObjectList;
463 * Update person authority.
465 * @param csid the csid
466 * @param theUpdate the the update
468 * @return the multipart output
472 public MultipartOutput updatePersonAuthority(
473 @PathParam("csid") String csid,
474 MultipartInput theUpdate) {
475 if (logger.isDebugEnabled()) {
476 logger.debug("updatePersonAuthority with csid=" + csid);
478 if (csid == null || "".equals(csid)) {
479 logger.error("updatePersonAuthority: missing csid!");
480 Response response = Response.status(Response.Status.BAD_REQUEST).entity(
481 "update failed on PersonAuthority csid=" + csid).type(
482 "text/plain").build();
483 throw new WebApplicationException(response);
485 MultipartOutput result = null;
487 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext(theUpdate);
488 DocumentHandler handler = createDocumentHandler(ctx);
489 getRepositoryClient(ctx).update(ctx, csid, handler);
490 result = (MultipartOutput) ctx.getOutput();
491 } catch (BadRequestException bre) {
492 Response response = Response.status(
493 Response.Status.BAD_REQUEST).entity("Create failed reason " + bre.getErrorReason()).type("text/plain").build();
494 throw new WebApplicationException(response);
495 } catch (UnauthorizedException ue) {
496 Response response = Response.status(
497 Response.Status.UNAUTHORIZED).entity("Update failed reason " + ue.getErrorReason()).type("text/plain").build();
498 throw new WebApplicationException(response);
499 } catch (DocumentNotFoundException dnfe) {
500 if (logger.isDebugEnabled()) {
501 logger.debug("caugth exception in updatePersonAuthority", dnfe);
503 Response response = Response.status(Response.Status.NOT_FOUND).entity(
504 "Update failed on PersonAuthority csid=" + csid).type(
505 "text/plain").build();
506 throw new WebApplicationException(response);
507 } catch (Exception e) {
508 Response response = Response.status(
509 Response.Status.INTERNAL_SERVER_ERROR).entity("Update failed").type("text/plain").build();
510 throw new WebApplicationException(response);
516 * Delete person authority.
518 * @param csid the csid
520 * @return the response
524 public Response deletePersonAuthority(@PathParam("csid") String csid) {
526 if (logger.isDebugEnabled()) {
527 logger.debug("deletePersonAuthority with csid=" + csid);
529 if (csid == null || "".equals(csid)) {
530 logger.error("deletePersonAuthority: missing csid!");
531 Response response = Response.status(Response.Status.BAD_REQUEST).entity(
532 "delete failed on PersonAuthority csid=" + csid).type(
533 "text/plain").build();
534 throw new WebApplicationException(response);
537 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext();
538 getRepositoryClient(ctx).delete(ctx, csid);
539 return Response.status(HttpResponseCodes.SC_OK).build();
540 } catch (UnauthorizedException ue) {
541 Response response = Response.status(
542 Response.Status.UNAUTHORIZED).entity("Delete failed reason " + ue.getErrorReason()).type("text/plain").build();
543 throw new WebApplicationException(response);
544 } catch (DocumentNotFoundException dnfe) {
545 if (logger.isDebugEnabled()) {
546 logger.debug("caught exception in deletePersonAuthority", dnfe);
548 Response response = Response.status(Response.Status.NOT_FOUND).entity(
549 "Delete failed on PersonAuthority csid=" + csid).type(
550 "text/plain").build();
551 throw new WebApplicationException(response);
552 } catch (Exception e) {
553 Response response = Response.status(
554 Response.Status.INTERNAL_SERVER_ERROR).entity("Delete failed").type("text/plain").build();
555 throw new WebApplicationException(response);
561 * ***********************************************************************
562 * Person parts - this is a sub-resource of PersonAuthority
563 * ***********************************************************************.
565 * @param parentcsid the parentcsid
566 * @param input the input
567 * @return the response
570 @Path("{csid}/items")
571 public Response createPerson(@PathParam("csid") String parentcsid, MultipartInput input) {
573 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext(getItemServiceName(), input);
574 DocumentHandler handler = createItemDocumentHandler(ctx, parentcsid);
575 String itemcsid = getRepositoryClient(ctx).create(ctx, handler);
576 UriBuilder path = UriBuilder.fromResource(PersonAuthorityResource.class);
577 path.path(parentcsid + "/items/" + itemcsid);
578 Response response = Response.created(path.build()).build();
580 } catch (BadRequestException bre) {
581 Response response = Response.status(
582 Response.Status.BAD_REQUEST).entity("Create failed reason " + bre.getErrorReason()).type("text/plain").build();
583 throw new WebApplicationException(response);
584 } catch (UnauthorizedException ue) {
585 Response response = Response.status(
586 Response.Status.UNAUTHORIZED).entity("Create failed reason " + ue.getErrorReason()).type("text/plain").build();
587 throw new WebApplicationException(response);
588 } catch (Exception e) {
589 if (logger.isDebugEnabled()) {
590 logger.debug("Caught exception in createPerson", e);
592 Response response = Response.status(
593 Response.Status.INTERNAL_SERVER_ERROR).entity("Create failed").type("text/plain").build();
594 throw new WebApplicationException(response);
601 * @param parentcsid the parentcsid
602 * @param itemcsid the itemcsid
607 @Path("{csid}/items/{itemcsid}")
608 public MultipartOutput getPerson(
609 @PathParam("csid") String parentcsid,
610 @PathParam("itemcsid") String itemcsid) {
611 if (logger.isDebugEnabled()) {
612 logger.debug("getPerson with parentcsid=" + parentcsid + " and itemcsid=" + itemcsid);
614 if (parentcsid == null || "".equals(parentcsid)
615 || itemcsid == null || "".equals(itemcsid)) {
616 logger.error("getPerson: missing parentcsid or itemcsid!");
617 Response response = Response.status(Response.Status.BAD_REQUEST).entity(
618 "get failed on Person with parentcsid="
619 + parentcsid + " and itemcsid=" + itemcsid).type(
620 "text/plain").build();
621 throw new WebApplicationException(response);
623 MultipartOutput result = null;
625 // Note that we have to create the service context for the Items, not the main service
626 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext(getItemServiceName());
627 DocumentHandler handler = createItemDocumentHandler(ctx, parentcsid);
628 getRepositoryClient(ctx).get(ctx, itemcsid, handler);
629 // TODO should we assert that the item is in the passed personAuthority?
630 result = (MultipartOutput) ctx.getOutput();
631 } catch (UnauthorizedException ue) {
632 Response response = Response.status(
633 Response.Status.UNAUTHORIZED).entity("Get failed reason " + ue.getErrorReason()).type("text/plain").build();
634 throw new WebApplicationException(response);
635 } catch (DocumentNotFoundException dnfe) {
636 if (logger.isDebugEnabled()) {
637 logger.debug("getPerson", dnfe);
639 Response response = Response.status(Response.Status.NOT_FOUND).entity(
640 "Get failed on Person csid=" + itemcsid).type(
641 "text/plain").build();
642 throw new WebApplicationException(response);
643 } catch (Exception e) {
644 if (logger.isDebugEnabled()) {
645 logger.debug("getPerson", e);
647 Response response = Response.status(
648 Response.Status.INTERNAL_SERVER_ERROR).entity("Get failed").type("text/plain").build();
649 throw new WebApplicationException(response);
651 if (result == null) {
652 Response response = Response.status(Response.Status.NOT_FOUND).entity(
653 "Get failed, the requested Person CSID:" + itemcsid + ": was not found.").type(
654 "text/plain").build();
655 throw new WebApplicationException(response);
661 * Gets the person list.
663 * @param parentcsid the parentcsid
664 * @param partialTerm the partial term
667 * @return the person list
670 @Path("{csid}/items")
671 @Produces("application/xml")
672 public PersonsCommonList getPersonList(
673 @PathParam("csid") String parentcsid,
674 @QueryParam (IQueryManager.SEARCH_TYPE_PARTIALTERM) String partialTerm,
675 @Context UriInfo ui) {
676 PersonsCommonList personObjectList = new PersonsCommonList();
678 // Note that docType defaults to the ServiceName, so we're fine with that.
679 MultivaluedMap<String, String> queryParams = ui.getQueryParameters();
680 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext(getItemServiceName(),
682 DocumentHandler handler = createItemDocumentHandler(ctx, parentcsid);
683 // Add the where clause "persons_common:inAuthority='" + parentcsid + "'"
684 handler.getDocumentFilter().setWhereClause(PersonJAXBSchema.PERSONS_COMMON + ":" +
685 PersonJAXBSchema.IN_AUTHORITY + "='" + parentcsid + "'");
687 // AND persons_common:displayName LIKE '%partialTerm%'
688 if (partialTerm != null && !partialTerm.isEmpty()) {
689 String ptClause = "AND " +
690 PersonJAXBSchema.PERSONS_COMMON + ":" +
691 PersonJAXBSchema.DISPLAY_NAME +
693 "'%" + partialTerm + "%'";
694 handler.getDocumentFilter().appendWhereClause(ptClause, IQueryManager.SEARCH_QUALIFIER_AND);
696 getRepositoryClient(ctx).getFiltered(ctx, handler);
697 personObjectList = (PersonsCommonList) handler.getCommonPartList();
698 } catch (UnauthorizedException ue) {
699 Response response = Response.status(
700 Response.Status.UNAUTHORIZED).entity("Index failed reason " + ue.getErrorReason()).type("text/plain").build();
701 throw new WebApplicationException(response);
702 } catch (Exception e) {
703 if (logger.isDebugEnabled()) {
704 logger.debug("Caught exception in getPersonList", e);
706 Response response = Response.status(
707 Response.Status.INTERNAL_SERVER_ERROR).entity("Index failed").type("text/plain").build();
708 throw new WebApplicationException(response);
710 return personObjectList;
715 * Gets the person list by auth name.
717 * @param parentSpecifier the parent specifier
718 * @param partialTerm the partial term
721 * @return the person list by auth name
724 @Path("urn:cspace:name({specifier})/items")
725 @Produces("application/xml")
726 public PersonsCommonList getPersonListByAuthName(
727 @PathParam("specifier") String parentSpecifier,
728 @QueryParam (IQueryManager.SEARCH_TYPE_PARTIALTERM) String partialTerm,
729 @Context UriInfo ui) {
730 PersonsCommonList personObjectList = new PersonsCommonList();
733 PersonAuthorityJAXBSchema.PERSONAUTHORITIES_COMMON+
734 ":" + PersonAuthorityJAXBSchema.DISPLAY_NAME+
735 "='" + parentSpecifier+"'";
736 // Need to get an Authority by name
737 MultivaluedMap<String, String> queryParams = ui.getQueryParameters();
738 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext(queryParams);
740 getRepositoryClient(ctx).findDocCSID(ctx, whereClause);
741 ctx = createServiceContext(getItemServiceName(), queryParams);
742 DocumentHandler handler = createItemDocumentHandler(ctx, parentcsid);
744 // Add the where clause "persons_common:inAuthority='" + parentcsid + "'"
745 handler.getDocumentFilter().setWhereClause(PersonJAXBSchema.PERSONS_COMMON + ":" +
746 PersonJAXBSchema.IN_AUTHORITY + "='" + parentcsid + "'");
748 // AND persons_common:displayName LIKE '%partialTerm%'
749 if (partialTerm != null && !partialTerm.isEmpty()) {
750 String ptClause = "AND " +
751 PersonJAXBSchema.PERSONS_COMMON + ":" +
752 PersonJAXBSchema.DISPLAY_NAME +
754 "'%" + partialTerm + "%'";
755 handler.getDocumentFilter().appendWhereClause(ptClause, IQueryManager.SEARCH_QUALIFIER_AND);
757 getRepositoryClient(ctx).getFiltered(ctx, handler);
758 personObjectList = (PersonsCommonList) handler.getCommonPartList();
759 } catch (UnauthorizedException ue) {
760 Response response = Response.status(
761 Response.Status.UNAUTHORIZED).entity("Index failed reason " + ue.getErrorReason()).type("text/plain").build();
762 throw new WebApplicationException(response);
763 } catch (Exception e) {
764 if (logger.isDebugEnabled()) {
765 logger.debug("Caught exception in getPersonList", e);
767 Response response = Response.status(
768 Response.Status.INTERNAL_SERVER_ERROR).entity("Index failed").type("text/plain").build();
769 throw new WebApplicationException(response);
771 return personObjectList;
777 * @param parentcsid the parentcsid
778 * @param itemcsid the itemcsid
779 * @param theUpdate the the update
781 * @return the multipart output
784 @Path("{csid}/items/{itemcsid}")
785 public MultipartOutput updatePerson(
786 @PathParam("csid") String parentcsid,
787 @PathParam("itemcsid") String itemcsid,
788 MultipartInput theUpdate) {
789 if (logger.isDebugEnabled()) {
790 logger.debug("updatePerson with parentcsid=" + parentcsid + " and itemcsid=" + itemcsid);
792 if (parentcsid == null || "".equals(parentcsid)) {
793 logger.error("updatePerson: missing csid!");
794 Response response = Response.status(Response.Status.BAD_REQUEST).entity(
795 "update failed on Person parentcsid=" + parentcsid).type(
796 "text/plain").build();
797 throw new WebApplicationException(response);
799 if (itemcsid == null || "".equals(itemcsid)) {
800 logger.error("updatePerson: missing itemcsid!");
801 Response response = Response.status(Response.Status.BAD_REQUEST).entity(
802 "update failed on Person=" + itemcsid).type(
803 "text/plain").build();
804 throw new WebApplicationException(response);
806 MultipartOutput result = null;
808 // Note that we have to create the service context for the Items, not the main service
809 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext(getItemServiceName(),
811 DocumentHandler handler = createItemDocumentHandler(ctx, parentcsid);
812 getRepositoryClient(ctx).update(ctx, itemcsid, handler);
813 result = (MultipartOutput) ctx.getOutput();
814 } catch (BadRequestException bre) {
815 Response response = Response.status(
816 Response.Status.BAD_REQUEST).entity("Create failed reason " + bre.getErrorReason()).type("text/plain").build();
817 throw new WebApplicationException(response);
818 } catch (UnauthorizedException ue) {
819 Response response = Response.status(
820 Response.Status.UNAUTHORIZED).entity("Update failed reason " + ue.getErrorReason()).type("text/plain").build();
821 throw new WebApplicationException(response);
822 } catch (DocumentNotFoundException dnfe) {
823 if (logger.isDebugEnabled()) {
824 logger.debug("caught exception in updatePerson", dnfe);
826 Response response = Response.status(Response.Status.NOT_FOUND).entity(
827 "Update failed on Person csid=" + itemcsid).type(
828 "text/plain").build();
829 throw new WebApplicationException(response);
830 } catch (Exception e) {
831 Response response = Response.status(
832 Response.Status.INTERNAL_SERVER_ERROR).entity("Update failed").type("text/plain").build();
833 throw new WebApplicationException(response);
841 * @param parentcsid the parentcsid
842 * @param itemcsid the itemcsid
844 * @return the response
847 @Path("{csid}/items/{itemcsid}")
848 public Response deletePerson(
849 @PathParam("csid") String parentcsid,
850 @PathParam("itemcsid") String itemcsid) {
851 if (logger.isDebugEnabled()) {
852 logger.debug("deletePerson with parentcsid=" + parentcsid + " and itemcsid=" + itemcsid);
854 if (parentcsid == null || "".equals(parentcsid)) {
855 logger.error("deletePerson: missing csid!");
856 Response response = Response.status(Response.Status.BAD_REQUEST).entity(
857 "delete failed on Person parentcsid=" + parentcsid).type(
858 "text/plain").build();
859 throw new WebApplicationException(response);
861 if (itemcsid == null || "".equals(itemcsid)) {
862 logger.error("deletePerson: missing itemcsid!");
863 Response response = Response.status(Response.Status.BAD_REQUEST).entity(
864 "delete failed on Person=" + itemcsid).type(
865 "text/plain").build();
866 throw new WebApplicationException(response);
869 // Note that we have to create the service context for the Items, not the main service
870 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext(getItemServiceName());
871 getRepositoryClient(ctx).delete(ctx, itemcsid);
872 return Response.status(HttpResponseCodes.SC_OK).build();
873 } catch (UnauthorizedException ue) {
874 Response response = Response.status(
875 Response.Status.UNAUTHORIZED).entity("Delete failed reason " + ue.getErrorReason()).type("text/plain").build();
876 throw new WebApplicationException(response);
877 } catch (DocumentNotFoundException dnfe) {
878 if (logger.isDebugEnabled()) {
879 logger.debug("caught exception in deletePerson", dnfe);
881 Response response = Response.status(Response.Status.NOT_FOUND).entity(
882 "Delete failed on Person itemcsid=" + itemcsid).type(
883 "text/plain").build();
884 throw new WebApplicationException(response);
885 } catch (Exception e) {
886 Response response = Response.status(
887 Response.Status.INTERNAL_SERVER_ERROR).entity("Delete failed").type("text/plain").build();
888 throw new WebApplicationException(response);
894 * ***********************************************************************
895 * Contact parts - this is a sub-resource of Person (or "item")
896 * ***********************************************************************.
898 * @param parentcsid the parentcsid
899 * @param itemcsid the itemcsid
900 * @param input the input
901 * @return the response
904 @Path("{parentcsid}/items/{itemcsid}/contacts")
905 public Response createContact(
906 @PathParam("parentcsid") String parentcsid,
907 @PathParam("itemcsid") String itemcsid,
908 MultipartInput input) {
910 // Note that we have to create the service context and document
911 // handler for the Contact service, not the main service.
912 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext(getContactServiceName(), input);
913 DocumentHandler handler = createContactDocumentHandler(ctx, parentcsid, itemcsid);
914 String csid = getRepositoryClient(ctx).create(ctx, handler);
915 UriBuilder path = UriBuilder.fromResource(PersonAuthorityResource.class);
916 path.path("" + parentcsid + "/items/" + itemcsid + "/contacts/" + csid);
917 Response response = Response.created(path.build()).build();
919 } catch (BadRequestException bre) {
920 Response response = Response.status(
921 Response.Status.BAD_REQUEST).entity("Create failed reason " + bre.getErrorReason()).type("text/plain").build();
922 throw new WebApplicationException(response);
923 } catch (UnauthorizedException ue) {
924 Response response = Response.status(
925 Response.Status.UNAUTHORIZED).entity("Create failed reason " + ue.getErrorReason()).type("text/plain").build();
926 throw new WebApplicationException(response);
927 } catch (Exception e) {
928 if (logger.isDebugEnabled()) {
929 logger.debug("Caught exception in createContact", e);
931 Response response = Response.status(
932 Response.Status.INTERNAL_SERVER_ERROR)
933 .entity("Attempt to create Contact failed.")
934 .type("text/plain").build();
935 throw new WebApplicationException(response);
941 * Gets the contact list.
943 * @param parentcsid the parentcsid
944 * @param itemcsid the itemcsid
947 * @return the contact list
950 @Produces({"application/xml"})
951 @Path("{parentcsid}/items/{itemcsid}/contacts/")
952 public ContactsCommonList getContactList(
953 @PathParam("parentcsid") String parentcsid,
954 @PathParam("itemcsid") String itemcsid,
955 @Context UriInfo ui) {
956 ContactsCommonList contactObjectList = new ContactsCommonList();
958 MultivaluedMap<String, String> queryParams = ui.getQueryParameters();
959 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext(getContactServiceName(),
961 DocumentHandler handler = createContactDocumentHandler(ctx, parentcsid, itemcsid);
962 handler.getDocumentFilter().setWhereClause(ContactJAXBSchema.CONTACTS_COMMON + ":" +
963 ContactJAXBSchema.IN_AUTHORITY +
964 "='" + parentcsid + "'" +
966 ContactJAXBSchema.CONTACTS_COMMON + ":" +
967 ContactJAXBSchema.IN_ITEM +
968 "='" + itemcsid + "'" +
969 " AND ecm:isProxy = 0");
970 getRepositoryClient(ctx).getFiltered(ctx, handler);
971 contactObjectList = (ContactsCommonList) handler.getCommonPartList();
972 } catch (UnauthorizedException ue) {
973 Response response = Response.status(
974 Response.Status.UNAUTHORIZED).entity("Index failed reason " + ue.getErrorReason()).type("text/plain").build();
975 throw new WebApplicationException(response);
976 } catch (Exception e) {
977 if (logger.isDebugEnabled()) {
978 logger.debug("Caught exception in getContactsList", e);
980 Response response = Response.status(
981 Response.Status.INTERNAL_SERVER_ERROR).entity("Index failed").type("text/plain").build();
982 throw new WebApplicationException(response);
984 return contactObjectList;
990 * @param parentcsid the parentcsid
991 * @param itemcsid the itemcsid
992 * @param csid the csid
994 * @return the contact
997 @Path("{parentcsid}/items/{itemcsid}/contacts/{csid}")
998 public MultipartOutput getContact(
999 @PathParam("parentcsid") String parentcsid,
1000 @PathParam("itemcsid") String itemcsid,
1001 @PathParam("csid") String csid) {
1002 MultipartOutput result = null;
1003 if (logger.isDebugEnabled()) {
1004 logger.debug("getContact with parentCsid=" + parentcsid +
1005 " itemcsid=" + itemcsid + " csid=" + csid);
1008 // Note that we have to create the service context and document
1009 // handler for the Contact service, not the main service.
1010 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext(getContactServiceName());
1011 DocumentHandler handler = createContactDocumentHandler(ctx, parentcsid, itemcsid);
1012 getRepositoryClient(ctx).get(ctx, csid, handler);
1013 result = (MultipartOutput) ctx.getOutput();
1014 } catch (UnauthorizedException ue) {
1015 Response response = Response.status(
1016 Response.Status.UNAUTHORIZED).entity("Get failed reason " + ue.getErrorReason()).type("text/plain").build();
1017 throw new WebApplicationException(response);
1018 } catch (DocumentNotFoundException dnfe) {
1019 if (logger.isDebugEnabled()) {
1020 logger.debug("getContact", dnfe);
1022 Response response = Response.status(Response.Status.NOT_FOUND)
1023 .entity("Get failed, the requested Contact CSID:" + csid + ": was not found.")
1024 .type("text/plain").build();
1025 throw new WebApplicationException(response);
1026 } catch (Exception e) {
1027 if (logger.isDebugEnabled()) {
1028 logger.debug("getContact", e);
1030 Response response = Response.status(Response.Status.INTERNAL_SERVER_ERROR)
1031 .entity("Get contact failed")
1032 .type("text/plain").build();
1033 throw new WebApplicationException(response);
1035 if (result == null) {
1036 Response response = Response.status(Response.Status.NOT_FOUND)
1037 .entity("Get failed, the requested Contact CSID:" + csid + ": was not found.")
1038 .type("text/plain").build();
1039 throw new WebApplicationException(response);
1048 * @param parentcsid the parentcsid
1049 * @param itemcsid the itemcsid
1050 * @param csid the csid
1051 * @param theUpdate the the update
1053 * @return the multipart output
1056 @Path("{parentcsid}/items/{itemcsid}/contacts/{csid}")
1057 public MultipartOutput updateContact(
1058 @PathParam("parentcsid") String parentcsid,
1059 @PathParam("itemcsid") String itemcsid,
1060 @PathParam("csid") String csid,
1061 MultipartInput theUpdate) {
1062 if (logger.isDebugEnabled()) {
1063 logger.debug("updateContact with parentcsid=" + parentcsid +
1064 " itemcsid=" + itemcsid + " csid=" + csid);
1066 if (parentcsid == null || parentcsid.trim().isEmpty()) {
1067 logger.error("updateContact: missing csid!");
1068 Response response = Response.status(Response.Status.BAD_REQUEST).entity(
1069 "update failed on Contact parentcsid=" + parentcsid).type(
1070 "text/plain").build();
1071 throw new WebApplicationException(response);
1073 if (itemcsid == null || itemcsid.trim().isEmpty()) {
1074 logger.error("updateContact: missing itemcsid!");
1075 Response response = Response.status(Response.Status.BAD_REQUEST).entity(
1076 "update failed on Contact=" + itemcsid).type(
1077 "text/plain").build();
1078 throw new WebApplicationException(response);
1080 if (csid == null || csid.trim().isEmpty()) {
1081 logger.error("updateContact: missing csid!");
1082 Response response = Response.status(Response.Status.BAD_REQUEST).entity(
1083 "update failed on Contact=" + csid).type(
1084 "text/plain").build();
1085 throw new WebApplicationException(response);
1087 MultipartOutput result = null;
1089 // Note that we have to create the service context and document
1090 // handler for the Contact service, not the main service.
1091 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext(getContactServiceName(),
1093 DocumentHandler handler = createContactDocumentHandler(ctx, parentcsid, itemcsid);
1094 getRepositoryClient(ctx).update(ctx, csid, handler);
1095 result = (MultipartOutput) ctx.getOutput();
1096 } catch (BadRequestException bre) {
1097 Response response = Response.status(
1098 Response.Status.BAD_REQUEST).entity("Create failed reason " + bre.getErrorReason()).type("text/plain").build();
1099 throw new WebApplicationException(response);
1100 } catch (UnauthorizedException ue) {
1101 Response response = Response.status(
1102 Response.Status.UNAUTHORIZED).entity("Update failed reason " + ue.getErrorReason()).type("text/plain").build();
1103 throw new WebApplicationException(response);
1104 } catch (DocumentNotFoundException dnfe) {
1105 if (logger.isDebugEnabled()) {
1106 logger.debug("caught exception in updateContact", dnfe);
1108 Response response = Response.status(Response.Status.NOT_FOUND).entity(
1109 "Update failed on Contact csid=" + itemcsid).type(
1110 "text/plain").build();
1111 throw new WebApplicationException(response);
1112 } catch (Exception e) {
1113 Response response = Response.status(
1114 Response.Status.INTERNAL_SERVER_ERROR).entity("Update failed").type("text/plain").build();
1115 throw new WebApplicationException(response);
1123 * @param parentcsid the parentcsid
1124 * @param itemcsid the itemcsid
1125 * @param csid the csid
1127 * @return the response
1130 @Path("{parentcsid}/items/{itemcsid}/contacts/{csid}")
1131 public Response deleteContact(
1132 @PathParam("parentcsid") String parentcsid,
1133 @PathParam("itemcsid") String itemcsid,
1134 @PathParam("csid") String csid) {
1135 if (logger.isDebugEnabled()) {
1136 logger.debug("deleteContact with parentCsid=" + parentcsid +
1137 " itemcsid=" + itemcsid + " csid=" + csid);
1139 if (parentcsid == null || parentcsid.trim().isEmpty()) {
1140 logger.error("deleteContact: missing parentcsid!");
1141 Response response = Response.status(Response.Status.BAD_REQUEST).entity(
1142 "delete contact failed on parentcsid=" + parentcsid).type(
1143 "text/plain").build();
1144 throw new WebApplicationException(response);
1146 if (itemcsid == null || itemcsid.trim().isEmpty()) {
1147 logger.error("deleteContact: missing itemcsid!");
1148 Response response = Response.status(Response.Status.BAD_REQUEST).entity(
1149 "delete contact failed on itemcsid=" + itemcsid).type(
1150 "text/plain").build();
1151 throw new WebApplicationException(response);
1153 if (csid == null || csid.trim().isEmpty()) {
1154 logger.error("deleteContact: missing csid!");
1155 Response response = Response.status(Response.Status.BAD_REQUEST).entity(
1156 "delete contact failed on csid=" + csid).type(
1157 "text/plain").build();
1158 throw new WebApplicationException(response);
1161 // Note that we have to create the service context for the
1162 // Contact service, not the main service.
1163 ServiceContext<MultipartInput, MultipartOutput> ctx = createServiceContext(getContactServiceName());
1164 getRepositoryClient(ctx).delete(ctx, csid);
1165 return Response.status(HttpResponseCodes.SC_OK).build();
1166 } catch (UnauthorizedException ue) {
1167 Response response = Response.status(
1168 Response.Status.UNAUTHORIZED).entity("Delete failed reason " + ue.getErrorReason()).type("text/plain").build();
1169 throw new WebApplicationException(response);
1170 } catch (DocumentNotFoundException dnfe) {
1171 if (logger.isDebugEnabled()) {
1172 logger.debug("Caught exception in deleteContact", dnfe);
1174 Response response = Response.status(Response.Status.NOT_FOUND)
1175 .entity("Delete failed, the requested Contact CSID:" + csid + ": was not found.")
1176 .type("text/plain").build();
1177 throw new WebApplicationException(response);
1178 } catch (Exception e) {
1179 Response response = Response.status(
1180 Response.Status.INTERNAL_SERVER_ERROR).entity("Delete failed").type("text/plain").build();
1181 throw new WebApplicationException(response);