- Auditable aspect now modifies properties in batch using setProperties

- Inbound rule type now only fires on content creation (not on content update)
- Update rule type added, but commented out sue to issues with over enthusiastic policies.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2541 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Roy Wetherall
2006-03-13 14:42:00 +00:00
parent 1858509d3a
commit 731733d59f
6 changed files with 130 additions and 46 deletions

View File

@@ -792,6 +792,9 @@
<property name="authenticationService"> <property name="authenticationService">
<ref bean="authenticationService" /> <ref bean="authenticationService" />
</property> </property>
<property name="policyBehaviourFilter">
<ref bean="policyBehaviourFilter" />
</property>
</bean> </bean>
<!-- Referenceable --> <!-- Referenceable -->

View File

@@ -67,41 +67,18 @@
<ref bean="on-create-node-trigger"/> <ref bean="on-create-node-trigger"/>
<ref bean="on-create-child-association-trigger"/> <ref bean="on-create-child-association-trigger"/>
<ref bean="on-content-create-trigger"/> <ref bean="on-content-create-trigger"/>
<!-- NOTE: if you do not want hte inbound rule to rile on content update -->
<!-- remove the following line -->
<ref bean="on-content-update-trigger"/>
</list> </list>
</constructor-arg> </constructor-arg>
</bean> </bean>
<!-- NOTE: Adding the following will provide an update policy. This will cause --> <!-- Commented out for now -->
<!-- rules to be fired on content or meta-data update. --> <!-- <bean id="update" class="org.alfresco.repo.rule.RuleTypeImpl" parent="rule-type-base">
<!-- WARNING: This is at present working but not fully QA'ed. -->
<!--
<bean id="update" class="org.alfresco.repo.rule.RuleTypeImpl" parent="rule-type-base">
<constructor-arg> <constructor-arg>
<list> <list>
<ref bean="on-property-update-trigger"/> <ref bean="on-property-update-trigger"/>
</list> </list>
</constructor-arg> </constructor-arg>
</bean> </bean> -->
-->
<!-- NOTE: Multiple rule types are not currently support so if you require inbound and update -->
<!-- behaviour then add the following rule type -->
<!--
<bean id="inboundAndUpdate" class="org.alfresco.repo.rule.RuleTypeImpl" parent="rule-type-base">
<constructor-arg>
<list>
<ref bean="on-create-node-trigger"/>
<ref bean="on-create-child-association-trigger"/>
<ref bean="on-content-create-trigger"/>
<ref bean="on-update-node-trigger"/>
<ref bean="on-content-update-trigger"/>
</list>
</constructor-arg>
</bean>
-->
<bean id="outbound" class="org.alfresco.repo.rule.RuleTypeImpl" parent="rule-type-base"> <bean id="outbound" class="org.alfresco.repo.rule.RuleTypeImpl" parent="rule-type-base">
<constructor-arg> <constructor-arg>

View File

