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;
25 import org.collectionspace.hello.*;
28 import org.collectionspace.hello.services.nuxeo.NuxeoRESTClient;
29 import org.collectionspace.hello.CollectionObjectList.CollectionObjectListItem;
30 import org.collectionspace.hello.services.CollectionObjectJAXBSchema;
31 import org.collectionspace.hello.services.CollectionObjectListItemJAXBSchema;
33 import org.dom4j.Document;
34 import org.dom4j.Element;
35 import org.dom4j.Namespace;
36 import org.dom4j.io.SAXReader;
37 import org.restlet.resource.Representation;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
41 @Path("/collectionobjects")
42 @Consumes("application/xml")
43 @Produces("application/xml")
44 public class CollectionObjectResource implements CollectionSpaceResource {
46 final static String CO_NUXEO_DOCTYPE = "CollectionObject";
47 final static String CO_NUXEO_SCHEMA_NAME = "collectionobject";
48 final static String CO_NUXEO_DC_TITLE = "CollectionSpace-CollectionObject";
50 final Logger logger = LoggerFactory.getLogger(CollectionObjectResource.class);
52 public CollectionObjectResource() {
57 public CollectionObjectList getCollectionObjectList(@Context UriInfo ui) {
58 CollectionObjectList p = new CollectionObjectList();
60 NuxeoRESTClient nxClient = getClient();
62 List<String> pathParams = new ArrayList<String>();
63 Map<String, String> queryParams = new HashMap<String, String>();
64 pathParams = Arrays.asList("default", CS_NUXEO_WORKSPACE_UID, "browse");
65 Representation res = nxClient.get(pathParams, queryParams);
66 SAXReader reader = new SAXReader();
67 Document document = reader.read(res.getStream());
68 Element root = document.getRootElement();
70 List<CollectionObjectList.CollectionObjectListItem> list = p.getCollectionObjectListItem();
71 for(Iterator i = root.elementIterator(); i.hasNext();){
72 Element element = (Element) i.next();
74 // set the CollectionObject list item entity elements
75 CollectionObjectListItem pli = new CollectionObjectListItem();
76 pli.setObjectNumber(element.attributeValue(CollectionObjectListItemJAXBSchema.OBJECT_NUMBER));
77 pli.setUri(element.attributeValue(CollectionObjectListItemJAXBSchema.URI));
78 pli.setCsid(element.attributeValue(CollectionObjectListItemJAXBSchema.CSID));
90 public Response createCollectionObject(CollectionObject co) {
92 NuxeoRESTClient nxClient = getClient();
94 List<String> pathParams = new ArrayList<String>();
95 Map<String, String> queryParams = new HashMap<String, String>();
96 pathParams.add("default");
97 pathParams.add(CS_NUXEO_WORKSPACE_UID);
98 pathParams.add("createDocument");
99 queryParams.put("docType", CO_NUXEO_DOCTYPE);
101 // a default title for the Dublin Core schema
102 queryParams.put("dublincore:title", CO_NUXEO_DC_TITLE);
104 // CollectionObject core values
105 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OBJECT_NUMBER,
106 co.getObjectNumber());
107 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OTHER_NUMBER,
108 co.getOtherNumber());
109 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.BRIEF_DESCRIPTION,
110 co.getBriefDescription());
111 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.COMMENTS,
113 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.DIST_FEATURES,
114 co.getDistFeatures());
115 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OBJECT_NAME,
117 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.RESPONSIBLE_DEPT,
118 co.getResponsibleDept());
119 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.TITLE,
122 ByteArrayInputStream bais = new ByteArrayInputStream(new byte[0]);
123 Representation res = nxClient.post(pathParams, queryParams, bais);
126 SAXReader reader = new SAXReader();
128 Document document = reader.read(res.getStream());
129 Element root = document.getRootElement();
130 for (Iterator i = root.elementIterator(); i.hasNext();){
131 Element element = (Element) i.next();
132 if ("docRef".equals(element.getName())){
133 csid = (String) element.getData();
137 } catch(Exception e){
138 Response response = Response.status(Response.Status.NOT_FOUND).entity(
139 "Create failed").type("text/plain").build();
140 throw new WebApplicationException(response);
144 verbose("createCollectionObject: ", co);
145 UriBuilder path = UriBuilder.fromResource(PersonNuxeoResource.class);
146 path.path("" + csid);
147 Response response = Response.created(path.build()).build();
154 public CollectionObject getCollectionObject(@PathParam("csid") String csid) {
156 CollectionObject co = null;
158 List<String> pathParams = new ArrayList<String>();
159 Map<String, String> queryParams = new HashMap<String, String>();
161 pathParams.add("default");
162 pathParams.add(csid);
163 pathParams.add("export");
164 queryParams.put("format", "XML");
166 NuxeoRESTClient nxClient = getClient();
167 Representation res = nxClient.get(pathParams, queryParams);
169 SAXReader reader = new SAXReader();
170 Document document = reader.read(res.getStream());
171 Element root = document.getRootElement();
172 co = new CollectionObject();
174 // TODO: recognize schema thru namespace uri
175 // Namespace ns = new Namespace("collectionobject", "http://collectionspace.org/collectionobject");
177 Iterator<Element> siter = root.elementIterator("schema");
178 while (siter.hasNext()) {
180 Element schemaElement = siter.next();
181 System.err.println("CollectionObject.getCollectionObject() called.");
183 //TODO: recognize schema thru namespace uri
184 if (CO_NUXEO_SCHEMA_NAME.equals(schemaElement.attribute("name").getValue())){
185 Element ele = schemaElement.element(CollectionObjectJAXBSchema.OBJECT_NUMBER);
187 co.setObjectNumber((String) ele.getData());
189 ele = schemaElement.element(CollectionObjectJAXBSchema.OTHER_NUMBER);
191 co.setOtherNumber((String) ele.getData());
193 ele = schemaElement.element(CollectionObjectJAXBSchema.BRIEF_DESCRIPTION);
195 co.setBriefDescription((String) ele.getData());
197 ele = schemaElement.element(CollectionObjectJAXBSchema.COMMENTS);
199 co.setComments((String) ele.getData());
201 ele = schemaElement.element(CollectionObjectJAXBSchema.DIST_FEATURES);
203 co.setDistFeatures((String) ele.getData());
205 ele = schemaElement.element(CollectionObjectJAXBSchema.OBJECT_NAME);
207 co.setObjectName((String) ele.getData());
209 ele = schemaElement.element(CollectionObjectJAXBSchema.RESPONSIBLE_DEPT);
211 co.setResponsibleDept((String) ele.getData());
213 ele = schemaElement.element(CollectionObjectJAXBSchema.TITLE);
215 co.setTitle((String) ele.getData());
219 } catch(Exception e){
221 Response response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(
222 "Get failed").type("text/plain").build();
223 throw new WebApplicationException(response);
226 Response response = Response.status(Response.Status.NOT_FOUND).entity(
227 "Get failed, the requested CollectionObject CSID:" + csid + ": was not found.").type("text/plain").build();
228 throw new WebApplicationException(response);
230 verbose("getCollectionObject: ", co);
237 public CollectionObject updateCollectionObject(
238 @PathParam("csid") String csid,
239 CollectionObject theUpdate) {
241 verbose("updateCollectionObject with input: ", theUpdate);
243 List<String> pathParams = new ArrayList<String>();
244 Map<String, String> queryParams = new HashMap<String, String>();
245 pathParams.add("default");
246 pathParams.add(csid);
247 pathParams.add("updateDocumentRestlet");
249 //todo: intelligent merge needed
250 if(theUpdate.getObjectNumber() != null){
251 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OBJECT_NUMBER,
252 theUpdate.getObjectNumber());
255 if(theUpdate.getOtherNumber() != null){
256 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OTHER_NUMBER,
257 theUpdate.getOtherNumber());
260 if(theUpdate.getBriefDescription()!= null){
261 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.BRIEF_DESCRIPTION,
262 theUpdate.getBriefDescription());
265 if(theUpdate.getComments() != null){
266 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.COMMENTS,
267 theUpdate.getComments());
270 if(theUpdate.getDistFeatures() != null){
271 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.DIST_FEATURES,
272 theUpdate.getDistFeatures());
275 if(theUpdate.getObjectName() != null){
276 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OBJECT_NAME,
277 theUpdate.getObjectName());
280 if(theUpdate.getResponsibleDept() != null){
281 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.RESPONSIBLE_DEPT,
282 theUpdate.getResponsibleDept());
285 if(theUpdate.getTitle() != null){
286 queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.TITLE,
287 theUpdate.getTitle());
290 NuxeoRESTClient nxClient = getClient();
291 Representation res = nxClient.get(pathParams, queryParams);
292 SAXReader reader = new SAXReader();
293 String status = null;
295 Document document = reader.read(res.getStream());
296 Element root = document.getRootElement();
297 for(Iterator i = root.elementIterator(); i.hasNext();){
298 Element element = (Element) i.next();
299 if("docRef".equals(element.getName())){
300 status = (String) element.getData();
301 verbose("updateCollectionObject response: " + status);
304 } catch(Exception e) {
306 Response response = Response.status(Response.Status.NOT_FOUND).entity(
307 "Update failed ").type("text/plain").build();
308 throw new WebApplicationException(response);
316 public void deleteCollectionObject(@PathParam("csid") String csid) {
318 verbose("deleteCollectionObject with csid=" + csid);
320 NuxeoRESTClient nxClient = getClient();
321 List<String> pathParams = new ArrayList<String>();
322 Map<String, String> queryParams = new HashMap<String, String>();
324 pathParams.add("default");
325 pathParams.add(csid);
326 pathParams.add("deleteDocumentRestlet");
327 Representation res = nxClient.get(pathParams, queryParams);
328 SAXReader reader = new SAXReader();
332 Document document = reader.read(res.getStream());
333 Element root = document.getRootElement();
334 for(Iterator i = root.elementIterator(); i.hasNext();){
335 Element element = (Element) i.next();
336 if("docRef".equals(element.getName())){
337 status = (String) element.getData();
338 verbose("deleteCollectionObjectt response: " + status);
343 Response response = Response.status(Response.Status.NOT_FOUND).entity(
344 "Delete failed ").type("text/plain").build();
345 throw new WebApplicationException(response);
350 private void verbose(String msg, CollectionObject co) {
353 JAXBContext jc = JAXBContext.newInstance(
354 CollectionObject.class);
356 Marshaller m = jc.createMarshaller();
357 m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
359 m.marshal(co, System.out);
360 } catch(Exception e){
365 private NuxeoRESTClient getClient() {
366 NuxeoRESTClient nxClient = new NuxeoRESTClient("http://127.0.0.1:8080/nuxeo");
367 nxClient.setAuthType(NuxeoRESTClient.AUTH_TYPE_BASIC);
368 nxClient.setBasicAuthentication("Administrator", "Administrator");
372 private void verbose(String msg) {
373 System.out.println("CollectionObjectResource. " + msg);