swemon
swemon

Reputation: 5946

Alfresco : Increase document version when overriding file in ftp

I want to increase minor document version when overriding file in ftp. When I traced the code, ContentDiskDriver2.truncateFile() works for overriding file. Inside this function I use versionService to increase version. Following code is written in truncateFile() try {

    NodeRef nodeRef = getNodeForPath(tree, DriverContent.FILE_OPEN_PARAMS.getPath());
    System.out.println("Node Ref: " + nodeRef);

    // Increase minor version to file.
    Map<String, Serializable> versionProperties = new HashMap<String, Serializable>(2, 1.0f);
    versionProperties.put(Version.PROP_DESCRIPTION, "");
    versionProperties.put(VersionModel.PROP_VERSION_TYPE, VersionType.MINOR);

    VersionService versionService = (VersionService) applicationContext.getBean("versionService");
    versionService.createVersion(nodeRef, versionProperties);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

But unfortunately I got this error.

2013-01-02 14:12:31,609  ERROR [org.alfresco.fileserver] [Sess_FTP3_192.168.1.166] Error from JLAN
 org.alfresco.error.AlfrescoRuntimeException: 00020073 Transaction must be active and synchronization is required: Thread[Sess_FTP3_192.168.1.166,5,FTPSessions]
    at org.alfresco.repo.transaction.AlfrescoTransactionSupport.registerSynchronizations(AlfrescoTransactionSupport.java:467)
    at org.alfresco.repo.transaction.AlfrescoTransactionSupport.getSynchronization(AlfrescoTransactionSupport.java:451)
    at org.alfresco.repo.transaction.AlfrescoTransactionSupport.getResource(AlfrescoTransactionSupport.java:244)
    at org.alfresco.repo.transaction.TransactionalResourceHelper.incrementCount(TransactionalResourceHelper.java:71)
    at org.alfresco.repo.policy.BehaviourFilterImpl.disableBehaviour(BehaviourFilterImpl.java:158)
    at org.alfresco.repo.version.Version2ServiceImpl.createVersion(Version2ServiceImpl.java:212)
    at org.alfresco.repo.version.Version2ServiceImpl.createVersion(Version2ServiceImpl.java:140)
    at org.alfresco.filesys.repo.ContentDiskDriver2.increaseVersion(ContentDiskDriver2.java:2937)
    at org.alfresco.filesys.repo.ContentDiskDriver2.truncateFile(ContentDiskDriver2.java:1652)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
    at $Proxy97.truncateFile(Unknown Source)
    at org.alfresco.filesys.repo.NonTransactionalRuleContentDiskDriver.truncateFile(NonTransactionalRuleContentDiskDriver.java:480)
    at org.alfresco.filesys.repo.LegacyFileStateDriver.truncateFile(LegacyFileStateDriver.java:471)
    at org.alfresco.filesys.repo.BufferedContentDiskDriver.truncateFile(BufferedContentDiskDriver.java:532)
    at org.alfresco.jlan.ftp.FTPSrvSession.procStoreFile(FTPSrvSession.java:2262)
    at org.alfresco.jlan.ftp.FTPSrvSession.run(FTPSrvSession.java:4924)
    at java.lang.Thread.run(Thread.java:662)

Can you help me how to solve Transaction must be active and synchronization is required

I found this link.. Is the Alfresco repository document version history available via CIFS/FTP?

Upvotes: 1

Views: 1851

Answers (2)

swemon
swemon

Reputation: 5946

This is alternative solution I found. The use of transaction explicitly.

    VersionService versionService = (VersionService) applicationContext.getBean("VersionService");
    TransactionService transactionService = (TransactionService) applicationContext.getBean("transactionService");

    UserTransaction tx = null;
    try {
        tx = transactionService.getUserTransaction();
        tx.begin();
        versionService.createVersion(nodeRef, versionProperties);
        tx.commit();
    } 
    catch (Exception e) 
    {
        if(tx != null)
        {
            try
            {
                tx.rollback();
            } catch (IllegalStateException e1) 
            {
                e1.printStackTrace();
            } catch (SecurityException e2) 
            {
                e2.printStackTrace();
            } catch (SystemException e3) 
            {
                e3.printStackTrace();
            }
        }
    }

Upvotes: 0

Gagravarr
Gagravarr

Reputation: 48386

You've been caught by "little letter" vs "Big Letter" Alfresco services

"little letter" services are the raw services, and normally only used within other Alfresco low level services. "Big Letter" services are the wrapped user facing services, which include transactions, auditing, security etc.

For your case, you need to use the Big Letter form, so change the line

VersionService versionService = (VersionService) applicationContext.getBean("versionService");

To the correct one:

VersionService versionService = (VersionService) applicationContext.getBean("VersionService");

And you'll get a copy of the VersionService with transactions, security etc, which is what I think you need for your situation. (Note that the bean is fetched with a Big First Letter rather than little letter)

Upvotes: 5

Related Questions