diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml
index 54cd8dda2e..cc67b45a97 100644
--- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml
+++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml
@@ -770,6 +770,7 @@
+
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/admin/RecordsManagementAdminServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/admin/RecordsManagementAdminServiceImpl.java
index 79837871e2..66e1f803a0 100644
--- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/admin/RecordsManagementAdminServiceImpl.java
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/admin/RecordsManagementAdminServiceImpl.java
@@ -63,6 +63,7 @@ import org.alfresco.repo.policy.annotation.BehaviourBean;
import org.alfresco.repo.policy.annotation.BehaviourKind;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
+import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.dictionary.AspectDefinition;
import org.alfresco.service.cmr.dictionary.AssociationDefinition;
import org.alfresco.service.cmr.dictionary.Constraint;
@@ -83,6 +84,7 @@ import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.RegexQNamePattern;
+import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.GUID;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -157,6 +159,9 @@ public class RecordsManagementAdminServiceImpl implements RecordsManagementAdmin
/** Policy component */
private PolicyComponent policyComponent;
+
+ /** Transaction service */
+ private TransactionService transactionService;
/** Policy delegates */
private ClassPolicyDelegate beforeCreateReferenceDelegate;
@@ -220,6 +225,14 @@ public class RecordsManagementAdminServiceImpl implements RecordsManagementAdmin
{
this.dictonaryRepositoryBootstrap = dictonaryRepositoryBootstrap;
}
+
+ /**
+ * @param transactionService transaction service
+ */
+ public void setTransactionService(TransactionService transactionService)
+ {
+ this.transactionService = transactionService;
+ }
/**
* Initialisation method
@@ -253,8 +266,26 @@ public class RecordsManagementAdminServiceImpl implements RecordsManagementAdmin
@Override
public void onApplicationEvent(ContextRefreshedEvent event)
{
- // initialise custom properties
- initCustomMap();
+ transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback()
+ {
+ public Void execute() throws Throwable
+ {
+ // initialise custom properties
+ initCustomMap();
+
+ return null;
+ }
+ });
+ }
+
+ /**
+ * Helper method to indicate whether the custom map is initialised or not.
+ *
+ * @return boolean true if initialised, false otherwise
+ */
+ public boolean isCustomMapInit()
+ {
+ return isCustomMapInit;
}
/**
diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/IssueTestSuite.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/IssueTestSuite.java
index 8c52e12ea1..2b86c45bf6 100755
--- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/IssueTestSuite.java
+++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/IssueTestSuite.java
@@ -18,6 +18,7 @@
*/
package org.alfresco.module.org_alfresco_module_rm.test.integration.issue;
+import org.alfresco.module.org_alfresco_module_rm.test.integration.issue.rm3314.RM3314Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@@ -44,7 +45,8 @@ import org.junit.runners.Suite.SuiteClasses;
RM1039Test.class,
RM1799Test.class,
//RM2190Test.class,
- RM2192Test.class
+ RM2192Test.class,
+ RM3314Test.class
})
public class IssueTestSuite
{
diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/rm3314/RM3314Test.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/rm3314/RM3314Test.java
new file mode 100644
index 0000000000..89911e5fab
--- /dev/null
+++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/rm3314/RM3314Test.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2005-2014 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+
+package org.alfresco.module.org_alfresco_module_rm.test.integration.issue.rm3314;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase;
+
+/**
+ * Test for https://issues.alfresco.com/jira/browse/RM-3114
+ *
+ * @author Roy Wetherall
+ * @since 2.2.1.5
+ */
+public class RM3314Test extends BaseRMTestCase
+{
+ public static Map callback = new HashMap(2);
+
+ /**
+ * Given that the custom model hasn't been initialised
+ * When an aspect is added
+ * Then nothing happens
+ *
+ * Given that the custom model has been initialised
+ * When an aspect is added
+ * Then something happens
+ */
+ public void testListenersExecutedInTheCorrectOrder()
+ {
+ assertFalse(callback.isEmpty());
+ assertFalse(callback.get("test.rm3314.1"));
+ assertTrue(callback.get("test.rm3314.2"));
+ }
+}
diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/rm3314/RM3314TestListener.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/rm3314/RM3314TestListener.java
new file mode 100644
index 0000000000..d162d0fe95
--- /dev/null
+++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/rm3314/RM3314TestListener.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2005-2014 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+
+package org.alfresco.module.org_alfresco_module_rm.test.integration.issue.rm3314;
+
+import org.alfresco.model.ContentModel;
+import org.alfresco.module.org_alfresco_module_rm.admin.RecordsManagementAdminServiceImpl;
+import org.alfresco.repo.model.Repository;
+import org.alfresco.repo.security.authentication.AuthenticationUtil;
+import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
+import org.alfresco.service.cmr.model.FileFolderService;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.cmr.repository.NodeService;
+import org.springframework.beans.factory.BeanNameAware;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.core.Ordered;
+import org.springframework.jdbc.BadSqlGrammarException;
+
+/**
+ * Simple bean used to test RM-3314
+ *
+ * @author rwetherall
+ * @since 2.2.1.5
+ */
+public class RM3314TestListener implements ApplicationListener,
+ Ordered,
+ BeanNameAware
+{
+ private RecordsManagementAdminServiceImpl recordsManagementAdminService;
+ private NodeService nodeService;
+ private FileFolderService fileFolderService;
+ private Repository repository;
+
+ private String name;
+ private int order = Ordered.LOWEST_PRECEDENCE;
+
+ public void setRecordsManagementAdminService(RecordsManagementAdminServiceImpl recordsManagementAdminService)
+ {
+ this.recordsManagementAdminService = recordsManagementAdminService;
+ }
+
+ public void setNodeService(NodeService nodeService)
+ {
+ this.nodeService = nodeService;
+ }
+
+ public void setFileFolderService(FileFolderService fileFolderService)
+ {
+ this.fileFolderService = fileFolderService;
+ }
+
+ public void setRepository(Repository repository)
+ {
+ this.repository = repository;
+ }
+
+ @Override
+ public void setBeanName(String name)
+ {
+ this.name = name;
+ }
+
+ public void setOrder(int order)
+ {
+ this.order = order;
+ }
+
+ @Override
+ public void onApplicationEvent(ContextRefreshedEvent event)
+ {
+ // call back to show whether the custom map is initialised or not
+ RM3314Test.callback.put(name, recordsManagementAdminService.isCustomMapInit());
+
+ // Do some work on a node to show that reguardless of whether the custom map is
+ // init or not, things still work.
+ // Note: using public services to ensure new transaction for each service call
+ AuthenticationUtil.runAsSystem(new RunAsWork()
+ {
+ public Void doWork() throws Exception
+ {
+ try
+ {
+ // create node
+ NodeRef folder = fileFolderService.create(
+ repository.getCompanyHome(),
+ name,
+ ContentModel.TYPE_FOLDER).getNodeRef();
+ try
+ {
+ // add aspect
+ nodeService.addAspect(folder, ContentModel.ASPECT_CLASSIFIABLE, null);
+
+ // remove aspect
+ nodeService.removeAspect(folder, ContentModel.ASPECT_CLASSIFIABLE);
+ }
+ finally
+ {
+ // delete node
+ nodeService.deleteNode(folder);
+ }
+ }
+ catch (BadSqlGrammarException e)
+ {
+ // ignore and carry on
+ }
+
+ return null;
+ }
+ });
+ }
+
+ @Override
+ public int getOrder()
+ {
+ return order;
+ }
+}
diff --git a/rm-server/test/resources/test-context.xml b/rm-server/test/resources/test-context.xml
index a5396c0b50..d0f608937c 100644
--- a/rm-server/test/resources/test-context.xml
+++ b/rm-server/test/resources/test-context.xml
@@ -240,4 +240,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file