diff --git a/.gitignore b/.gitignore
index ec71c08b48..32be0cb401 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,6 +24,7 @@ test-output
/rm-server/alfresco-solr.zip
/rm-server/solr
/rm-server/shared
+/rm-server/alf_data
# /rm-server/config/
/rm-server/config/alfresco-global.properties
diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/module-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/module-context.xml
index 0a656298a5..962083afce 100644
--- a/rm-server/config/alfresco/module/org_alfresco_module_rm/module-context.xml
+++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/module-context.xml
@@ -179,7 +179,6 @@
-
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 7ddb3f28b2..d1d575c4d2 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
@@ -775,6 +775,7 @@
+
rma:recordCategory
@@ -817,7 +818,6 @@
,
+ Ordered
{
/** I18N messages*/
private static final String MSG_SERVICE_NOT_INIT = "rm.admin.service-not-init";
@@ -98,14 +107,26 @@ public class RecordsManagementAdminServiceImpl extends RecordsManagementAdminBas
/** Relationship service */
private RelationshipService relationshipService;
+
+ /** Transaction service */
+ private TransactionService transactionService;
/** List of types that can be customisable */
private List pendingCustomisableTypes;
private Map customisableTypes;
+
+ /** indicates whether the custom map has been initialised or not */
+ private boolean isCustomMapInit = false;
+
+ /**
+ * @param transactionService transaction service
+ */
+ public void setTransactionService(TransactionService transactionService)
+ {
+ this.transactionService = transactionService;
+ }
/**
- * Sets the relationship instance
- *
* @param relationshipService The relationship service instance
*/
public void setRelationshipService(RelationshipService relationshipService)
@@ -123,6 +144,48 @@ public class RecordsManagementAdminServiceImpl extends RecordsManagementAdminBas
return this.relationshipService;
}
+ /**
+ * Indicate that this application content listener must be executed with the lowest
+ * precedence. (ie last)
+ *
+ * @see Ordered#getOrder()
+ */
+ @Override
+ public int getOrder()
+ {
+ return Ordered.LOWEST_PRECEDENCE;
+ }
+
+ /**
+ * Load the custom properties map
+ *
+ * @see ApplicationListener#onApplicationEvent(org.springframework.context.ApplicationEvent)
+ */
+ @Override
+ public void onApplicationEvent(ContextRefreshedEvent event)
+ {
+ 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;
+ }
+
/**
* @see org.alfresco.repo.node.NodeServicePolicies.OnAddAspectPolicy#onAddAspect(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.namespace.QName)
*/
@@ -135,25 +198,25 @@ public class RecordsManagementAdminServiceImpl extends RecordsManagementAdminBas
)
public void onAddAspect(final NodeRef nodeRef, final QName aspectTypeQName)
{
- mandatory("nodeRef", nodeRef);
- mandatory("aspectTypeQName", aspectTypeQName);
-
- AuthenticationUtil.runAs(new RunAsWork()
+ if (isCustomMapInit)
{
- @Override
- public Void doWork()
+ AuthenticationUtil.runAs(new RunAsWork()
{
- if (getNodeService().exists(nodeRef) &&
- getDictionaryService().getAllModels().contains(RM_CUSTOM_MODEL) &&
- isCustomisable(aspectTypeQName))
+ @Override
+ public Void doWork()
{
- QName customPropertyAspect = getCustomAspect(aspectTypeQName);
- getNodeService().addAspect(nodeRef, customPropertyAspect, null);
+ if (getNodeService().exists(nodeRef) &&
+ getDictionaryService().getAllModels().contains(RM_CUSTOM_MODEL) &&
+ isCustomisable(aspectTypeQName))
+ {
+ QName customPropertyAspect = getCustomAspect(aspectTypeQName);
+ getNodeService().addAspect(nodeRef, customPropertyAspect, null);
+ }
+
+ return null;
}
-
- return null;
- }
- }, AuthenticationUtil.getSystemUserName());
+ }, AuthenticationUtil.getSystemUserName());
+ }
}
/**
@@ -168,24 +231,24 @@ public class RecordsManagementAdminServiceImpl extends RecordsManagementAdminBas
)
public void onRemoveAspect(final NodeRef nodeRef, final QName aspectTypeQName)
{
- mandatory("nodeRef", nodeRef);
- mandatory("aspectTypeQName", aspectTypeQName);
-
- AuthenticationUtil.runAs(new RunAsWork()
+ if (isCustomMapInit)
{
- @Override
- public Void doWork()
+ AuthenticationUtil.runAs(new RunAsWork()
{
- if (getNodeService().exists(nodeRef) &&
- isCustomisable(aspectTypeQName))
+ @Override
+ public Void doWork()
{
- QName customPropertyAspect = getCustomAspect(aspectTypeQName);
- getNodeService().removeAspect(nodeRef, customPropertyAspect);
+ if (getNodeService().exists(nodeRef) &&
+ isCustomisable(aspectTypeQName))
+ {
+ QName customPropertyAspect = getCustomAspect(aspectTypeQName);
+ getNodeService().removeAspect(nodeRef, customPropertyAspect);
+ }
+
+ return null;
}
-
- return null;
- }
- }, AuthenticationUtil.getSystemUserName());
+ }, AuthenticationUtil.getSystemUserName());
+ }
}
/**
@@ -202,49 +265,41 @@ public class RecordsManagementAdminServiceImpl extends RecordsManagementAdminBas
)
public void onCreateNode(final ChildAssociationRef childAssocRef)
{
- mandatory("nodeRef", childAssocRef);
-
- AuthenticationUtil.runAs(new RunAsWork()
- {
- @Override
- public Void doWork()
+ if (isCustomMapInit)
+ {
+ AuthenticationUtil.runAs(new RunAsWork()
{
- if (getDictionaryService().getAllModels().contains(RecordsManagementCustomModel.RM_CUSTOM_MODEL))
+ @Override
+ public Void doWork()
{
- NodeRef nodeRef = childAssocRef.getChildRef();
- QName type = getNodeService().getType(nodeRef);
- while (type != null && !ContentModel.TYPE_CMOBJECT.equals(type))
+ if (getDictionaryService().getAllModels().contains(RecordsManagementCustomModel.RM_CUSTOM_MODEL))
{
- if (isCustomisable(type))
+ NodeRef nodeRef = childAssocRef.getChildRef();
+ QName type = getNodeService().getType(nodeRef);
+ while (type != null && !ContentModel.TYPE_CMOBJECT.equals(type))
{
- QName customPropertyAspect = getCustomAspect(type);
- getNodeService().addAspect(nodeRef, customPropertyAspect, null);
- }
-
- TypeDefinition def = getDictionaryService().getType(type);
- if (def != null)
- {
- type = def.getParentName();
- }
- else
- {
- type = null;
+ if (isCustomisable(type))
+ {
+ QName customPropertyAspect = getCustomAspect(type);
+ getNodeService().addAspect(nodeRef, customPropertyAspect, null);
+ }
+
+ TypeDefinition def = getDictionaryService().getType(type);
+ if (def != null)
+ {
+ type = def.getParentName();
+ }
+ else
+ {
+ type = null;
+ }
}
}
+
+ return null;
}
-
- return null;
- }
- }, AuthenticationUtil.getSystemUserName());
- }
-
- /**
- * @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementAdminService#initialiseCustomModel()
- */
- public void initialiseCustomModel()
- {
- // Initialise the map
- getCustomisableMap();
+ }, AuthenticationUtil.getSystemUserName());
+ }
}
/**
@@ -329,6 +384,92 @@ public class RecordsManagementAdminServiceImpl extends RecordsManagementAdminBas
return result;
}
+
+ /**
+ * Initialise custom type map
+ */
+ private void initCustomMap()
+ {
+ customisableTypes = new HashMap(7);
+ Collection aspects = getDictionaryService().getAspects(RM_CUSTOM_MODEL);
+ for (QName aspect : aspects)
+ {
+ AspectDefinition aspectDef = getDictionaryService().getAspect(aspect);
+ String name = aspectDef.getName().getLocalName();
+ if (name.endsWith("Properties"))
+ {
+ QName type = null;
+ String prefixString = aspectDef.getDescription(getDictionaryService());
+ if (prefixString == null)
+ {
+ // Backward compatibility from previous RM V1.0 custom models
+ if (CompatibilityModel.NAME_CUSTOM_RECORD_PROPERTIES.equals(name))
+ {
+ type = RecordsManagementModel.ASPECT_RECORD;
+ }
+ else if (CompatibilityModel.NAME_CUSTOM_RECORD_FOLDER_PROPERTIES.equals(name))
+ {
+ type = RecordsManagementModel.TYPE_RECORD_FOLDER;
+ }
+ else if (CompatibilityModel.NAME_CUSTOM_RECORD_CATEGORY_PROPERTIES.equals(name))
+ {
+ type = RecordsManagementModel.TYPE_RECORD_CATEGORY;
+ }
+ else if (CompatibilityModel.NAME_CUSTOM_RECORD_SERIES_PROPERTIES.equals(name) &&
+ // Only add the deprecated record series type as customisable if
+ // a v1.0 installation has added custom properties
+ aspectDef.getProperties().size() != 0)
+ {
+ type = CompatibilityModel.TYPE_RECORD_SERIES;
+ }
+ }
+ else
+ {
+ type = QName.createQName(prefixString, getNamespaceService());
+ }
+
+ // Add the customisable type to the map
+ if (type != null)
+ {
+ customisableTypes.put(type, aspect);
+
+ // Remove customisable type from the pending list
+ if (pendingCustomisableTypes != null && pendingCustomisableTypes.contains(type))
+ {
+ pendingCustomisableTypes.remove(type);
+ }
+ }
+ }
+ }
+
+ // Deal with any pending types left over
+ if (pendingCustomisableTypes != null && pendingCustomisableTypes.size() != 0)
+ {
+ NodeRef modelRef = getCustomModelRef(RecordsManagementModel.RM_CUSTOM_URI);
+ M2Model model = readCustomContentModel(modelRef);
+ try
+ {
+ for (QName customisableType : pendingCustomisableTypes)
+ {
+ QName customAspect = getCustomAspectImpl(customisableType);
+
+ // Create the new aspect to hold the custom properties
+ M2Aspect aspect = model.createAspect(customAspect.toPrefixString(getNamespaceService()));
+ aspect.setDescription(customisableType.toPrefixString(getNamespaceService()));
+
+ // Make a record of the customisable type
+ customisableTypes.put(customisableType, customAspect);
+ }
+ }
+ finally
+ {
+ writeCustomContentModel(modelRef, model);
+ }
+ }
+
+ // indicate map is initialised
+ isCustomMapInit = true;
+ }
/**
* Gets a map containing all the customisable types
@@ -337,86 +478,11 @@ public class RecordsManagementAdminServiceImpl extends RecordsManagementAdminBas
*/
private Map getCustomisableMap()
{
- if (customisableTypes == null)
- {
- customisableTypes = new HashMap(7);
- Collection aspects = getDictionaryService().getAspects(RM_CUSTOM_MODEL);
- for (QName aspect : aspects)
- {
- AspectDefinition aspectDef = getDictionaryService().getAspect(aspect);
- String name = aspectDef.getName().getLocalName();
- if (name.endsWith("Properties"))
- {
- QName type = null;
- String prefixString = aspectDef.getDescription(getDictionaryService());
- if (prefixString == null)
- {
- // Backward compatibility from previous RM V1.0 custom models
- if (CompatibilityModel.NAME_CUSTOM_RECORD_PROPERTIES.equals(name))
- {
- type = RecordsManagementModel.ASPECT_RECORD;
- }
- else if (CompatibilityModel.NAME_CUSTOM_RECORD_FOLDER_PROPERTIES.equals(name))
- {
- type = RecordsManagementModel.TYPE_RECORD_FOLDER;
- }
- else if (CompatibilityModel.NAME_CUSTOM_RECORD_CATEGORY_PROPERTIES.equals(name))
- {
- type = RecordsManagementModel.TYPE_RECORD_CATEGORY;
- }
- else if (CompatibilityModel.NAME_CUSTOM_RECORD_SERIES_PROPERTIES.equals(name) &&
- // Only add the deprecated record series type as customisable if
- // a v1.0 installation has added custom properties
- aspectDef.getProperties().size() != 0)
- {
- type = CompatibilityModel.TYPE_RECORD_SERIES;
- }
- }
- else
- {
- type = QName.createQName(prefixString, getNamespaceService());
- }
-
- // Add the customisable type to the map
- if (type != null)
- {
- customisableTypes.put(type, aspect);
-
- // Remove customisable type from the pending list
- if (pendingCustomisableTypes != null && pendingCustomisableTypes.contains(type))
- {
- pendingCustomisableTypes.remove(type);
- }
- }
- }
- }
-
- // Deal with any pending types left over
- if (pendingCustomisableTypes != null && pendingCustomisableTypes.size() != 0)
- {
- NodeRef modelRef = getCustomModelRef(RecordsManagementModel.RM_CUSTOM_URI);
- M2Model model = readCustomContentModel(modelRef);
- try
- {
- for (QName customisableType : pendingCustomisableTypes)
- {
- QName customAspect = getCustomAspectImpl(customisableType);
-
- // Create the new aspect to hold the custom properties
- M2Aspect aspect = model.createAspect(customAspect.toPrefixString(getNamespaceService()));
- aspect.setDescription(customisableType.toPrefixString(getNamespaceService()));
-
- // Make a record of the customisable type
- customisableTypes.put(customisableType, customAspect);
- }
- }
- finally
- {
- writeCustomContentModel(modelRef, model);
- }
- }
- }
- return customisableTypes;
+ if (customisableTypes == null)
+ {
+ throw AlfrescoRuntimeException.create("Customisable map has not been initialised correctly.");
+ }
+ return customisableTypes;
}
/**
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/bootstrap/RecordsManagementBootstrap.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/bootstrap/RecordsManagementBootstrap.java
index f061d07a4c..2dcfff5dd2 100644
--- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/bootstrap/RecordsManagementBootstrap.java
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/bootstrap/RecordsManagementBootstrap.java
@@ -18,7 +18,6 @@
*/
package org.alfresco.module.org_alfresco_module_rm.bootstrap;
-import org.alfresco.module.org_alfresco_module_rm.admin.RecordsManagementAdminService;
import org.alfresco.module.org_alfresco_module_rm.action.impl.SplitEmailAction;
import org.alfresco.module.org_alfresco_module_rm.caveat.RMCaveatConfigService;
import org.alfresco.module.org_alfresco_module_rm.email.CustomEmailMappingService;
@@ -41,7 +40,6 @@ public class RecordsManagementBootstrap extends AbstractLifecycleBean
private TransactionService transactionService;
private RMCaveatConfigService caveatConfigService;
private CustomEmailMappingService customEmailMappingService;
- private RecordsManagementAdminService adminService;
private NodeParameterSuggesterBootstrap suggesterBootstrap;
public NodeParameterSuggesterBootstrap getSuggesterBootstrap()
@@ -69,11 +67,6 @@ public class RecordsManagementBootstrap extends AbstractLifecycleBean
this.customEmailMappingService = customEmailMappingService;
}
- public void setRecordsManagementAdminService(RecordsManagementAdminService adminService)
- {
- this.adminService = adminService;
- }
-
public CustomEmailMappingService getCustomEmailMappingService()
{
return customEmailMappingService;
@@ -93,9 +86,6 @@ public class RecordsManagementBootstrap extends AbstractLifecycleBean
{
// initialise caveat config
caveatConfigService.init();
-
- // Initialise the custom model
- adminService.initialiseCustomModel();
// Initialize the suggester after the model
// in case it contains namespaces from custom models
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 510bcb3c9e..4b6c387171 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;
@@ -48,7 +49,8 @@ import org.junit.runners.Suite.SuiteClasses;
RM1887Test.class,
RM1914Test.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..7bc0a982bf
--- /dev/null
+++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/rm3314/RM3314Test.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2005-2016 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
+{
+ /** registry to record callback from test beans "test.rm3114.1" and "test.rm3114.2" */
+ 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()
+ {
+ /**
+ * The related test beans will call back into the callback map showing
+ * whether at the end of their execution whether the custom model has been
+ * initialised or not. Given the order in which these test beans are executed
+ * on spring context load, we would expect that .1 executes with the custom
+ * map unloaded, and the .2 with it loaded.
+ */
+
+ 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 e4d4131b90..b3abc98753 100644
--- a/rm-server/test/resources/test-context.xml
+++ b/rm-server/test/resources/test-context.xml
@@ -241,4 +241,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file