1 package org.collectionspace.hello.services;
3 import java.io.ByteArrayInputStream;
4 import org.collectionspace.hello.services.nuxeo.NuxeoRESTClient;
5 import java.util.ArrayList;
6 import java.util.Arrays;
7 import java.util.HashMap;
8 import java.util.Iterator;
10 import javax.ws.rs.Consumes;
11 import javax.ws.rs.GET;
12 import javax.ws.rs.Path;
13 import javax.ws.rs.Produces;
15 import javax.ws.rs.DELETE;
16 import javax.ws.rs.POST;
17 import javax.ws.rs.PUT;
18 import javax.ws.rs.PathParam;
19 import javax.ws.rs.WebApplicationException;
20 import javax.ws.rs.core.Context;
21 import javax.ws.rs.core.Response;
22 import javax.ws.rs.core.UriBuilder;
23 import javax.ws.rs.core.UriInfo;
24 import javax.xml.bind.JAXBContext;
25 import javax.xml.bind.Marshaller;
26 import org.collectionspace.hello.*;
29 import org.collectionspace.hello.People.PeopleItem;
30 import org.dom4j.Document;
31 import org.dom4j.Element;
32 import org.dom4j.Namespace;
33 import org.dom4j.io.SAXReader;
34 import org.restlet.resource.Representation;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
39 @Consumes("application/xml")
40 @Produces("application/xml")
41 public class PersonNuxeoResource {
43 final Logger logger = LoggerFactory.getLogger(PersonNuxeoResource.class);
45 public PersonNuxeoResource() {
49 public People getPeople(@Context UriInfo ui) {
50 People p = new People();
52 List<People.PeopleItem> list = p.getPeopleItem();
53 NuxeoRESTClient nxClient = getClient();
55 List<String> pathParams = new ArrayList<String>();
56 Map<String, String> queryParams = new HashMap<String, String>();
57 //browse default repository for People
58 //For sanjay, People repository id is f084243e-4b81-42a1-9a05-518e974facbd
59 //For Richard, workspace repos ID is 77187c27-0467-4c3d-b395-122b82113f4d
60 pathParams = Arrays.asList("default", "1b58eef7-4fff-430b-b773-8c98724f19de", "browse");
61 Representation res = nxClient.get(pathParams, queryParams);
62 SAXReader reader = new SAXReader();
63 Document document = reader.read(res.getStream());
64 Element root = document.getRootElement();
65 for(Iterator i = root.elementIterator(); i.hasNext();){
66 Element element = (Element) i.next();
67 PeopleItem pli = new PeopleItem();
68 pli.setTitle(element.attributeValue("title"));
69 pli.setUri(element.attributeValue("url"));
70 pli.setId(element.attributeValue("id"));
81 public Response createPerson(PersonNuxeo p) {
83 NuxeoRESTClient nxClient = getClient();
85 List<String> pathParams = new ArrayList<String>();
86 Map<String, String> queryParams = new HashMap<String, String>();
87 pathParams.add("default");
88 pathParams.add("1b58eef7-4fff-430b-b773-8c98724f19de");
89 pathParams.add("createDocument");
90 queryParams.put("docType", "Hello");
91 queryParams.put("dublincore:title", p.getFirstName() + " " + p.getLastName());
92 queryParams.put("hello:cversion", Integer.valueOf(1).toString());
93 queryParams.put("hello:firstName", p.getFirstName());
94 queryParams.put("hello:lastName", p.getLastName());
95 queryParams.put("hello:street", p.getStreet());
96 queryParams.put("hello:city", p.getCity());
97 queryParams.put("hello:state", p.getState());
98 queryParams.put("hello:zip", p.getZip());
99 queryParams.put("hello:country", p.getCountry());
100 ByteArrayInputStream bais = new ByteArrayInputStream(new byte[0]);
101 Representation res = nxClient.post(pathParams, queryParams, bais);
103 SAXReader reader = new SAXReader();
105 Document document = reader.read(res.getStream());
106 Element root = document.getRootElement();
107 for(Iterator i = root.elementIterator(); i.hasNext();){
108 Element element = (Element) i.next();
109 if("docRef".equals(element.getName())){
110 String id = (String) element.getData();
115 Response response = Response.status(Response.Status.NOT_FOUND).entity(
116 "Create failed").type("text/plain").build();
117 throw new WebApplicationException(response);
120 verbose("created person", p);
121 UriBuilder path = UriBuilder.fromResource(PersonNuxeoResource.class);
122 path.path("" + p.getId());
123 Response response = Response.created(path.build()).build();
129 public PersonNuxeo getPerson(@PathParam("id") String id) {
131 PersonNuxeo p = null;
134 NuxeoRESTClient nxClient = getClient();
136 List<String> pathParams = new ArrayList<String>();
137 Map<String, String> queryParams = new HashMap<String, String>();
139 pathParams.add("default");
141 pathParams.add("export");
142 queryParams.put("format", "XML");
144 Representation res = nxClient.get(pathParams, queryParams);
145 SAXReader reader = new SAXReader();
147 Document document = reader.read(res.getStream());
148 Element root = document.getRootElement();
149 p = new PersonNuxeo();
150 //TODO: recognize schema thru namespace uri
151 // Namespace ns = new Namespace("hello", "http://collectionspace.org/hello");
152 Iterator<Element> siter = root.elementIterator("schema");
153 while(siter.hasNext()){
155 Element s = siter.next();
157 System.err.println("PersonNuxeo.getPerson() called.");
159 //TODO: recognize schema thru namespace uri
160 if("hello".equals(s.attribute("name").getValue())){
162 Element ele = s.element("cversion");
164 p.setVersion((String) ele.getData());
166 ele = s.element("firstName");
168 p.setFirstName((String) ele.getData());
170 ele = s.element("lastName");
172 p.setLastName((String) ele.getData());
174 ele = s.element("city");
176 p.setCity((String) ele.getData());
178 ele = s.element("state");
180 p.setState((String) ele.getData());
182 ele = s.element("zip");
184 p.setZip((String) ele.getData());
186 ele = s.element("country");
188 p.setCountry((String) ele.getData());
195 Response response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(
196 "Get failed").type("text/plain").build();
197 throw new WebApplicationException(response);
200 Response response = Response.status(Response.Status.NOT_FOUND).entity(
201 "Get failed, the requested person ID:" + id + ": was not found.").type("text/plain").build();
202 throw new WebApplicationException(response);
204 verbose("get person", p);
210 public PersonNuxeo updatePerson(
211 @PathParam("id") String id,
212 PersonNuxeo update) {
214 verbose("updating person input", update);
216 NuxeoRESTClient nxClient = getClient();
218 List<String> pathParams = new ArrayList<String>();
219 Map<String, String> queryParams = new HashMap<String, String>();
220 pathParams.add("default");
221 pathParams.add(update.getId());
222 pathParams.add("updateDocumentRestlet");
223 queryParams.put("dublincore:title", "change title");
224 //todo: intelligent merge needed
225 if(update.getFirstName() != null){
226 queryParams.put("hello:firstName", update.getFirstName());
229 if(update.getLastName() != null){
230 queryParams.put("hello:lastName", update.getLastName());
233 if(update.getFirstName() != null && update.getLastName() != null){
234 queryParams.put("dublincore:title", update.getFirstName() + " " + update.getLastName());
237 if(update.getStreet() != null){
238 queryParams.put("hello:street", update.getStreet());
241 if(update.getCity() != null){
242 queryParams.put("hello:city", update.getCity());
245 if(update.getState() != null){
246 queryParams.put("hello:state", update.getState());
249 if(update.getZip() != null){
250 queryParams.put("hello:zip", update.getZip());
253 if(update.getCountry() != null){
254 queryParams.put("hello:country", update.getCountry());
257 Representation res = nxClient.get(pathParams, queryParams);
258 SAXReader reader = new SAXReader();
261 Document document = reader.read(res.getStream());
262 Element root = document.getRootElement();
263 for(Iterator i = root.elementIterator(); i.hasNext();){
264 Element element = (Element) i.next();
265 if("docRef".equals(element.getName())){
266 status = (String) element.getData();
267 verbose("updatePerson: response=" + status);
273 Response response = Response.status(Response.Status.NOT_FOUND).entity(
274 "Update failed ").type("text/plain").build();
275 throw new WebApplicationException(response);
282 public void deletePerson(@PathParam("id") String id) {
283 verbose("deleting person with id=" + id);
284 NuxeoRESTClient nxClient = getClient();
285 List<String> pathParams = new ArrayList<String>();
286 Map<String, String> queryParams = new HashMap<String, String>();
287 pathParams.add("default");
289 pathParams.add("deleteDocumentRestlet");
290 Representation res = nxClient.get(pathParams, queryParams);
291 SAXReader reader = new SAXReader();
294 Document document = reader.read(res.getStream());
295 Element root = document.getRootElement();
296 for(Iterator i = root.elementIterator(); i.hasNext();){
297 Element element = (Element) i.next();
298 if("docRef".equals(element.getName())){
299 status = (String) element.getData();
300 verbose("deletePerson: response=" + status);
306 Response response = Response.status(Response.Status.NOT_FOUND).entity(
307 "Delete failed ").type("text/plain").build();
308 throw new WebApplicationException(response);
313 private void verbose(String msg, PersonNuxeo p) {
316 JAXBContext jc = JAXBContext.newInstance(
319 Marshaller m = jc.createMarshaller();
320 m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
322 m.marshal(p, System.out);
329 // private void getQueryModel() throws IOException {
330 // NuxeoRESTClient nxClient = getClient();
332 // List<String> pathParams = new ArrayList<String>();
333 // Map<String, String> queryParams = new HashMap<String, String>();
335 // //query model for user documents
336 // pathParams = Arrays.asList("execQueryModel", "USER_DOCUMENTS");
337 // queryParams.put("QP1", "Administrator");
338 // queryParams.put("format", "XML");
341 // Representation res = nxClient.get(pathParams, queryParams);
342 // String resStr = res.getText();
343 // verbose("getQueryModel:" + resStr);
347 // private void getVocabulary() throws IOException {
348 // NuxeoRESTClient nxClient = getClient();
350 // List<String> pathParams = new ArrayList<String>();
351 // Map<String, String> queryParams = new HashMap<String, String>();
353 // pathParams = Arrays.asList("vocabulary", "continent_country");
354 // queryParams.put("lang", "en");
356 // Representation res = nxClient.get(pathParams, queryParams);
357 // String resStr = res.getText();
358 // verbose("getVocabulary:" + resStr);
361 private NuxeoRESTClient getClient() {
362 NuxeoRESTClient nxClient = new NuxeoRESTClient("http://127.0.0.1:8080/nuxeo");
363 nxClient.setAuthType(NuxeoRESTClient.AUTH_TYPE_BASIC);
364 nxClient.setBasicAuthentication("Administrator", "Administrator");
368 private void verbose(String msg) {
369 System.out.println("PersonNuxeoResource: " + msg);