diff --git a/source/test-java/org/alfresco/Repository01TestSuite.java b/source/test-java/org/alfresco/Repository01TestSuite.java
index ec0e45d360..9473f48fc8 100644
--- a/source/test-java/org/alfresco/Repository01TestSuite.java
+++ b/source/test-java/org/alfresco/Repository01TestSuite.java
@@ -426,4 +426,10 @@ public class Repository01TestSuite extends TestSuite
{
suite.addTestSuite(org.alfresco.repo.doclink.DocumentLinkServiceImplTest.class);
}
+
+ static void tests68(TestSuite suite)
+ {
+ // This test opens, closes and again opens the alfresco application context.
+ suite.addTest(new JUnit4TestAdapter(org.alfresco.repo.dictionary.CustomModelRepoRestartTest.class));
+ }
}
diff --git a/source/test-java/org/alfresco/repo/dictionary/CustomModelRepoRestartTest.java b/source/test-java/org/alfresco/repo/dictionary/CustomModelRepoRestartTest.java
new file mode 100644
index 0000000000..aeb5a22ae4
--- /dev/null
+++ b/source/test-java/org/alfresco/repo/dictionary/CustomModelRepoRestartTest.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2005-2015 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.repo.dictionary;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.alfresco.repo.security.authentication.AuthenticationUtil;
+import org.alfresco.repo.transaction.RetryingTransactionHelper;
+import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
+import org.alfresco.service.cmr.dictionary.CustomModelDefinition;
+import org.alfresco.service.cmr.dictionary.CustomModelService;
+import org.alfresco.service.namespace.QName;
+import org.alfresco.util.ApplicationContextHelper;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Tests custom model expected behaviour after the repo server restarts.
+ *
+ * @author Jamal Kaabi-Mofrad
+ */
+public class CustomModelRepoRestartTest
+{
+ private CustomModelService customModelService;
+ private RetryingTransactionHelper transactionHelper;
+ private String modelName;
+
+ @Before
+ public void setUp() throws Exception
+ {
+ getCtxAndSetBeans();
+ modelName = System.currentTimeMillis() + "testCustomModel";
+ }
+
+ @After
+ public void tearDown() throws Exception
+ {
+ transactionHelper.doInTransaction(new RetryingTransactionCallback()
+ {
+ public Void execute() throws Exception
+ {
+ try
+ {
+ // Deactivate the model
+ customModelService.deactivateCustomModel(modelName);
+ }
+ catch (Exception ex)
+ {
+ // Ignore
+ }
+ return null;
+ }
+ });
+
+ transactionHelper.doInTransaction(new RetryingTransactionCallback()
+ {
+ public Void execute() throws Exception
+ {
+ try
+ {
+ // Delete the model
+ customModelService.deleteCustomModel(modelName);
+ }
+ catch (Exception ex)
+ {
+ // we did our best, so ignore
+ }
+ return null;
+ }
+ });
+
+ AuthenticationUtil.clearCurrentSecurityContext();
+ }
+
+ private void getCtxAndSetBeans()
+ {
+ ApplicationContext ctx = ApplicationContextHelper.getApplicationContext();
+ this.customModelService = ctx.getBean("customModelService", CustomModelService.class);
+ this.transactionHelper = ctx.getBean("retryingTransactionHelper", RetryingTransactionHelper.class);
+ AuthenticationUtil.setAdminUserAsFullyAuthenticatedUser();
+ }
+
+ @Test
+ public void testActivateModelAndRestartRepo() throws Exception
+ {
+ final long timeMillis = System.currentTimeMillis();
+ final String uri = "http://www.alfresco.org/model/testcmmrestartnamespace" + timeMillis;
+ final String prefix = "testcmmrestart" + timeMillis;
+
+ final M2Model model = M2Model.createModel(prefix + QName.NAMESPACE_PREFIX + modelName);
+ model.createNamespace(uri, prefix);
+
+ // Create the model
+ CustomModelDefinition modelDefinition = transactionHelper.doInTransaction(new RetryingTransactionCallback()
+ {
+ public CustomModelDefinition execute() throws Exception
+ {
+ return customModelService.createCustomModel(model, false);
+ }
+ });
+
+ assertNotNull(modelDefinition);
+ assertEquals(modelName, modelDefinition.getName().getLocalName());
+ assertFalse(modelDefinition.isActive());
+
+ // Activate the model
+ transactionHelper.doInTransaction(new RetryingTransactionCallback()
+ {
+ public Void execute() throws Exception
+ {
+ customModelService.activateCustomModel(modelName);
+ return null;
+ }
+ });
+
+ // Retrieve the model
+ modelDefinition = getModel(modelName);
+ assertNotNull(modelDefinition);
+ assertEquals(modelName, modelDefinition.getName().getLocalName());
+ assertTrue(modelDefinition.isActive());
+
+ // Close the application context
+ ApplicationContextHelper.closeApplicationContext();
+ // Get the application context and set the beans
+ getCtxAndSetBeans();
+
+ // Retrieve the model after the server restart
+ modelDefinition = getModel(modelName);
+ assertNotNull(modelDefinition);
+ assertEquals(modelName, modelDefinition.getName().getLocalName());
+ assertTrue(modelDefinition.isActive());
+ }
+
+ private CustomModelDefinition getModel(final String modelName)
+ {
+ return transactionHelper.doInTransaction(new RetryingTransactionCallback()
+ {
+ public CustomModelDefinition execute() throws Exception
+ {
+ return customModelService.getCustomModel(modelName);
+ }
+ });
+ }
+}