mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Fixed ALFCOM-3024 - Updating metadata for an auto-versioned object does not create a new version
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@14890 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2008 Alfresco Software Limited.
|
* Copyright (C) 2005-2009 Alfresco Software Limited.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@@ -27,7 +27,9 @@ package org.alfresco.repo.version;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import org.alfresco.i18n.I18NUtil;
|
import org.alfresco.i18n.I18NUtil;
|
||||||
import org.alfresco.model.ContentModel;
|
import org.alfresco.model.ContentModel;
|
||||||
@@ -41,6 +43,7 @@ import org.alfresco.repo.policy.Behaviour;
|
|||||||
import org.alfresco.repo.policy.JavaBehaviour;
|
import org.alfresco.repo.policy.JavaBehaviour;
|
||||||
import org.alfresco.repo.policy.PolicyComponent;
|
import org.alfresco.repo.policy.PolicyComponent;
|
||||||
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
|
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
|
||||||
|
import org.alfresco.repo.transaction.TransactionListenerAdapter;
|
||||||
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
import org.alfresco.service.cmr.repository.NodeService;
|
import org.alfresco.service.cmr.repository.NodeService;
|
||||||
@@ -52,12 +55,13 @@ import org.alfresco.service.namespace.QName;
|
|||||||
/**
|
/**
|
||||||
* Class containing behaviour for the versionable aspect
|
* Class containing behaviour for the versionable aspect
|
||||||
*
|
*
|
||||||
* @author Roy Wetherall
|
* @author Roy Wetherall, janv
|
||||||
*/
|
*/
|
||||||
public class VersionableAspect implements ContentServicePolicies.OnContentUpdatePolicy,
|
public class VersionableAspect implements ContentServicePolicies.OnContentUpdatePolicy,
|
||||||
NodeServicePolicies.OnAddAspectPolicy,
|
NodeServicePolicies.OnAddAspectPolicy,
|
||||||
NodeServicePolicies.OnRemoveAspectPolicy,
|
NodeServicePolicies.OnRemoveAspectPolicy,
|
||||||
NodeServicePolicies.OnDeleteNodePolicy,
|
NodeServicePolicies.OnDeleteNodePolicy,
|
||||||
|
NodeServicePolicies.OnUpdatePropertiesPolicy,
|
||||||
VersionServicePolicies.AfterCreateVersionPolicy,
|
VersionServicePolicies.AfterCreateVersionPolicy,
|
||||||
CopyServicePolicies.OnCopyNodePolicy
|
CopyServicePolicies.OnCopyNodePolicy
|
||||||
{
|
{
|
||||||
@@ -67,6 +71,7 @@ public class VersionableAspect implements ContentServicePolicies.OnContentUpdate
|
|||||||
|
|
||||||
/** Transaction resource key */
|
/** Transaction resource key */
|
||||||
private static final String KEY_VERSIONED_NODEREFS = "versioned_noderefs";
|
private static final String KEY_VERSIONED_NODEREFS = "versioned_noderefs";
|
||||||
|
private static final String KEY_PENDING_NODEREFS = "pending_noderefs";
|
||||||
|
|
||||||
/** The policy component */
|
/** The policy component */
|
||||||
private PolicyComponent policyComponent;
|
private PolicyComponent policyComponent;
|
||||||
@@ -77,8 +82,10 @@ public class VersionableAspect implements ContentServicePolicies.OnContentUpdate
|
|||||||
/** The Version service */
|
/** The Version service */
|
||||||
private VersionService versionService;
|
private VersionService versionService;
|
||||||
|
|
||||||
/** Auto version behaviour */
|
/** If true, property changes are not auto-versioned (and contentUpdate is not deferred to beforeCommit) */
|
||||||
private Behaviour autoVersionBehaviour;
|
private boolean deprecatedNotOnUpdateProperties = false;
|
||||||
|
|
||||||
|
private VersionableAspectTransactionListener transactionListener;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the policy component
|
* Set the policy component
|
||||||
@@ -110,6 +117,16 @@ public class VersionableAspect implements ContentServicePolicies.OnContentUpdate
|
|||||||
this.nodeService = nodeService;
|
this.nodeService = nodeService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set to TRUE for to disable auto-versioned property changes (pre-3.2 behaviour)
|
||||||
|
*
|
||||||
|
* @param deprecatedNotOnUpdateProperties
|
||||||
|
*/
|
||||||
|
public void setDeprecatedNotOnUpdateProperties(boolean deprecatedNotOnUpdateProperties)
|
||||||
|
{
|
||||||
|
this.deprecatedNotOnUpdateProperties = deprecatedNotOnUpdateProperties;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialise the versionable aspect policies
|
* Initialise the versionable aspect policies
|
||||||
*/
|
*/
|
||||||
@@ -132,11 +149,18 @@ public class VersionableAspect implements ContentServicePolicies.OnContentUpdate
|
|||||||
ContentModel.ASPECT_VERSIONABLE,
|
ContentModel.ASPECT_VERSIONABLE,
|
||||||
new JavaBehaviour(this, "afterCreateVersion", Behaviour.NotificationFrequency.EVERY_EVENT));
|
new JavaBehaviour(this, "afterCreateVersion", Behaviour.NotificationFrequency.EVERY_EVENT));
|
||||||
|
|
||||||
autoVersionBehaviour = new JavaBehaviour(this, "onContentUpdate", Behaviour.NotificationFrequency.TRANSACTION_COMMIT);
|
|
||||||
this.policyComponent.bindClassBehaviour(
|
this.policyComponent.bindClassBehaviour(
|
||||||
ContentServicePolicies.ON_CONTENT_UPDATE,
|
ContentServicePolicies.ON_CONTENT_UPDATE,
|
||||||
ContentModel.ASPECT_VERSIONABLE,
|
ContentModel.ASPECT_VERSIONABLE,
|
||||||
autoVersionBehaviour);
|
new JavaBehaviour(this, "onContentUpdate", Behaviour.NotificationFrequency.TRANSACTION_COMMIT));
|
||||||
|
|
||||||
|
if (! deprecatedNotOnUpdateProperties)
|
||||||
|
{
|
||||||
|
this.policyComponent.bindClassBehaviour(
|
||||||
|
QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"),
|
||||||
|
ContentModel.ASPECT_VERSIONABLE,
|
||||||
|
new JavaBehaviour(this, "onUpdateProperties", Behaviour.NotificationFrequency.TRANSACTION_COMMIT));
|
||||||
|
}
|
||||||
|
|
||||||
// Register the copy behaviour
|
// Register the copy behaviour
|
||||||
this.policyComponent.bindClassBehaviour(
|
this.policyComponent.bindClassBehaviour(
|
||||||
@@ -265,12 +289,54 @@ public class VersionableAspect implements ContentServicePolicies.OnContentUpdate
|
|||||||
// else this means that the default value has not been set and the versionable aspect was applied pre-1.1
|
// else this means that the default value has not been set and the versionable aspect was applied pre-1.1
|
||||||
|
|
||||||
if (autoVersion == true)
|
if (autoVersion == true)
|
||||||
|
{
|
||||||
|
if (deprecatedNotOnUpdateProperties)
|
||||||
{
|
{
|
||||||
// Create the auto-version
|
// Create the auto-version
|
||||||
Map<String, Serializable> versionProperties = new HashMap<String, Serializable>(1);
|
Map<String, Serializable> versionProperties = new HashMap<String, Serializable>(1);
|
||||||
versionProperties.put(Version.PROP_DESCRIPTION, I18NUtil.getMessage(MSG_AUTO_VERSION));
|
versionProperties.put(Version.PROP_DESCRIPTION, I18NUtil.getMessage(MSG_AUTO_VERSION));
|
||||||
this.versionService.createVersion(nodeRef, versionProperties);
|
this.versionService.createVersion(nodeRef, versionProperties);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
queueVersion(nodeRef);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 3.2
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public void onUpdateProperties(
|
||||||
|
NodeRef nodeRef,
|
||||||
|
Map<QName, Serializable> before,
|
||||||
|
Map<QName, Serializable> after)
|
||||||
|
{
|
||||||
|
if ((!deprecatedNotOnUpdateProperties) &&
|
||||||
|
(this.nodeService.exists(nodeRef) == true) &&
|
||||||
|
(this.nodeService.hasAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE) == true) &&
|
||||||
|
(this.nodeService.hasAspect(nodeRef, ContentModel.ASPECT_TEMPORARY) == false))
|
||||||
|
{
|
||||||
|
Map<NodeRef, NodeRef> versionedNodeRefs = (Map)AlfrescoTransactionSupport.getResource(KEY_VERSIONED_NODEREFS);
|
||||||
|
if (versionedNodeRefs == null || versionedNodeRefs.containsKey(nodeRef) == false)
|
||||||
|
{
|
||||||
|
// Determine whether the node is auto versionable or not
|
||||||
|
boolean autoVersion = false;
|
||||||
|
Boolean value = (Boolean)this.nodeService.getProperty(nodeRef, ContentModel.PROP_AUTO_VERSION);
|
||||||
|
if (value != null)
|
||||||
|
{
|
||||||
|
// If the value is not null then
|
||||||
|
autoVersion = value.booleanValue();
|
||||||
|
}
|
||||||
|
// else this means that the default value has not been set and the versionable aspect was applied pre-1.1
|
||||||
|
|
||||||
|
if (autoVersion == true)
|
||||||
|
{
|
||||||
|
queueVersion(nodeRef);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -289,4 +355,42 @@ public class VersionableAspect implements ContentServicePolicies.OnContentUpdate
|
|||||||
}
|
}
|
||||||
versionedNodeRefs.put(versionableNode, versionableNode);
|
versionedNodeRefs.put(versionableNode, versionableNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private void queueVersion(NodeRef nodeRef)
|
||||||
|
{
|
||||||
|
Set<NodeRef> pendingNodeRefs = (Set<NodeRef>)AlfrescoTransactionSupport.getResource(KEY_PENDING_NODEREFS);
|
||||||
|
if (pendingNodeRefs == null)
|
||||||
|
{
|
||||||
|
pendingNodeRefs = new HashSet<NodeRef>();
|
||||||
|
AlfrescoTransactionSupport.bindResource(KEY_PENDING_NODEREFS, pendingNodeRefs);
|
||||||
|
}
|
||||||
|
pendingNodeRefs.add(nodeRef);
|
||||||
|
|
||||||
|
AlfrescoTransactionSupport.bindListener(this.transactionListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class VersionableAspectTransactionListener extends TransactionListenerAdapter
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @see org.alfresco.repo.transaction.TransactionListener#beforeCommit(boolean)
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public void beforeCommit(boolean readOnly)
|
||||||
|
{
|
||||||
|
Set<NodeRef> pendingNodeRefs = (Set<NodeRef>)AlfrescoTransactionSupport.getResource(KEY_PENDING_NODEREFS);
|
||||||
|
|
||||||
|
if (pendingNodeRefs != null)
|
||||||
|
{
|
||||||
|
for (NodeRef nodeRef : pendingNodeRefs)
|
||||||
|
{
|
||||||
|
// Create the auto-version
|
||||||
|
Map<String, Serializable> versionProperties = new HashMap<String, Serializable>(1);
|
||||||
|
versionProperties.put(Version.PROP_DESCRIPTION, I18NUtil.getMessage(MSG_AUTO_VERSION));
|
||||||
|
versionService.createVersion(nodeRef, versionProperties);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user