From 652b9406db33bfae49f4c0dc8cd5ce5510fe69b9 Mon Sep 17 00:00:00 2001 From: Derek Hulley Date: Tue, 11 Sep 2007 00:52:59 +0000 Subject: [PATCH] Merged V2.1 to HEAD 6535: adding in handlers for renames and deletes of webforms to update web project configurations. 6536: fix to monthpicker. 6537: Cluster sample config for ticketsCache defaults to replicating puts 6538: Invite web users wizard was not correctly initialising 6539: AWC-1474 - Email Space Users dialog - if no email recipients then show message 6540: Fixed remote classpath check for SDK projects 6541: AR-1544: Inbound Rules Being Fired on Name Property Update 6542: Fix for AWC-1216 - changed NavigationBean to spot when CIFS server is disabled (as the method has changed in repo) 6543: AR-1623: WebServices authentication errors during concurrent load test 6544: AWC-1253: AddContent action should be externally configurable/overridable 6545: Fixed AR-1586: Nicer message when installing older module or duplicate module 6546: AWC-1301: Access Denied viewing details of content with association 6547: AWC-1499: It is impossible to remove 'Complianceable' aspect with the help of Run action 6548: Missing file ... should fix build issues 6549: Missed file .. fixed build issue 6550: AWC-1092: sorting by version number in version history is alpha, not numeric 6551: AWC-1217: Cannot differentiate between two users with same name in user picker search results 6552: Fixed AR-1572: Export of ML-enabled documents can now be imported 6553: Removed tabs 6554: Fixed handling of SC_NOT_FOUND message 6555: Fixed AR-1627: Removed ability to flush transaction resources on demand git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@6744 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../ehcache-custom.xml.sample.cluster | 4 +- config/alfresco/model/contentModel.xml | 9 +- config/alfresco/rule-services-context.xml | 13 +-- .../http/HttpAlfrescoContentReader.java | 2 +- .../repo/exporter/ExporterComponent.java | 30 +++++- .../filefolder/FileFolderServiceImpl.java | 21 +++-- .../module/tool/ModuleManagementTool.java | 23 +++-- .../repo/node/BaseNodeServiceTest.java | 7 -- .../repo/rule/RuleServiceCoverageTest.java | 45 +++++++++ .../repo/rule/RuleServiceImplTest.java | 3 - ...foreDeleteChildAssociationRuleTrigger.java | 94 +++++++++++++++++++ .../ruletrigger/CreateNodeRuleTrigger.java | 34 ++++++- ... OnCreateChildAssociationRuleTrigger.java} | 76 ++++++--------- .../AlfrescoTransactionSupport.java | 24 ++--- 14 files changed, 276 insertions(+), 109 deletions(-) create mode 100644 source/java/org/alfresco/repo/rule/ruletrigger/BeforeDeleteChildAssociationRuleTrigger.java rename source/java/org/alfresco/repo/rule/ruletrigger/{SingleChildAssocRefPolicyRuleTrigger.java => OnCreateChildAssociationRuleTrigger.java} (58%) diff --git a/config/alfresco/extension/ehcache-custom.xml.sample.cluster b/config/alfresco/extension/ehcache-custom.xml.sample.cluster index 6dcb2ee5e7..6ca32332f7 100644 --- a/config/alfresco/extension/ehcache-custom.xml.sample.cluster +++ b/config/alfresco/extension/ehcache-custom.xml.sample.cluster @@ -488,10 +488,10 @@ diff --git a/config/alfresco/model/contentModel.xml b/config/alfresco/model/contentModel.xml index 7024f83836..93abeae06a 100644 --- a/config/alfresco/model/contentModel.xml +++ b/config/alfresco/model/contentModel.xml @@ -364,18 +364,15 @@ Complianceable - cm:auditable - Remove After d:datetime + + cm:auditable + diff --git a/config/alfresco/rule-services-context.xml b/config/alfresco/rule-services-context.xml index e8deb83ebe..bdc6cf9e95 100644 --- a/config/alfresco/rule-services-context.xml +++ b/config/alfresco/rule-services-context.xml @@ -116,9 +116,6 @@ - - onCreateNode - true @@ -133,16 +130,10 @@ - - - onCreateChildAssociation - + - - - beforeDeleteChildAssociation - + true diff --git a/source/java/org/alfresco/repo/content/http/HttpAlfrescoContentReader.java b/source/java/org/alfresco/repo/content/http/HttpAlfrescoContentReader.java index cf0f89830a..946aa88bbc 100644 --- a/source/java/org/alfresco/repo/content/http/HttpAlfrescoContentReader.java +++ b/source/java/org/alfresco/repo/content/http/HttpAlfrescoContentReader.java @@ -173,7 +173,7 @@ public class HttpAlfrescoContentReader extends AbstractContentReader else { // Check the return codes - if (statusCode == HttpServletResponse.SC_NOT_FOUND) + if (statusCode == HttpServletResponse.SC_NO_CONTENT) { // It doesn't exist, which is not an error. The defaults are fine. } diff --git a/source/java/org/alfresco/repo/exporter/ExporterComponent.java b/source/java/org/alfresco/repo/exporter/ExporterComponent.java index dbbafda38b..c0df6329f4 100644 --- a/source/java/org/alfresco/repo/exporter/ExporterComponent.java +++ b/source/java/org/alfresco/repo/exporter/ExporterComponent.java @@ -36,6 +36,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.alfresco.model.ContentModel; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.dictionary.PropertyDefinition; @@ -375,7 +376,15 @@ public class ExporterComponent Set aspects = nodeService.getAspects(nodeRef); for (QName aspect : aspects) { - if (!isExcludedURI(parameters.getExcludeNamespaceURIs(), aspect.getNamespaceURI())) + if (isExcludedURI(parameters.getExcludeNamespaceURIs(), aspect.getNamespaceURI())) + { + continue; + } + else if (isExcludeAspect(aspect)) + { + continue; + } + else { exporter.startAspect(nodeRef, aspect); exporter.endAspect(nodeRef, aspect); @@ -686,6 +695,25 @@ public class ExporterComponent return false; } + /** + * Is the aspect unexportable? + * + * @param aspectQName the aspect name + * @return true if the aspect can't be exported + */ + private boolean isExcludeAspect(QName aspectQName) + { + if (aspectQName.equals(ContentModel.ASPECT_MULTILINGUAL_DOCUMENT) || + aspectQName.equals(ContentModel.ASPECT_MULTILINGUAL_EMPTY_TRANSLATION)) + { + return true; + } + else + { + return false; + } + } + /** * Determine if specified Node Reference is within the set of nodes to be exported * diff --git a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java index 1db139777b..6969faa2bd 100644 --- a/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java +++ b/source/java/org/alfresco/repo/model/filefolder/FileFolderServiceImpl.java @@ -36,6 +36,7 @@ import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; import org.alfresco.repo.search.QueryParameterDefImpl; import org.alfresco.repo.tenant.TenantService; +import org.alfresco.repo.transaction.AlfrescoTransactionSupport; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.model.FileExistsException; @@ -521,12 +522,20 @@ public class FileFolderServiceImpl implements FileFolderService // done return nodeRefs; } - + /** * @see #move(NodeRef, NodeRef, String) */ public FileInfo rename(NodeRef sourceNodeRef, String newName) throws FileExistsException, FileNotFoundException { + // NOTE: + // + // This information is placed in the transaction to indicate that a rename has taken place. This information is + // used by the rule trigger to ensure inbound rule is not triggered by a file rename + // + // See http://issues.alfresco.com/browse/AR-1544 + AlfrescoTransactionSupport.bindResource(sourceNodeRef.toString()+"rename", sourceNodeRef); + return moveOrCopy(sourceNodeRef, null, newName, true); } @@ -643,12 +652,12 @@ public class FileFolderServiceImpl implements FileFolderService ContentData contentData = (ContentData)nodeService.getProperty(targetNodeRef, ContentModel.PROP_CONTENT); if (contentData != null) { - String targetMimetype = contentData.getMimetype(); - String newMimetype = mimetypeService.guessMimetype(newName); - if (!targetMimetype.equalsIgnoreCase(newMimetype)) + String targetMimetype = contentData.getMimetype(); + String newMimetype = mimetypeService.guessMimetype(newName); + if (!targetMimetype.equalsIgnoreCase(newMimetype)) { - contentData = ContentData.setMimetype(contentData, newMimetype); - nodeService.setProperty(targetNodeRef, ContentModel.PROP_CONTENT, contentData); + contentData = ContentData.setMimetype(contentData, newMimetype); + nodeService.setProperty(targetNodeRef, ContentModel.PROP_CONTENT, contentData); } } } diff --git a/source/java/org/alfresco/repo/module/tool/ModuleManagementTool.java b/source/java/org/alfresco/repo/module/tool/ModuleManagementTool.java index a60788c8b2..4c75923467 100644 --- a/source/java/org/alfresco/repo/module/tool/ModuleManagementTool.java +++ b/source/java/org/alfresco/repo/module/tool/ModuleManagementTool.java @@ -768,16 +768,25 @@ public class ModuleManagementTool } } } - - if (directory == false) + + try { - // Install the module - manager.installModule(aepFileLocation, warFileLocation, previewInstall, forceInstall, backup); + if (directory == false) + { + // Install the module + manager.installModule(aepFileLocation, warFileLocation, previewInstall, forceInstall, backup); + } + else + { + // Install the modules from the directory + manager.installModules(aepFileLocation, warFileLocation, previewInstall, forceInstall, backup); + } } - else + catch (ModuleManagementToolException e) { - // Install the modules from the directory - manager.installModules(aepFileLocation, warFileLocation, previewInstall, forceInstall, backup); + // These are user-friendly + manager.outputMessage(e.getMessage()); + outputUsage(); } } else if (OP_LIST.equals(operation) == true && args.length == 2) diff --git a/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java b/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java index edf13d0522..bf227f7415 100644 --- a/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java +++ b/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java @@ -1013,9 +1013,6 @@ public abstract class BaseNodeServiceTest extends BaseSpringTest getSession().flush(); getSession().clear(); - // make sure that our integrity allows this - AlfrescoTransactionSupport.flush(); - // now get them back Map checkMap = nodeService.getProperties(nodeRef); assertNotNull("Properties were not set/retrieved", checkMap); @@ -1717,14 +1714,12 @@ public abstract class BaseNodeServiceTest extends BaseSpringTest ASSOC_TYPE_QNAME_TEST_CONTAINS, QName.createQName("pathB"), ContentModel.TYPE_CONTENT); - AlfrescoTransactionSupport.flush(); // there should be no issue with a duplicate association names any more ChildAssociationRef pathBDuplicateRef = nodeService.createNode( parentRef, ASSOC_TYPE_QNAME_TEST_CONTAINS, QName.createQName("pathB"), ContentModel.TYPE_CONTENT); - AlfrescoTransactionSupport.flush(); // Now create nodes with duplicate cm:name properties Map props = new HashMap(5); props.put(ContentModel.PROP_NAME, "ABC"); @@ -1734,7 +1729,6 @@ public abstract class BaseNodeServiceTest extends BaseSpringTest QName.createQName("ABC"), ContentModel.TYPE_CONTENT, props); - AlfrescoTransactionSupport.flush(); try { // now check that the duplicate is detected with attention to being case-insensitive @@ -1774,7 +1768,6 @@ public abstract class BaseNodeServiceTest extends BaseSpringTest ContentModel.TYPE_CONTENT, props); NodeRef abcRef = pathAbcRef.getChildRef(); - AlfrescoTransactionSupport.flush(); // delete ABC nodeService.deleteNode(abcRef); // create it again diff --git a/source/java/org/alfresco/repo/rule/RuleServiceCoverageTest.java b/source/java/org/alfresco/repo/rule/RuleServiceCoverageTest.java index cf6281fd3e..76ae116512 100644 --- a/source/java/org/alfresco/repo/rule/RuleServiceCoverageTest.java +++ b/source/java/org/alfresco/repo/rule/RuleServiceCoverageTest.java @@ -70,6 +70,7 @@ import org.alfresco.service.cmr.coci.CheckOutCheckInService; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.lock.LockService; import org.alfresco.service.cmr.lock.LockStatus; +import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.ContentService; @@ -118,6 +119,7 @@ public class RuleServiceCoverageTest extends TestCase private ContentTransformerRegistry transformerRegistry; private CopyService copyService; private AuthenticationComponent authenticationComponent; + private FileFolderService fileFolderService; /** * Category related values @@ -157,6 +159,7 @@ public class RuleServiceCoverageTest extends TestCase this.transactionService = serviceRegistry.getTransactionService(); this.transformerRegistry = (ContentTransformerRegistry)applicationContext.getBean("contentTransformerRegistry"); this.authenticationComponent = (AuthenticationComponent)applicationContext.getBean("authenticationComponent"); + this.fileFolderService = serviceRegistry.getFileFolderService(); //authenticationComponent.setCurrentUser(authenticationComponent.getSystemUserName()); //authenticationComponent.setSystemUserAsCurrentUser(); @@ -359,6 +362,48 @@ public class RuleServiceCoverageTest extends TestCase // System.out.println(NodeStoreInspector.dumpNodeStore(this.nodeService, this.testStoreRef)); } + public void testModifyNameTriggersInboundRule() + throws Exception + { + //this.nodeService.addAspect(this.nodeRef, ContentModel.ASPECT_LOCKABLE, null); + Map folderProps = new HashMap(1); + folderProps.put(ContentModel.PROP_NAME, "myTestFolder"); + NodeRef folder = this.nodeService.createNode( + this.rootNodeRef, + ContentModel.ASSOC_CHILDREN, + ContentModel.ASSOC_CHILDREN, + ContentModel.TYPE_FOLDER, + folderProps).getChildRef(); + + Map params = new HashMap(1); + params.put("aspect-name", ContentModel.ASPECT_VERSIONABLE); + + Rule rule = createRule( + RuleType.INBOUND, + AddFeaturesActionExecuter.NAME, + params, + NoConditionEvaluator.NAME, + null); + + this.ruleService.saveRule(folder, rule); + + Map contentProps = new HashMap(1); + contentProps.put(ContentModel.PROP_NAME, "myTestDocument.txt"); + NodeRef newNodeRef = this.nodeService.createNode( + folder, + ContentModel.ASSOC_CONTAINS, + QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "myTestDocument.txt"), + ContentModel.TYPE_CONTENT, + contentProps).getChildRef(); + //addContentToNode(newNodeRef); + assertFalse(this.nodeService.hasAspect(newNodeRef, ContentModel.ASPECT_VERSIONABLE)); + + // Use the file folder to change the name of the node + this.fileFolderService.rename(newNodeRef, "myNewName.txt"); + assertFalse(this.nodeService.hasAspect(newNodeRef, ContentModel.ASPECT_VERSIONABLE)); + + } + public void testDisableIndividualRules() { Map params = new HashMap(1); diff --git a/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java b/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java index ac5bbd46c7..6a2736535f 100644 --- a/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java +++ b/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java @@ -35,8 +35,6 @@ import org.alfresco.repo.action.evaluator.ComparePropertyValueEvaluator; import org.alfresco.repo.action.executer.ImageTransformActionExecuter; import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.content.transform.AbstractContentTransformerTest; -import org.alfresco.repo.transaction.TransactionUtil; -import org.alfresco.repo.transaction.TransactionUtil.TransactionWork; import org.alfresco.service.cmr.action.Action; import org.alfresco.service.cmr.action.ActionCondition; import org.alfresco.service.cmr.repository.ContentWriter; @@ -47,7 +45,6 @@ import org.alfresco.service.cmr.rule.RuleType; import org.alfresco.service.cmr.security.AuthenticationService; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.namespace.QName; -import org.apache.commons.digester.SetRootRule; /** diff --git a/source/java/org/alfresco/repo/rule/ruletrigger/BeforeDeleteChildAssociationRuleTrigger.java b/source/java/org/alfresco/repo/rule/ruletrigger/BeforeDeleteChildAssociationRuleTrigger.java new file mode 100644 index 0000000000..8e23c35686 --- /dev/null +++ b/source/java/org/alfresco/repo/rule/ruletrigger/BeforeDeleteChildAssociationRuleTrigger.java @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2005-2007 Alfresco Software Limited. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + * As a special exception to the terms and conditions of version 2.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * and Open Source Software ("FLOSS") applications as described in Alfresco's + * FLOSS exception. You should have recieved a copy of the text describing + * the FLOSS exception, and it is also available here: + * http://www.alfresco.com/legal/licensing" + */ +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.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * A rule trigger for the creation of secondary child associations. + *

+ * Policy names supported are: + *

    + *
  • {@linkplain NodeServicePolicies.BeforeDeleteChildAssociationPolicy}
  • + *
+ * + * @author Roy Wetherall + */ +public class BeforeDeleteChildAssociationRuleTrigger + extends RuleTriggerAbstractBase + implements NodeServicePolicies.BeforeDeleteChildAssociationPolicy + +{ + /** + * The logger + */ + private static Log logger = LogFactory.getLog(BeforeDeleteChildAssociationRuleTrigger.class); + + private static final String POLICY = "beforeDeleteChildAssociation"; + + private boolean isClassBehaviour = false; + + public void setIsClassBehaviour(boolean isClassBehaviour) + { + this.isClassBehaviour = isClassBehaviour; + } + + /** + * @see org.alfresco.repo.rule.ruletrigger.RuleTrigger#registerRuleTrigger() + */ + public void registerRuleTrigger() + { + if (isClassBehaviour == true) + { + this.policyComponent.bindClassBehaviour( + QName.createQName(NamespaceService.ALFRESCO_URI, POLICY), + this, + new JavaBehaviour(this, POLICY)); + } + else + { + this.policyComponent.bindAssociationBehaviour( + QName.createQName(NamespaceService.ALFRESCO_URI, POLICY), + this, + new JavaBehaviour(this, POLICY)); + } + } + + public void beforeDeleteChildAssociation(ChildAssociationRef childAssocRef) + { + if (logger.isDebugEnabled() == true) + { + logger.debug("Single child assoc trigger (policy = " + POLICY + ") fired for parent node " + childAssocRef.getParentRef() + " and child node " + childAssocRef.getChildRef()); + } + + triggerRules(childAssocRef.getParentRef(), childAssocRef.getChildRef()); + } +} diff --git a/source/java/org/alfresco/repo/rule/ruletrigger/CreateNodeRuleTrigger.java b/source/java/org/alfresco/repo/rule/ruletrigger/CreateNodeRuleTrigger.java index c3c244eaf7..8288071442 100644 --- a/source/java/org/alfresco/repo/rule/ruletrigger/CreateNodeRuleTrigger.java +++ b/source/java/org/alfresco/repo/rule/ruletrigger/CreateNodeRuleTrigger.java @@ -25,12 +25,14 @@ package org.alfresco.repo.rule.ruletrigger; import org.alfresco.repo.node.NodeServicePolicies; +import org.alfresco.repo.policy.JavaBehaviour; import org.alfresco.repo.transaction.AlfrescoTransactionSupport; import org.alfresco.service.cmr.dictionary.ClassDefinition; import org.alfresco.service.cmr.dictionary.DataTypeDefinition; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.dictionary.PropertyDefinition; import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -49,7 +51,7 @@ import org.apache.commons.logging.LogFactory; * * @author Roy Wetherall */ -public class CreateNodeRuleTrigger extends SingleChildAssocRefPolicyRuleTrigger +public class CreateNodeRuleTrigger extends RuleTriggerAbstractBase implements NodeServicePolicies.OnCreateNodePolicy { /** @@ -57,12 +59,42 @@ public class CreateNodeRuleTrigger extends SingleChildAssocRefPolicyRuleTrigger */ private static Log logger = LogFactory.getLog(CreateNodeRuleTrigger.class); + private static final String POLICY = "onCreateNode"; + + private boolean isClassBehaviour = false; + + public void setIsClassBehaviour(boolean isClassBehaviour) + { + this.isClassBehaviour = isClassBehaviour; + } + DictionaryService dictionaryService; public void setDictionaryService(DictionaryService dictionaryService) { this.dictionaryService = dictionaryService; } + + /** + * @see org.alfresco.repo.rule.ruletrigger.RuleTrigger#registerRuleTrigger() + */ + public void registerRuleTrigger() + { + if (isClassBehaviour == true) + { + this.policyComponent.bindClassBehaviour( + QName.createQName(NamespaceService.ALFRESCO_URI, POLICY), + this, + new JavaBehaviour(this, POLICY)); + } + else + { + this.policyComponent.bindAssociationBehaviour( + QName.createQName(NamespaceService.ALFRESCO_URI, POLICY), + this, + new JavaBehaviour(this, POLICY)); + } + } /** * {@inheritDoc} diff --git a/source/java/org/alfresco/repo/rule/ruletrigger/SingleChildAssocRefPolicyRuleTrigger.java b/source/java/org/alfresco/repo/rule/ruletrigger/OnCreateChildAssociationRuleTrigger.java similarity index 58% rename from source/java/org/alfresco/repo/rule/ruletrigger/SingleChildAssocRefPolicyRuleTrigger.java rename to source/java/org/alfresco/repo/rule/ruletrigger/OnCreateChildAssociationRuleTrigger.java index ed673ac3fe..18ed5ae519 100644 --- a/source/java/org/alfresco/repo/rule/ruletrigger/SingleChildAssocRefPolicyRuleTrigger.java +++ b/source/java/org/alfresco/repo/rule/ruletrigger/OnCreateChildAssociationRuleTrigger.java @@ -26,8 +26,8 @@ package org.alfresco.repo.rule.ruletrigger; import org.alfresco.repo.node.NodeServicePolicies; import org.alfresco.repo.policy.JavaBehaviour; +import org.alfresco.repo.transaction.AlfrescoTransactionSupport; import org.alfresco.service.cmr.repository.ChildAssociationRef; -import org.alfresco.service.cmr.rule.RuleServiceException; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.apache.commons.logging.Log; @@ -39,40 +39,23 @@ import org.apache.commons.logging.LogFactory; * Policy names supported are: *
    *
  • {@linkplain NodeServicePolicies.OnCreateChildAssociationPolicy}
  • - *
  • {@linkplain NodeServicePolicies.BeforeDeleteChildAssociationPolicy}
  • *
* * @author Roy Wetherall */ -public class SingleChildAssocRefPolicyRuleTrigger +public class OnCreateChildAssociationRuleTrigger extends RuleTriggerAbstractBase - implements NodeServicePolicies.OnCreateChildAssociationPolicy, - NodeServicePolicies.BeforeDeleteChildAssociationPolicy - + implements NodeServicePolicies.OnCreateChildAssociationPolicy { - private static final String ERR_POLICY_NAME_NOT_SET = "Unable to register rule trigger since policy name has not been set."; - /** * The logger */ - private static Log logger = LogFactory.getLog(SingleChildAssocRefPolicyRuleTrigger.class); + private static Log logger = LogFactory.getLog(OnCreateChildAssociationRuleTrigger.class); + + private static final String POLICY_NAME = "onCreateChildAssociation"; - private String policyNamespace = NamespaceService.ALFRESCO_URI; - - private String policyName; - - private boolean isClassBehaviour = false; - - public void setPolicyNamespace(String policyNamespace) - { - this.policyNamespace = policyNamespace; - } - - public void setPolicyName(String policyName) - { - this.policyName = policyName; - } - + private boolean isClassBehaviour = false; + public void setIsClassBehaviour(boolean isClassBehaviour) { this.isClassBehaviour = isClassBehaviour; @@ -83,37 +66,22 @@ public class SingleChildAssocRefPolicyRuleTrigger */ public void registerRuleTrigger() { - if (policyName == null) - { - throw new RuleServiceException(ERR_POLICY_NAME_NOT_SET); - } - if (isClassBehaviour == true) { this.policyComponent.bindClassBehaviour( - QName.createQName(this.policyNamespace, this.policyName), + QName.createQName(NamespaceService.ALFRESCO_URI, POLICY_NAME), this, - new JavaBehaviour(this, policyName)); + new JavaBehaviour(this, POLICY_NAME)); } else - { + { this.policyComponent.bindAssociationBehaviour( - QName.createQName(this.policyNamespace, this.policyName), + QName.createQName(NamespaceService.ALFRESCO_URI, POLICY_NAME), this, - new JavaBehaviour(this, policyName)); + new JavaBehaviour(this, POLICY_NAME)); } } - 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()); - } - public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean isNewNode) { if (isNewNode) @@ -122,9 +90,23 @@ public class SingleChildAssocRefPolicyRuleTrigger } if (logger.isDebugEnabled() == true) { - logger.debug("Single child assoc trigger (policy = " + this.policyName + ") fired for parent node " + childAssocRef.getParentRef() + " and child node " + childAssocRef.getChildRef()); + logger.debug("Single child assoc trigger (policy = " + POLICY_NAME + ") fired for parent node " + childAssocRef.getParentRef() + " and child node " + childAssocRef.getChildRef()); } - triggerRules(childAssocRef.getParentRef(), childAssocRef.getChildRef()); + // NOTE: + // + // We check for the presence of this resource in the transaction to determine whether a rename has been issued. If that is the case + // then we don't want to trigger any associated rules. + // + // See http://issues.alfresco.com/browse/AR-1544 + if (AlfrescoTransactionSupport.getResource(childAssocRef.getChildRef().toString()+"rename") == null) + { + triggerRules(childAssocRef.getParentRef(), childAssocRef.getChildRef()); + } + else + { + // Remove the marker + AlfrescoTransactionSupport.unbindResource(childAssocRef.getChildRef().toString()+"rename"); + } } } diff --git a/source/java/org/alfresco/repo/transaction/AlfrescoTransactionSupport.java b/source/java/org/alfresco/repo/transaction/AlfrescoTransactionSupport.java index 102ceb1805..5f77fcb471 100644 --- a/source/java/org/alfresco/repo/transaction/AlfrescoTransactionSupport.java +++ b/source/java/org/alfresco/repo/transaction/AlfrescoTransactionSupport.java @@ -554,21 +554,7 @@ public abstract class AlfrescoTransactionSupport */ public void flush() { - // check integrity - for (IntegrityChecker integrityChecker : integrityCheckers) - { - integrityChecker.checkIntegrity(); - } - // flush listeners - for (TransactionListener listener : getListenersIterable()) - { - listener.flush(); - } - // flush changes - for (TransactionalDao daoService : getDaoServices()) - { - daoService.flush(); - } + throw new UnsupportedOperationException("Manual flush no longer supported."); } /** @@ -627,8 +613,12 @@ public abstract class AlfrescoTransactionSupport listener.beforeCommit(readOnly); } - // flush - flush(); + // Check integrity + for (IntegrityChecker integrityChecker : integrityCheckers) + { + integrityChecker.checkIntegrity(); + } + // prepare the indexes for (LuceneIndexerAndSearcher lucene : lucenes) {