Search code examples
javaalfrescoopencmis

Create and update documents while maintaining version history using OpenCMIS


Can someone post the OpenCMIS code necessary to create a new document and then update that document by updating its content stream? I don't want to lose the original document--I want to maintain the version history as new documents are updated. I am using Alfresco but this should be applicable to any CMIS repository.


Solution

  • In Alfresco, to create a new version, just get the Private Working Copy that is returned to you after a checkout, update the PWC's content stream, then check it back in. Alfresco will manage the versions for you. Here is an example.

    Folder folder = (Folder) getSession().getObjectByPath("/cmis-demo");
    
    String timeStamp = new Long(System.currentTimeMillis()).toString();
    String filename = "cmis-demo-doc (" + timeStamp + ")";
    
    // Create a doc
    Map <String, Object> properties = new HashMap<String, Object>();
    properties.put(PropertyIds.OBJECT_TYPE_ID, "cmis:document");
    properties.put(PropertyIds.NAME, filename);
    String docText = "This is a sample document";
    byte[] content = docText.getBytes();
    InputStream stream = new ByteArrayInputStream(content);
    ContentStream contentStream = getSession().getObjectFactory().createContentStream(filename, Long.valueOf(content.length), "text/plain", stream);
    
    Document doc = folder.createDocument(
               properties,
               contentStream,
               VersioningState.MAJOR);
    
    System.out.println("Created: " + doc.getId());
    System.out.println("Content Length: " + doc.getContentStreamLength());
    System.out.println("Version label:" + doc.getVersionLabel());
    
    // Now update it with a new version
    if (doc.getAllowableActions().getAllowableActions().contains(org.apache.chemistry.opencmis.commons.enums.Action.CAN_CHECK_OUT)) {
       doc.refresh();
       String testName = doc.getContentStream().getFileName();
       ObjectId idOfCheckedOutDocument = doc.checkOut();
       Document pwc = (Document) session.getObject(idOfCheckedOutDocument);
       docText = "This is a sample document with an UPDATE";
       content = docText.getBytes();
       stream = new ByteArrayInputStream(content);         
       contentStream = getSession().getObjectFactory().createContentStream(filename, Long.valueOf(content.length), "text/plain", stream);          
       ObjectId objectId = pwc.checkIn(false, null, contentStream, "just a minor change");
       doc = (Document) session.getObject(objectId);
       System.out.println("Version label is now:" + doc.getVersionLabel());
    }
    

    When run, it outputs this:

    Created: workspace://SpacesStore/d6f3fca2-bf9c-4a0e-8141-088d07d45359;1.0
    Content Length: 25
    Version label:1.0
    Version label is now:1.1
    Done