From 9209562e3a43aa60b699ea931a62db108a108fce Mon Sep 17 00:00:00 2001 From: Aron Roberts Date: Sat, 13 Feb 2010 01:36:25 +0000 Subject: [PATCH] CSPACE-826. Contacts can now be created and read as a subordinate resource of PersonAuthority and Person. See comments in this JIRA issue for approach taken and remaining tasks. --- .../resources/schemas/contacts_common.xsd | 2 + .../services/client/ContactClientUtils.java | 62 +++++++ .../client/test/ContactServiceTest.java | 30 +--- .../services/contact/ContactJAXBSchema.java | 3 + .../src/main/resources/contacts-common.xsd | 2 + .../services/contact/ContactResource.java | 88 ++++++++++ .../nuxeo/ContactDocumentModelHandler.java | 19 +++ services/person/client/pom.xml | 6 +- .../client/PersonAuthorityClient.java | 11 ++ .../services/client/PersonAuthorityProxy.java | 49 +++++- .../test/PersonAuthorityServiceTest.java | 128 ++++++++++++++ services/person/service/pom.xml | 7 +- .../person/PersonAuthorityResource.java | 160 +++++++++++++++++- 13 files changed, 534 insertions(+), 33 deletions(-) create mode 100644 services/contact/client/src/main/java/org/collectionspace/services/client/ContactClientUtils.java diff --git a/services/contact/3rdparty/nuxeo-platform-cs-contact/src/main/resources/schemas/contacts_common.xsd b/services/contact/3rdparty/nuxeo-platform-cs-contact/src/main/resources/schemas/contacts_common.xsd index 891aecf4b..1addb001f 100644 --- a/services/contact/3rdparty/nuxeo-platform-cs-contact/src/main/resources/schemas/contacts_common.xsd +++ b/services/contact/3rdparty/nuxeo-platform-cs-contact/src/main/resources/schemas/contacts_common.xsd @@ -32,6 +32,8 @@ + + diff --git a/services/contact/client/src/main/java/org/collectionspace/services/client/ContactClientUtils.java b/services/contact/client/src/main/java/org/collectionspace/services/client/ContactClientUtils.java new file mode 100644 index 000000000..39c851ecb --- /dev/null +++ b/services/contact/client/src/main/java/org/collectionspace/services/client/ContactClientUtils.java @@ -0,0 +1,62 @@ +package org.collectionspace.services.client; + +import javax.ws.rs.core.MediaType; + +import org.collectionspace.services.client.ContactClient; +import org.collectionspace.services.contact.ContactsCommon; +import org.jboss.resteasy.plugins.providers.multipart.MultipartOutput; +import org.jboss.resteasy.plugins.providers.multipart.OutputPart; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ContactClientUtils { + private static final Logger logger = + LoggerFactory.getLogger(ContactClientUtils.class); + + public static MultipartOutput createContactInstance(String identifier) { + String inAuthority = ""; + String inItem = ""; + return createContactInstance( + inAuthority, + inItem, + "addressText1-" + identifier, + "postcode-" + identifier, + "addressType1-" + identifier); + } + + public static MultipartOutput createContactInstance( + String inAuthority, String inItem, String identifier) { + return createContactInstance( + inAuthority, + inItem, + "addressText1-" + identifier, + "postcode-" + identifier, + "addressType1-" + identifier); + } + + public static MultipartOutput createContactInstance( + String inAuthority, String inItem, String addressText, + String postcode, String addressType) { + ContactsCommon contact = new ContactsCommon(); + contact.setInAuthority(inAuthority); + contact.setInItem(inItem); + contact.setAddressText1(addressText); + contact.setPostcode1(postcode); + contact.setAddressType1(addressType); + MultipartOutput multipart = new MultipartOutput(); + OutputPart commonPart = + multipart.addPart(contact, MediaType.APPLICATION_XML_TYPE); + ContactClient client = new ContactClient(); + commonPart.getHeaders().add("label", client.getCommonPartName()); + + if(logger.isDebugEnabled()){ + logger.debug("to be created, contact common"); + // logger.debug(objectAsXmlString(contact, ContactsCommon.class)); + } + + return multipart; + } + + +} diff --git a/services/contact/client/src/test/java/org/collectionspace/services/client/test/ContactServiceTest.java b/services/contact/client/src/test/java/org/collectionspace/services/client/test/ContactServiceTest.java index dcd62e5a0..f36b28122 100644 --- a/services/contact/client/src/test/java/org/collectionspace/services/client/test/ContactServiceTest.java +++ b/services/contact/client/src/test/java/org/collectionspace/services/client/test/ContactServiceTest.java @@ -28,6 +28,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.collectionspace.services.client.ContactClient; +import org.collectionspace.services.client.ContactClientUtils; import org.collectionspace.services.contact.ContactsCommon; import org.collectionspace.services.contact.ContactsCommonList; @@ -77,7 +78,7 @@ public class ContactServiceTest extends AbstractServiceTestImpl { // Submit the request to the service and store the response. String identifier = createIdentifier(); - MultipartOutput multipart = createContactInstance(identifier); + MultipartOutput multipart = ContactClientUtils.createContactInstance(identifier); ClientResponse res = client.create(multipart); int statusCode = res.getStatus(); @@ -482,7 +483,7 @@ public class ContactServiceTest extends AbstractServiceTestImpl { // The only relevant ID may be the one used in update(), below. // The only relevant ID may be the one used in update(), below. - MultipartOutput multipart = createContactInstance(NON_EXISTENT_ID); + MultipartOutput multipart = ContactClientUtils.createContactInstance(NON_EXISTENT_ID); ClientResponse res = client.update(NON_EXISTENT_ID, multipart); int statusCode = res.getStatus(); @@ -605,29 +606,4 @@ public class ContactServiceTest extends AbstractServiceTestImpl { return SERVICE_PATH_COMPONENT; } - private MultipartOutput createContactInstance(String identifier) { - return createContactInstance( - "addressText1-" + identifier, - "postcode-" + identifier, - "addressType1-" + identifier); - } - - private MultipartOutput createContactInstance(String addressText1, - String postcode, String addressType1) { - ContactsCommon contact = new ContactsCommon(); - contact.setAddressText1(addressText1); - contact.setPostcode1(postcode); - contact.setAddressType1(addressType1); - MultipartOutput multipart = new MultipartOutput(); - OutputPart commonPart = - multipart.addPart(contact, MediaType.APPLICATION_XML_TYPE); - commonPart.getHeaders().add("label", client.getCommonPartName()); - - if(logger.isDebugEnabled()){ - logger.debug("to be created, contact common"); - logger.debug(objectAsXmlString(contact, ContactsCommon.class)); - } - - return multipart; - } } diff --git a/services/contact/jaxb/src/main/java/org/collectionspace/services/contact/ContactJAXBSchema.java b/services/contact/jaxb/src/main/java/org/collectionspace/services/contact/ContactJAXBSchema.java index 9e2d4c68a..3c1aafdbb 100644 --- a/services/contact/jaxb/src/main/java/org/collectionspace/services/contact/ContactJAXBSchema.java +++ b/services/contact/jaxb/src/main/java/org/collectionspace/services/contact/ContactJAXBSchema.java @@ -7,6 +7,9 @@ package org.collectionspace.services.contact; * */ public interface ContactJAXBSchema { + final static String CSID = "csid"; + final static String IN_AUTHORITY = "inAuthority"; + final static String IN_ITEM ="inItem"; final static String ADDRESS_TYPE1 = "addressType1"; final static String ADDRESS_TYPE2 = "addressType2"; final static String ADDRESS_TYPE3 = "addressType3"; diff --git a/services/contact/jaxb/src/main/resources/contacts-common.xsd b/services/contact/jaxb/src/main/resources/contacts-common.xsd index e3003be5d..1d1c312e3 100644 --- a/services/contact/jaxb/src/main/resources/contacts-common.xsd +++ b/services/contact/jaxb/src/main/resources/contacts-common.xsd @@ -44,6 +44,8 @@ + + diff --git a/services/contact/service/src/main/java/org/collectionspace/services/contact/ContactResource.java b/services/contact/service/src/main/java/org/collectionspace/services/contact/ContactResource.java index 9d1eb50d2..eacd99ae6 100644 --- a/services/contact/service/src/main/java/org/collectionspace/services/contact/ContactResource.java +++ b/services/contact/service/src/main/java/org/collectionspace/services/contact/ContactResource.java @@ -79,6 +79,34 @@ public class ContactResource extends AbstractCollectionSpaceResourceImpl { return serviceName; } + private void validateIdsNotEmpty(String authorityCsid, String itemCsid, String csid) + throws WebApplicationException{ + if (authorityCsid == null || authorityCsid.trim().isEmpty()) { + logger.error("missing authorityCsid!"); + Response response = Response.status(Response.Status.BAD_REQUEST).entity( + "ID of Authority in request " + + "must not be null or empty").type( + "text/plain").build(); + throw new WebApplicationException(response); + } + if (itemCsid == null || itemCsid.trim().isEmpty()) { + logger.error("missing itemCsid!"); + Response response = Response.status(Response.Status.BAD_REQUEST).entity( + "ID of Item in request " + + "must not be null or empty").type( + "text/plain").build(); + throw new WebApplicationException(response); + } + if (csid == null || csid.trim().isEmpty()) { + logger.error("missing csid!"); + Response response = Response.status(Response.Status.BAD_REQUEST).entity( + "ID of Contact in request " + + "must not be null or empty").type( + "text/plain").build(); + throw new WebApplicationException(response); + } + } + @Override public DocumentHandler createDocumentHandler(ServiceContext ctx) throws Exception { DocumentHandler docHandler = ctx.getDocumentHandler(); @@ -91,6 +119,9 @@ public class ContactResource extends AbstractCollectionSpaceResourceImpl { return docHandler; } + // FIXME This method might be removed or disabled once its + // counterpart, sub-resource-based createContact method, below, + // is fully working. @POST public Response createContact(MultipartInput input) { try { @@ -112,6 +143,26 @@ public class ContactResource extends AbstractCollectionSpaceResourceImpl { } } + @POST + public String createContact(String authorityCsid, String itemCsid, MultipartInput input) { + try { + ServiceContext ctx = MultipartServiceContextFactory.get().createServiceContext(input, getServiceName()); + DocumentHandler handler = createDocumentHandler(ctx); + String csid = getRepositoryClient(ctx).create(ctx, handler); + return csid; + } catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("Caught exception in createContact", e); + } + Response response = Response.status( + Response.Status.INTERNAL_SERVER_ERROR).entity("Create failed").type("text/plain").build(); + throw new WebApplicationException(response); + } + } + + // FIXME This method might be removed or disabled once its + // counterpart, sub-resource-based getContact method, below, + // is fully working. @GET @Path("{csid}") public MultipartOutput getContact( @@ -157,6 +208,43 @@ public class ContactResource extends AbstractCollectionSpaceResourceImpl { return result; } + public MultipartOutput getContact(@PathParam("authorityCsid") String authorityCsid, + @PathParam("itemCsid") String itemCsid, @PathParam("csid") String csid) + throws DocumentNotFoundException, WebApplicationException { + if (logger.isDebugEnabled()) { + logger.debug("getContact with authorityCsid=" + authorityCsid + + " itemcsid=" + itemCsid + " csid=" + csid); + } + try { + validateIdsNotEmpty(authorityCsid, itemCsid, csid); + } catch (WebApplicationException e) { + throw e; + } + MultipartOutput result = null; + try { + ServiceContext ctx = MultipartServiceContextFactory.get().createServiceContext(null, getServiceName()); + DocumentHandler handler = createDocumentHandler(ctx); + getRepositoryClient(ctx).get(ctx, csid, handler); + result = (MultipartOutput) ctx.getOutput(); + } catch (DocumentNotFoundException dnfe) { + throw dnfe; + } catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("getContact", e); + } + Response response = Response.status( + Response.Status.INTERNAL_SERVER_ERROR).entity("Get failed").type("text/plain").build(); + throw new WebApplicationException(response); + } + if (result == null) { + Response response = Response.status(Response.Status.NOT_FOUND).entity( + "Get failed, the requested Contact CSID:" + csid + " was not found.").type( + "text/plain").build(); + throw new WebApplicationException(response); + } + return result; + } + @GET @Produces("application/xml") public ContactsCommonList getContactList(@Context UriInfo ui) { diff --git a/services/contact/service/src/main/java/org/collectionspace/services/contact/nuxeo/ContactDocumentModelHandler.java b/services/contact/service/src/main/java/org/collectionspace/services/contact/nuxeo/ContactDocumentModelHandler.java index 7898d4ff1..af72072b3 100644 --- a/services/contact/service/src/main/java/org/collectionspace/services/contact/nuxeo/ContactDocumentModelHandler.java +++ b/services/contact/service/src/main/java/org/collectionspace/services/contact/nuxeo/ContactDocumentModelHandler.java @@ -61,6 +61,25 @@ public class ContactDocumentModelHandler */ private ContactsCommonList contactList; + private String inAuthority; + + public String getInAuthority() { + return inAuthority; + } + + public void setInAuthority(String inAuthority) { + this.inAuthority = inAuthority; + } + + private String inItem; + + public String getInItem() { + return inItem; + } + + public void setInItem(String inItem) { + this.inItem = inItem; + } /** * getCommonPart get associated contact diff --git a/services/person/client/pom.xml b/services/person/client/pom.xml index 89e0645bb..c7a937ab3 100644 --- a/services/person/client/pom.xml +++ b/services/person/client/pom.xml @@ -37,7 +37,11 @@ org.collectionspace.services.client ${cspace.services.client.version} - + + org.collectionspace.services + org.collectionspace.services.contact.client + ${cspace.services.client.version} + org.testng testng diff --git a/services/person/client/src/main/java/org/collectionspace/services/client/PersonAuthorityClient.java b/services/person/client/src/main/java/org/collectionspace/services/client/PersonAuthorityClient.java index 4a04d0a7e..e9420e606 100644 --- a/services/person/client/src/main/java/org/collectionspace/services/client/PersonAuthorityClient.java +++ b/services/person/client/src/main/java/org/collectionspace/services/client/PersonAuthorityClient.java @@ -154,4 +154,15 @@ public class PersonAuthorityClient extends AbstractServiceClientImpl { public ClientResponse deleteItem(String vcsid, String csid) { return personAuthorityProxy.deleteItem(vcsid, csid); } + + public ClientResponse createContact(String authorityCsid, + String itemCsid, MultipartOutput multipart) { + return personAuthorityProxy.createContact(authorityCsid, itemCsid, multipart); + } + + public ClientResponse readContact(String authorityCsid, + String itemCsid, String csid) { + return personAuthorityProxy.readContact(authorityCsid, itemCsid, csid); + } + } diff --git a/services/person/client/src/main/java/org/collectionspace/services/client/PersonAuthorityProxy.java b/services/person/client/src/main/java/org/collectionspace/services/client/PersonAuthorityProxy.java index 6b6f7de3e..4bab9e958 100644 --- a/services/person/client/src/main/java/org/collectionspace/services/client/PersonAuthorityProxy.java +++ b/services/person/client/src/main/java/org/collectionspace/services/client/PersonAuthorityProxy.java @@ -10,6 +10,7 @@ import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.Response; +import org.collectionspace.services.contact.ContactsCommonList; import org.collectionspace.services.person.PersonauthoritiesCommonList; import org.collectionspace.services.person.PersonsCommonList; import org.jboss.resteasy.client.ClientResponse; @@ -59,18 +60,60 @@ public interface PersonAuthorityProxy { @Path("/{vcsid}/items/") ClientResponse createItem(@PathParam("vcsid") String vcsid, MultipartOutput multipart); - //(R)ead + //(R)ead Item @GET @Path("/{vcsid}/items/{csid}") ClientResponse readItem(@PathParam("vcsid") String vcsid, @PathParam("csid") String csid); - //(U)pdate + //(U)pdate Item @PUT @Path("/{vcsid}/items/{csid}") ClientResponse updateItem(@PathParam("vcsid") String vcsid, @PathParam("csid") String csid, MultipartOutput multipart); - //(D)elete + //(D)elete Item @DELETE @Path("/{vcsid}/items/{csid}") ClientResponse deleteItem(@PathParam("vcsid") String vcsid, @PathParam("csid") String csid); + + // List Contacts + @GET + @Produces({"application/xml"}) + @Path("/{authorityCsid}/items/{itemCsid}/contacts/") + ClientResponse readContactList( + @PathParam("authorityCsid") String authorityCsid, + @PathParam("itemCsid") String itemCsid); + + //(C)reate Contact + @POST + @Path("/{authorityCsid}/items/{itemCsid}/contacts/") + ClientResponse createContact( + @PathParam("authorityCsid") String authorityCsid, + @PathParam("itemCsid") String itemCsid, + MultipartOutput multipart); + + //(R)ead Contact + @GET + @Path("/{authorityCsid}/items/{itemCsid}/contacts/{csid}") + ClientResponse readContact( + @PathParam("authorityCsid") String authorityCsid, + @PathParam("itemCsid") String itemCsid, + @PathParam("csid") String csid); + + //(U)pdate Contact + @PUT + @Path("/{authorityCsid}/items/{itemCsid}/contacts/{csid}") + ClientResponse updateContact( + @PathParam("authorityCsid") String authorityCsid, + @PathParam("itemCsid") String itemCsid, + @PathParam("csid") String csid, + MultipartOutput multipart); + + //(D)elete Contact + @DELETE + @Path("/{authorityCsid}/items/{itemCsid}/contacts/{csid}") + ClientResponse deleteContact( + @PathParam("authorityCsid") String authorityCsid, + @PathParam("itemCsid") String itemCsid, + @PathParam("csid") String csid); + } diff --git a/services/person/client/src/test/java/org/collectionspace/services/client/test/PersonAuthorityServiceTest.java b/services/person/client/src/test/java/org/collectionspace/services/client/test/PersonAuthorityServiceTest.java index bff29e9d3..957b2f298 100644 --- a/services/person/client/src/test/java/org/collectionspace/services/client/test/PersonAuthorityServiceTest.java +++ b/services/person/client/src/test/java/org/collectionspace/services/client/test/PersonAuthorityServiceTest.java @@ -28,8 +28,13 @@ import java.util.List; import java.util.Map; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; +import org.collectionspace.services.client.ContactClient; +import org.collectionspace.services.client.ContactClientUtils; +import org.collectionspace.services.contact.ContactsCommon; +import org.collectionspace.services.contact.ContactsCommonList; import org.collectionspace.services.PersonJAXBSchema; import org.collectionspace.services.client.PersonAuthorityClient; import org.collectionspace.services.client.PersonAuthorityClientUtils; @@ -61,12 +66,14 @@ public class PersonAuthorityServiceTest extends AbstractServiceTestImpl { // Instance variables specific to this test. private PersonAuthorityClient client = new PersonAuthorityClient(); + private ContactClient contactClient = new ContactClient(); final String SERVICE_PATH_COMPONENT = "personauthorities"; final String ITEM_SERVICE_PATH_COMPONENT = "items"; private String knownResourceId = null; private String lastPersonAuthId = null; private String knownResourceRefName = null; private String knownItemResourceId = null; + private String knownContactResourceId = null; private int nItemsToCreateInList = 3; private List allResourceIdsCreated = new ArrayList(); private Map allResourceItemIdsCreated = @@ -199,6 +206,62 @@ public class PersonAuthorityServiceTest extends AbstractServiceTestImpl { return extractedID; } + @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class, + dependsOnMethods = {"create", "createItem"}) + public void createContact(String testName) { + setupCreate(testName); + knownContactResourceId = createContactInItem(knownResourceId, knownItemResourceId); + if(logger.isDebugEnabled()){ + logger.debug(testName + ": knownContactResourceId=" + knownContactResourceId); + } + } + + private String createContactInItem(String authorityId, String itemId) { + + final String testName = "createContactInItem"; + setupCreate(testName); + if(logger.isDebugEnabled()){ + logger.debug(testName + ":..."); + } + + // Submit the request to the service and store the response. + String identifier = createIdentifier(); + MultipartOutput multipart = + ContactClientUtils.createContactInstance(authorityId, itemId, identifier); + ClientResponse res = + client.createContact(authorityId, itemId, multipart); + int statusCode = res.getStatus(); + String extractedID = PersonAuthorityClientUtils.extractId(res); + + // Check the status code of the response: does it match + // the expected response(s)? + if(logger.isDebugEnabled()){ + logger.debug(testName + ": status = " + statusCode); + } + Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode), + invalidStatusCodeMessage(REQUEST_TYPE, statusCode)); + Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE); + + // Store the ID returned from the first contact resource created + // for additional tests below. + if (knownContactResourceId == null){ + knownContactResourceId = extractedID; + if (logger.isDebugEnabled()) { + logger.debug(testName + ": knownContactResourceId=" + knownContactResourceId); + } + } + + // Store the IDs from any item resources created + // by tests, along with the IDs of their parents, so these items + // can be deleted after all tests have been run. + // + // Item resource IDs are unique, so these are used as keys; + // the non-unique IDs of their parents are stored as associated values. + allResourceItemIdsCreated.put(extractedID, knownContactResourceId); + + return extractedID; + } + @Override @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class, dependsOnMethods = {"create", "createItem"}) @@ -412,6 +475,44 @@ public class PersonAuthorityServiceTest extends AbstractServiceTestImpl { } + @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class, + dependsOnMethods = {"create", "createItem", + "createContact", "read", "readItem"}) + public void readContact(String testName) throws Exception { + + // Perform setup. + setupRead(testName); + + // Submit the request to the service and store the response. + ClientResponse res = + client.readContact(knownResourceId, knownItemResourceId, + knownContactResourceId); + int statusCode = res.getStatus(); + + // Check the status code of the response: does it match + // the expected response(s)? + if(logger.isDebugEnabled()){ + logger.debug(testName + ": status = " + statusCode); + } + Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode), + invalidStatusCodeMessage(REQUEST_TYPE, statusCode)); + Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE); + + // Check whether we've received a contact. + MultipartInput input = (MultipartInput) res.getEntity(); + ContactsCommon contact = (ContactsCommon) extractPart(input, + contactClient.getCommonPartName(), ContactsCommon.class); + Assert.assertNotNull(contact); + boolean showFull = true; + if(showFull && logger.isDebugEnabled()){ + logger.debug(testName + ": returned payload:"); + logger.debug(objectAsXmlString(contact, ContactsCommon.class)); + } + Assert.assertEquals(contact.getInAuthority(), knownResourceId); + Assert.assertEquals(contact.getInItem(), knownItemResourceId); + + } + // Failure outcomes @Override @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class, @@ -455,6 +556,29 @@ public class PersonAuthorityServiceTest extends AbstractServiceTestImpl { invalidStatusCodeMessage(REQUEST_TYPE, statusCode)); Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE); } + + @Test(dataProvider="testName", dataProviderClass=AbstractServiceTestImpl.class, + dependsOnMethods = {"readContact", "readNonExistent", "readItemNonExistent"}) + public void readContactNonExistent(String testName) { + + // Perform setup. + setupReadNonExistent(testName); + + // Submit the request to the service and store the response. + ClientResponse res = + client.readContact(knownResourceId, knownItemResourceId, NON_EXISTENT_ID); + int statusCode = res.getStatus(); + + // Check the status code of the response: does it match + // the expected response(s)? + if(logger.isDebugEnabled()){ + logger.debug(testName + ": status = " + statusCode); + } + Assert.assertTrue(REQUEST_TYPE.isValidStatusCode(statusCode), + invalidStatusCodeMessage(REQUEST_TYPE, statusCode)); + Assert.assertEquals(statusCode, EXPECTED_STATUS_CODE); + } + // --------------------------------------------------------------- // CRUD tests : READ_LIST tests // --------------------------------------------------------------- @@ -996,6 +1120,7 @@ public class PersonAuthorityServiceTest extends AbstractServiceTestImpl { * at any point during testing, even if some of those resources * may be expected to be deleted by certain tests. */ + @AfterClass(alwaysRun=true) public void cleanUp() { if (logger.isDebugEnabled()) { @@ -1007,6 +1132,8 @@ public class PersonAuthorityServiceTest extends AbstractServiceTestImpl { for (Map.Entry entry : allResourceItemIdsCreated.entrySet()) { personResourceId = entry.getKey(); personAuthorityResourceId = entry.getValue(); + // FIXME Add cleanup of any contact resources created + // for this item here, before cleaning up the item. // Note: Any non-success responses are ignored and not reported. ClientResponse res = client.deleteItem(personAuthorityResourceId, personResourceId); @@ -1018,6 +1145,7 @@ public class PersonAuthorityServiceTest extends AbstractServiceTestImpl { } } + // --------------------------------------------------------------- // Utility methods used by tests above // --------------------------------------------------------------- diff --git a/services/person/service/pom.xml b/services/person/service/pom.xml index 6e48de49f..cc51f0dbd 100644 --- a/services/person/service/pom.xml +++ b/services/person/service/pom.xml @@ -24,7 +24,12 @@ org.collectionspace.services org.collectionspace.services.person.jaxb 1.0 - + + + org.collectionspace.services + org.collectionspace.services.contact.service + 1.0 + org.slf4j slf4j-api diff --git a/services/person/service/src/main/java/org/collectionspace/services/person/PersonAuthorityResource.java b/services/person/service/src/main/java/org/collectionspace/services/person/PersonAuthorityResource.java index fd58d224a..fbbd27c47 100644 --- a/services/person/service/src/main/java/org/collectionspace/services/person/PersonAuthorityResource.java +++ b/services/person/service/src/main/java/org/collectionspace/services/person/PersonAuthorityResource.java @@ -23,6 +23,7 @@ */ package org.collectionspace.services.person; +import java.net.URI; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; @@ -34,6 +35,7 @@ import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; +import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriBuilder; @@ -51,6 +53,9 @@ import org.collectionspace.services.common.document.DocumentHandler; import org.collectionspace.services.common.document.DocumentNotFoundException; import org.collectionspace.services.common.security.UnauthorizedException; import org.collectionspace.services.common.query.IQueryManager; +import org.collectionspace.services.contact.ContactResource; +import org.collectionspace.services.contact.ContactsCommon; +import org.collectionspace.services.contact.nuxeo.ContactDocumentModelHandler; import org.collectionspace.services.person.nuxeo.PersonDocumentModelHandler; import org.jboss.resteasy.plugins.providers.multipart.MultipartInput; import org.jboss.resteasy.plugins.providers.multipart.MultipartOutput; @@ -68,6 +73,7 @@ public class PersonAuthorityResource extends AbstractCollectionSpaceResourceImpl final Logger logger = LoggerFactory.getLogger(PersonAuthorityResource.class); //FIXME retrieve client type from configuration final static ClientType CLIENT_TYPE = ServiceMain.getInstance().getClientType(); + private ContactResource contactResource = new ContactResource(); public PersonAuthorityResource() { // do nothing @@ -89,6 +95,10 @@ public class PersonAuthorityResource extends AbstractCollectionSpaceResourceImpl return personServiceName; } + public String getContactServiceName() { + return contactResource.getServiceName(); + } + /* public RemoteServiceContext createItemServiceContext(MultipartInput input) throws Exception { RemoteServiceContext ctx = new RemoteServiceContextImpl(getItemServiceName()); @@ -123,6 +133,27 @@ public class PersonAuthorityResource extends AbstractCollectionSpaceResourceImpl return docHandler; } + private DocumentHandler createContactDocumentHandler( + ServiceContext ctx, String inAuthority, + String inItem) throws Exception { + DocumentHandler docHandler = ctx.getDocumentHandler(); + // Set the inAuthority and inItem values, specifying the + // grandparent authority (e.g. PersonAuthority, OrgAuthority) and + // the parent item (e.g. Person, Organization) of the Contact + ((ContactDocumentModelHandler) docHandler).setInAuthority(inAuthority); + ((ContactDocumentModelHandler) docHandler).setInItem(inItem); + if (ctx.getInput() != null) { + Object obj = ((MultipartServiceContext) ctx) + .getInputPart(ctx.getCommonPartLabel(getContactServiceName()), + ContactsCommon.class); + if (obj != null) { + docHandler.setCommonPart((ContactsCommon) obj); + } + } + return docHandler; + } + + @POST public Response createPersonAuthority(MultipartInput input) { try { @@ -480,7 +511,7 @@ public class PersonAuthorityResource extends AbstractCollectionSpaceResourceImpl throw new WebApplicationException(response); } catch (DocumentNotFoundException dnfe) { if (logger.isDebugEnabled()) { - logger.debug("caugth exception in updatePerson", dnfe); + logger.debug("caught exception in updatePerson", dnfe); } Response response = Response.status(Response.Status.NOT_FOUND).entity( "Update failed on Person csid=" + itemcsid).type( @@ -540,4 +571,131 @@ public class PersonAuthorityResource extends AbstractCollectionSpaceResourceImpl } } + + /************************************************************************* + * Contact parts - this is a sub-resource of Person (or "item") + *************************************************************************/ + @POST + @Path("{authorityCsid}/items/{itemCsid}/contacts") + public Response createContact( + @PathParam("authorityCsid") String authorityCsid, + @PathParam("itemCsid") String itemCsid, + MultipartInput input) { + try { + + ContactResource contactResource = new ContactResource(); + String csid = + contactResource.createContact(authorityCsid, itemCsid, input); + UriBuilder path = UriBuilder.fromResource(PersonAuthorityResource.class); + path.path("" + authorityCsid + "/items/" + itemCsid + "/contacts/" + csid); + Response response = Response.created(path.build()).build(); + return response; +/* + } catch (UnauthorizedException ue) { + Response response = Response.status(Response.Status.UNAUTHORIZED).entity( + "Create failed reason " + ue.getErrorReason()).type("text/plain").build(); + throw new WebApplicationException(response); +*/ + } catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("Caught exception in createContact", e); + } + Response response = Response.status( + Response.Status.INTERNAL_SERVER_ERROR) + .entity("Attempt to create Contact failed.") + .type("text/plain").build(); + throw new WebApplicationException(response); + } + + } + + @GET + @Produces({"application/xml"}) + @Path("/{authorityCsid}/items/{itemCsid}/contacts/") + public Response getContactList( + @PathParam("authorityCsid") String authorityCsid, + @PathParam("itemCsid") String itemCsid) { + + // FIXME Placeholder while call is being implemented. + String msg = "Reading lists of contacts is not yet implemented."; + logger.info(msg); + Response response = Response.status( + Response.Status.INTERNAL_SERVER_ERROR).entity(msg).type("text/plain").build(); + return response; + + } + + @GET + @Path("/{authorityCsid}/items/{itemCsid}/contacts/{csid}") + public MultipartOutput getContact( + @PathParam("authorityCsid") String authorityCsid, + @PathParam("itemCsid") String itemCsid, + @PathParam("csid") String csid) { + MultipartOutput result = null; + try { + ContactResource resource = new ContactResource(); + result = resource.getContact(authorityCsid, itemCsid, csid); + /* + } catch (UnauthorizedException ue) { + Response response = Response.status(Response.Status.UNAUTHORIZED) + .entity("Get failed reason " + ue.getErrorReason()) + .type("text/plain").build(); + throw new WebApplicationException(response); + */ + } catch (DocumentNotFoundException dnfe) { + if (logger.isDebugEnabled()) { + logger.debug("getContact", dnfe); + } + Response response = Response.status(Response.Status.NOT_FOUND) + .entity("Get failed, the requested Contact CSID:" + csid + ": was not found.") + .type("text/plain").build(); + throw new WebApplicationException(response); + } catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("getContact", e); + } + Response response = Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity("Get failed") + .type("text/plain").build(); + throw new WebApplicationException(response); + } + if (result == null) { + Response response = Response.status(Response.Status.NOT_FOUND) + .entity("Get failed, the requested Contact CSID:" + csid + ": was not found.") + .type("text/plain").build(); + throw new WebApplicationException(response); + } + return result; + + } + + @PUT + @Path("/{authorityCsid}/items/{itemCsid}/contacts/{csid}") + MultipartOutput updateContact( + @PathParam("authorityCsid") String authorityCsid, + @PathParam("itemCsid") String itemCsid, + @PathParam("csid") String csid, + MultipartInput input) { + + // FIXME Placeholder while call is being implemented. + MultipartOutput result = null; + return result; + } + + @DELETE + @Path("/{authorityCsid}/items/{itemCsid}/contacts/{csid}") + Response deleteContact( + @PathParam("authorityCsid") String authorityCsid, + @PathParam("itemCsid") String itemCsid, + @PathParam("csid") String csid) { + + // FIXME Placeholder while call is being implemented. + String msg = "Deleting contacts is not yet implemented."; + logger.info(msg); + Response response = Response.status( + Response.Status.INTERNAL_SERVER_ERROR).entity(msg).type("text/plain").build(); + return response; + + } + } -- 2.47.3