diff --git a/config/alfresco/rule-services-context.xml b/config/alfresco/rule-services-context.xml
index 3091716692..15eee57035 100644
--- a/config/alfresco/rule-services-context.xml
+++ b/config/alfresco/rule-services-context.xml
@@ -79,6 +79,7 @@
+
@@ -181,4 +182,6 @@
+
+
diff --git a/source/java/org/alfresco/jcr/dictionary/ClassMap.java b/source/java/org/alfresco/jcr/dictionary/ClassMap.java
index a4de4b6c63..da819c57dc 100644
--- a/source/java/org/alfresco/jcr/dictionary/ClassMap.java
+++ b/source/java/org/alfresco/jcr/dictionary/ClassMap.java
@@ -94,7 +94,7 @@ public class ClassMap
*/
public static QName convertClassToType(QName alfrescoClass)
{
- return JCRToAlfresco.get(alfrescoClass);
+ return AlfrescoToJCR.get(alfrescoClass);
}
/**
diff --git a/source/java/org/alfresco/jcr/item/Alf1791Test.java b/source/java/org/alfresco/jcr/item/Alf1791Test.java
new file mode 100644
index 0000000000..57fdf6de0c
--- /dev/null
+++ b/source/java/org/alfresco/jcr/item/Alf1791Test.java
@@ -0,0 +1,68 @@
+package org.alfresco.jcr.item;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+import javax.jcr.nodetype.NodeType;
+
+import org.alfresco.jcr.test.BaseJCRTest;
+
+public class Alf1791Test extends BaseJCRTest
+{
+
+ protected Session superuserSession;
+ protected Node node;
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ SimpleCredentials superuser = new SimpleCredentials("superuser", "".toCharArray());
+ superuserSession = repository.login(superuser, getWorkspace());
+ Node rootNode = superuserSession.getRootNode();
+ node = rootNode.addNode("alf1791", "cm:content");
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ node.remove();
+ superuserSession.logout();
+ super.tearDown();
+ }
+
+
+ public void testAlf1791()
+ throws Exception
+ {
+ final String mixPrefix = node.getSession().getNamespacePrefix("http://www.jcp.org/jcr/mix/1.0");
+ final String mixReferenceable = mixPrefix + ":referenceable";
+ final String sysPrefix = node.getSession().getNamespacePrefix("http://www.alfresco.org/model/system/1.0");
+ final String sysReferenceable = sysPrefix + ":referenceable";
+
+ node.addMixin(mixReferenceable);
+ if (!hasMixin(node, mixReferenceable))
+ {
+ throw new RepositoryException("Node just made 'mix:referenceable' isn't! ('sys:referenceable'=" + hasMixin(node, sysReferenceable) + ")");
+ }
+ }
+
+
+ public static final boolean hasMixin(final Node node, final String mixinName)
+ throws RepositoryException
+ {
+ final NodeType[] mixinNodeTypes = node.getMixinNodeTypes();
+ if (mixinNodeTypes == null)
+ return false;
+ for (NodeType mixinNodeType : mixinNodeTypes)
+ {
+ if (mixinNodeType == null)
+ continue;
+ if (mixinName.equals(mixinNodeType.getName()))
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/source/java/org/alfresco/repo/node/AbstractNodeServiceImpl.java b/source/java/org/alfresco/repo/node/AbstractNodeServiceImpl.java
index 5ad114fece..31ef41b0e9 100644
--- a/source/java/org/alfresco/repo/node/AbstractNodeServiceImpl.java
+++ b/source/java/org/alfresco/repo/node/AbstractNodeServiceImpl.java
@@ -47,6 +47,7 @@ import org.alfresco.repo.node.NodeServicePolicies.OnDeleteChildAssociationPolicy
import org.alfresco.repo.node.NodeServicePolicies.OnDeleteNodePolicy;
import org.alfresco.repo.node.NodeServicePolicies.OnMoveNodePolicy;
import org.alfresco.repo.node.NodeServicePolicies.OnRemoveAspectPolicy;
+import org.alfresco.repo.node.NodeServicePolicies.OnRestoreNodePolicy;
import org.alfresco.repo.node.NodeServicePolicies.OnUpdateNodePolicy;
import org.alfresco.repo.node.NodeServicePolicies.OnUpdatePropertiesPolicy;
import org.alfresco.repo.policy.AssociationPolicyDelegate;
@@ -113,6 +114,7 @@ public abstract class AbstractNodeServiceImpl implements NodeService
private ClassPolicyDelegate onUpdatePropertiesDelegate;
private ClassPolicyDelegate beforeDeleteNodeDelegate;
private ClassPolicyDelegate onDeleteNodeDelegate;
+ private ClassPolicyDelegate onRestoreNodePolicy;
private ClassPolicyDelegate beforeAddAspectDelegate;
private ClassPolicyDelegate onAddAspectDelegate;
private ClassPolicyDelegate beforeRemoveAspectDelegate;
@@ -201,6 +203,7 @@ public abstract class AbstractNodeServiceImpl implements NodeService
onUpdatePropertiesDelegate = policyComponent.registerClassPolicy(NodeServicePolicies.OnUpdatePropertiesPolicy.class);
beforeDeleteNodeDelegate = policyComponent.registerClassPolicy(NodeServicePolicies.BeforeDeleteNodePolicy.class);
onDeleteNodeDelegate = policyComponent.registerClassPolicy(NodeServicePolicies.OnDeleteNodePolicy.class);
+ onRestoreNodePolicy = policyComponent.registerClassPolicy(NodeServicePolicies.OnRestoreNodePolicy.class);
beforeAddAspectDelegate = policyComponent.registerClassPolicy(NodeServicePolicies.BeforeAddAspectPolicy.class);
onAddAspectDelegate = policyComponent.registerClassPolicy(NodeServicePolicies.OnAddAspectPolicy.class);
@@ -452,6 +455,19 @@ public abstract class AbstractNodeServiceImpl implements NodeService
}
}
+ /**
+ * @see NodeServicePolicies.OnRestoreNodePolicy#onDeleteNode(ChildAssociationRef)
+ */
+ protected void invokeOnRestoreNode(ChildAssociationRef childAssocRef)
+ {
+ NodeRef childNodeRef = childAssocRef.getChildRef();
+ // get qnames to invoke against
+ Set qnames = getTypeAndAspectQNames(childNodeRef);
+ // execute policy for node type and aspects
+ NodeServicePolicies.OnRestoreNodePolicy policy = onRestoreNodePolicy.get(childAssocRef.getChildRef(), qnames);
+ policy.onRestoreNode(childAssocRef);
+ }
+
/**
* @see NodeServicePolicies.BeforeAddAspectPolicy#beforeAddAspect(NodeRef,
* QName)
diff --git a/source/java/org/alfresco/repo/node/NodeServicePolicies.java b/source/java/org/alfresco/repo/node/NodeServicePolicies.java
index 790badb7cb..4a9c5fea43 100644
--- a/source/java/org/alfresco/repo/node/NodeServicePolicies.java
+++ b/source/java/org/alfresco/repo/node/NodeServicePolicies.java
@@ -218,6 +218,16 @@ public interface NodeServicePolicies
public void onRemoveAspect(NodeRef nodeRef, QName aspectTypeQName);
}
+ public interface OnRestoreNodePolicy extends ClassPolicy
+ {
+ /**
+ * Called after an archived node is restored.
+ *
+ * @param childAssocRef the newly created child association reference
+ */
+ public void onRestoreNode(ChildAssociationRef childAssocRef);
+ }
+
public interface BeforeCreateNodeAssociationPolicy extends AssociationPolicy
{
public static final QName QNAME = QName.createQName(NamespaceService.ALFRESCO_URI, "beforeCreateNodeAssociation");
diff --git a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java
index 89eba3b924..f0f4bde9c6 100644
--- a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java
+++ b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java
@@ -1926,7 +1926,7 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl
// the node reference has changed due to the store move
NodeRef restoredNodeRef = newChildAssocRef.getChildRef();
-
+ invokeOnRestoreNode(newChildAssocRef);
// done
if (logger.isDebugEnabled())
{
diff --git a/source/java/org/alfresco/repo/rule/RuleServiceImpl.java b/source/java/org/alfresco/repo/rule/RuleServiceImpl.java
index c4b2b81ded..4479f2f0af 100644
--- a/source/java/org/alfresco/repo/rule/RuleServiceImpl.java
+++ b/source/java/org/alfresco/repo/rule/RuleServiceImpl.java
@@ -1098,17 +1098,29 @@ public class RuleServiceImpl
/**
* Executes a pending rule
*
- * @param pendingRule the pending rule data object
+ * @param pendingRule the pending rule data object
*/
@SuppressWarnings("unchecked")
private void executePendingRule(PendingRuleData pendingRule)
{
Set executedRules =
(Set) AlfrescoTransactionSupport.getResource(KEY_RULES_EXECUTED);
-
+
NodeRef actionedUponNodeRef = pendingRule.getActionedUponNodeRef();
Rule rule = pendingRule.getRule();
-
+
+ NodeRef ruleNodeRef = rule.getNodeRef();
+ if (!ruleNodeRef.getStoreRef().equals(actionedUponNodeRef.getStoreRef()) && !nodeService.exists(ruleNodeRef))
+ {
+ NodeRef newRuleNodeRef = new NodeRef(actionedUponNodeRef.getStoreRef(), ruleNodeRef.getId());
+ if (nodeService.exists(newRuleNodeRef))
+ {
+ ruleNodeRef = newRuleNodeRef;
+ }
+
+ }
+ //update all associations and actions
+ rule = getRule(ruleNodeRef);
if (executedRules == null || canExecuteRule(executedRules, actionedUponNodeRef, rule) == true)
{
executeRule(rule, actionedUponNodeRef, executedRules);
diff --git a/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java b/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java
index 7b29e8a950..37d155e75b 100644
--- a/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java
+++ b/source/java/org/alfresco/repo/rule/RuleServiceImplTest.java
@@ -31,16 +31,21 @@ import org.alfresco.repo.action.executer.ImageTransformActionExecuter;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.content.transform.AbstractContentTransformerTest;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
+import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.action.ActionCondition;
+import org.alfresco.service.cmr.action.CompositeAction;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.CyclicChildRelationshipException;
import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.rule.Rule;
import org.alfresco.service.cmr.rule.RuleType;
import org.alfresco.service.cmr.security.MutableAuthenticationService;
import org.alfresco.service.cmr.security.PermissionService;
+import org.alfresco.service.namespace.NamespaceService;
+import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern;
@@ -56,16 +61,20 @@ public class RuleServiceImplTest extends BaseRuleTest
private RegexQNamePattern ASSOC_NAME_RULES_REGEX = new RegexQNamePattern(RuleModel.RULE_MODEL_URI, "^" + ASSOC_NAME_RULES_PREFIX + ".*");
MutableAuthenticationService authenticationService;
- PermissionService permissionService;
-
- @Override
- protected void onSetUpInTransaction() throws Exception
- {
- super.onSetUpInTransaction();
- this.permissionService = (PermissionService)this.applicationContext.getBean("permissionService");
+ PermissionService permissionService;
+ SearchService searchService;
+ NamespaceService namespaceService;
+
+ @Override
+ protected void onSetUpInTransaction() throws Exception
+ {
+ super.onSetUpInTransaction();
+ this.permissionService = (PermissionService)this.applicationContext.getBean("permissionService");
this.authenticationService = (MutableAuthenticationService)this.applicationContext.getBean("authenticationService");
- }
-
+ this.searchService = (SearchService) applicationContext.getBean("SearchService");
+ this.namespaceService = (NamespaceService) applicationContext.getBean("NamespaceService");
+ }
+
/**
* Test get rule type
*/
@@ -76,9 +85,9 @@ public class RuleServiceImplTest extends BaseRuleTest
// Visual check to make sure that the display labels are being returned correctly
for (RuleType type : ruleTypes)
- {
- System.out.println(type.getDisplayLabel());
- }
+ {
+ System.out.println(type.getDisplayLabel());
+ }
}
/**
@@ -369,55 +378,55 @@ public class RuleServiceImplTest extends BaseRuleTest
public void testRuleServicePermissionsConsumer()
{
- this.authenticationService.createAuthentication("conUser", "password".toCharArray());
- this.permissionService.setPermission(this.nodeRef, "conUser", PermissionService.CONSUMER, true);
- this.permissionService.setInheritParentPermissions(this.nodeRef, true);
-
- this.authenticationService.authenticate("conUser", "password".toCharArray());
- Rule rule = createTestRule();
- try
- {
- this.ruleService.saveRule(this.nodeRef, rule);
- // Fail
- fail("Consumers cannot create rules.");
- }
- catch (Exception exception)
- {
- // Ok
- }
+ this.authenticationService.createAuthentication("conUser", "password".toCharArray());
+ this.permissionService.setPermission(this.nodeRef, "conUser", PermissionService.CONSUMER, true);
+ this.permissionService.setInheritParentPermissions(this.nodeRef, true);
+
+ this.authenticationService.authenticate("conUser", "password".toCharArray());
+ Rule rule = createTestRule();
+ try
+ {
+ this.ruleService.saveRule(this.nodeRef, rule);
+ // Fail
+ fail("Consumers cannot create rules.");
+ }
+ catch (Exception exception)
+ {
+ // Ok
+ }
}
public void testRuleServicePermissionsEditor()
{
- this.authenticationService.createAuthentication("editorUser", "password".toCharArray());
- this.permissionService.setPermission(this.nodeRef, "editorUser", PermissionService.EDITOR, true);
- this.permissionService.setInheritParentPermissions(this.nodeRef, true);
-
- this.authenticationService.authenticate("editorUser", "password".toCharArray());
- Rule rule = createTestRule();
- try
- {
- this.ruleService.saveRule(this.nodeRef, rule);
- // Fail
- fail("Editors cannot create rules.");
- }
- catch (Exception exception)
- {
- // Ok
- }
+ this.authenticationService.createAuthentication("editorUser", "password".toCharArray());
+ this.permissionService.setPermission(this.nodeRef, "editorUser", PermissionService.EDITOR, true);
+ this.permissionService.setInheritParentPermissions(this.nodeRef, true);
+
+ this.authenticationService.authenticate("editorUser", "password".toCharArray());
+ Rule rule = createTestRule();
+ try
+ {
+ this.ruleService.saveRule(this.nodeRef, rule);
+ // Fail
+ fail("Editors cannot create rules.");
+ }
+ catch (Exception exception)
+ {
+ // Ok
+ }
}
public void testRuleServicePermissionsCoordinator()
{
- this.authenticationService.createAuthentication("coordUser", "password".toCharArray());
- this.permissionService.setPermission(this.nodeRef, "coordUser", PermissionService.COORDINATOR, true);
- this.permissionService.setInheritParentPermissions(this.nodeRef, true);
-
+ this.authenticationService.createAuthentication("coordUser", "password".toCharArray());
+ this.permissionService.setPermission(this.nodeRef, "coordUser", PermissionService.COORDINATOR, true);
+ this.permissionService.setInheritParentPermissions(this.nodeRef, true);
+
this.authenticationService.authenticate(AuthenticationUtil.getAdminUserName(), "admin".toCharArray());
- Rule rule2 = createTestRule();
- this.ruleService.saveRule(this.nodeRef, rule2);
- this.authenticationService.clearCurrentSecurityContext();
+ Rule rule2 = createTestRule();
+ this.ruleService.saveRule(this.nodeRef, rule2);
+ this.authenticationService.clearCurrentSecurityContext();
}
/**
@@ -863,4 +872,58 @@ public class RuleServiceImplTest extends BaseRuleTest
// };
// });
}
+
+ public void testDeleteSpaceWithExecuteScriptRule() throws Exception
+ {
+ transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback