mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-10-08 14:51:49 +00:00
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@109515 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
1066 lines
44 KiB
Java
1066 lines
44 KiB
Java
/*
|
|
* 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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
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.assertNull;
|
|
import static org.junit.Assert.assertTrue;
|
|
import static org.junit.Assert.fail;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Collection;
|
|
import java.util.List;
|
|
import java.util.Set;
|
|
|
|
import org.alfresco.model.ContentModel;
|
|
import org.alfresco.query.PagingRequest;
|
|
import org.alfresco.query.PagingResults;
|
|
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.AspectDefinition;
|
|
import org.alfresco.service.cmr.dictionary.CustomModelDefinition;
|
|
import org.alfresco.service.cmr.dictionary.CustomModelService;
|
|
import org.alfresco.service.cmr.dictionary.ModelDefinition;
|
|
import org.alfresco.service.cmr.dictionary.NamespaceDefinition;
|
|
import org.alfresco.service.cmr.dictionary.TypeDefinition;
|
|
import org.alfresco.service.cmr.dictionary.CustomModelException.ActiveModelConstraintException;
|
|
import org.alfresco.service.cmr.dictionary.CustomModelException.InvalidNamespaceException;
|
|
import org.alfresco.service.cmr.dictionary.CustomModelException.ModelDoesNotExistException;
|
|
import org.alfresco.service.cmr.dictionary.CustomModelException.NamespaceConstraintException;
|
|
import org.alfresco.service.cmr.download.DownloadStatus;
|
|
import org.alfresco.service.cmr.repository.NodeRef;
|
|
import org.alfresco.service.cmr.security.AuthorityService;
|
|
import org.alfresco.service.cmr.security.PersonService;
|
|
import org.alfresco.service.namespace.QName;
|
|
import org.alfresco.util.Pair;
|
|
import org.alfresco.util.PropertyMap;
|
|
import org.alfresco.util.test.junitrules.ApplicationContextInit;
|
|
import org.alfresco.util.test.junitrules.RunAsFullyAuthenticatedRule;
|
|
import org.junit.After;
|
|
import org.junit.AfterClass;
|
|
import org.junit.BeforeClass;
|
|
import org.junit.ClassRule;
|
|
import org.junit.Rule;
|
|
import org.junit.Test;
|
|
|
|
/**
|
|
* Integration tests for {@link CustomModelServiceImpl}
|
|
*
|
|
* @author Jamal Kaabi-Mofrad
|
|
*/
|
|
public class CustomModelServiceImplTest
|
|
{
|
|
|
|
private static final long PAUSE_TIME = 1000;
|
|
|
|
@ClassRule
|
|
public static ApplicationContextInit APP_CONTEXT_INIT = new ApplicationContextInit();
|
|
|
|
@Rule
|
|
public RunAsFullyAuthenticatedRule runAsRule = new RunAsFullyAuthenticatedRule(AuthenticationUtil.getAdminUserName());
|
|
|
|
private static CustomModelService customModelService;
|
|
private static RetryingTransactionHelper transactionHelper;
|
|
private static PersonService personService;
|
|
private static AuthorityService authorityService;
|
|
private static CMMDownloadTestUtil cmmDownloadTestUtil;
|
|
|
|
private List<String> modelNames = new ArrayList<>();
|
|
|
|
@BeforeClass
|
|
public static void initStaticData() throws Exception
|
|
{
|
|
customModelService = APP_CONTEXT_INIT.getApplicationContext().getBean("customModelService", CustomModelService.class);
|
|
transactionHelper = APP_CONTEXT_INIT.getApplicationContext().getBean("retryingTransactionHelper", RetryingTransactionHelper.class);
|
|
personService = APP_CONTEXT_INIT.getApplicationContext().getBean("personService", PersonService.class);
|
|
authorityService = APP_CONTEXT_INIT.getApplicationContext().getBean("authorityService", AuthorityService.class);
|
|
cmmDownloadTestUtil = new CMMDownloadTestUtil(APP_CONTEXT_INIT.getApplicationContext());
|
|
}
|
|
|
|
@AfterClass
|
|
public static void cleanUp()
|
|
{
|
|
cmmDownloadTestUtil.cleanup();
|
|
AuthenticationUtil.clearCurrentSecurityContext();
|
|
}
|
|
|
|
@After
|
|
public void tearDown() throws Exception
|
|
{
|
|
final List<String> activeModels = new ArrayList<>();
|
|
for (final String model : modelNames)
|
|
{
|
|
transactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
|
|
{
|
|
public Void execute() throws Exception
|
|
{
|
|
try
|
|
{
|
|
customModelService.deleteCustomModel(model);
|
|
}
|
|
catch (ActiveModelConstraintException ex)
|
|
{
|
|
activeModels.add(model);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
// Ignore
|
|
}
|
|
return null;
|
|
}
|
|
});
|
|
}
|
|
|
|
for(final String am: activeModels)
|
|
{
|
|
// Try to deactivate and delete again
|
|
try
|
|
{
|
|
transactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
|
|
{
|
|
public Void execute() throws Exception
|
|
{
|
|
customModelService.deactivateCustomModel(am);
|
|
return null;
|
|
}
|
|
});
|
|
transactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
|
|
{
|
|
public Void execute() throws Exception
|
|
{
|
|
customModelService.deleteCustomModel(am);
|
|
return null;
|
|
}
|
|
});
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
// Ignore
|
|
}
|
|
}
|
|
modelNames.clear();
|
|
}
|
|
|
|
@Test
|
|
public void testCreateBasicInactiveModel() throws Exception
|
|
{
|
|
final String modelName1 = makeUniqueName("testCustomModel1");
|
|
final String desc = "This is test custom model desc";
|
|
|
|
Pair<String, String> namespacePair = getTestNamespacePrefixPair();
|
|
M2Model model = M2Model.createModel(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName1);
|
|
model.createNamespace(namespacePair.getFirst(), namespacePair.getSecond());
|
|
model.setDescription(desc);
|
|
model.setAuthor("John Doe");
|
|
|
|
// Create the 1st model
|
|
CustomModelDefinition modelDefinition = createModel(model, false);
|
|
|
|
assertNotNull(modelDefinition);
|
|
assertEquals(modelName1, modelDefinition.getName().getLocalName());
|
|
assertTrue("There is no imported namespace." ,modelDefinition.getImportedNamespaces().isEmpty());
|
|
|
|
NamespaceDefinition namespaceDefinition = modelDefinition.getNamespaces().iterator().next();
|
|
assertNotNull(namespaceDefinition);
|
|
assertEquals(namespacePair.getFirst(), namespaceDefinition.getUri());
|
|
assertEquals(namespacePair.getSecond(), namespaceDefinition.getPrefix());
|
|
|
|
assertEquals(desc, modelDefinition.getDescription());
|
|
assertEquals("John Doe", modelDefinition.getAuthor());
|
|
|
|
final String modelName2 = makeUniqueName("testCustomModel2");
|
|
model = M2Model.createModel(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName2);
|
|
model.createNamespace(namespacePair.getFirst(), "newTestPrefix");
|
|
|
|
// Create the 2nd model - duplicate namespace URI
|
|
try
|
|
{
|
|
createModel(model, false);
|
|
fail("Shouldn't be able to create a model with an already in-use namespace uri.");
|
|
}
|
|
catch (NamespaceConstraintException ex)
|
|
{
|
|
// Expected
|
|
}
|
|
|
|
final String modelName3 = makeUniqueName("testCustomModel3");
|
|
model = M2Model.createModel(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName3);
|
|
model.createNamespace(getTestNamespacePrefixPair().getFirst(), namespacePair.getSecond());
|
|
|
|
// Create the 2nd model - duplicate namespace Prefix
|
|
try
|
|
{
|
|
createModel(model, false);
|
|
fail("Shouldn't be able to create a model with an already in-use namespace prefix.");
|
|
}
|
|
catch (NamespaceConstraintException ex)
|
|
{
|
|
// Expected
|
|
}
|
|
|
|
namespacePair = getTestNamespacePrefixPair();
|
|
model = M2Model.createModel(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName2);
|
|
model.createNamespace(namespacePair.getFirst(), namespacePair.getSecond());
|
|
modelDefinition = createModel(model, false);
|
|
assertNotNull(modelDefinition);
|
|
assertEquals(modelName2, modelDefinition.getName().getLocalName());
|
|
namespaceDefinition = modelDefinition.getNamespaces().iterator().next();
|
|
assertNotNull(namespaceDefinition);
|
|
assertEquals(namespacePair.getFirst(), namespaceDefinition.getUri());
|
|
assertEquals(namespacePair.getSecond(), namespaceDefinition.getPrefix());
|
|
|
|
try
|
|
{
|
|
// Test duplicate model
|
|
createModel(model, false);
|
|
fail("Shouldn't be able to create a duplicate model.");
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
// Expected
|
|
}
|
|
|
|
try
|
|
{
|
|
// Test creating a model with the same name as the bootstrapped model
|
|
model.setName("contentmodel");
|
|
createModel(model, false);
|
|
fail("Shouldn't be able to create a model with the same name as the bootstrapped model.");
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
// Expected
|
|
}
|
|
|
|
// Test list all models
|
|
try
|
|
{
|
|
customModelService.getCustomModels(null);
|
|
fail("Should have thrown IllegalArgumentException as PagingRequest was null.");
|
|
}
|
|
catch (IllegalArgumentException e)
|
|
{
|
|
// Expected
|
|
}
|
|
final PagingRequest pagingRequest = new PagingRequest(0, Integer.MAX_VALUE);
|
|
PagingResults<CustomModelDefinition> result = transactionHelper.doInTransaction(new RetryingTransactionCallback<PagingResults<CustomModelDefinition>>()
|
|
{
|
|
public PagingResults<CustomModelDefinition> execute() throws Exception
|
|
{
|
|
return customModelService.getCustomModels(pagingRequest);
|
|
}
|
|
});
|
|
|
|
assertTrue(result.getTotalResultCount().getFirst() >= 2);
|
|
}
|
|
|
|
@Test
|
|
public void testListTypesAspects_Empty() throws Exception
|
|
{
|
|
final String modelName = makeUniqueName("testCustomModel");
|
|
Pair<String, String> namespacePair = getTestNamespacePrefixPair();
|
|
|
|
final M2Model model = M2Model.createModel(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName);
|
|
model.createNamespace(namespacePair.getFirst(), namespacePair.getSecond());
|
|
|
|
createModel(model, false);
|
|
|
|
// Retrieve the created model
|
|
CustomModelDefinition modelDefinition = getModel(modelName);
|
|
assertNotNull(modelDefinition);
|
|
assertEquals(modelName, modelDefinition.getName().getLocalName());
|
|
|
|
// List all of the model's types
|
|
Collection<TypeDefinition> types = modelDefinition.getTypeDefinitions();
|
|
assertEquals(0, types.size());
|
|
|
|
// List all of the model's aspects
|
|
Collection<AspectDefinition> aspects = modelDefinition.getAspectDefinitions();
|
|
assertEquals(0, aspects.size());
|
|
}
|
|
|
|
@Test
|
|
public void testModelAdmin() throws Exception
|
|
{
|
|
assertFalse(customModelService.isModelAdmin(null));
|
|
|
|
final String userName = "testUser" + System.currentTimeMillis();
|
|
final PropertyMap testUser = new PropertyMap();
|
|
testUser.put(ContentModel.PROP_USERNAME, userName);
|
|
testUser.put(ContentModel.PROP_FIRSTNAME, "John");
|
|
testUser.put(ContentModel.PROP_LASTNAME, "Doe");
|
|
testUser.put(ContentModel.PROP_PASSWORD, "password");
|
|
|
|
final NodeRef personNodeRef = transactionHelper.doInTransaction(new RetryingTransactionCallback<NodeRef>()
|
|
{
|
|
public NodeRef execute() throws Exception
|
|
{
|
|
NodeRef nodeRef = personService.createPerson(testUser);
|
|
assertNotNull(nodeRef);
|
|
assertFalse(customModelService.isModelAdmin(userName));
|
|
|
|
// Add the user to the group
|
|
authorityService.addAuthority(CustomModelServiceImpl.GROUP_ALFRESCO_MODEL_ADMINISTRATORS_AUTHORITY, userName);
|
|
assertTrue(customModelService.isModelAdmin(userName));
|
|
|
|
return nodeRef;
|
|
}
|
|
});
|
|
|
|
// Cleanup
|
|
transactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
|
|
{
|
|
public Void execute() throws Exception
|
|
{
|
|
personService.deletePerson(personNodeRef);
|
|
return null;
|
|
}
|
|
});
|
|
}
|
|
|
|
@Test
|
|
public void testActivateModel() throws Exception
|
|
{
|
|
final String modelName = makeUniqueName("testCustomModel");
|
|
final String desc = "This is test custom model desc";
|
|
|
|
Pair<String, String> namespacePair = getTestNamespacePrefixPair();
|
|
M2Model model = M2Model.createModel(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName);
|
|
model.createNamespace(namespacePair.getFirst(), namespacePair.getSecond());
|
|
model.setDescription(desc);
|
|
model.setAuthor("John Doe");
|
|
|
|
// Create the model
|
|
CustomModelDefinition modelDefinition = createModel(model, false);
|
|
|
|
assertNotNull(modelDefinition);
|
|
assertEquals(modelName, modelDefinition.getName().getLocalName());
|
|
assertFalse(modelDefinition.isActive());
|
|
|
|
transactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
|
|
{
|
|
public Void execute() throws Exception
|
|
{
|
|
// Activate the model
|
|
customModelService.activateCustomModel(modelName);
|
|
return null;
|
|
}
|
|
});
|
|
|
|
// Retrieve the model
|
|
modelDefinition = getModel(modelName);
|
|
assertNotNull(modelDefinition);
|
|
assertEquals(modelName, modelDefinition.getName().getLocalName());
|
|
assertTrue(modelDefinition.isActive());
|
|
|
|
// Try to activate the model again
|
|
try
|
|
{
|
|
customModelService.activateCustomModel(modelName);
|
|
fail("Shouldn't be able to activate an already activated model.");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
// Expected
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testisNamespaceUriExists()
|
|
{
|
|
final String modelName = makeUniqueName("testCustomModel");
|
|
|
|
Pair<String, String> namespacePair = getTestNamespacePrefixPair();
|
|
M2Model model = M2Model.createModel(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName);
|
|
model.createNamespace(namespacePair.getFirst(), namespacePair.getSecond());
|
|
model.setAuthor("John Doe");
|
|
|
|
assertNull(customModelService.getCustomModelByUri(namespacePair.getFirst()));
|
|
// Create the model
|
|
CustomModelDefinition modelDefinition = createModel(model, false);
|
|
assertNotNull(modelDefinition);
|
|
assertEquals(modelName, modelDefinition.getName().getLocalName());
|
|
|
|
assertTrue(customModelService.isNamespaceUriExists(namespacePair.getFirst()));
|
|
ModelDefinition modelDefinitionByUri = customModelService.getCustomModelByUri(namespacePair.getFirst());
|
|
assertNotNull(modelDefinitionByUri);
|
|
assertEquals(modelName, modelDefinitionByUri.getName().getLocalName());
|
|
}
|
|
|
|
@Test
|
|
public void testCreateModelWithTypesAndAspects() throws Exception
|
|
{
|
|
String modelName = makeUniqueName("testCustomModelFailed");
|
|
Pair<String, String> namespacePair = getTestNamespacePrefixPair();
|
|
M2Model model = M2Model.createModel(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName);
|
|
model.createNamespace(namespacePair.getFirst(), namespacePair.getSecond());
|
|
model.setAuthor("Average Joe");
|
|
|
|
// Type
|
|
String typeName = "testType";
|
|
M2Type m2Type = model.createType(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + typeName);
|
|
m2Type.setTitle("Test type title");
|
|
m2Type.setParentName("cm:content");
|
|
|
|
// Aspect
|
|
String aspectName = "testMarkerAspect";
|
|
model.createAspect(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + aspectName);
|
|
|
|
try
|
|
{
|
|
createModel(model, false);
|
|
fail("Shouldn't be able to create a model without namespace imports, when type and/or aspect have parent name.");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
// Expected
|
|
}
|
|
|
|
model.setName(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName);
|
|
model.createImport("http://www.alfresco.org/model/content/1.0", "cm");
|
|
|
|
CustomModelDefinition modelDefinition = createModel(model, false);
|
|
|
|
assertNotNull(modelDefinition);
|
|
assertEquals(modelName, modelDefinition.getName().getLocalName());
|
|
|
|
assertEquals(1, modelDefinition.getTypeDefinitions().size());
|
|
assertEquals(typeName, modelDefinition.getTypeDefinitions().iterator().next().getName().getLocalName());
|
|
assertEquals("cm:content", modelDefinition.getTypeDefinitions().iterator().next().getParentName().toPrefixString());
|
|
|
|
assertEquals(1, modelDefinition.getAspectDefinitions().size());
|
|
assertEquals(aspectName, modelDefinition.getAspectDefinitions().iterator().next().getName().getLocalName());
|
|
|
|
// list all custom models's types and aspects
|
|
{
|
|
try
|
|
{
|
|
customModelService.getAllCustomTypes(null);
|
|
fail("Should have thrown IllegalArgumentException as PagingRequest was null.");
|
|
}
|
|
catch (IllegalArgumentException e)
|
|
{
|
|
// Expected
|
|
}
|
|
try
|
|
{
|
|
customModelService.getAllCustomAspects(null);
|
|
fail("Should have thrown IllegalArgumentException as PagingRequest was null.");
|
|
}
|
|
catch (IllegalArgumentException e)
|
|
{
|
|
// Expected
|
|
}
|
|
final PagingRequest pagingRequest = new PagingRequest(0, Integer.MAX_VALUE);
|
|
PagingResults<TypeDefinition> allTypes = transactionHelper.doInTransaction(new RetryingTransactionCallback<PagingResults<TypeDefinition>>()
|
|
{
|
|
public PagingResults<TypeDefinition> execute() throws Exception
|
|
{
|
|
return customModelService.getAllCustomTypes(pagingRequest);
|
|
}
|
|
});
|
|
assertTrue(allTypes.getTotalResultCount().getFirst() >= 1);
|
|
|
|
PagingResults<AspectDefinition> allAspects = transactionHelper.doInTransaction(new RetryingTransactionCallback<PagingResults<AspectDefinition>>()
|
|
{
|
|
public PagingResults<AspectDefinition> execute() throws Exception
|
|
{
|
|
return customModelService.getAllCustomAspects(pagingRequest);
|
|
}
|
|
});
|
|
assertTrue(allAspects.getTotalResultCount().getFirst() >= 1);
|
|
}
|
|
|
|
// Retrieve the aspect by the aspect QName
|
|
QName aspectQName = QName.createQName("{" + namespacePair.getFirst() + "}" + aspectName);
|
|
AspectDefinition aspectDefinition = customModelService.getCustomAspect(aspectQName);
|
|
assertNotNull(aspectDefinition);
|
|
assertEquals(1, getModel(modelName).getAspectDefinitions().size());
|
|
|
|
// Retrieve the type by the type QName
|
|
QName typeQName = QName.createQName("{" + namespacePair.getFirst()+ "}" + typeName);
|
|
TypeDefinition typeDefinition = customModelService.getCustomType(typeQName);
|
|
assertNotNull(typeDefinition);
|
|
assertEquals(1, getModel(modelName).getTypeDefinitions().size());
|
|
|
|
// Test update model by adding an aspect
|
|
String aspectName2 = "testMarkerAspect2";
|
|
model.createAspect(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + aspectName2);
|
|
updateModel(modelName, model, false);
|
|
|
|
// Retrieve the created aspect
|
|
aspectQName = QName.createQName("{" + namespacePair.getFirst() + "}" + aspectName2);
|
|
aspectDefinition = customModelService.getCustomAspect(aspectQName);
|
|
assertNotNull(aspectDefinition);
|
|
assertEquals(aspectQName, aspectDefinition.getName());
|
|
assertEquals(2, getModel(modelName).getAspectDefinitions().size());
|
|
|
|
// Test update model by adding a type
|
|
String typeName2 = "testType2";
|
|
model.createType(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + typeName2);
|
|
updateModel(modelName, model, false);
|
|
|
|
// Retrieve the created type
|
|
typeQName = QName.createQName("{" + namespacePair.getFirst() + "}" + typeName2);
|
|
typeDefinition = customModelService.getCustomType(typeQName);
|
|
assertNotNull(typeDefinition);
|
|
assertEquals(typeQName, typeDefinition.getName());
|
|
assertEquals(2, getModel(modelName).getTypeDefinitions().size());
|
|
|
|
{
|
|
// Create an aspect with an identical name as an already defined
|
|
// type name within this model
|
|
model.createAspect(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + typeName);
|
|
try
|
|
{
|
|
updateModel(modelName, model, false);
|
|
fail("Shouldn't be able to create a type and an aspect with the same name in a model.");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
// Expected
|
|
}
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testDeactivateModel() throws Exception
|
|
{
|
|
final String modelName = makeUniqueName("testDeactivateCustomModel");
|
|
final String desc = "This is test custom model desc";
|
|
|
|
Pair<String, String> namespacePair = getTestNamespacePrefixPair();
|
|
final M2Model model = M2Model.createModel(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName);
|
|
model.createNamespace(namespacePair.getFirst(), namespacePair.getSecond());
|
|
model.setDescription(desc);
|
|
model.setAuthor("John Doe");
|
|
|
|
// Create the model
|
|
CustomModelDefinition modelDefinition = createModel(model, true);
|
|
assertNotNull(modelDefinition);
|
|
assertEquals(modelName, modelDefinition.getName().getLocalName());
|
|
assertTrue(modelDefinition.isActive());
|
|
|
|
// Deactivate the model
|
|
customModelService.deactivateCustomModel(modelName);
|
|
|
|
// Retrieve the model
|
|
modelDefinition = transactionHelper.doInTransaction(new RetryingTransactionCallback<CustomModelDefinition>()
|
|
{
|
|
public CustomModelDefinition execute() throws Exception
|
|
{
|
|
return customModelService.getCustomModel(modelName);
|
|
}
|
|
});
|
|
|
|
assertNotNull(modelDefinition);
|
|
assertEquals(modelName, modelDefinition.getName().getLocalName());
|
|
assertFalse(modelDefinition.isActive());
|
|
|
|
// Try to deactivate the model again
|
|
try
|
|
{
|
|
customModelService.deactivateCustomModel(modelName);
|
|
fail("Shouldn't be able to deactivate an already deactivated model.");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
// Expected
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testDeleteModel() throws Exception
|
|
{
|
|
final String modelName = makeUniqueName("testDeleteCustomModel");
|
|
|
|
Pair<String, String> namespacePair = getTestNamespacePrefixPair();
|
|
final M2Model model = M2Model.createModel(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName);
|
|
model.createNamespace(namespacePair.getFirst(), namespacePair.getSecond());
|
|
model.setAuthor("John Doe");
|
|
|
|
// Create the model
|
|
CustomModelDefinition modelDefinition = createModel(model, false);
|
|
assertNotNull(modelDefinition);
|
|
assertEquals(modelName, modelDefinition.getName().getLocalName());
|
|
assertFalse(modelDefinition.isActive());
|
|
|
|
transactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
|
|
{
|
|
public Void execute() throws Exception
|
|
{
|
|
// delete non-existing model
|
|
try
|
|
{
|
|
customModelService.deleteCustomModel(modelName + "someModel");
|
|
fail("Should have thrown ModelDoesNotExistException.");
|
|
}
|
|
catch (ModelDoesNotExistException ex)
|
|
{
|
|
// Expected
|
|
}
|
|
return null;
|
|
}
|
|
});
|
|
|
|
transactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
|
|
{
|
|
public Void execute() throws Exception
|
|
{
|
|
// Activate the model
|
|
customModelService.activateCustomModel(modelName);
|
|
return null;
|
|
}
|
|
});
|
|
|
|
// delete an active model
|
|
try
|
|
{
|
|
customModelService.deleteCustomModel(modelName);
|
|
fail("Shouldn't be able to delete an active model.");
|
|
}
|
|
catch (ActiveModelConstraintException ex)
|
|
{
|
|
// Expected
|
|
}
|
|
|
|
// Deactivate the model
|
|
customModelService.deactivateCustomModel(modelName);
|
|
|
|
transactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
|
|
{
|
|
public Void execute() throws Exception
|
|
{
|
|
customModelService.deleteCustomModel(modelName);
|
|
return null;
|
|
}
|
|
});
|
|
|
|
modelDefinition = getModel(modelName);
|
|
assertNull(modelDefinition);
|
|
}
|
|
|
|
@Test
|
|
public void testUpdateModel() throws Exception
|
|
{
|
|
final String modelName = makeUniqueName("testUpdateCustomModel");
|
|
final String desc = "This is test custom model desc";
|
|
|
|
Pair<String, String> namespacePair = getTestNamespacePrefixPair();
|
|
M2Model model = M2Model.createModel(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName);
|
|
model.createNamespace(namespacePair.getFirst(), namespacePair.getSecond());
|
|
model.setDescription(desc);
|
|
model.setAuthor("John Doe");
|
|
// Add aspect
|
|
String aspectName = "testMarkerAspect";
|
|
model.createAspect(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + aspectName);
|
|
|
|
// Create the model
|
|
CustomModelDefinition modelDefinition = createModel(model, false);
|
|
assertNotNull(modelDefinition);
|
|
assertEquals(modelName, modelDefinition.getName().getLocalName());
|
|
assertFalse(modelDefinition.isActive());
|
|
NamespaceDefinition namespaceDefinition = modelDefinition.getNamespaces().iterator().next();
|
|
assertEquals(namespacePair.getFirst(), namespaceDefinition.getUri());
|
|
assertEquals(namespacePair.getSecond(), namespaceDefinition.getPrefix());
|
|
assertEquals(desc, modelDefinition.getDescription());
|
|
assertEquals("John Doe", modelDefinition.getAuthor());
|
|
assertEquals(1, modelDefinition.getAspectDefinitions().size());
|
|
|
|
// Update the model by removing the namespace
|
|
model.removeNamespace(namespacePair.getFirst());
|
|
try
|
|
{
|
|
updateModel(modelName, model, false);
|
|
fail("Shouldn't be able to update a custom model with an empty namespace.");
|
|
}
|
|
catch (InvalidNamespaceException ex)
|
|
{
|
|
// Expected
|
|
}
|
|
|
|
// Update the model by removing the namespace prefix
|
|
model.createNamespace(namespacePair.getFirst(), null);
|
|
try
|
|
{
|
|
updateModel(modelName, model, false);
|
|
fail("Model validation should have failed, as the namespace prefix is null.");
|
|
}
|
|
catch (IllegalArgumentException ex)
|
|
{
|
|
// Expected
|
|
}
|
|
|
|
// Update the model by adding more namespace URIs
|
|
model.createNamespace("http://www.alfresco.org/model/contenttest/1.0", namespacePair.getSecond());
|
|
try
|
|
{
|
|
updateModel(modelName, model, false);
|
|
fail("Shouldn't be able to add more than one namespace URI into a custom model.");
|
|
}
|
|
catch (InvalidNamespaceException ex)
|
|
{
|
|
// Expected
|
|
}
|
|
|
|
// Update the namespace with a URI that has already been used
|
|
model.removeNamespace(namespacePair.getFirst());
|
|
model.removeNamespace("http://www.alfresco.org/model/contenttest/1.0");
|
|
model.createNamespace("http://www.alfresco.org/model/content/1.0", namespacePair.getSecond());
|
|
try
|
|
{
|
|
updateModel(modelName, model, false);
|
|
fail("Shouldn't be able to update a model with an already in-use namespace URI.");
|
|
}
|
|
catch (NamespaceConstraintException ex)
|
|
{
|
|
// Expected
|
|
}
|
|
|
|
// Update the namespace with a Prefix that has already been used
|
|
model.removeNamespace("http://www.alfresco.org/model/content/1.0");
|
|
model.createNamespace(namespacePair.getFirst(), "cm");
|
|
try
|
|
{
|
|
updateModel(modelName, model, false);
|
|
fail("Shouldn't be able to update a model with an already in-use namespace Prefix.");
|
|
}
|
|
catch (NamespaceConstraintException ex)
|
|
{
|
|
// Expected
|
|
}
|
|
|
|
// New namespace
|
|
Pair<String, String> newNamespacePair = getTestNamespacePrefixPair();
|
|
model = M2Model.createModel(newNamespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName);
|
|
model.createNamespace(newNamespacePair.getFirst(), newNamespacePair.getSecond());
|
|
model.setDescription(desc);
|
|
// Update non-existing model
|
|
try
|
|
{
|
|
updateModel(modelName + "non-existing model", model, false);
|
|
fail("Should have thrown ModelDoesNotExistException.");
|
|
}
|
|
catch (ModelDoesNotExistException ex)
|
|
{
|
|
// Expected
|
|
}
|
|
modelDefinition = updateModel(modelName, model, false);
|
|
namespaceDefinition = modelDefinition.getNamespaces().iterator().next();
|
|
assertEquals(newNamespacePair.getFirst(), namespaceDefinition.getUri());
|
|
assertEquals(newNamespacePair.getSecond(), namespaceDefinition.getPrefix());
|
|
assertEquals(desc, modelDefinition.getDescription());
|
|
assertNull(modelDefinition.getAuthor());
|
|
assertEquals(0, modelDefinition.getAspectDefinitions().size());
|
|
|
|
// Test that the cache is updated correctly. This means the cache should have removed the old namespace URI.
|
|
QName aspectQName = QName.createQName("{" + namespacePair.getFirst() + "}" + aspectName);
|
|
AspectDefinition aspectDefinition = customModelService.getCustomAspect(aspectQName);
|
|
assertNull(aspectDefinition);
|
|
|
|
transactionHelper.doInTransaction(new RetryingTransactionCallback<Void>()
|
|
{
|
|
public Void execute() throws Exception
|
|
{
|
|
// Activate the model
|
|
customModelService.activateCustomModel(modelName);
|
|
return null;
|
|
}
|
|
});
|
|
|
|
// Retrieve the model
|
|
modelDefinition = getModel(modelName);
|
|
assertNotNull(modelDefinition);
|
|
assertTrue(modelDefinition.isActive());
|
|
|
|
// Try to update only the namespace URI of an active model
|
|
Pair<String, String> activeModelNamespacePair = getTestNamespacePrefixPair();
|
|
model = M2Model.createModel(newNamespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName);
|
|
model.createNamespace(activeModelNamespacePair.getFirst(), newNamespacePair.getSecond());
|
|
try
|
|
{
|
|
updateModel(modelName, model, true); // true => as we activated the model
|
|
fail("Shouldn't be able to update the namespace URI of an active model.");
|
|
}
|
|
catch (ActiveModelConstraintException ax)
|
|
{
|
|
// Expected
|
|
}
|
|
|
|
// Try to update only the namespace prefix of an active model
|
|
activeModelNamespacePair = getTestNamespacePrefixPair();
|
|
model = M2Model.createModel(activeModelNamespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName);
|
|
model.createNamespace(newNamespacePair.getFirst(), activeModelNamespacePair.getSecond());
|
|
try
|
|
{
|
|
updateModel(modelName, model, true); // true => as we activated the model
|
|
fail("Shouldn't be able to update the namespace prefix of an active model.");
|
|
}
|
|
catch (ActiveModelConstraintException ax)
|
|
{
|
|
// Expected
|
|
}
|
|
|
|
// Try to update both the namespace URI and prefix of an active model
|
|
activeModelNamespacePair = getTestNamespacePrefixPair();
|
|
model = M2Model.createModel(activeModelNamespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName);
|
|
model.createNamespace(activeModelNamespacePair.getFirst(), activeModelNamespacePair.getSecond());
|
|
try
|
|
{
|
|
updateModel(modelName, model, true); // true => as we activated the model
|
|
fail("Shouldn't be able to update the namespace URI and namespace prefix of an active model.");
|
|
}
|
|
catch (ActiveModelConstraintException ax)
|
|
{
|
|
// Expected
|
|
}
|
|
|
|
// Update active model's desc and author
|
|
modelDefinition = getModel(modelName);
|
|
namespaceDefinition = modelDefinition.getNamespaces().iterator().next();
|
|
model = M2Model.createModel(namespaceDefinition.getPrefix() + QName.NAMESPACE_PREFIX + modelName);
|
|
model.createNamespace(namespaceDefinition.getUri(), namespaceDefinition.getPrefix());
|
|
model.setDescription(desc);
|
|
model.setAuthor("Admin Admin");
|
|
|
|
modelDefinition = updateModel(modelName, model, true);
|
|
assertEquals(modelName, modelDefinition.getName().getLocalName());
|
|
assertTrue(modelDefinition.isActive());
|
|
assertEquals(desc, modelDefinition.getDescription());
|
|
assertEquals("Admin Admin", modelDefinition.getAuthor());
|
|
|
|
}
|
|
|
|
@Test
|
|
public void testCreateDownload() throws Exception
|
|
{
|
|
final String modelName = makeUniqueName("testDownloadCustomModel");
|
|
final String modelExportFileName = modelName + ".xml";
|
|
final String shareExtExportFileName = "CMM_" + modelName + "_module.xml";
|
|
|
|
Pair<String, String> namespacePair = getTestNamespacePrefixPair();
|
|
M2Model model = M2Model.createModel(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName);
|
|
model.createNamespace(namespacePair.getFirst(), namespacePair.getSecond());
|
|
model.setAuthor("Admin");
|
|
model.createImport("http://www.alfresco.org/model/content/1.0", "cm");
|
|
|
|
// Add Type
|
|
String typeName = "testType";
|
|
M2Type m2Type = model.createType(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + typeName);
|
|
m2Type.setTitle("Test type title");
|
|
m2Type.setParentName("cm:content");
|
|
|
|
// Create the model
|
|
CustomModelDefinition modelDefinition = createModel(model, false);
|
|
|
|
assertNotNull(modelDefinition);
|
|
assertEquals(modelName, modelDefinition.getName().getLocalName());
|
|
|
|
NodeRef downloadNode = createDownload(modelName, false);
|
|
assertNotNull(downloadNode);
|
|
|
|
DownloadStatus status = cmmDownloadTestUtil.getDownloadStatus(downloadNode);
|
|
while (status.getStatus() == DownloadStatus.Status.PENDING)
|
|
{
|
|
Thread.sleep(PAUSE_TIME);
|
|
status = cmmDownloadTestUtil.getDownloadStatus(downloadNode);
|
|
}
|
|
|
|
Set<String> entries = cmmDownloadTestUtil.getDownloadEntries(downloadNode);
|
|
assertEquals(1, entries.size());
|
|
String modelEntry = cmmDownloadTestUtil.getDownloadEntry(entries, modelExportFileName);
|
|
assertNotNull(modelEntry);
|
|
assertEquals(modelEntry, modelExportFileName);
|
|
|
|
// Create Share extension module
|
|
cmmDownloadTestUtil.createShareExtModule(modelName);
|
|
|
|
downloadNode = createDownload(modelName, true);
|
|
assertNotNull(downloadNode);
|
|
|
|
status = cmmDownloadTestUtil.getDownloadStatus(downloadNode);
|
|
while (status.getStatus() == DownloadStatus.Status.PENDING)
|
|
{
|
|
Thread.sleep(PAUSE_TIME);
|
|
status = cmmDownloadTestUtil.getDownloadStatus(downloadNode);
|
|
}
|
|
|
|
entries = cmmDownloadTestUtil.getDownloadEntries(downloadNode);
|
|
assertEquals(2, entries.size());
|
|
|
|
modelEntry = cmmDownloadTestUtil.getDownloadEntry(entries, modelExportFileName);
|
|
assertNotNull(modelEntry);
|
|
assertEquals(modelEntry, modelExportFileName);
|
|
|
|
String shareExtEntry = cmmDownloadTestUtil.getDownloadEntry(entries, shareExtExportFileName);
|
|
assertNotNull(shareExtEntry);
|
|
assertEquals(shareExtEntry, shareExtExportFileName);
|
|
|
|
// Create Share extension module - this will override the existing module
|
|
cmmDownloadTestUtil.createShareExtModule(modelName + System.currentTimeMillis());
|
|
|
|
// The module id dose not exist, so the CMM service logs the error
|
|
// (warning) and creates a zip containing only the model.
|
|
downloadNode = createDownload(modelName, true);
|
|
assertNotNull(downloadNode);
|
|
|
|
status = cmmDownloadTestUtil.getDownloadStatus(downloadNode);
|
|
while (status.getStatus() == DownloadStatus.Status.PENDING)
|
|
{
|
|
Thread.sleep(PAUSE_TIME);
|
|
status = cmmDownloadTestUtil.getDownloadStatus(downloadNode);
|
|
}
|
|
|
|
entries = cmmDownloadTestUtil.getDownloadEntries(downloadNode);
|
|
assertEquals(1, entries.size());
|
|
modelEntry = cmmDownloadTestUtil.getDownloadEntry(entries, modelExportFileName);
|
|
assertNotNull(modelEntry);
|
|
assertEquals(modelEntry, modelExportFileName);
|
|
}
|
|
|
|
@Test
|
|
public void testModelsInfo() throws Exception
|
|
{
|
|
CustomModelsInfo info = transactionHelper.doInTransaction(new RetryingTransactionCallback<CustomModelsInfo>()
|
|
{
|
|
public CustomModelsInfo execute() throws Exception
|
|
{
|
|
return customModelService.getCustomModelsInfo();
|
|
}
|
|
});
|
|
|
|
final String modelName = makeUniqueName("testCustomModelsInfo");
|
|
Pair<String, String> namespacePair = getTestNamespacePrefixPair();
|
|
M2Model model = M2Model.createModel(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + modelName);
|
|
model.createNamespace(namespacePair.getFirst(), namespacePair.getSecond());
|
|
model.setAuthor("Admin");
|
|
model.createImport("http://www.alfresco.org/model/content/1.0", "cm");
|
|
|
|
// Add Type
|
|
String typeName = "testType";
|
|
M2Type m2Type = model.createType(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + typeName);
|
|
m2Type.setTitle("Test type title");
|
|
m2Type.setParentName("cm:content");
|
|
|
|
// Add Aspect
|
|
String aspectName = "testMarkerAspect";
|
|
model.createAspect(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + aspectName);
|
|
|
|
// Create the model
|
|
createModel(model, true);
|
|
|
|
CustomModelsInfo newInfo = transactionHelper.doInTransaction(new RetryingTransactionCallback<CustomModelsInfo>()
|
|
{
|
|
public CustomModelsInfo execute() throws Exception
|
|
{
|
|
return customModelService.getCustomModelsInfo();
|
|
}
|
|
});
|
|
|
|
assertEquals(info.getNumberOfActiveModels() + 1, newInfo.getNumberOfActiveModels());
|
|
assertEquals(info.getNumberOfActiveTypes() + 1, newInfo.getNumberOfActiveTypes());
|
|
assertEquals(info.getNumberOfActiveAspects() + 1, newInfo.getNumberOfActiveAspects());
|
|
|
|
// Add another aspect
|
|
String aspectNameTwo = "testMarkerAspectTwo";
|
|
model.createAspect(namespacePair.getSecond() + QName.NAMESPACE_PREFIX + aspectNameTwo);
|
|
// Update the model
|
|
updateModel(modelName, model, true);
|
|
|
|
// Get the models' info
|
|
newInfo = transactionHelper.doInTransaction(new RetryingTransactionCallback<CustomModelsInfo>()
|
|
{
|
|
public CustomModelsInfo execute() throws Exception
|
|
{
|
|
return customModelService.getCustomModelsInfo();
|
|
}
|
|
});
|
|
assertEquals(info.getNumberOfActiveModels() + 1, newInfo.getNumberOfActiveModels());
|
|
assertEquals(info.getNumberOfActiveTypes() + 1, newInfo.getNumberOfActiveTypes());
|
|
// 2 => we added two aspects
|
|
assertEquals(info.getNumberOfActiveAspects() + 2, newInfo.getNumberOfActiveAspects());
|
|
}
|
|
|
|
private Pair<String, String> getTestNamespacePrefixPair()
|
|
{
|
|
long timeMillis = System.currentTimeMillis();
|
|
String uri = "http://www.alfresco.org/model/testcmmservicenamespace" + timeMillis + "/1.0";
|
|
String prefix = "testcmmservice" + timeMillis;
|
|
|
|
return new Pair<String, String>(uri, prefix);
|
|
}
|
|
|
|
private String makeUniqueName(String modelName)
|
|
{
|
|
String name = modelName + System.currentTimeMillis();
|
|
modelNames.add(name);
|
|
|
|
return name;
|
|
}
|
|
|
|
private CustomModelDefinition createModel(final M2Model m2Model, final boolean activate)
|
|
{
|
|
return transactionHelper.doInTransaction(new RetryingTransactionCallback<CustomModelDefinition>()
|
|
{
|
|
public CustomModelDefinition execute() throws Exception
|
|
{
|
|
return customModelService.createCustomModel(m2Model, activate);
|
|
}
|
|
});
|
|
}
|
|
|
|
private CustomModelDefinition updateModel(final String modelName, final M2Model m2Model, final boolean activate)
|
|
{
|
|
return transactionHelper.doInTransaction(new RetryingTransactionCallback<CustomModelDefinition>()
|
|
{
|
|
public CustomModelDefinition execute() throws Exception
|
|
{
|
|
return customModelService.updateCustomModel(modelName, m2Model, activate);
|
|
}
|
|
});
|
|
}
|
|
|
|
private CustomModelDefinition getModel(final String modelName)
|
|
{
|
|
return transactionHelper.doInTransaction(new RetryingTransactionCallback<CustomModelDefinition>()
|
|
{
|
|
public CustomModelDefinition execute() throws Exception
|
|
{
|
|
return customModelService.getCustomModel(modelName);
|
|
}
|
|
});
|
|
}
|
|
|
|
private NodeRef createDownload(final String modelName, final boolean withShareExtModule)
|
|
{
|
|
return transactionHelper.doInTransaction(new RetryingTransactionCallback<NodeRef>()
|
|
{
|
|
public NodeRef execute() throws Exception
|
|
{
|
|
NodeRef nodeRef = customModelService.createDownloadNode(modelName, withShareExtModule);
|
|
return nodeRef;
|
|
}
|
|
});
|
|
}
|
|
}
|