1 package org.collectionspace.hello.services;
3 import java.io.ByteArrayInputStream;
4 import java.util.ArrayList;
5 import java.util.Arrays;
6 import java.util.HashMap;
7 import java.util.Iterator;
9 import javax.ws.rs.Consumes;
10 import javax.ws.rs.GET;
11 import javax.ws.rs.Path;
12 import javax.ws.rs.Produces;
14 import javax.ws.rs.DELETE;
15 import javax.ws.rs.POST;
16 import javax.ws.rs.PUT;
17 import javax.ws.rs.PathParam;
18 import javax.ws.rs.WebApplicationException;
19 import javax.ws.rs.core.Context;
20 import javax.ws.rs.core.Response;
21 import javax.ws.rs.core.UriBuilder;
22 import javax.ws.rs.core.UriInfo;
23 import javax.xml.bind.JAXBContext;
24 import javax.xml.bind.Marshaller;
26 import org.collectionspace.hello.*;
27 import org.collectionspace.hello.services.nuxeo.NuxeoRESTClient;
28 import org.collectionspace.hello.CollectionObjectList.CollectionObjectListItem;
29 import org.collectionspace.hello.services.CollectionObjectJAXBSchema;
30 import org.collectionspace.hello.services.CollectionObjectListItemJAXBSchema;
32 import org.dom4j.Document;
33 import org.dom4j.Element;
34 import org.dom4j.Namespace;
35 import org.dom4j.io.SAXReader;
36 import org.restlet.resource.Representation;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
40 @Path("/collectionobjects")
41 @Consumes("application/xml")
42 @Produces("application/xml")
43 public class CollectionObjectResource extends CollectionSpaceResource {
45 final static String CO_NUXEO_DOCTYPE = "CollectionObject";
46 final static String CO_NUXEO_SCHEMA_NAME = "collectionobject";
47 final static String CO_NUXEO_DC_TITLE = "CollectionSpace-CollectionObject";
49 final Logger logger = LoggerFactory.getLogger(CollectionObjectResource.class);
51 public CollectionObjectResource() {
56 public CollectionObjectList getCollectionObjectList(@Context UriInfo ui) {
57 CollectionObjectList p = new CollectionObjectList();
59 NuxeoRESTClient nxClient = getClient();
61 List<String> pathParams = new ArrayList<String>();
62 Map<String, String> queryParams = new HashMap<String, String>();
63 pathParams = Arrays.asList("default", CS_COLLECTIONOBJECT_WORKSPACE_UID, "browse");
64 Representation res = nxClient.get(pathParams, queryParams);
65 SAXReader reader = new SAXReader();
66 Document document = reader.read(res.getStream());
67 Element root = document.getRootElement();
70 System.err.println(res.toString());
71 System.err.println(document.asXML());
73 List<CollectionObjectList.CollectionObjectListItem> list = p.getCollectionObjectListItem();
74 for(Iterator i = root.elementIterator(); i.hasNext();){
75 Element element = (Element) i.next();
77 System.err.println();element.asXML();
79 // set the CollectionObject list item entity elements
80 CollectionObjectListItem pli = new CollectionObjectListItem();
81 pli.setObjectNumber(element.attributeValue("title"));
82 pli.setUri(element.attributeValue("url"));
83 pli.setCsid(element.attributeValue("id"));
95 public Response createCollectionObject(CollectionObject co) {
97 NuxeoRESTClient nxClient = getClient();
99 List<String> pathParams = new ArrayList<String>();
100 Map<String, String> queryParams = new HashMap<String, String>();
101 pathParams.add("default");
102 pathParams.add(CS_COLLECTIONOBJECT_WORKSPACE_UID);
103 pathParams.add("createDocument");
104 queryParams.put("docType", CO_NUXEO_DOCTYPE);
106 // a default title for the Dublin Core schema
107 queryParams.put("dublincore:title", CO_NUXEO_DC_TITLE);
109 // CollectionObject core values
110 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OBJECT_NUMBER,
111 co.getObjectNumber());
112 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OTHER_NUMBER,
113 co.getOtherNumber());
114 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.BRIEF_DESCRIPTION,
115 co.getBriefDescription());
116 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.COMMENTS,
118 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.DIST_FEATURES,
119 co.getDistFeatures());
120 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OBJECT_NAME,
122 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.RESPONSIBLE_DEPT,
123 co.getResponsibleDept());
124 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.TITLE,
127 ByteArrayInputStream bais = new ByteArrayInputStream(new byte[0]);
128 Representation res = nxClient.post(pathParams, queryParams, bais);
131 SAXReader reader = new SAXReader();
133 Document document = reader.read(res.getStream());
134 Element root = document.getRootElement();
135 for (Iterator i = root.elementIterator(); i.hasNext();){
136 Element element = (Element) i.next();
137 if ("docRef".equals(element.getName())){
138 csid = (String) element.getData();
142 } catch(Exception e){
143 Response response = Response.status(Response.Status.NOT_FOUND).entity(
144 "Create failed").type("text/plain").build();
145 throw new WebApplicationException(response);
149 verbose("createCollectionObject: ", co);
150 UriBuilder path = UriBuilder.fromResource(CollectionObjectResource.class);
151 path.path("" + csid);
152 Response response = Response.created(path.build()).build();
159 public CollectionObject getCollectionObject(@PathParam("csid") String csid) {
161 CollectionObject co = null;
163 List<String> pathParams = new ArrayList<String>();
164 Map<String, String> queryParams = new HashMap<String, String>();
166 pathParams.add("default");
167 pathParams.add(csid);
168 pathParams.add("export");
169 queryParams.put("format", "XML");
171 NuxeoRESTClient nxClient = getClient();
172 Representation res = nxClient.get(pathParams, queryParams);
174 SAXReader reader = new SAXReader();
175 Document document = reader.read(res.getStream());
176 Element root = document.getRootElement();
177 co = new CollectionObject();
179 // TODO: recognize schema thru namespace uri
180 // Namespace ns = new Namespace("collectionobject", "http://collectionspace.org/collectionobject");
182 Iterator<Element> siter = root.elementIterator("schema");
183 while (siter.hasNext()) {
185 Element schemaElement = siter.next();
186 System.err.println("CollectionObject.getCollectionObject() called.");
188 //TODO: recognize schema thru namespace uri
189 if (CO_NUXEO_SCHEMA_NAME.equals(schemaElement.attribute("name").getValue())){
190 Element ele = schemaElement.element(CollectionObjectJAXBSchema.OBJECT_NUMBER);
192 co.setObjectNumber((String) ele.getData());
194 ele = schemaElement.element(CollectionObjectJAXBSchema.OTHER_NUMBER);
196 co.setOtherNumber((String) ele.getData());
198 ele = schemaElement.element(CollectionObjectJAXBSchema.BRIEF_DESCRIPTION);
200 co.setBriefDescription((String) ele.getData());
202 ele = schemaElement.element(CollectionObjectJAXBSchema.COMMENTS);
204 co.setComments((String) ele.getData());
206 ele = schemaElement.element(CollectionObjectJAXBSchema.DIST_FEATURES);
208 co.setDistFeatures((String) ele.getData());
210 ele = schemaElement.element(CollectionObjectJAXBSchema.OBJECT_NAME);
212 co.setObjectName((String) ele.getData());
214 ele = schemaElement.element(CollectionObjectJAXBSchema.RESPONSIBLE_DEPT);
216 co.setResponsibleDept((String) ele.getData());
218 ele = schemaElement.element(CollectionObjectJAXBSchema.TITLE);
220 co.setTitle((String) ele.getData());
224 } catch(Exception e){
226 Response response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(
227 "Get failed").type("text/plain").build();
228 throw new WebApplicationException(response);
231 Response response = Response.status(Response.Status.NOT_FOUND).entity(
232 "Get failed, the requested CollectionObject CSID:" + csid + ": was not found.").type("text/plain").build();
233 throw new WebApplicationException(response);
235 verbose("getCollectionObject: ", co);
242 public CollectionObject updateCollectionObject(
243 @PathParam("csid") String csid,
244 CollectionObject theUpdate) {
246 verbose("updateCollectionObject with input: ", theUpdate);
248 List<String> pathParams = new ArrayList<String>();
249 Map<String, String> queryParams = new HashMap<String, String>();
250 pathParams.add("default");
251 pathParams.add(csid);
252 pathParams.add("updateDocumentRestlet");
254 //todo: intelligent merge needed
255 if(theUpdate.getObjectNumber() != null){
256 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OBJECT_NUMBER,
257 theUpdate.getObjectNumber());
260 if(theUpdate.getOtherNumber() != null){
261 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OTHER_NUMBER,
262 theUpdate.getOtherNumber());
265 if(theUpdate.getBriefDescription()!= null){
266 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.BRIEF_DESCRIPTION,
267 theUpdate.getBriefDescription());
270 if(theUpdate.getComments() != null){
271 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.COMMENTS,
272 theUpdate.getComments());
275 if(theUpdate.getDistFeatures() != null){
276 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.DIST_FEATURES,
277 theUpdate.getDistFeatures());
280 if(theUpdate.getObjectName() != null){
281 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OBJECT_NAME,
282 theUpdate.getObjectName());
285 if(theUpdate.getResponsibleDept() != null){
286 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.RESPONSIBLE_DEPT,
287 theUpdate.getResponsibleDept());
290 if(theUpdate.getTitle() != null){
291 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.TITLE,
292 theUpdate.getTitle());
295 NuxeoRESTClient nxClient = getClient();
296 Representation res = nxClient.get(pathParams, queryParams);
297 SAXReader reader = new SAXReader();
298 String status = null;
300 Document document = reader.read(res.getStream());
301 Element root = document.getRootElement();
302 for(Iterator i = root.elementIterator(); i.hasNext();){
303 Element element = (Element) i.next();
304 if("docRef".equals(element.getName())){
305 status = (String) element.getData();
306 verbose("updateCollectionObject response: " + status);
309 } catch(Exception e) {
311 Response response = Response.status(Response.Status.NOT_FOUND).entity(
312 "Update failed ").type("text/plain").build();
313 throw new WebApplicationException(response);
321 public void deleteCollectionObject(@PathParam("csid") String csid) {
323 verbose("deleteCollectionObject with csid=" + csid);
325 NuxeoRESTClient nxClient = getClient();
326 List<String> pathParams = new ArrayList<String>();
327 Map<String, String> queryParams = new HashMap<String, String>();
329 pathParams.add("default");
330 pathParams.add(csid);
331 pathParams.add("deleteDocumentRestlet");
332 Representation res = nxClient.get(pathParams, queryParams);
333 SAXReader reader = new SAXReader();
337 Document document = reader.read(res.getStream());
338 Element root = document.getRootElement();
339 for(Iterator i = root.elementIterator(); i.hasNext();){
340 Element element = (Element) i.next();
341 if("docRef".equals(element.getName())){
342 status = (String) element.getData();
343 verbose("deleteCollectionObjectt response: " + status);
348 Response response = Response.status(Response.Status.NOT_FOUND).entity(
349 "Delete failed ").type("text/plain").build();
350 throw new WebApplicationException(response);
355 private void verbose(String msg, CollectionObject co) {
358 JAXBContext jc = JAXBContext.newInstance(
359 CollectionObject.class);
361 Marshaller m = jc.createMarshaller();
362 m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
364 m.marshal(co, System.out);
365 } catch(Exception e){
370 private void verbose(String msg) {
371 System.out.println("CollectionObjectResource. " + msg);