From 6e0c406488720bf25be77e60d4adc5d3abc65fb7 Mon Sep 17 00:00:00 2001 From: Derek Hulley Date: Mon, 18 Jun 2007 11:29:00 +0000 Subject: [PATCH] Enhanced 'beforeCreateChildAssociaton' and 'onCreateChildAssociation' to carry an 'isNewNode' flag. Fixed Lock and Rules to react correctly to this new information. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@6003 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../alfresco/repo/lock/LockServiceImpl.java | 3 +- .../repo/node/AbstractNodeServiceImpl.java | 8 ++-- .../repo/node/NodeServicePolicies.java | 17 ++++--- .../repo/node/db/DbNodeServiceImpl.java | 12 ++--- .../alfresco/repo/node/index/NodeIndexer.java | 7 ++- .../node/integrity/IncompleteNodeTagger.java | 35 ++++++++------- .../repo/node/integrity/IntegrityChecker.java | 11 ++++- .../ruletrigger/CreateNodeRuleTrigger.java | 14 +++++- .../SingleChildAssocRefPolicyRuleTrigger.java | 44 ++++++++++++++++--- 9 files changed, 106 insertions(+), 45 deletions(-) diff --git a/source/java/org/alfresco/repo/lock/LockServiceImpl.java b/source/java/org/alfresco/repo/lock/LockServiceImpl.java index 5de035a159..e8bf76828f 100644 --- a/source/java/org/alfresco/repo/lock/LockServiceImpl.java +++ b/source/java/org/alfresco/repo/lock/LockServiceImpl.java @@ -489,7 +489,8 @@ public class LockServiceImpl implements LockService, NodeRef parentNodeRef, NodeRef childNodeRef, QName assocTypeQName, - QName assocQName) + QName assocQName, + boolean isNewNode) { checkForLock(parentNodeRef); } diff --git a/source/java/org/alfresco/repo/node/AbstractNodeServiceImpl.java b/source/java/org/alfresco/repo/node/AbstractNodeServiceImpl.java index 1d61c76444..3e86e26d7a 100644 --- a/source/java/org/alfresco/repo/node/AbstractNodeServiceImpl.java +++ b/source/java/org/alfresco/repo/node/AbstractNodeServiceImpl.java @@ -439,19 +439,19 @@ public abstract class AbstractNodeServiceImpl implements NodeService * @see NodeServicePolicies.BeforeCreateChildAssociationPolicy#beforeCreateChildAssociation(NodeRef, * NodeRef, QName, QName) */ - protected void invokeBeforeCreateChildAssociation(NodeRef parentNodeRef, NodeRef childNodeRef, QName assocTypeQName, QName assocQName) + protected void invokeBeforeCreateChildAssociation(NodeRef parentNodeRef, NodeRef childNodeRef, QName assocTypeQName, QName assocQName, boolean isNewNode) { // get qnames to invoke against Set qnames = getTypeAndAspectQNames(parentNodeRef); // execute policy for node type NodeServicePolicies.BeforeCreateChildAssociationPolicy policy = beforeCreateChildAssociationDelegate.get(parentNodeRef, qnames, assocTypeQName); - policy.beforeCreateChildAssociation(parentNodeRef, childNodeRef, assocTypeQName, assocQName); + policy.beforeCreateChildAssociation(parentNodeRef, childNodeRef, assocTypeQName, assocQName, isNewNode); } /** * @see NodeServicePolicies.OnCreateChildAssociationPolicy#onCreateChildAssociation(ChildAssociationRef) */ - protected void invokeOnCreateChildAssociation(ChildAssociationRef childAssocRef) + protected void invokeOnCreateChildAssociation(ChildAssociationRef childAssocRef, boolean isNewNode) { // Get the parent reference and the assoc type qName NodeRef parentNodeRef = childAssocRef.getParentRef(); @@ -460,7 +460,7 @@ public abstract class AbstractNodeServiceImpl implements NodeService Set qnames = getTypeAndAspectQNames(parentNodeRef); // execute policy for node type and aspects NodeServicePolicies.OnCreateChildAssociationPolicy policy = onCreateChildAssociationDelegate.get(parentNodeRef, qnames, assocTypeQName); - policy.onCreateChildAssociation(childAssocRef); + policy.onCreateChildAssociation(childAssocRef, isNewNode); } /** diff --git a/source/java/org/alfresco/repo/node/NodeServicePolicies.java b/source/java/org/alfresco/repo/node/NodeServicePolicies.java index bb85da1b6c..57d6eb339f 100644 --- a/source/java/org/alfresco/repo/node/NodeServicePolicies.java +++ b/source/java/org/alfresco/repo/node/NodeServicePolicies.java @@ -239,16 +239,18 @@ public interface NodeServicePolicies /** * Called before a node child association is created. * - * @param parentNodeRef - * @param childNodeRef - * @param assocTypeQName the type of the association - * @param assocQName the name of the association + * @param parentNodeRef the parent node reference + * @param childNodeRef the child node reference + * @param assocTypeQName the type of the association + * @param assocQName the name of the association + * @param isNewNode true if the node is new or false if the node is being linked in */ public void beforeCreateChildAssociation( NodeRef parentNodeRef, NodeRef childNodeRef, QName assocTypeQName, - QName assocQName); + QName assocQName, + boolean isNewNode); } public interface OnCreateChildAssociationPolicy extends AssociationPolicy @@ -256,9 +258,10 @@ public interface NodeServicePolicies /** * Called after a node child association has been created. * - * @param childAssocRef the child association that has been created + * @param childAssocRef the child association that has been created + * @param isNewNode true if the node is new or false if the node is being linked in */ - public void onCreateChildAssociation(ChildAssociationRef childAssocRef); + public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean isNewNode); } public interface BeforeDeleteChildAssociationPolicy extends AssociationPolicy diff --git a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java index 511ce61746..d33dbfdf6b 100644 --- a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java +++ b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java @@ -322,7 +322,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl NodeRef childNodeRef = childNode.getNodeRef(); // We now have enough to declare the child association creation - invokeBeforeCreateChildAssociation(parentRef, childNodeRef, assocTypeQName, assocQName); + invokeBeforeCreateChildAssociation(parentRef, childNodeRef, assocTypeQName, assocQName, true); // Get the parent node Node parentNode = getNodeNotNull(parentRef); @@ -354,7 +354,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl // Invoke policy behaviour invokeOnCreateNode(childAssocRef); - invokeOnCreateChildAssociation(childAssocRef); + invokeOnCreateChildAssociation(childAssocRef, true); if (propertiesAfter != null) { invokeOnUpdateProperties(childAssocRef.getChildRef(), propertiesBefore, propertiesAfter); @@ -427,7 +427,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl else { invokeBeforeDeleteChildAssociation(oldAssocRef); - invokeBeforeCreateChildAssociation(newParentRef, nodeToMoveRef, assocTypeQName, assocQName); + invokeBeforeCreateChildAssociation(newParentRef, nodeToMoveRef, assocTypeQName, assocQName, false); } // remove the child assoc from the old parent @@ -467,7 +467,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl } else { - invokeOnCreateChildAssociation(newAssoc.getChildAssocRef()); + invokeOnCreateChildAssociation(newAssoc.getChildAssocRef(), false); invokeOnDeleteChildAssociation(oldAssoc.getChildAssocRef()); } invokeOnMoveNode(oldAssocRef, newAssocRef); @@ -741,7 +741,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl public ChildAssociationRef addChild(NodeRef parentRef, NodeRef childRef, QName assocTypeQName, QName assocQName) { // Invoke policy behaviours - invokeBeforeCreateChildAssociation(parentRef, childRef, assocTypeQName, assocQName); + invokeBeforeCreateChildAssociation(parentRef, childRef, assocTypeQName, assocQName, false); // get the parent node and ensure that it is a container node Node parentNode = getNodeNotNull(parentRef); @@ -764,7 +764,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl getPaths(childNodeRef, false); // Invoke policy behaviours - invokeOnCreateChildAssociation(assocRef); + invokeOnCreateChildAssociation(assocRef, false); return assoc.getChildAssocRef(); } diff --git a/source/java/org/alfresco/repo/node/index/NodeIndexer.java b/source/java/org/alfresco/repo/node/index/NodeIndexer.java index d8bfc8b965..bd35ec0000 100644 --- a/source/java/org/alfresco/repo/node/index/NodeIndexer.java +++ b/source/java/org/alfresco/repo/node/index/NodeIndexer.java @@ -109,9 +109,12 @@ public class NodeIndexer indexer.deleteNode(childAssocRef); } - public void onCreateChildAssociation(ChildAssociationRef childAssocRef) + public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean isNew) { - indexer.createChildRelationship(childAssocRef); + if (!isNew) + { + indexer.createChildRelationship(childAssocRef); + } } public void onDeleteChildAssociation(ChildAssociationRef childAssocRef) diff --git a/source/java/org/alfresco/repo/node/integrity/IncompleteNodeTagger.java b/source/java/org/alfresco/repo/node/integrity/IncompleteNodeTagger.java index 51fb7b7f56..a1aeb39dcf 100644 --- a/source/java/org/alfresco/repo/node/integrity/IncompleteNodeTagger.java +++ b/source/java/org/alfresco/repo/node/integrity/IncompleteNodeTagger.java @@ -231,6 +231,9 @@ public class IncompleteNodeTagger } } + /** + * {@inheritDoc} + */ public void onCreateNode(ChildAssociationRef childAssocRef) { NodeRef nodeRef = childAssocRef.getChildRef(); @@ -238,6 +241,9 @@ public class IncompleteNodeTagger saveAssoc(nodeRef, null); } + /** + * {@inheritDoc} + */ public void onUpdateProperties( NodeRef nodeRef, Map before, @@ -247,6 +253,8 @@ public class IncompleteNodeTagger } /** + * {@inheritDoc} + *

* Save the node for checking of properties. * The {@link org.alfresco.model.ContentModel#ASPECT_INCOMPLETE incomplete} aspect is * not processed. @@ -279,20 +287,21 @@ public class IncompleteNodeTagger } /** - * @see AssocSourceTypeIntegrityEvent - * @see AssocTargetTypeIntegrityEvent - * @see AssocSourceMultiplicityIntegrityEvent - * @see AssocTargetMultiplicityIntegrityEvent - * @see AssocTargetRoleIntegrityEvent + * {@inheritDoc} + *

+ * This only saves the node for checking if it is not new. The create of the + * node will handle it. */ - public void onCreateChildAssociation(ChildAssociationRef childAssocRef) + public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean isNew) { - saveAssoc(childAssocRef.getParentRef(), childAssocRef.getTypeQName()); + if (!isNew) + { + saveAssoc(childAssocRef.getParentRef(), childAssocRef.getTypeQName()); + } } /** - * @see AssocSourceMultiplicityIntegrityEvent - * @see AssocTargetMultiplicityIntegrityEvent + * {@inheritDoc} */ public void onDeleteChildAssociation(ChildAssociationRef childAssocRef) { @@ -300,10 +309,7 @@ public class IncompleteNodeTagger } /** - * @see AssocSourceTypeIntegrityEvent - * @see AssocTargetTypeIntegrityEvent - * @see AssocSourceMultiplicityIntegrityEvent - * @see AssocTargetMultiplicityIntegrityEvent + * {@inheritDoc} */ public void onCreateAssociation(AssociationRef nodeAssocRef) { @@ -311,8 +317,7 @@ public class IncompleteNodeTagger } /** - * @see AssocSourceMultiplicityIntegrityEvent - * @see AssocTargetMultiplicityIntegrityEvent + * {@inheritDoc} */ public void onDeleteAssociation(AssociationRef nodeAssocRef) { diff --git a/source/java/org/alfresco/repo/node/integrity/IntegrityChecker.java b/source/java/org/alfresco/repo/node/integrity/IntegrityChecker.java index aae0730c05..8e8247be50 100644 --- a/source/java/org/alfresco/repo/node/integrity/IntegrityChecker.java +++ b/source/java/org/alfresco/repo/node/integrity/IntegrityChecker.java @@ -328,7 +328,7 @@ public class IntegrityChecker save(event); // check that the multiplicity and other properties of the new association are allowed - onCreateChildAssociation(childAssocRef); + onCreateChildAssociation(childAssocRef, false); // check mandatory aspects event = new AspectsIntegrityEvent(nodeService, dictionaryService, childRef); @@ -426,14 +426,21 @@ public class IntegrityChecker } /** + * This handles the creation of secondary child associations. + * * @see AssocSourceTypeIntegrityEvent * @see AssocTargetTypeIntegrityEvent * @see AssocSourceMultiplicityIntegrityEvent * @see AssocTargetMultiplicityIntegrityEvent * @see AssocTargetRoleIntegrityEvent */ - public void onCreateChildAssociation(ChildAssociationRef childAssocRef) + public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean isNew) { + if (isNew) + { + return; + } + IntegrityEvent event = null; // check source type event = new AssocSourceTypeIntegrityEvent( diff --git a/source/java/org/alfresco/repo/rule/ruletrigger/CreateNodeRuleTrigger.java b/source/java/org/alfresco/repo/rule/ruletrigger/CreateNodeRuleTrigger.java index 7191ebdcc4..c3c244eaf7 100644 --- a/source/java/org/alfresco/repo/rule/ruletrigger/CreateNodeRuleTrigger.java +++ b/source/java/org/alfresco/repo/rule/ruletrigger/CreateNodeRuleTrigger.java @@ -24,6 +24,7 @@ */ package org.alfresco.repo.rule.ruletrigger; +import org.alfresco.repo.node.NodeServicePolicies; import org.alfresco.repo.transaction.AlfrescoTransactionSupport; import org.alfresco.service.cmr.dictionary.ClassDefinition; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; @@ -38,10 +39,18 @@ import org.apache.commons.logging.LogFactory; * We use this specialised trigger for create node beaucse of a problem with the CIFS integration. *

* The create node trigger will only be fired if the object is NOT a sub-type of content. + *

+ * Policy names supported are: + *

    + *
  • {@linkplain NodeServicePolicies.OnCreateChildAssociationPolicy}
  • + *
  • {@linkplain NodeServicePolicies.BeforeDeleteChildAssociationPolicy}
  • + *
  • {@linkplain NodeServicePolicies.OnCreateNodePolicy}
  • + *
* * @author Roy Wetherall */ public class CreateNodeRuleTrigger extends SingleChildAssocRefPolicyRuleTrigger + implements NodeServicePolicies.OnCreateNodePolicy { /** * The logger @@ -55,7 +64,10 @@ public class CreateNodeRuleTrigger extends SingleChildAssocRefPolicyRuleTrigger this.dictionaryService = dictionaryService; } - public void policyBehaviour(ChildAssociationRef childAssocRef) + /** + * {@inheritDoc} + */ + public void onCreateNode(ChildAssociationRef childAssocRef) { // Only fire the rule if the node is question has no potential to contain content // TODO we need to find a better way to do this .. how can this be resolved in CIFS?? diff --git a/source/java/org/alfresco/repo/rule/ruletrigger/SingleChildAssocRefPolicyRuleTrigger.java b/source/java/org/alfresco/repo/rule/ruletrigger/SingleChildAssocRefPolicyRuleTrigger.java index 302c51689b..ed673ac3fe 100644 --- a/source/java/org/alfresco/repo/rule/ruletrigger/SingleChildAssocRefPolicyRuleTrigger.java +++ b/source/java/org/alfresco/repo/rule/ruletrigger/SingleChildAssocRefPolicyRuleTrigger.java @@ -24,6 +24,7 @@ */ package org.alfresco.repo.rule.ruletrigger; +import org.alfresco.repo.node.NodeServicePolicies; import org.alfresco.repo.policy.JavaBehaviour; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.rule.RuleServiceException; @@ -32,7 +33,22 @@ import org.alfresco.service.namespace.QName; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -public class SingleChildAssocRefPolicyRuleTrigger extends RuleTriggerAbstractBase +/** + * A rule trigger for the creation of secondary child associations. + *

+ * Policy names supported are: + *

    + *
  • {@linkplain NodeServicePolicies.OnCreateChildAssociationPolicy}
  • + *
  • {@linkplain NodeServicePolicies.BeforeDeleteChildAssociationPolicy}
  • + *
+ * + * @author Roy Wetherall + */ +public class SingleChildAssocRefPolicyRuleTrigger + extends RuleTriggerAbstractBase + implements NodeServicePolicies.OnCreateChildAssociationPolicy, + NodeServicePolicies.BeforeDeleteChildAssociationPolicy + { private static final String ERR_POLICY_NAME_NOT_SET = "Unable to register rule trigger since policy name has not been set."; @@ -77,24 +93,38 @@ public class SingleChildAssocRefPolicyRuleTrigger extends RuleTriggerAbstractBas this.policyComponent.bindClassBehaviour( QName.createQName(this.policyNamespace, this.policyName), this, - new JavaBehaviour(this, "policyBehaviour")); + new JavaBehaviour(this, policyName)); } else { this.policyComponent.bindAssociationBehaviour( QName.createQName(this.policyNamespace, this.policyName), this, - new JavaBehaviour(this, "policyBehaviour")); + new JavaBehaviour(this, policyName)); } } - public void policyBehaviour(ChildAssociationRef childAssocRef) - { + public void beforeDeleteChildAssociation(ChildAssociationRef childAssocRef) + { if (logger.isDebugEnabled() == true) { logger.debug("Single child assoc trigger (policy = " + this.policyName + ") fired for parent node " + childAssocRef.getParentRef() + " and child node " + childAssocRef.getChildRef()); } - triggerRules(childAssocRef.getParentRef(), childAssocRef.getChildRef()); - } + triggerRules(childAssocRef.getParentRef(), childAssocRef.getChildRef()); + } + + public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean isNewNode) + { + if (isNewNode) + { + return; + } + if (logger.isDebugEnabled() == true) + { + logger.debug("Single child assoc trigger (policy = " + this.policyName + ") fired for parent node " + childAssocRef.getParentRef() + " and child node " + childAssocRef.getChildRef()); + } + + triggerRules(childAssocRef.getParentRef(), childAssocRef.getChildRef()); + } }