}\r
\r
@Override\r
- public ClientResponse<String> getWorkflow(@PathParam("csid") String csid) {\r
+ public ClientResponse<String> getWorkflow(String csid) {\r
return getProxy().getWorkflow(csid);\r
- } \r
+ }\r
+ \r
+ @Override\r
+ public ClientResponse<String> updateWorkflow(String csid, PoxPayloadOut xmlPayload) {\r
+ return getProxy().updateWorkflow(csid, xmlPayload.getBytes());\r
+ } \r
\r
/*\r
* Because of how RESTEasy creates proxy classes, sub-interfaces will need to override\r
* @param csid the csid of the entity
* @return the workflow
*/
- public ClientResponse<String> getWorkflow(@PathParam("csid") String csid);
+ public ClientResponse<String> getWorkflow(String csid);
+
+ public ClientResponse<String> updateWorkflow(String csid, PoxPayloadOut xmlPayload);
/**
* Gets the authority refs.
*/\r
package org.collectionspace.services.client;\r
\r
+import javax.ws.rs.Consumes;\r
import javax.ws.rs.GET;\r
import javax.ws.rs.DELETE;\r
+import javax.ws.rs.PUT;\r
import javax.ws.rs.Path;\r
import javax.ws.rs.PathParam;\r
import javax.ws.rs.Produces;\r
ClientResponse<AuthorityRefList> getAuthorityRefs(@PathParam("csid") String csid);\r
\r
@GET\r
+ @Produces({"application/xml"})\r
+ @Consumes({"application/xml"}) \r
@Path("{csid}/workflow")\r
ClientResponse<String> getWorkflow(@PathParam("csid") String csid);\r
\r
+ @PUT\r
+ @Produces({"application/xml"})\r
+ @Consumes({"application/xml"}) \r
+ @Path("{csid}/workflow")\r
+ ClientResponse<String> updateWorkflow(@PathParam("csid") String csid, byte[] xmlPayload);\r
+ \r
/*\r
* (R)read List operations\r
*/\r
*/\r
package org.collectionspace.services.common;\r
\r
+import javax.ws.rs.Consumes;\r
import javax.ws.rs.GET;\r
+import javax.ws.rs.PUT;\r
import javax.ws.rs.Path;\r
import javax.ws.rs.PathParam;\r
+import javax.ws.rs.Produces;\r
import javax.ws.rs.WebApplicationException;\r
import javax.ws.rs.core.Response;\r
\r
import org.collectionspace.services.common.workflow.client.WorkflowClient;\r
import org.collectionspace.services.common.workflow.service.nuxeo.WorkflowDocumentModelHandler;\r
import org.collectionspace.services.workflow.WorkflowsCommon;\r
+import org.jboss.resteasy.client.ClientResponse;\r
\r
import org.slf4j.Logger;\r
import org.slf4j.LoggerFactory;\r
/*\r
* JAX-RS Annotated methods\r
*/\r
- \r
+ \r
@GET\r
@Path("{csid}/workflow")\r
public byte[] getWorkflow(\r
@PathParam("csid") String csid) {\r
PoxPayloadOut result = null;\r
\r
- try {\r
+ try { \r
ServiceContext<PoxPayloadIn, PoxPayloadOut> parentCtx = createServiceContext();\r
String parentWorkspaceName = parentCtx.getRepositoryWorkspaceName();\r
\r
return result.getBytes();\r
}\r
\r
+ @PUT\r
+ @Path("{csid}/workflow")\r
+ public byte[] updateWorkflow(@PathParam("csid") String csid, String xmlPayload) {\r
+ PoxPayloadOut result = null;\r
+ try {\r
+ ServiceContext<PoxPayloadIn, PoxPayloadOut> parentCtx = createServiceContext();\r
+ String parentWorkspaceName = parentCtx.getRepositoryWorkspaceName();\r
+ \r
+ PoxPayloadIn workflowUpdate = new PoxPayloadIn(xmlPayload);\r
+ MultipartServiceContext ctx = (MultipartServiceContext) createServiceContext(WorkflowClient.SERVICE_NAME, workflowUpdate);\r
+ WorkflowDocumentModelHandler handler = createWorkflowDocumentHandler(ctx);\r
+ ctx.setRespositoryWorkspaceName(parentWorkspaceName); //find the document in the parent's workspace\r
+ getRepositoryClient(ctx).update(ctx, csid, handler);\r
+ result = ctx.getOutput();\r
+ } catch (Exception e) {\r
+ throw bigReThrow(e, ServiceMessages.UPDATE_FAILED + WorkflowClient.SERVICE_PAYLOAD_NAME, csid);\r
+ }\r
+ return result.getBytes();\r
+ }\r
+ \r
+ \r
}\r
* @see org.collectionspace.services.common.document.DocumentHandler#getQProperty(java.lang.String)
*/
@Override
- public abstract String getQProperty(String prop);
+ public abstract String getQProperty(String prop) throws DocumentException;
/*
* Strip Nuxeo's schema name from the start of the field / element name.
public abstract void setCommonPartList(TL obj);
@Override
- public abstract String getQProperty(String prop);
+ public abstract String getQProperty(String prop) throws DocumentException;
}
* getQProperty get qualified property (useful for mapping to repository document property)
* @param prop
* @return
+ * @throws DocumentException
*/
- public String getQProperty(String prop);
+ public String getQProperty(String prop) throws DocumentException;
/**
* getUnQProperty unqualifies document property from repository
public static final String SERVICE_PAYLOAD_NAME = SERVICE_NAME;
public static final String SERVICE_COMMONPART_NAME = SERVICE_NAME + PART_LABEL_SEPARATOR + PART_COMMON_LABEL;
+ public static final String WORKFLOWSTATE_DELETED = "deleted";
+ public static final String WORKFLOWSTATE_PROJECT = "project";
+ public static final String WORKFLOWSTATE_APPROVED = "approved";
+
+
@Override
public String getServiceName() {
return SERVICE_NAME;
package org.collectionspace.services.common.workflow.service.nuxeo;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import javax.ws.rs.core.MediaType;
+import org.collectionspace.services.client.PayloadInputPart;
+import org.collectionspace.services.client.PoxPayloadIn;
+import org.collectionspace.services.client.PoxPayloadOut;
+import org.collectionspace.services.common.context.MultipartServiceContext;
+import org.collectionspace.services.common.context.ServiceContext;
+import org.collectionspace.services.common.document.BadRequestException;
+import org.collectionspace.services.common.document.DocumentUtils;
import org.collectionspace.services.common.document.DocumentWrapper;
+import org.collectionspace.services.common.document.DocumentHandler.Action;
import org.collectionspace.services.common.service.ObjectPartType;
import org.collectionspace.services.common.workflow.client.WorkflowClient;
import org.collectionspace.services.common.workflow.jaxb.WorkflowJAXBSchema;
import org.collectionspace.services.nuxeo.client.java.DocHandlerBase;
+import org.collectionspace.services.nuxeo.client.java.RemoteDocumentModelHandlerImpl;
import org.collectionspace.services.workflow.WorkflowsCommon;
+import org.dom4j.Element;
import org.nuxeo.ecm.core.api.DocumentModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class WorkflowDocumentModelHandler
extends DocHandlerBase<WorkflowsCommon> {
+
+ /** The logger. */
+ private final Logger logger = LoggerFactory.getLogger(WorkflowDocumentModelHandler.class);
+
+ /*
+ * Workflow transitions
+ */
+ private static final String TRANSITION_DELETE = "delete";
+ private static final String TRANSITION_APPROVE = "approve";
+ private static final String TRANSITION_UNKNOWN = "unknown";
+
+ /*
+ * Handle read (GET)
+ */
@Override
protected Map<String, Object> extractPart(DocumentModel docModel,
@Override
public void extractAllParts(DocumentWrapper<DocumentModel> wrapDoc)
throws Exception {
-
DocumentModel docModel = wrapDoc.getWrappedObject();
String[] schemas = {WorkflowClient.SERVICE_COMMONPART_NAME};
Map<String, ObjectPartType> partsMetaMap = getServiceContext().getPartsMetadata();
addOutputPart(unQObjectProperties, schema, partMeta);
}
}
+
+ private String getTransitionFromState(String state) {
+ String result = TRANSITION_UNKNOWN;
+ if (state.equalsIgnoreCase(WorkflowClient.WORKFLOWSTATE_DELETED)) {
+ result = TRANSITION_DELETE;
+ } else if (state.equalsIgnoreCase(WorkflowClient.WORKFLOWSTATE_APPROVED)) {
+ result = TRANSITION_APPROVE;
+ }
+ return result;
+ }
+ /*
+ * Handle Update (PUT)
+ */
+ @Override
+ protected void fillPart(PayloadInputPart part, DocumentModel docModel,
+ ObjectPartType partMeta, Action action,
+ ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx)
+ throws Exception {
+ WorkflowsCommon workflowsCommon = (WorkflowsCommon)part.getBody();
+ docModel.followTransition(getTransitionFromState(workflowsCommon.getCurrentLifeCycleState()));
+ }
+
}
import org.collectionspace.services.common.service.DocHandlerParams;\r
import org.collectionspace.services.common.service.ServiceBindingType;\r
import org.collectionspace.services.common.context.MultipartServiceContext;\r
+import org.collectionspace.services.common.document.DocumentException;\r
import org.collectionspace.services.common.document.DocumentWrapper;\r
import org.collectionspace.services.jaxb.AbstractCommonList;\r
import org.collectionspace.services.nuxeo.client.java.CommonList;\r
return commonList;\r
}\r
\r
- public void setCommonPartList(AbstractCommonList aCommonList) {\r
+ @Override\r
+ public void setCommonPartList(AbstractCommonList aCommonList) {\r
this.commonList = aCommonList;\r
}\r
\r
return (T)commonPart;\r
}\r
\r
- public void setCommonPart(T commonPart) {\r
+ @Override\r
+ public void setCommonPart(T commonPart) {\r
this.commonPart = commonPart;\r
}\r
\r
docModel, label, id, true);\r
}\r
\r
- public DocHandlerParams.Params getDocHandlerParams(){\r
- MultipartServiceContext sc = (MultipartServiceContext) getServiceContext();\r
- ServiceBindingType sb = sc.getServiceBinding();\r
- DocHandlerParams dhb = sb.getDocHandlerParams();\r
- if(dhb!=null&&dhb.getParams()!=null) {\r
- return dhb.getParams();\r
- }\r
- throw new RuntimeException("No DocHandlerParams configured for: "+sb.getName());\r
- }\r
-\r
- public String getSummaryFields(AbstractCommonList commonList){\r
+ public DocHandlerParams.Params getDocHandlerParams() throws DocumentException {\r
+ MultipartServiceContext sc = (MultipartServiceContext) getServiceContext();\r
+ ServiceBindingType sb = sc.getServiceBinding();\r
+ DocHandlerParams dhb = sb.getDocHandlerParams();\r
+ if (dhb != null && dhb.getParams() != null) {\r
+ return dhb.getParams();\r
+ }\r
+ throw new DocumentException("No DocHandlerParams configured for: "\r
+ + sb.getName());\r
+ }\r
+\r
+ public String getSummaryFields(AbstractCommonList theCommonList) throws DocumentException {\r
return getDocHandlerParams().getSummaryFields();\r
}\r
\r
- public List<ListResultField> getListItemsArray(){\r
+ public List<ListResultField> getListItemsArray() throws DocumentException {\r
return getDocHandlerParams().getListResultsFields().getListResultField();\r
}\r
\r
throw new UnsupportedOperationException();\r
}\r
\r
- public void fillCommonPart(T objectexitObject, DocumentWrapper<DocumentModel> wrapDoc) throws Exception {\r
+ @Override\r
+ public void fillCommonPart(T objectexitObject, DocumentWrapper<DocumentModel> wrapDoc) throws Exception {\r
throw new UnsupportedOperationException();\r
}\r
\r
}\r
\r
@Override\r
- public String getQProperty(String prop) {\r
+ public String getQProperty(String prop) throws DocumentException {\r
return getDocHandlerParams().getSchemaName() + ":" + prop;\r
}\r
\r
fillDublinCoreObject(wrapDoc);\r
}\r
\r
+ /**\r
+ * Fill dublin core object, but only if there are document handler parameters in the service\r
+ * bindings.\r
+ *\r
+ * @param wrapDoc the wrap doc\r
+ * @throws Exception the exception\r
+ */\r
protected void fillDublinCoreObject(DocumentWrapper<DocumentModel> wrapDoc) throws Exception {\r
- String title = getDocHandlerParams().getDublinCoreTitle();\r
- if (Tools.isEmpty(title)){\r
- return;\r
- }\r
- DocumentModel docModel = wrapDoc.getWrappedObject();\r
- docModel.setPropertyValue("dublincore:title", title);\r
+ DocHandlerParams.Params docHandlerParams = null;\r
+ try {\r
+ docHandlerParams = getDocHandlerParams();\r
+ } catch (Exception e) {\r
+ logger.warn(e.getMessage());\r
+ }\r
+ \r
+ if (docHandlerParams != null) {\r
+ String title = getDocHandlerParams().getDublinCoreTitle();\r
+ if (Tools.isEmpty(title) == false){\r
+ DocumentModel docModel = wrapDoc.getWrappedObject();\r
+ docModel.setPropertyValue("dublincore:title", title);\r
+ }\r
+ }\r
}\r
\r
//================== UTILITY METHODS ================================================\r
public ClientResponse<DimensionsCommonList> readList() {
DimensionProxy proxy = (DimensionProxy)getProxy();
return proxy.readList();
- }
-
+ }
}
org.nuxeo.ecm.platform.ws,\r
org.collectionspace.collectionspace_core\r
Provide-Package: org.collectionspace.workflow\r
-Nuxeo-Component: OSGI-INF/core-types-contrib.xml,\r
- OSGI-INF/ecm-types-contrib.xml,\r
- OSGI-INF/layouts-contrib.xml\r
+Nuxeo-Component: OSGI-INF/core-types-contrib.xml\r
\r
package org.collectionspace.services.client.test;
import java.util.List;
+
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.collectionspace.services.workflow.WorkflowsCommon;
import org.collectionspace.services.client.DimensionClient;
import org.collectionspace.services.dimension.DimensionsCommon;
+import org.collectionspace.services.dimension.DimensionsCommonList;
import org.jboss.resteasy.client.ClientResponse;
// allResourceIdsCreated.add(extractId(res)); // Store the IDs from every resource created by tests so they can be deleted after tests have been run.
// }
+
/*
* Create a Dimension instance to use as our test target.
*/
- @Test(dataProvider = "testName", dataProviderClass = AbstractServiceTestImpl.class)
public void createTestObject(String testName) throws Exception {
logger.debug(testBanner(testName, CLASS_NAME));
setupCreate();
}
@Override
- @Test(dataProvider = "testName", dataProviderClass = AbstractServiceTestImpl.class, dependsOnMethods = {"createTestObject"})
+ @Test(dataProvider = "testName", dataProviderClass = AbstractServiceTestImpl.class, dependsOnMethods = {"create"})
public void read(String testName) throws Exception {
logger.debug(testBanner(testName, CLASS_NAME));
setupRead();
// }
// }
// }
-
+
@Override
-// @Test(dataProvider = "testName", dataProviderClass = AbstractServiceTestImpl.class, dependsOnMethods = {"read"})
+ @Test(dataProvider = "testName", dataProviderClass = AbstractServiceTestImpl.class, dependsOnMethods = {"read"})
public void update(String testName) throws Exception {
logger.debug(testBanner(testName, CLASS_NAME));
setupUpdate();
- WorkflowClient client = new WorkflowClient();
- ClientResponse<String> res = client.read(knownResourceId);
+ updateLifeCycleState(testName, knownResourceId, WorkflowClient.WORKFLOWSTATE_APPROVED);
+ }
+
+ private void updateLifeCycleState(String testName, String resourceId, String lifeCycleState) throws Exception {
+ //
+ // Read the existing object
+ //
+ DimensionClient client = new DimensionClient();
+ ClientResponse<String> res = client.getWorkflow(resourceId);
assertStatusCode(res, testName);
- logger.debug("got object to update with ID: " + knownResourceId);
+ logger.debug("Got object to update life cycle state with ID: " + resourceId);
PoxPayloadIn input = new PoxPayloadIn(res.getEntity());
- WorkflowsCommon objectexit = (WorkflowsCommon) extractPart(input, client.getCommonPartName(), WorkflowsCommon.class);
- Assert.assertNotNull(objectexit);
-
-// objectexit.setExitNumber("updated-" + objectexit.getExitNumber());
- logger.debug("Object to be updated:"+objectAsXmlString(objectexit, WorkflowsCommon.class));
+ WorkflowsCommon workflowCommons = (WorkflowsCommon) extractPart(input, WorkflowClient.SERVICE_COMMONPART_NAME, WorkflowsCommon.class);
+ Assert.assertNotNull(workflowCommons);
+ //
+ // Mark it for a soft delete.
+ //
+ logger.debug("Current workflow state:" + objectAsXmlString(workflowCommons, WorkflowsCommon.class));
+ workflowCommons.setCurrentLifeCycleState(lifeCycleState);
PoxPayloadOut output = new PoxPayloadOut(WorkflowClient.SERVICE_PAYLOAD_NAME);
- PayloadOutputPart commonPart = output.addPart(objectexit, MediaType.APPLICATION_XML_TYPE);
- commonPart.setLabel(client.getCommonPartName());
- res = client.update(knownResourceId, output);
+ PayloadOutputPart commonPart = output.addPart(workflowCommons, MediaType.APPLICATION_XML_TYPE);
+ commonPart.setLabel(WorkflowClient.SERVICE_COMMONPART_NAME);
+ //
+ // Perform the update
+ //
+ res = client.updateWorkflow(resourceId, output);
assertStatusCode(res, testName);
input = new PoxPayloadIn(res.getEntity());
- WorkflowsCommon updatedObjectExit = (WorkflowsCommon) extractPart(input, client.getCommonPartName(), WorkflowsCommon.class);
- Assert.assertNotNull(updatedObjectExit);
+ WorkflowsCommon updatedWorkflowCommons = (WorkflowsCommon) extractPart(input, WorkflowClient.SERVICE_COMMONPART_NAME, WorkflowsCommon.class);
+ Assert.assertNotNull(updatedWorkflowCommons);
+ //
+ // Read the updated object and make sure it was updated correctly.
+ //
+ res = client.getWorkflow(resourceId);
+ assertStatusCode(res, testName);
+ logger.debug("Got workflow state of updated object with ID: " + resourceId);
+ input = new PoxPayloadIn(res.getEntity());
+ updatedWorkflowCommons = (WorkflowsCommon) extractPart(input, WorkflowClient.SERVICE_COMMONPART_NAME, WorkflowsCommon.class);
+ Assert.assertNotNull(workflowCommons);
+ Assert.assertEquals(updatedWorkflowCommons.getCurrentLifeCycleState(), lifeCycleState);
}
@Override
}
@Override
+ @Test(dataProvider = "testName", dataProviderClass = AbstractServiceTestImpl.class)
public void create(String testName) throws Exception {
- //empty N/A
+ this.createTestObject(testName);
}
- @Override
+ private void readList(String testName, int expectedSize, String queryParam) {
+ // Perform setup.
+ setupReadList();
+
+ // Submit the request to the service and store the response.
+ DimensionClient client = new DimensionClient();
+ ClientResponse<DimensionsCommonList> res = client.readList();
+ DimensionsCommonList list = res.getEntity();
+ 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);
+ //
+ // Now check that list size is correct
+ //
+ List<DimensionsCommonList.DimensionListItem> items =
+ list.getDimensionListItem();
+ Assert.assertEquals(items.size(), expectedSize);
+ }
+
+ /*
+ * This test assumes that no objects exist yet.
+ *
+ * http://localhost:8180/cspace-services/intakes?wf_deleted=false
+ */
+ @Override
+ @Test(dataProvider = "testName", dataProviderClass = AbstractServiceTestImpl.class, dependsOnMethods = {"update"})
public void readList(String testName) throws Exception {
- //empty N/A
+ //
+ // Create 3 new objects
+ //
+ final int OBJECTS_TOTAL = 3;
+ for (int i = 0; i < OBJECTS_TOTAL; i++) {
+ this.createTestObject(testName);
+ }
+ //
+ // Mark one as soft deleted
+ //
+ int currentTotal = allResourceIdsCreated.size();
+ String csid = allResourceIdsCreated.get(currentTotal - 1); //get the last one added
+ this.setupUpdate();
+ this.updateLifeCycleState(testName, csid, WorkflowClient.WORKFLOWSTATE_DELETED);
+ //
+ // Read the list back
+ //
}
@Override