]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
9e4fb90789d019319fb01e7fb5740799e0061ce0
[tmp/jakarta-migration.git] /
1 package org.collectionspace.hello.services;
2
3 import java.io.ByteArrayInputStream;
4 import org.collectionspace.hello.services.nuxeo.NuxeoRESTClient;
5 import java.util.ArrayList;
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.MediaType;
20 import javax.ws.rs.core.Response;
21 import javax.ws.rs.core.UriBuilder;
22 import javax.xml.bind.JAXBContext;
23 import javax.xml.bind.Marshaller;
24 import org.collectionspace.hello.*;
25
26 import org.collectionspace.world.DublincoreNuxeo;
27 import org.dom4j.Document;
28 import org.dom4j.Element;
29 import org.dom4j.io.SAXReader;
30 import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput;
31 import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataOutput;
32 import org.restlet.resource.Representation;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35
36 @Path("/multipart")
37 @Consumes("application/xml")
38 @Produces("application/xml")
39 public class MultipartResource extends CollectionSpaceResource {
40
41     final Logger logger = LoggerFactory.getLogger(MultipartResource.class);
42
43     public MultipartResource() {
44     }
45
46     @POST
47     @Consumes("multipart/form-data")
48     public Response createPerson(MultipartFormDataInput multipart) {
49
50         PersonNuxeo p = new PersonNuxeo();
51         DublincoreNuxeo dc = new DublincoreNuxeo();
52         NuxeoRESTClient nxClient = getClient();
53
54         List<String> pathParams = new ArrayList<String>();
55         Map<String, String> queryParams = new HashMap<String, String>();
56         pathParams.add("default");
57         pathParams.add(CS_PERSON_WORKSPACE_UID);
58         pathParams.add("createDocument");
59         queryParams.put("docType", "Hello");
60
61         try{
62             if(multipart.getFormData().containsKey("dublincore")){
63                 dc = multipart.getFormDataPart("dublincore", DublincoreNuxeo.class, null);
64                 if(dc.getTitle() != null){
65                     queryParams.put("dublincore:title", dc.getTitle());
66                 }
67             }
68             if(multipart.getFormData().containsKey("hello")){
69                 p = multipart.getFormDataPart("hello", PersonNuxeo.class, null);
70                 queryParams.put("hello:cversion", Integer.valueOf(1).toString());
71                 if(p.getFirstName() != null){
72                     queryParams.put("hello:firstName", p.getFirstName());
73                 }
74                 if(p.getLastName() != null){
75                     queryParams.put("hello:lastName", p.getLastName());
76                 }
77                 if(p.getStreet() != null){
78                     queryParams.put("hello:street", p.getStreet());
79                 }
80                 if(p.getCity() != null){
81                     queryParams.put("hello:city", p.getCity());
82                 }
83                 if(p.getState() != null){
84                     queryParams.put("hello:state", p.getState());
85                 }
86                 if(p.getZip() != null){
87                     queryParams.put("hello:zip", p.getZip());
88                 }
89                 if(p.getCountry() != null){
90                     queryParams.put("hello:country", p.getCountry());
91                 }
92             }
93             ByteArrayInputStream bais = new ByteArrayInputStream(new byte[0]);
94             Representation res = nxClient.post(pathParams, queryParams, bais);
95
96             SAXReader reader = new SAXReader();
97
98             Document document = reader.read(res.getStream());
99             Element root = document.getRootElement();
100             for(Iterator i = root.elementIterator(); i.hasNext();){
101                 Element element = (Element) i.next();
102                 if("docRef".equals(element.getName())){
103                     String id = (String) element.getData();
104                     p.setId(id);
105                 }
106             }
107         }catch(Exception e){
108             Response response = Response.status(Response.Status.NOT_FOUND).entity(
109                     "Create failed").type("text/plain").build();
110             throw new WebApplicationException(response);
111         }
112
113         verbosePerson("createPerson: person", p);
114         verboseDublin("createPerson: dublincore", dc);
115         UriBuilder path = UriBuilder.fromResource(MultipartResource.class);
116         path.path("" + p.getId());
117         Response response = Response.created(path.build()).build();
118         return response;
119     }
120
121     @GET
122     @Path("{id}")
123     @Produces("multipart/form-data")
124     public MultipartFormDataOutput getPerson(@PathParam("id") String id) {
125
126         PersonNuxeo person = new PersonNuxeo();
127         DublincoreNuxeo dublin = new DublincoreNuxeo();
128         MultipartFormDataOutput output = new MultipartFormDataOutput();
129
130         try{
131             NuxeoRESTClient nxClient = getClient();
132
133             List<String> pathParams = new ArrayList<String>();
134             Map<String, String> queryParams = new HashMap<String, String>();
135
136             pathParams.add("default");
137             pathParams.add(id);
138             pathParams.add("export");
139             queryParams.put("format", "XML");
140
141             Representation res = nxClient.get(pathParams, queryParams);
142             SAXReader reader = new SAXReader();
143
144             Document document = reader.read(res.getStream());
145             Element root = document.getRootElement();
146
147             //TODO: recognize schema thru namespace uri
148 //            Namespace ns = new Namespace("hello", "http://collectionspace.org/hello");
149             Iterator<Element> siter = root.elementIterator("schema");
150             while(siter.hasNext()){
151
152                 Element s = siter.next();
153
154                 //TODO: recognize schema thru namespace uri
155                 if("hello".equals(s.attribute("name").getValue())){
156                     person.setId(id);
157                     Element ele = s.element("cversion");
158                     if(ele != null){
159                         person.setVersion((String) ele.getData());
160                     }
161                     ele = s.element("firstName");
162                     if(ele != null){
163                         person.setFirstName((String) ele.getData());
164                     }
165                     ele = s.element("lastName");
166                     if(ele != null){
167                         person.setLastName((String) ele.getData());
168                     }
169                     ele = s.element("city");
170                     if(ele != null){
171                         person.setCity((String) ele.getData());
172                     }
173                     ele = s.element("state");
174                     if(ele != null){
175                         person.setState((String) ele.getData());
176                     }
177                     ele = s.element("zip");
178                     if(ele != null){
179                         person.setZip((String) ele.getData());
180                     }
181                     ele = s.element("country");
182                     if(ele != null){
183                         person.setCountry((String) ele.getData());
184                     }
185                 }else if("dublincore".equals(s.attribute("name").getValue())){
186                     Element ele = s.element("title");
187                     if(ele != null){
188                         dublin.setTitle((String) ele.getData());
189                     }
190                 }
191             }//while
192             verbosePerson("getPerson:hello:", person);
193             output.addFormData("hello", person, MediaType.APPLICATION_XML_TYPE);
194             verboseDublin("getPerson:dublincore:", dublin);
195             output.addFormData("dublincore", dublin, MediaType.APPLICATION_XML_TYPE);
196
197         }catch(Exception e){
198             e.printStackTrace();
199             Response response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(
200                     "Get failed").type("text/plain").build();
201             throw new WebApplicationException(response);
202         }
203         if(person == null){
204             Response response = Response.status(Response.Status.NOT_FOUND).entity(
205                     "Get failed, the requested person ID:" + id + ": was not found.").type("text/plain").build();
206             throw new WebApplicationException(response);
207         }
208
209         return output;
210     }
211
212     @PUT
213     @Path("{id}")
214     public PersonNuxeo updatePerson(
215             @PathParam("id") String id,
216             PersonNuxeo update) {
217
218         verbosePerson("updating person input", update);
219
220         NuxeoRESTClient nxClient = getClient();
221
222         List<String> pathParams = new ArrayList<String>();
223         Map<String, String> queryParams = new HashMap<String, String>();
224         pathParams.add("default");
225         pathParams.add(update.getId());
226         pathParams.add("updateDocumentRestlet");
227         queryParams.put("dublincore:title", "change title");
228         //todo: intelligent merge needed
229         if(update.getFirstName() != null){
230             queryParams.put("hello:firstName", update.getFirstName());
231         }
232
233         if(update.getLastName() != null){
234             queryParams.put("hello:lastName", update.getLastName());
235         }
236
237         if(update.getFirstName() != null && update.getLastName() != null){
238             queryParams.put("dublincore:title", update.getFirstName() + " " + update.getLastName());
239         }
240
241         if(update.getStreet() != null){
242             queryParams.put("hello:street", update.getStreet());
243         }
244
245         if(update.getCity() != null){
246             queryParams.put("hello:city", update.getCity());
247         }
248
249         if(update.getState() != null){
250             queryParams.put("hello:state", update.getState());
251         }
252
253         if(update.getZip() != null){
254             queryParams.put("hello:zip", update.getZip());
255         }
256
257         if(update.getCountry() != null){
258             queryParams.put("hello:country", update.getCountry());
259         }
260
261         Representation res = nxClient.get(pathParams, queryParams);
262         SAXReader reader = new SAXReader();
263         String status = "";
264         try{
265             Document document = reader.read(res.getStream());
266             Element root = document.getRootElement();
267             for(Iterator i = root.elementIterator(); i.hasNext();){
268                 Element element = (Element) i.next();
269                 if("docRef".equals(element.getName())){
270                     status = (String) element.getData();
271                     verbose("updatePerson: response=" + status);
272                 }
273
274             }
275         }catch(Exception e){
276             //FIXME: NOT_FOUND?
277             Response response = Response.status(Response.Status.NOT_FOUND).entity(
278                     "Update failed ").type("text/plain").build();
279             throw new WebApplicationException(response);
280         }
281         return update;
282     }
283
284     @DELETE
285     @Path("{id}")
286     public void deletePerson(@PathParam("id") String id) {
287         verbose("deleting person with id=" + id);
288         NuxeoRESTClient nxClient = getClient();
289         List<String> pathParams = new ArrayList<String>();
290         Map<String, String> queryParams = new HashMap<String, String>();
291         pathParams.add("default");
292         pathParams.add(id);
293         pathParams.add("deleteDocumentRestlet");
294         Representation res = nxClient.get(pathParams, queryParams);
295         SAXReader reader = new SAXReader();
296         String status = "";
297         try{
298             Document document = reader.read(res.getStream());
299             Element root = document.getRootElement();
300             for(Iterator i = root.elementIterator(); i.hasNext();){
301                 Element element = (Element) i.next();
302                 if("docRef".equals(element.getName())){
303                     status = (String) element.getData();
304                     verbose("deletePerson: response=" + status);
305                 }
306
307             }
308         }catch(Exception e){
309             //FIXME: NOT_FOUND?
310             Response response = Response.status(Response.Status.NOT_FOUND).entity(
311                     "Delete failed ").type("text/plain").build();
312             throw new WebApplicationException(response);
313         }
314
315     }
316
317     private void verbosePerson(String msg, PersonNuxeo person) {
318         try{
319             verbose(msg);
320             JAXBContext jc = JAXBContext.newInstance(
321                     PersonNuxeo.class);
322
323             Marshaller m = jc.createMarshaller();
324             m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
325                     Boolean.TRUE);
326             m.marshal(person, System.out);
327         }catch(Exception e){
328             e.printStackTrace();
329         }
330
331     }
332
333     private void verboseDublin(String msg, DublincoreNuxeo dubin) {
334         try{
335             verbose(msg);
336             JAXBContext jc = JAXBContext.newInstance(
337                     DublincoreNuxeo.class);
338
339             Marshaller m = jc.createMarshaller();
340             m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
341                     Boolean.TRUE);
342             m.marshal(dubin, System.out);
343         }catch(Exception e){
344             e.printStackTrace();
345         }
346
347     }
348
349     private void verbose(String msg) {
350         System.out.println("MultipartResource: " + msg);
351     }
352 }