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)
{