cancel
Showing results for 
Search instead for 
Did you mean: 

Read versionLabel right after Creating a versionable node

binnyg
Champ in-the-making
Champ in-the-making
We have a java backed upload webscript which creates a versionable node. I am having trouble finding a way to read the versionLabel property on the node which was just created. I get null for versionLabel on node creation and versionLabel is behind one version on node updates.

It appears to me that version is created after the transaction is committed. Transaction is only committed after the response was sent back. How can we retrieve the version number right after creating a node?
2 REPLIES 2

afaust
Legendary Innovator
Legendary Innovator
Hello,

unless you do an explicit version creation yourself, the only way to deal with this would be to handle transactions differently. E.g. don't execute the entire web script in a transaction - only the actual creation / modification part (manually managed via RetryingTransactionHandler) and retrieve the version label after that transaction completes.

Regards
Axel

sanjaytaunk
Champ in-the-making
Champ in-the-making
With the help of the leads provided by AFaust, I was able to solve above issue with below code piece.

        RetryingTransactionHelper txnHelper = serviceRegistry.getTransactionService().getRetryingTransactionHelper();
        RetryingTransactionCallback<NodeRef> callback = new RetryingTransactionCallback<NodeRef>() {
            public NodeRef execute() throws Throwable {
                NodeRef newNode = upload(parent, TradeMarkModel.MARK_QNAME, serialNumber, fileName, inputStream, properties);
                return newNode;
            }
         };
        NodeRef newNodeRef = txnHelper.doInTransaction(callback, false, true);
       
        PostResponse postResponse = new PostResponse();
        postResponse.setDocumentId(serialNumber, TradeMarkModel.TYPE_MARK, fileName);
        postResponse.setVersion((String) serviceRegistry.getNodeService().getProperty(newNodeRef, ContentModel.PROP_VERSION_LABEL));

The above code works fine for new node creation.

For Update node metadata:
You need to break down the writing on the node and then reading versionLabel as two separate transactions.

1a)
    private void updateMarkProperties(final Map<QName, Serializable> properties, final NodeRef nodeRef) throws UpdateMarkMetadataFailedException {
        RetryingTransactionHelper txnHelper = serviceRegistry.getTransactionService().getRetryingTransactionHelper();
        RetryingTransactionCallback<Void> callback = new RetryingTransactionCallback<Void>() {
            public Void execute() throws Throwable {
            for (QName key : properties.keySet()) {
                serviceRegistry.getNodeService().setProperty(nodeRef, key, properties.get(key));
            }
            return null;
            }
        };
        txnHelper.doInTransaction(callback, false, true);
    }
   
1b)
   RetryingTransactionHelper txnHelper = serviceRegistry.getTransactionService().getRetryingTransactionHelper();
   RetryingTransactionCallback<String> callback = new RetryingTransactionCallback<String>() {
   public String execute() throws Throwable {
      String verNo = (String) serviceRegistry.getNodeService().getProperty(markNodeRef,ContentModel.PROP_VERSION_LABEL);                       
      return verNo;
   }
   };
   String versionNumber = txnHelper.doInTransaction(callback, true, true);                   
   postResponse.setVersion(versionNumber);


Update node content:
You need to follow above technique for content modification of the Node and then retrieval of versionLabel as two separate transaction.

Also there is another way to solve similar transaction problem: Sample method below
    private NodeRef createCaseFolderAndCopyNode(final FileInfo fileInfo, final NodeRef efileNodeRef, final String trgtSerialNumber, final Map<QName, Serializable> newMetadataProperrties) {
        NodeRef newDocumentTypeNode = null;
        UserTransaction trx_A = serviceRegistry.getTransactionService().getNonPropagatingUserTransaction();
        try {
            trx_A.begin();
            NodeRef caseFolderNodeRef = caseService.getCaseFolderNodeRef(trgtSerialNumber, true);
            QName assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, fileInfo.getName());
            newDocumentTypeNode = serviceRegistry.getCopyService().copy(efileNodeRef, caseFolderNodeRef, ContentModel.ASSOC_CONTAINS, assocQName);
            serviceRegistry.getNodeService().setProperty(newDocumentTypeNode, ContentModel.PROP_NAME, fileInfo.getName());
            serviceRegistry.getNodeService().setProperty(newDocumentTypeNode, TradeMarkModel.SERIAL_NUMBER_QNAME, trgtSerialNumber);
            if (newMetadataProperrties != null && !(newMetadataProperrties.isEmpty())) {
                updateDocumentMetadata(newMetadataProperrties, newDocumentTypeNode);
            }      
            trx_A.commit();
        } catch (Throwable e) {
            try {
                trx_A.rollback();
            } catch (Throwable ee) {

            }
        }
        return newDocumentTypeNode;