]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
CSPACE-3708: Workflow get/update now fully supported on Dimmension objects.
authorRichard Millet <richard.millet@berkeley.edu>
Wed, 30 Mar 2011 22:49:49 +0000 (22:49 +0000)
committerRichard Millet <richard.millet@berkeley.edu>
Wed, 30 Mar 2011 22:49:49 +0000 (22:49 +0000)
13 files changed:
services/client/src/main/java/org/collectionspace/services/client/AbstractServiceClientImpl.java
services/client/src/main/java/org/collectionspace/services/client/CollectionSpaceClient.java
services/client/src/main/java/org/collectionspace/services/client/CollectionSpaceProxy.java
services/common/src/main/java/org/collectionspace/services/common/AbstractMultiPartCollectionSpaceResourceImpl.java
services/common/src/main/java/org/collectionspace/services/common/document/AbstractDocumentHandlerImpl.java
services/common/src/main/java/org/collectionspace/services/common/document/AbstractMultipartDocumentHandlerImpl.java
services/common/src/main/java/org/collectionspace/services/common/document/DocumentHandler.java
services/common/src/main/java/org/collectionspace/services/common/workflow/client/WorkflowClient.java
services/common/src/main/java/org/collectionspace/services/common/workflow/service/nuxeo/WorkflowDocumentModelHandler.java
services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/DocHandlerBase.java
services/dimension/client/src/main/java/org/collectionspace/services/client/DimensionClient.java
services/workflow/3rdparty/nuxeo-platform-cs-workflow/src/main/resources/META-INF/MANIFEST.MF
services/workflow/client/src/test/java/org/collectionspace/services/client/test/WorkflowServiceTest.java

index bdaeab9bd234b1faa683f3258429b1e532fa48d5..1314d1cd7088af0072cf22ac7ecc39d93f690f02 100644 (file)
@@ -410,9 +410,14 @@ public abstract class AbstractServiceClientImpl<T extends CollectionSpaceProxy>
     }\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
index cfe5893064db16b92d6ee1726cdd7558bf8f26c2..90dc28b3eceff39361f0d68ad397b4e9fc6be884 100644 (file)
@@ -176,7 +176,9 @@ public interface CollectionSpaceClient<T extends CollectionSpaceProxy> {
      * @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.
index 02c39baaebdcef952dd9c367e755ac39efd2e8f7..e093f4be688f22b0c98792efaa9072adad502747 100644 (file)
  */\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
@@ -57,9 +59,17 @@ public interface CollectionSpaceProxy {
     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
index 1371cb62be714bd9a61f28ca82dafc9dd4260bea..e669941c466f115a69cd10a558079d487c2fbcfc 100644 (file)
  */\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
@@ -45,6 +48,7 @@ import org.collectionspace.services.common.security.UnauthorizedException;
 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
@@ -167,14 +171,14 @@ public abstract class AbstractMultiPartCollectionSpaceResourceImpl extends
     /*\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
@@ -190,4 +194,25 @@ public abstract class AbstractMultiPartCollectionSpaceResourceImpl extends
         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
index e281c4c0158c5fd62fd834b9d46a14d3ec389279..060af748db2cbb7de9f1ca6893aaf3f9b35e2e80 100644 (file)
@@ -371,7 +371,7 @@ public abstract class AbstractDocumentHandlerImpl<T, TL, WT, WTL>
      * @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.
index e34b6dc282a98ab7059a6011d7527940fba629c8..a8a580ff59329c65ed243dd1bffb4fc586d6e033 100644 (file)
@@ -101,6 +101,6 @@ public abstract class AbstractMultipartDocumentHandlerImpl<T, TL, WT, WTL>
     public abstract void setCommonPartList(TL obj);
 
     @Override
-    public abstract String getQProperty(String prop);
+    public abstract String getQProperty(String prop) throws DocumentException;
 
 }
index b869e9f75e76d75c2086f30a06fbe0dda6c048cd..a609e8d23220da28627518758c2edb8d98e34274 100644 (file)
@@ -307,8 +307,9 @@ public interface DocumentHandler<T, TL, WT, WTL> {
      * 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
index 2f470777cce4969fb38636a8e4d4bb4b8db70c7d..5090db8e31d2919cde5e116d62935570088fc23e 100644 (file)
@@ -32,6 +32,11 @@ public class WorkflowClient extends AbstractPoxServiceClientImpl<WorkflowProxy>
        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;
index dc622c4adf17626a61dfa2b85c25297055917aeb..2f47a3a84f97640a144ff2ed1403448df64eddde 100644 (file)
 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, 
@@ -62,7 +89,6 @@ public class WorkflowDocumentModelHandler
     @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();
@@ -75,6 +101,28 @@ public class WorkflowDocumentModelHandler
             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()));
+    }
+
 }
 
index 98ed10ff01d48773a4a86dd880e3edcf08aea43b..96daaf235d550e8aba765dad3f174e60a2c150b6 100755 (executable)
@@ -35,6 +35,7 @@ import org.collectionspace.services.common.service.ListResultField;
 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
@@ -67,7 +68,8 @@ public abstract class DocHandlerBase<T> extends RemoteDocumentModelHandlerImpl<T
         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
@@ -78,7 +80,8 @@ public abstract class DocHandlerBase<T> extends RemoteDocumentModelHandlerImpl<T
         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
@@ -100,21 +103,22 @@ public abstract class DocHandlerBase<T> extends RemoteDocumentModelHandlerImpl<T
                        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
@@ -123,7 +127,8 @@ public abstract class DocHandlerBase<T> extends RemoteDocumentModelHandlerImpl<T
         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
@@ -199,7 +204,7 @@ public abstract class DocHandlerBase<T> extends RemoteDocumentModelHandlerImpl<T
     }\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
@@ -211,13 +216,28 @@ public abstract class DocHandlerBase<T> extends RemoteDocumentModelHandlerImpl<T
         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
index 13913149469cb19274c6ed0ab601f5325dffbc08..7ad75a304edb433583854dffaa741b156a6beba5 100644 (file)
@@ -63,6 +63,5 @@ public class DimensionClient extends AbstractPoxServiceClientImpl<DimensionProxy
     public ClientResponse<DimensionsCommonList> readList() {
        DimensionProxy proxy = (DimensionProxy)getProxy();
        return proxy.readList();
-    }
-    
+    }    
 }
index 6b8bf35003b1c7c9df6196f791434e7a4d234453..fb5cad529ab9e1fede3577becd3068b76b052890 100644 (file)
@@ -16,7 +16,5 @@ Require-Bundle: org.nuxeo.runtime,
  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
index 77d2e8eda9a9bca84fe431a06b1c7c45bfc5b0a5..3582ae85404c78f34483b9e4f82e8b2cda2238de 100644 (file)
@@ -23,6 +23,7 @@
 package org.collectionspace.services.client.test;
 
 import java.util.List;
+
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
@@ -36,6 +37,7 @@ import org.collectionspace.services.common.workflow.client.WorkflowClient;
 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;
 
@@ -92,10 +94,10 @@ public class WorkflowServiceTest extends AbstractServiceTestImpl {
 //        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();
@@ -116,7 +118,7 @@ public class WorkflowServiceTest extends AbstractServiceTestImpl {
     }
 
     @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();
@@ -151,30 +153,52 @@ public class WorkflowServiceTest extends AbstractServiceTestImpl {
 //            }
 //        }
 //    }
-
+    
     @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
@@ -289,13 +313,63 @@ public class WorkflowServiceTest extends AbstractServiceTestImpl {
     }
 
        @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