]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
90255d06db96982927f49ba347be9011c04b160a
[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 import org.collectionspace.hello.*;
26
27
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;
32
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;
40
41 @Path("/collectionobjects")
42 @Consumes("application/xml")
43 @Produces("application/xml")
44 public class CollectionObjectResource implements CollectionSpaceResource {
45
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";
49         
50     final Logger logger = LoggerFactory.getLogger(CollectionObjectResource.class);
51
52     public CollectionObjectResource() {
53         // do nothing
54     }
55
56     @GET
57     public CollectionObjectList getCollectionObjectList(@Context UriInfo ui) {
58         CollectionObjectList p = new CollectionObjectList();
59         try{
60             NuxeoRESTClient nxClient = getClient();
61
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();
69
70             List<CollectionObjectList.CollectionObjectListItem> list = p.getCollectionObjectListItem();
71             for(Iterator i = root.elementIterator(); i.hasNext();){
72                 Element element = (Element) i.next();
73
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));
79                 list.add(pli);
80             }
81
82         }catch(Exception e){
83             e.printStackTrace();
84         }
85         
86         return p;
87     }
88
89     @POST
90     public Response createCollectionObject(CollectionObject co) {
91
92         NuxeoRESTClient nxClient = getClient();
93
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);
100         
101         // a default title for the Dublin Core schema
102         queryParams.put("dublincore:title", CO_NUXEO_DC_TITLE);
103         
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,
112                         co.getComments());
113         queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.DIST_FEATURES,
114                         co.getDistFeatures());
115         queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OBJECT_NAME,
116                         co.getObjectName());
117         queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.RESPONSIBLE_DEPT,
118                         co.getResponsibleDept());
119         queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.TITLE,
120                         co.getTitle());
121         
122         ByteArrayInputStream bais = new ByteArrayInputStream(new byte[0]);
123         Representation res = nxClient.post(pathParams, queryParams, bais);
124
125         String csid = null;
126         SAXReader reader = new SAXReader();
127         try {
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();
134                     co.setCsid(csid);
135                 }
136             }
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);
141         }
142
143         
144         verbose("createCollectionObject: ", co);
145         UriBuilder path = UriBuilder.fromResource(PersonNuxeoResource.class);
146         path.path("" + csid);
147         Response response = Response.created(path.build()).build();
148         
149         return response;
150     }
151
152     @GET
153     @Path("{csid}")
154     public CollectionObject getCollectionObject(@PathParam("csid") String csid) {
155
156         CollectionObject co = null;
157         try {
158             List<String> pathParams = new ArrayList<String>();
159             Map<String, String> queryParams = new HashMap<String, String>();
160
161             pathParams.add("default");
162             pathParams.add(csid);
163             pathParams.add("export");
164             queryParams.put("format", "XML");
165
166             NuxeoRESTClient nxClient = getClient();
167             Representation res = nxClient.get(pathParams, queryParams);
168
169             SAXReader reader = new SAXReader();
170             Document document = reader.read(res.getStream());
171             Element root = document.getRootElement();
172             co = new CollectionObject();
173
174  //                     TODO: recognize schema thru namespace uri
175 //          Namespace ns = new Namespace("collectionobject", "http://collectionspace.org/collectionobject");
176
177             Iterator<Element> siter = root.elementIterator("schema");
178             while (siter.hasNext()) {
179
180                 Element schemaElement = siter.next();
181                 System.err.println("CollectionObject.getCollectionObject() called.");
182
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);
186                     if(ele != null){
187                         co.setObjectNumber((String) ele.getData());
188                     }
189                     ele = schemaElement.element(CollectionObjectJAXBSchema.OTHER_NUMBER);
190                     if(ele != null){
191                         co.setOtherNumber((String) ele.getData());
192                     }
193                     ele = schemaElement.element(CollectionObjectJAXBSchema.BRIEF_DESCRIPTION);
194                     if(ele != null){
195                         co.setBriefDescription((String) ele.getData());
196                     }
197                     ele = schemaElement.element(CollectionObjectJAXBSchema.COMMENTS);
198                     if(ele != null){
199                         co.setComments((String) ele.getData());
200                     }
201                     ele = schemaElement.element(CollectionObjectJAXBSchema.DIST_FEATURES);
202                     if(ele != null){
203                         co.setDistFeatures((String) ele.getData());
204                     }
205                     ele = schemaElement.element(CollectionObjectJAXBSchema.OBJECT_NAME);
206                     if(ele != null){
207                         co.setObjectName((String) ele.getData());
208                     }
209                     ele = schemaElement.element(CollectionObjectJAXBSchema.RESPONSIBLE_DEPT);
210                     if(ele != null){
211                         co.setResponsibleDept((String) ele.getData());
212                     }
213                     ele = schemaElement.element(CollectionObjectJAXBSchema.TITLE);
214                     if(ele != null){
215                         co.setTitle((String) ele.getData());
216                     }
217                 }
218             }
219         } catch(Exception e){
220             e.printStackTrace();
221             Response response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(
222                     "Get failed").type("text/plain").build();
223             throw new WebApplicationException(response);
224         }
225         if (co == null) {
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);
229         }
230         verbose("getCollectionObject: ", co);
231         
232         return co;
233     }
234
235     @PUT
236     @Path("{csid}")
237     public CollectionObject updateCollectionObject(
238             @PathParam("csid") String csid,
239             CollectionObject theUpdate) {
240
241         verbose("updateCollectionObject with input: ", theUpdate);
242
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");
248         
249         //todo: intelligent merge needed
250         if(theUpdate.getObjectNumber() != null){
251             queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OBJECT_NUMBER, 
252                         theUpdate.getObjectNumber());
253         }
254
255         if(theUpdate.getOtherNumber() != null){
256             queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OTHER_NUMBER, 
257                         theUpdate.getOtherNumber());
258         }
259
260         if(theUpdate.getBriefDescription()!= null){
261             queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.BRIEF_DESCRIPTION, 
262                         theUpdate.getBriefDescription());
263         }
264
265         if(theUpdate.getComments() != null){
266             queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.COMMENTS, 
267                         theUpdate.getComments());
268         }
269
270         if(theUpdate.getDistFeatures() != null){
271             queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.DIST_FEATURES, 
272                         theUpdate.getDistFeatures());
273         }
274
275         if(theUpdate.getObjectName() != null){
276             queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.OBJECT_NAME, 
277                         theUpdate.getObjectName());
278         }
279
280         if(theUpdate.getResponsibleDept() != null){
281             queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.RESPONSIBLE_DEPT, 
282                         theUpdate.getResponsibleDept());
283         }
284
285         if(theUpdate.getTitle() != null){
286             queryParams.put(CO_NUXEO_SCHEMA_NAME + ":" + CollectionObjectJAXBSchema.TITLE, 
287                         theUpdate.getTitle());
288         }
289
290         NuxeoRESTClient nxClient = getClient();
291         Representation res = nxClient.get(pathParams, queryParams);
292         SAXReader reader = new SAXReader();
293         String status = null;
294         try {
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);
302                 }
303             }
304         } catch(Exception e) {
305             //FIXME: NOT_FOUND?
306             Response response = Response.status(Response.Status.NOT_FOUND).entity(
307                     "Update failed ").type("text/plain").build();
308             throw new WebApplicationException(response);
309         }
310         
311         return theUpdate;
312     }
313
314     @DELETE
315     @Path("{csid}")
316     public void deleteCollectionObject(@PathParam("csid") String csid) {
317
318         verbose("deleteCollectionObject with csid=" + csid);
319         
320         NuxeoRESTClient nxClient = getClient();
321         List<String> pathParams = new ArrayList<String>();
322         Map<String, String> queryParams = new HashMap<String, String>();
323
324         pathParams.add("default");
325         pathParams.add(csid);
326         pathParams.add("deleteDocumentRestlet");
327         Representation res = nxClient.get(pathParams, queryParams);
328         SAXReader reader = new SAXReader();
329         String status = "";
330         
331         try {
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);
339                 }
340             }
341         }catch(Exception e){
342             //FIXME: NOT_FOUND?
343             Response response = Response.status(Response.Status.NOT_FOUND).entity(
344                     "Delete failed ").type("text/plain").build();
345             throw new WebApplicationException(response);
346         }
347
348     }
349
350     private void verbose(String msg, CollectionObject co) {
351         try {
352             verbose(msg);
353             JAXBContext jc = JAXBContext.newInstance(
354                     CollectionObject.class);
355
356             Marshaller m = jc.createMarshaller();
357             m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
358                     Boolean.TRUE);
359             m.marshal(co, System.out);
360         } catch(Exception e){
361             e.printStackTrace();
362         }
363     }
364
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");
369         return nxClient;
370     }
371
372     private void verbose(String msg) {
373         System.out.println("CollectionObjectResource. " + msg);
374     }
375 }