]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
479d5888a10899f647da7d5ec9c3aff865fe9ef1
[tmp/jakarta-migration.git] /
1 package org.collectionspace.hello.services;
2
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;
8 import java.util.List;
9 import javax.ws.rs.Consumes;
10 import javax.ws.rs.GET;
11 import javax.ws.rs.Path;
12 import javax.ws.rs.Produces;
13 import java.util.Map;
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
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;
31
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;
39
40 @Path("/collectionobjects")
41 @Consumes("application/xml")
42 @Produces("application/xml")
43 public class CollectionObjectResource extends CollectionSpaceResource {
44
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";
48         
49     final Logger logger = LoggerFactory.getLogger(CollectionObjectResource.class);
50
51     public CollectionObjectResource() {
52         // do nothing
53     }
54
55     @GET
56     public CollectionObjectList getCollectionObjectList(@Context UriInfo ui) {
57         CollectionObjectList p = new CollectionObjectList();
58         try{
59             NuxeoRESTClient nxClient = getClient();
60
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();
68             
69             //debug
70             System.err.println(res.toString());
71             System.err.println(document.asXML());
72
73             List<CollectionObjectList.CollectionObjectListItem> list = p.getCollectionObjectListItem();
74             for(Iterator i = root.elementIterator(); i.hasNext();){
75                 Element element = (Element) i.next();
76                 //debug
77                 System.err.println();element.asXML();
78
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"));
84                 list.add(pli);
85             }
86
87         }catch(Exception e){
88             e.printStackTrace();
89         }
90         
91         return p;
92     }
93
94     @POST
95     public Response createCollectionObject(CollectionObject co) {
96
97         NuxeoRESTClient nxClient = getClient();
98
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);
105         
106         // a default title for the Dublin Core schema
107         queryParams.put("dublincore:title", CO_NUXEO_DC_TITLE);
108         
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,
117                         co.getComments());
118         queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.DIST_FEATURES,
119                         co.getDistFeatures());
120         queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OBJECT_NAME,
121                         co.getObjectName());
122         queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.RESPONSIBLE_DEPT,
123                         co.getResponsibleDept());
124         queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.TITLE,
125                         co.getTitle());
126         
127         ByteArrayInputStream bais = new ByteArrayInputStream(new byte[0]);
128         Representation res = nxClient.post(pathParams, queryParams, bais);
129
130         String csid = null;
131         SAXReader reader = new SAXReader();
132         try {
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();
139                     co.setCsid(csid);
140                 }
141             }
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);
146         }
147
148         
149         verbose("createCollectionObject: ", co);
150         UriBuilder path = UriBuilder.fromResource(CollectionObjectResource.class);
151         path.path("" + csid);
152         Response response = Response.created(path.build()).build();
153         
154         return response;
155     }
156
157     @GET
158     @Path("{csid}")
159     public CollectionObject getCollectionObject(@PathParam("csid") String csid) {
160
161         CollectionObject co = null;
162         try {
163             List<String> pathParams = new ArrayList<String>();
164             Map<String, String> queryParams = new HashMap<String, String>();
165
166             pathParams.add("default");
167             pathParams.add(csid);
168             pathParams.add("export");
169             queryParams.put("format", "XML");
170
171             NuxeoRESTClient nxClient = getClient();
172             Representation res = nxClient.get(pathParams, queryParams);
173
174             SAXReader reader = new SAXReader();
175             Document document = reader.read(res.getStream());
176             Element root = document.getRootElement();
177             co = new CollectionObject();
178
179  //                     TODO: recognize schema thru namespace uri
180 //          Namespace ns = new Namespace("collectionobject", "http://collectionspace.org/collectionobject");
181
182             Iterator<Element> siter = root.elementIterator("schema");
183             while (siter.hasNext()) {
184
185                 Element schemaElement = siter.next();
186                 System.err.println("CollectionObject.getCollectionObject() called.");
187
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);
191                     if(ele != null){
192                         co.setObjectNumber((String) ele.getData());
193                     }
194                     ele = schemaElement.element(CollectionObjectJAXBSchema.OTHER_NUMBER);
195                     if(ele != null){
196                         co.setOtherNumber((String) ele.getData());
197                     }
198                     ele = schemaElement.element(CollectionObjectJAXBSchema.BRIEF_DESCRIPTION);
199                     if(ele != null){
200                         co.setBriefDescription((String) ele.getData());
201                     }
202                     ele = schemaElement.element(CollectionObjectJAXBSchema.COMMENTS);
203                     if(ele != null){
204                         co.setComments((String) ele.getData());
205                     }
206                     ele = schemaElement.element(CollectionObjectJAXBSchema.DIST_FEATURES);
207                     if(ele != null){
208                         co.setDistFeatures((String) ele.getData());
209                     }
210                     ele = schemaElement.element(CollectionObjectJAXBSchema.OBJECT_NAME);
211                     if(ele != null){
212                         co.setObjectName((String) ele.getData());
213                     }
214                     ele = schemaElement.element(CollectionObjectJAXBSchema.RESPONSIBLE_DEPT);
215                     if(ele != null){
216                         co.setResponsibleDept((String) ele.getData());
217                     }
218                     ele = schemaElement.element(CollectionObjectJAXBSchema.TITLE);
219                     if(ele != null){
220                         co.setTitle((String) ele.getData());
221                     }
222                 }
223             }
224         } catch(Exception e){
225             e.printStackTrace();
226             Response response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(
227                     "Get failed").type("text/plain").build();
228             throw new WebApplicationException(response);
229         }
230         if (co == null) {
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);
234         }
235         verbose("getCollectionObject: ", co);
236         
237         return co;
238     }
239
240     @PUT
241     @Path("{csid}")
242     public CollectionObject updateCollectionObject(
243             @PathParam("csid") String csid,
244             CollectionObject theUpdate) {
245
246         verbose("updateCollectionObject with input: ", theUpdate);
247
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");
253         
254         //todo: intelligent merge needed
255         if(theUpdate.getObjectNumber() != null){
256             queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OBJECT_NUMBER, 
257                         theUpdate.getObjectNumber());
258         }
259
260         if(theUpdate.getOtherNumber() != null){
261             queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OTHER_NUMBER, 
262                         theUpdate.getOtherNumber());
263         }
264
265         if(theUpdate.getBriefDescription()!= null){
266             queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.BRIEF_DESCRIPTION, 
267                         theUpdate.getBriefDescription());
268         }
269
270         if(theUpdate.getComments() != null){
271             queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.COMMENTS, 
272                         theUpdate.getComments());
273         }
274
275         if(theUpdate.getDistFeatures() != null){
276             queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.DIST_FEATURES, 
277                         theUpdate.getDistFeatures());
278         }
279
280         if(theUpdate.getObjectName() != null){
281             queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OBJECT_NAME, 
282                         theUpdate.getObjectName());
283         }
284
285         if(theUpdate.getResponsibleDept() != null){
286             queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.RESPONSIBLE_DEPT, 
287                         theUpdate.getResponsibleDept());
288         }
289
290         if(theUpdate.getTitle() != null){
291             queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.TITLE, 
292                         theUpdate.getTitle());
293         }
294
295         NuxeoRESTClient nxClient = getClient();
296         Representation res = nxClient.get(pathParams, queryParams);
297         SAXReader reader = new SAXReader();
298         String status = null;
299         try {
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);
307                 }
308             }
309         } catch(Exception e) {
310             //FIXME: NOT_FOUND?
311             Response response = Response.status(Response.Status.NOT_FOUND).entity(
312                     "Update failed ").type("text/plain").build();
313             throw new WebApplicationException(response);
314         }
315         
316         return theUpdate;
317     }
318
319     @DELETE
320     @Path("{csid}")
321     public void deleteCollectionObject(@PathParam("csid") String csid) {
322
323         verbose("deleteCollectionObject with csid=" + csid);
324         
325         NuxeoRESTClient nxClient = getClient();
326         List<String> pathParams = new ArrayList<String>();
327         Map<String, String> queryParams = new HashMap<String, String>();
328
329         pathParams.add("default");
330         pathParams.add(csid);
331         pathParams.add("deleteDocumentRestlet");
332         Representation res = nxClient.get(pathParams, queryParams);
333         SAXReader reader = new SAXReader();
334         String status = "";
335         
336         try {
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);
344                 }
345             }
346         }catch(Exception e){
347             //FIXME: NOT_FOUND?
348             Response response = Response.status(Response.Status.NOT_FOUND).entity(
349                     "Delete failed ").type("text/plain").build();
350             throw new WebApplicationException(response);
351         }
352
353     }
354
355     private void verbose(String msg, CollectionObject co) {
356         try {
357             verbose(msg);
358             JAXBContext jc = JAXBContext.newInstance(
359                     CollectionObject.class);
360
361             Marshaller m = jc.createMarshaller();
362             m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
363                     Boolean.TRUE);
364             m.marshal(co, System.out);
365         } catch(Exception e){
366             e.printStackTrace();
367         }
368     }
369
370     private void verbose(String msg) {
371         System.out.println("CollectionObjectResource. " + msg);
372     }
373 }