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.contact;
26 import javax.ws.rs.Consumes;
27 import javax.ws.rs.DELETE;
28 import javax.ws.rs.GET;
29 import javax.ws.rs.POST;
30 import javax.ws.rs.PUT;
31 import javax.ws.rs.Path;
32 import javax.ws.rs.PathParam;
33 import javax.ws.rs.Produces;
34 import javax.ws.rs.WebApplicationException;
35 import javax.ws.rs.core.Context;
36 import javax.ws.rs.core.MultivaluedMap;
37 import javax.ws.rs.core.Response;
38 import javax.ws.rs.core.UriBuilder;
39 import javax.ws.rs.core.UriInfo;
41 import org.collectionspace.services.client.IQueryManager;
42 import org.collectionspace.services.client.PoxPayloadIn;
43 import org.collectionspace.services.client.PoxPayloadOut;
44 import org.collectionspace.services.common.vocabulary.AuthorityResource;
45 import org.collectionspace.services.common.context.ServiceContext;
46 import org.collectionspace.services.common.document.DocumentFilter;
47 import org.collectionspace.services.common.document.DocumentHandler;
48 import org.collectionspace.services.contact.ContactResource;
49 import org.collectionspace.services.contact.ContactsCommon;
50 import org.collectionspace.services.contact.ContactJAXBSchema;
51 import org.collectionspace.services.contact.nuxeo.ContactDocumentModelHandler;
52 import org.collectionspace.services.jaxb.AbstractCommonList;
53 import org.jboss.resteasy.util.HttpResponseCodes;
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
58 * The Class AuthorityResourceWithContacts.
60 @Consumes("application/xml")
61 @Produces("application/xml")
62 public abstract class AuthorityResourceWithContacts<AuthCommon, AuthItemHandler> extends //FIXME: REM - Why is this resource in this package instead of somewhere in 'common'?
63 AuthorityResource<AuthCommon, AuthItemHandler> {
65 private ContactResource contactResource = new ContactResource(); // Warning: ContactResource is a singleton.
66 final Logger logger = LoggerFactory.getLogger(AuthorityResourceWithContacts.class);
68 public AuthorityResourceWithContacts(
69 Class<AuthCommon> authCommonClass, Class<?> resourceClass,
70 String authorityCommonSchemaName, String authorityItemCommonSchemaName) {
71 super(authCommonClass, resourceClass,
72 authorityCommonSchemaName, authorityItemCommonSchemaName);
75 public abstract String getItemServiceName();
77 public String getContactServiceName() {
78 return contactResource.getServiceName();
81 private DocumentHandler createContactDocumentHandler(
82 ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx, String inAuthority,
83 String inItem) throws Exception {
85 return createContactDocumentHandler(ctx, inAuthority, inItem, ui);
88 private DocumentHandler createContactDocumentHandler(
89 ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx, String inAuthority,
90 String inItem, UriInfo ui) throws Exception {
91 ContactDocumentModelHandler docHandler = (ContactDocumentModelHandler) createDocumentHandler(
93 ctx.getCommonPartLabel(getContactServiceName()),
94 ContactsCommon.class);
95 docHandler.setInAuthority(inAuthority);
96 docHandler.setInItem(inItem);
97 docHandler.getServiceContext().setUriInfo(ui);
101 /*************************************************************************
102 * Contact parts - this is a sub-resource of the AuthorityItem
103 * @param parentspecifier either a CSID or one of the urn forms
104 * @param itemspecifier either a CSID or one of the urn forms
106 *************************************************************************/
108 @Path("{parentcsid}/items/{itemcsid}/contacts")
109 public Response createContact(
110 @PathParam("parentcsid") String parentspecifier,
111 @PathParam("itemcsid") String itemspecifier,
114 PoxPayloadIn input = new PoxPayloadIn(xmlPayload);
115 String parentcsid = lookupParentCSID(parentspecifier, "createContact(authority)", "CREATE_ITEM_CONTACT", null);
117 ServiceContext itemCtx = createServiceContext(getItemServiceName());
118 String itemcsid = lookupItemCSID(itemspecifier, parentcsid, "createContact(item)", "CREATE_ITEM_CONTACT", itemCtx);
120 // Note that we have to create the service context and document
121 // handler for the Contact service, not the main service.
122 ServiceContext ctx = createServiceContext(getContactServiceName(), input);
123 DocumentHandler handler = createContactDocumentHandler(ctx, parentcsid, itemcsid);
124 String csid = getRepositoryClient(ctx).create(ctx, handler);
125 UriBuilder path = UriBuilder.fromResource(resourceClass);
126 path.path("" + parentcsid + "/items/" + itemcsid + "/contacts/" + csid);
127 Response response = Response.created(path.build()).build();
129 } catch (Exception e) {
131 "Create Contact failed; one of the requested specifiers for authority:"
132 + parentspecifier + ": and item:" + itemspecifier + ": was not found.",
138 * Gets the contact list.
140 * @param parentspecifier either a CSID or one of the urn forms
141 * @param itemspecifier either a CSID or one of the urn forms
144 * @return the contact list
147 @Produces({"application/xml"})
148 @Path("{parentcsid}/items/{itemcsid}/contacts/")
149 public AbstractCommonList getContactList(
150 @PathParam("parentcsid") String parentspecifier,
151 @PathParam("itemcsid") String itemspecifier,
152 @Context UriInfo ui) {
153 AbstractCommonList contactObjectList = new AbstractCommonList();
155 String parentcsid = lookupParentCSID(parentspecifier, "getContactList(parent)", "GET_CONTACT_LIST", null);
157 ServiceContext itemCtx = createServiceContext(getItemServiceName());
158 String itemcsid = lookupItemCSID(itemspecifier, parentcsid, "getContactList(item)", "GET_CONTACT_LIST", itemCtx);
160 MultivaluedMap<String, String> queryParams = ui.getQueryParameters();
161 ServiceContext ctx = createServiceContext(getContactServiceName(), queryParams);
162 DocumentHandler handler = createContactDocumentHandler(ctx, parentcsid, itemcsid, ui);
163 DocumentFilter myFilter = handler.getDocumentFilter(); //new DocumentFilter();
164 myFilter.appendWhereClause(ContactJAXBSchema.CONTACTS_COMMON + ":"
165 + ContactJAXBSchema.IN_AUTHORITY
166 + "='" + parentcsid + "'"
167 + IQueryManager.SEARCH_QUALIFIER_AND
168 + ContactJAXBSchema.CONTACTS_COMMON + ":"
169 + ContactJAXBSchema.IN_ITEM
170 + "='" + itemcsid + "'",
171 IQueryManager.SEARCH_QUALIFIER_AND); // "AND" this clause to any existing
172 getRepositoryClient(ctx).getFiltered(ctx, handler);
173 contactObjectList = (AbstractCommonList) handler.getCommonPartList();
174 } catch (Exception e) {
176 "Get ContactList failed; one of the requested specifiers for authority:"
177 + parentspecifier + ": and item:" + itemspecifier + ": was not found.",
180 return contactObjectList;
186 * @param parentspecifier either a CSID or one of the urn forms
187 * @param itemspecifier either a CSID or one of the urn forms
188 * @param csid the csid
190 * @return the contact
193 @Path("{parentcsid}/items/{itemcsid}/contacts/{csid}")
194 public String getContact(
195 @PathParam("parentcsid") String parentspecifier,
196 @PathParam("itemcsid") String itemspecifier,
197 @PathParam("csid") String csid) {
198 PoxPayloadOut result = null;
200 String parentcsid = lookupParentCSID(parentspecifier, "getContact(parent)", "GET_ITEM_CONTACT", null);
202 ServiceContext itemCtx = createServiceContext(getItemServiceName());
203 String itemcsid = lookupItemCSID(itemspecifier, parentcsid, "getContact(item)", "GET_ITEM_CONTACT", itemCtx);
205 // Note that we have to create the service context and document handler for the Contact service, not the main service.
206 ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx = createServiceContext(getContactServiceName());
207 DocumentHandler handler = createContactDocumentHandler(ctx, parentcsid, itemcsid);
208 getRepositoryClient(ctx).get(ctx, csid, handler);
209 result = ctx.getOutput();
210 } catch (Exception e) {
211 throw bigReThrow(e, "Get failed, the requested Contact CSID:" + csid
212 + ": or one of the specifiers for authority:" + parentspecifier
213 + ": and item:" + itemspecifier + ": was not found.",
216 if (result == null) {
217 Response response = Response.status(Response.Status.NOT_FOUND).entity("Get failed, the requested Contact CSID:" + csid + ": was not found.").type("text/plain").build();
218 throw new WebApplicationException(response);
220 return result.toXML();
226 * @param parentspecifier either a CSID or one of the urn forms
227 * @param itemspecifier either a CSID or one of the urn forms
228 * @param csid the csid
230 * @return the multipart output
233 @Path("{parentcsid}/items/{itemcsid}/contacts/{csid}")
234 public String updateContact(
235 @PathParam("parentcsid") String parentspecifier,
236 @PathParam("itemcsid") String itemspecifier,
237 @PathParam("csid") String csid,
239 PoxPayloadOut result = null;
241 PoxPayloadIn theUpdate = new PoxPayloadIn(xmlPayload);
242 String parentcsid = lookupParentCSID(parentspecifier, "updateContact(authority)", "UPDATE_CONTACT", null);
244 ServiceContext itemCtx = createServiceContext(getItemServiceName());
245 String itemcsid = lookupItemCSID(itemspecifier, parentcsid, "updateContact(item)", "UPDATE_CONTACT", itemCtx);
247 ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx = null;
248 // Note that we have to create the service context and document handler for the Contact service, not the main service.
249 ctx = createServiceContext(getContactServiceName(), theUpdate);
250 DocumentHandler handler = createContactDocumentHandler(ctx, parentcsid, itemcsid);
251 getRepositoryClient(ctx).update(ctx, csid, handler);
252 result = ctx.getOutput();
253 } catch (Exception e) {
254 throw bigReThrow(e, "Update failed, the requested Contact CSID:" + csid
255 + ": or one of the specifiers for authority:" + parentspecifier
256 + ": and item:" + itemspecifier + ": was not found.",
259 return result.toXML();
265 * @param parentspecifier either a CSID or one of the urn forms
266 * @param itemspecifier either a CSID or one of the urn forms
267 * @param csid the csid
269 * @return the response
272 @Path("{parentcsid}/items/{itemcsid}/contacts/{csid}")
273 public Response deleteContact(
274 @PathParam("parentcsid") String parentspecifier,
275 @PathParam("itemcsid") String itemspecifier,
276 @PathParam("csid") String csid) {
278 String parentcsid = lookupParentCSID(parentspecifier, "deleteContact(authority)", "DELETE_CONTACT", null);
280 ServiceContext itemCtx = createServiceContext(getItemServiceName());
281 String itemcsid = lookupItemCSID(itemspecifier, parentcsid, "deleteContact(item)", "DELETE_CONTACT", itemCtx);
282 //NOTE: itemcsid is not used below. Leaving the above call in for possible side effects??? CSPACE-3175
284 ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx = null;
285 // Note that we have to create the service context for the Contact service, not the main service.
286 ctx = createServiceContext(getContactServiceName());
287 getRepositoryClient(ctx).delete(ctx, csid);
288 return Response.status(HttpResponseCodes.SC_OK).build();
289 } catch (Exception e) {
290 throw bigReThrow(e, "DELETE failed, the requested Contact CSID:" + csid
291 + ": or one of the specifiers for authority:" + parentspecifier
292 + ": and item:" + itemspecifier + ": was not found.", csid);