- 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

@@ -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<QName, Serializable> 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<QName, Serializable> 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);
}
}
/**

View File

@@ -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<QName, Serializable> before,
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
Set<QName> qnames = getTypeAndAspectQNames(nodeRef);
// 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.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<ChildAssociationRef> parentsAssocRefs = this.nodeService.getParentAssocs(nodeRef);
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.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<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);
for (ChildAssociationRef parentAssocRef : parentsAssocRefs)
{