@@ -16,10 +16,13 @@
*/ */
package org.alfresco.repo.audit; package org.alfresco.repo.audit;
import java.io.Serializable;
import java.util.Date; import java.util.Date;
import java.util.Map;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.repo.policy.Behaviour; import org.alfresco.repo.policy.Behaviour;
import org.alfresco.repo.policy.BehaviourFilter;
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.policy.PolicyScope; import org.alfresco.repo.policy.PolicyScope;
@@ -51,6 +54,7 @@ public class AuditableAspect
private NodeService nodeService; private NodeService nodeService;
private AuthenticationService authenticationService; private AuthenticationService authenticationService;
private PolicyComponent policyComponent; private PolicyComponent policyComponent;
private BehaviourFilter policyBehaviourFilter;
// Behaviours // Behaviours
private Behaviour onCreateAudit; private Behaviour onCreateAudit;
@@ -74,6 +78,14 @@ public class AuditableAspect
this.policyComponent = policyComponent; this.policyComponent = policyComponent;
} }
/**
* @param policyBehaviourFilter the policy behaviour filter
*/
public void setPolicyBehaviourFilter(BehaviourFilter policyBehaviourFilter)
{
this.policyBehaviourFilter = policyBehaviourFilter;
}
/** /**
* @param authenticationService the authentication service * @param authenticationService the authentication service
*/ */
@@ -122,28 +134,34 @@ public class AuditableAspect
{ {
try try
{ {
onUpdateAudit.disable(); this.policyBehaviourFilter.disableBehaviour(ContentModel.ASPECT_AUDITABLE);
// Get the current properties
Map<QName, Serializable> properties = this.nodeService.getProperties(nodeRef);
// Set created / updated date // Set created / updated date
Date now = new Date(System.currentTimeMillis()); Date now = new Date(System.currentTimeMillis());
nodeService.setProperty(nodeRef, ContentModel.PROP_CREATED, now); properties.put(ContentModel.PROP_CREATED, now);
nodeService.setProperty(nodeRef, ContentModel.PROP_MODIFIED, now); properties.put(ContentModel.PROP_MODIFIED, now);
// Set creator (but do not override, if explicitly set) // 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) if (creator == null || creator.length() == 0)
{ {
creator = getUsername(); 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()) if (logger.isDebugEnabled())
logger.debug("Auditable node " + nodeRef + " created [created,modified=" + now + ";creator,modifier=" + creator + "]"); logger.debug("Auditable node " + nodeRef + " created [created,modified=" + now + ";creator,modifier=" + creator + "]");
} }
finally finally
{ {
onUpdateAudit.enable(); this.policyBehaviourFilter.enableBehaviour(ContentModel.ASPECT_AUDITABLE);
} }
} }
@@ -153,17 +171,32 @@ public class AuditableAspect
* @param nodeRef the updated node * @param nodeRef the updated node
*/ */
public void onUpdateAudit(NodeRef nodeRef) public void onUpdateAudit(NodeRef nodeRef)
{ {
// Set updated date try
Date now = new Date(System.currentTimeMillis()); {
nodeService.setProperty(nodeRef, ContentModel.PROP_MODIFIED, now); this.policyBehaviourFilter.disableBehaviour(ContentModel.ASPECT_AUDITABLE);
// Set modifier // Get the current properties
String modifier = getUsername(); Map<QName, Serializable> properties = this.nodeService.getProperties(nodeRef);
nodeService.setProperty(nodeRef, ContentModel.PROP_MODIFIER, modifier);
// Set updated date
if (logger.isDebugEnabled()) Date now = new Date(System.currentTimeMillis());
logger.debug("Auditable node " + nodeRef + " updated [modified=" + now + ";modifier=" + modifier + "]"); 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);
}
} }
/** /**

View File

@@ -63,6 +63,8 @@ import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.QNamePattern; import org.alfresco.service.namespace.QNamePattern;
import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.service.namespace.RegexQNamePattern;
import org.alfresco.util.GUID; import org.alfresco.util.GUID;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/** /**
* Provides common functionality for * Provides common functionality for
@@ -77,6 +79,11 @@ import org.alfresco.util.GUID;
*/ */
public abstract class AbstractNodeServiceImpl implements NodeService public abstract class AbstractNodeServiceImpl implements NodeService
{ {
/**
* The logger
*/
private static Log logger = LogFactory.getLog(AbstractNodeServiceImpl.class);
/** a uuid identifying this unique instance */ /** a uuid identifying this unique instance */
private String uuid; private String uuid;
/** controls policy delegates */ /** controls policy delegates */
@@ -250,6 +257,43 @@ public abstract class AbstractNodeServiceImpl implements NodeService
Map<QName, Serializable> before, Map<QName, Serializable> before,
Map<QName, Serializable> after) Map<QName, Serializable> 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<QName, Serializable> 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 // get qnames to invoke against
Set<QName> qnames = getTypeAndAspectQNames(nodeRef); Set<QName> qnames = getTypeAndAspectQNames(nodeRef);
// execute policy for node type and aspects // execute policy for node type and aspects

View File

@@ -22,6 +22,8 @@ import org.alfresco.repo.content.ContentServicePolicies;
import org.alfresco.repo.policy.JavaBehaviour; import org.alfresco.repo.policy.JavaBehaviour;
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.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/** /**
* @author Roy Wetherall * @author Roy Wetherall
@@ -29,6 +31,11 @@ import org.alfresco.service.cmr.repository.NodeRef;
public class OnContentUpdateRuleTrigger extends RuleTriggerAbstractBase public class OnContentUpdateRuleTrigger extends RuleTriggerAbstractBase
implements ContentServicePolicies.OnContentUpdatePolicy implements ContentServicePolicies.OnContentUpdatePolicy
{ {
/**
* The logger
*/
private static Log logger = LogFactory.getLog(OnContentUpdateRuleTrigger.class);
/** True trigger on new content, false otherwise */ /** True trigger on new content, false otherwise */
private boolean onNewContent = false; private boolean onNewContent = false;
@@ -76,6 +83,11 @@ public class OnContentUpdateRuleTrigger extends RuleTriggerAbstractBase
{ {
if (triggerParentRules == true) if (triggerParentRules == true)
{ {
if (logger.isDebugEnabled() == true)
{
logger.debug("OnContentUpdate rule triggered fired for content; nodeId=" + nodeRef.getId() + "; newContent=" + newContent);
}
List<ChildAssociationRef> parentsAssocRefs = this.nodeService.getParentAssocs(nodeRef); List<ChildAssociationRef> parentsAssocRefs = this.nodeService.getParentAssocs(nodeRef);
for (ChildAssociationRef parentAssocRef : parentsAssocRefs) for (ChildAssociationRef parentAssocRef : parentsAssocRefs)
{ {

View File

@@ -26,6 +26,8 @@ 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.namespace.NamespaceService; import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/** /**
* On propety update trigger * On propety update trigger
@@ -35,6 +37,11 @@ import org.alfresco.service.namespace.QName;
public class OnPropertyUpdateRuleTrigger extends RuleTriggerAbstractBase public class OnPropertyUpdateRuleTrigger extends RuleTriggerAbstractBase
implements NodeServicePolicies.OnUpdatePropertiesPolicy implements NodeServicePolicies.OnUpdatePropertiesPolicy
{ {
/**
* The logger
*/
private static Log logger = LogFactory.getLog(OnPropertyUpdateRuleTrigger.class);
/** True trigger parent rules, false otherwier */ /** True trigger parent rules, false otherwier */
private boolean triggerParentRules = true; private boolean triggerParentRules = true;
@@ -60,10 +67,18 @@ public class OnPropertyUpdateRuleTrigger extends RuleTriggerAbstractBase
new JavaBehaviour(this, "onUpdateProperties")); 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<QName, Serializable> before, Map<QName, Serializable> after) public void onUpdateProperties(NodeRef nodeRef, Map<QName, Serializable> before, Map<QName, Serializable> after)
{ {
if (triggerParentRules == true) if (logger.isDebugEnabled() == true)
{ {
logger.debug("OnPropertyUpdate rule triggered fired; nodeRef=" + nodeRef.toString() + "; triggerParentRules=" + this.triggerParentRules);
}
if (triggerParentRules == true)
{
List<ChildAssociationRef> parentsAssocRefs = this.nodeService.getParentAssocs(nodeRef); List<ChildAssociationRef> parentsAssocRefs = this.nodeService.getParentAssocs(nodeRef);
for (ChildAssociationRef parentAssocRef : parentsAssocRefs) for (ChildAssociationRef parentAssocRef : parentsAssocRefs)
{ {