diff --git a/config/alfresco/core-services-context.xml b/config/alfresco/core-services-context.xml index 4abd930294..35a5eaa976 100644 --- a/config/alfresco/core-services-context.xml +++ b/config/alfresco/core-services-context.xml @@ -792,6 +792,9 @@ + + + diff --git a/config/alfresco/rule-services-context.xml b/config/alfresco/rule-services-context.xml index d2c3e370a2..b038b4bcc9 100644 --- a/config/alfresco/rule-services-context.xml +++ b/config/alfresco/rule-services-context.xml @@ -67,41 +67,18 @@ - - - - - - - - + - - - - + --> diff --git a/source/java/org/alfresco/repo/audit/AuditableAspect.java b/source/java/org/alfresco/repo/audit/AuditableAspect.java index 52590e3e6c..5fc43e5797 100644 --- a/source/java/org/alfresco/repo/audit/AuditableAspect.java +++ b/source/java/org/alfresco/repo/audit/AuditableAspect.java @@ -16,10 +16,13 @@ */ package org.alfresco.repo.audit; +import java.io.Serializable; import java.util.Date; +import java.util.Map; import org.alfresco.model.ContentModel; import org.alfresco.repo.policy.Behaviour; +import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.policy.JavaBehaviour; import org.alfresco.repo.policy.PolicyComponent; import org.alfresco.repo.policy.PolicyScope; @@ -51,6 +54,7 @@ public class AuditableAspect private NodeService nodeService; private AuthenticationService authenticationService; private PolicyComponent policyComponent; + private BehaviourFilter policyBehaviourFilter; // Behaviours private Behaviour onCreateAudit; @@ -74,6 +78,14 @@ public class AuditableAspect this.policyComponent = policyComponent; } + /** + * @param policyBehaviourFilter the policy behaviour filter + */ + public void setPolicyBehaviourFilter(BehaviourFilter policyBehaviourFilter) + { + this.policyBehaviourFilter = policyBehaviourFilter; + } + /** * @param authenticationService the authentication service */ @@ -122,28 +134,34 @@ public class AuditableAspect { try { - onUpdateAudit.disable(); + this.policyBehaviourFilter.disableBehaviour(ContentModel.ASPECT_AUDITABLE); + + // Get the current properties + Map properties = this.nodeService.getProperties(nodeRef); // Set created / updated date Date now = new Date(System.currentTimeMillis()); - nodeService.setProperty(nodeRef, ContentModel.PROP_CREATED, now); - nodeService.setProperty(nodeRef, ContentModel.PROP_MODIFIED, now); + properties.put(ContentModel.PROP_CREATED, now); + properties.put(ContentModel.PROP_MODIFIED, now); // Set creator (but do not override, if explicitly set) - String creator = (String)nodeService.getProperty(nodeRef, ContentModel.PROP_CREATOR); + String creator = (String)properties.get(ContentModel.PROP_CREATOR); if (creator == null || creator.length() == 0) { creator = getUsername(); - nodeService.setProperty(nodeRef, ContentModel.PROP_CREATOR, creator); + properties.put(ContentModel.PROP_CREATOR, creator); } - nodeService.setProperty(nodeRef, ContentModel.PROP_MODIFIER, creator); + properties.put(ContentModel.PROP_MODIFIER, creator); + + // Set the updated property values + this.nodeService.setProperties(nodeRef, properties); if (logger.isDebugEnabled()) logger.debug("Auditable node " + nodeRef + " created [created,modified=" + now + ";creator,modifier=" + creator + "]"); } finally { - onUpdateAudit.enable(); + this.policyBehaviourFilter.enableBehaviour(ContentModel.ASPECT_AUDITABLE); } } @@ -153,17 +171,32 @@ public class AuditableAspect * @param nodeRef the updated node */ public void onUpdateAudit(NodeRef nodeRef) - { - // Set updated date - Date now = new Date(System.currentTimeMillis()); - nodeService.setProperty(nodeRef, ContentModel.PROP_MODIFIED, now); - - // Set modifier - String modifier = getUsername(); - nodeService.setProperty(nodeRef, ContentModel.PROP_MODIFIER, modifier); - - if (logger.isDebugEnabled()) - logger.debug("Auditable node " + nodeRef + " updated [modified=" + now + ";modifier=" + modifier + "]"); + { + try + { + this.policyBehaviourFilter.disableBehaviour(ContentModel.ASPECT_AUDITABLE); + + // Get the current properties + Map properties = this.nodeService.getProperties(nodeRef); + + // Set updated date + Date now = new Date(System.currentTimeMillis()); + properties.put(ContentModel.PROP_MODIFIED, now); + + // Set modifier + String modifier = getUsername(); + properties.put(ContentModel.PROP_MODIFIER, modifier); + + // Set the updated property values + this.nodeService.setProperties(nodeRef, properties); + + if (logger.isDebugEnabled()) + logger.debug("Auditable node " + nodeRef + " updated [modified=" + now + ";modifier=" + modifier + "]"); + } + finally + { + this.policyBehaviourFilter.enableBehaviour(ContentModel.ASPECT_AUDITABLE); + } } /** diff --git a/source/java/org/alfresco/repo/node/AbstractNodeServiceImpl.java b/source/java/org/alfresco/repo/node/AbstractNodeServiceImpl.java index 96a4cf0b8d..f00bc2d017 100644 --- a/source/java/org/alfresco/repo/node/AbstractNodeServiceImpl.java +++ b/source/java/org/alfresco/repo/node/AbstractNodeServiceImpl.java @@ -63,6 +63,8 @@ import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QNamePattern; import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.util.GUID; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * Provides common functionality for @@ -77,6 +79,11 @@ import org.alfresco.util.GUID; */ public abstract class AbstractNodeServiceImpl implements NodeService { + /** + * The logger + */ + private static Log logger = LogFactory.getLog(AbstractNodeServiceImpl.class); + /** a uuid identifying this unique instance */ private String uuid; /** controls policy delegates */ @@ -250,6 +257,43 @@ public abstract class AbstractNodeServiceImpl implements NodeService Map before, Map after) { + + // Some logging so we can see which properties have been modified + if (logger.isDebugEnabled() == true) + { + if (before == null) + { + logger.debug("The properties are being set for the first time. (nodeRef=" + nodeRef.toString() + ")"); + } + else if (after == null) + { + logger.debug("All the properties are being cleared. (nodeRef=" + nodeRef.toString() + ")"); + } + else + { + logger.debug("The following properties have been updated: (nodeRef=" + nodeRef.toString() + ")"); + for (Map.Entry entry : after.entrySet()) + { + Serializable beforeValue = before.get(entry.getKey()); + if (beforeValue == null) + { + // Property has been set for the first time + logger.debug(" - The property " + entry.getKey().toString() + " has been set for the first time."); + } + else + { + // Compare the before and after value + if (beforeValue.equals(entry.getValue()) == false) + { + logger.debug(" - The property " + entry.getKey().toString() + " has been updated."); + } + } + + } + } + + } + // get qnames to invoke against Set qnames = getTypeAndAspectQNames(nodeRef); // execute policy for node type and aspects diff --git a/source/java/org/alfresco/repo/rule/ruletrigger/OnContentUpdateRuleTrigger.java b/source/java/org/alfresco/repo/rule/ruletrigger/OnContentUpdateRuleTrigger.java index f8e9a2e962..fcee23aaff 100644 --- a/source/java/org/alfresco/repo/rule/ruletrigger/OnContentUpdateRuleTrigger.java +++ b/source/java/org/alfresco/repo/rule/ruletrigger/OnContentUpdateRuleTrigger.java @@ -22,6 +22,8 @@ import org.alfresco.repo.content.ContentServicePolicies; import org.alfresco.repo.policy.JavaBehaviour; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * @author Roy Wetherall @@ -29,6 +31,11 @@ import org.alfresco.service.cmr.repository.NodeRef; public class OnContentUpdateRuleTrigger extends RuleTriggerAbstractBase implements ContentServicePolicies.OnContentUpdatePolicy { + /** + * The logger + */ + private static Log logger = LogFactory.getLog(OnContentUpdateRuleTrigger.class); + /** True trigger on new content, false otherwise */ private boolean onNewContent = false; @@ -76,6 +83,11 @@ public class OnContentUpdateRuleTrigger extends RuleTriggerAbstractBase { if (triggerParentRules == true) { + if (logger.isDebugEnabled() == true) + { + logger.debug("OnContentUpdate rule triggered fired for content; nodeId=" + nodeRef.getId() + "; newContent=" + newContent); + } + List parentsAssocRefs = this.nodeService.getParentAssocs(nodeRef); for (ChildAssociationRef parentAssocRef : parentsAssocRefs) { diff --git a/source/java/org/alfresco/repo/rule/ruletrigger/OnPropertyUpdateRuleTrigger.java b/source/java/org/alfresco/repo/rule/ruletrigger/OnPropertyUpdateRuleTrigger.java index c01f3ee0b1..c21a7fe61b 100644 --- a/source/java/org/alfresco/repo/rule/ruletrigger/OnPropertyUpdateRuleTrigger.java +++ b/source/java/org/alfresco/repo/rule/ruletrigger/OnPropertyUpdateRuleTrigger.java @@ -26,6 +26,8 @@ import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * On propety update trigger @@ -35,6 +37,11 @@ import org.alfresco.service.namespace.QName; public class OnPropertyUpdateRuleTrigger extends RuleTriggerAbstractBase implements NodeServicePolicies.OnUpdatePropertiesPolicy { + /** + * The logger + */ + private static Log logger = LogFactory.getLog(OnPropertyUpdateRuleTrigger.class); + /** True trigger parent rules, false otherwier */ private boolean triggerParentRules = true; @@ -60,10 +67,18 @@ public class OnPropertyUpdateRuleTrigger extends RuleTriggerAbstractBase new JavaBehaviour(this, "onUpdateProperties")); } + /** + * @see org.alfresco.repo.node.NodeServicePolicies.OnUpdatePropertiesPolicy#onUpdateProperties(org.alfresco.service.cmr.repository.NodeRef, java.util.Map, java.util.Map) + */ public void onUpdateProperties(NodeRef nodeRef, Map before, Map after) { - if (triggerParentRules == true) + if (logger.isDebugEnabled() == true) { + logger.debug("OnPropertyUpdate rule triggered fired; nodeRef=" + nodeRef.toString() + "; triggerParentRules=" + this.triggerParentRules); + } + + if (triggerParentRules == true) + { List parentsAssocRefs = this.nodeService.getParentAssocs(nodeRef); for (ChildAssociationRef parentAssocRef : parentsAssocRefs) {