package org.alfresco.repo.dictionary;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.dictionary.DictionaryRepositoryBootstrap.RepositoryLocation;
import org.alfresco.repo.policy.BehaviourFilter;
import org.alfresco.repo.security.authentication.AuthenticationComponent;
import org.alfresco.service.cmr.dictionary.DictionaryException;
import org.alfresco.service.cmr.dictionary.ModelDefinition;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.BaseAlfrescoSpringTest;
public class DictionaryRepositoryBootstrapTest extends BaseAlfrescoSpringTest
{
public static final String TEMPLATE_MODEL_XML =
"" +
" {1}" +
" Alfresco" +
" 2005-05-30" +
" 1.0" +
" " +
" " +
" {2} " +
" " +
" " +
" " +
" " +
" " +
" " +
" Base" +
" The Base Type" +
" " +
" " +
" d:text" +
" " +
" " +
" " +
" " +
"";
/** Behaviour filter */
private BehaviourFilter behaviourFilter;
/** The bootstrap service */
private DictionaryRepositoryBootstrap bootstrap;
/** The search service */
private SearchService searchService;
/** The dictionary DAO */
private DictionaryDAO dictionaryDAO;
/** The transaction service */
private TransactionService transactionService;
/** The authentication service */
private AuthenticationComponent authenticationComponent;
/**
* @see org.springframework.test.AbstractTransactionalSpringContextTests#onSetUpInTransaction()
*/
@Override
protected void onSetUpInTransaction() throws Exception
{
super.onSetUpInTransaction();
// Get the behaviour filter and turn the behaviour off for the model type
this.behaviourFilter = (BehaviourFilter)this.applicationContext.getBean("policyBehaviourFilter");
this.behaviourFilter.disableBehaviour(ContentModel.TYPE_DICTIONARY_MODEL);
this.searchService = (SearchService)this.applicationContext.getBean("searchService");
this.dictionaryDAO = (DictionaryDAO)this.applicationContext.getBean("dictionaryDAO");
this.transactionService = (TransactionService)this.applicationContext.getBean("transactionComponent");
this.authenticationComponent = (AuthenticationComponent)this.applicationContext.getBean("authenticationComponent");
this.bootstrap = new DictionaryRepositoryBootstrap();
this.bootstrap.setContentService(this.contentService);
this.bootstrap.setSearchService(this.searchService);
this.bootstrap.setDictionaryDAO(this.dictionaryDAO);
this.bootstrap.setAuthenticationComponent(this.authenticationComponent);
this.bootstrap.setTransactionService(this.transactionService);
RepositoryLocation location = this.bootstrap.new RepositoryLocation();
location.setStoreProtocol(this.storeRef.getProtocol());
location.setStoreId(this.storeRef.getIdentifier());
// NOTE: we are not setting the path for now .. in doing so we are searching the whole dictionary
List locations = new ArrayList();
locations.add(location);
this.bootstrap.setRepositoryLocations(locations);
}
/**
* Test bootstrap
*/
public void testBootstrap()
{
createModelNode(
"http://www.alfresco.org/model/test2DictionaryBootstrapFromRepo/1.0",
"test2",
"testModel2",
" ",
"Test model two",
"base2",
"prop2");
createModelNode(
"http://www.alfresco.org/model/test3DictionaryBootstrapFromRepo/1.0",
"test3",
"testModel3",
" ",
"Test model three",
"base3",
"prop3");
createModelNode(
"http://www.alfresco.org/model/test1DictionaryBootstrapFromRepo/1.0",
"test1",
"testModel1",
"",
"Test model one",
"base1",
"prop1");
// Check that the model is not in the dictionary yet
try
{
this.dictionaryDAO.getModel(
QName.createQName("http://www.alfresco.org/model/test1DictionaryBootstrapFromRepo/1.0", "testModel1"));
fail("The model should not be there.");
}
catch (DictionaryException exception)
{
// Ignore since we where expecting this
}
// Now do the bootstrap
this.bootstrap.bootstrap();
// Check that the model is now there
ModelDefinition modelDefinition1 = this.dictionaryDAO.getModel(
QName.createQName("http://www.alfresco.org/model/test1DictionaryBootstrapFromRepo/1.0", "testModel1"));
assertNotNull(modelDefinition1);
ModelDefinition modelDefinition2 = this.dictionaryDAO.getModel(
QName.createQName("http://www.alfresco.org/model/test2DictionaryBootstrapFromRepo/1.0", "testModel2"));
assertNotNull(modelDefinition2);
ModelDefinition modelDefinition3 = this.dictionaryDAO.getModel(
QName.createQName("http://www.alfresco.org/model/test3DictionaryBootstrapFromRepo/1.0", "testModel3"));
assertNotNull(modelDefinition3);
}
/**
* Create model node
*
* @param uri
* @param prefix
* @param modelLocalName
* @param importStatement
* @param description
* @param typeName
* @param propertyName
* @return
*/
private NodeRef createModelNode(
String uri,
String prefix,
String modelLocalName,
String importStatement,
String description,
String typeName,
String propertyName)
{
// Create a model node
NodeRef model = this.nodeService.createNode(
this.rootNodeRef,
ContentModel.ASSOC_CHILDREN,
QName.createQName("{test}models"),
ContentModel.TYPE_DICTIONARY_MODEL).getChildRef();
ContentWriter contentWriter1 = this.contentService.getWriter(model, ContentModel.PROP_CONTENT, true);
contentWriter1.setEncoding("UTF-8");
contentWriter1.setMimetype(MimetypeMap.MIMETYPE_XML);
String modelOne = getModelString(
uri,
prefix,
modelLocalName,
importStatement,
description,
typeName,
propertyName);
contentWriter1.putContent(modelOne);
return model;
}
/**
*
* Gets the model string
*
* @param uri
* @param prefix
* @param modelLocalName
* @param importStatement
* @param description
* @param typeName
* @param propertyName
* @return
*/
private String getModelString(
String uri,
String prefix,
String modelLocalName,
String importStatement,
String description,
String typeName,
String propertyName)
{
return MessageFormat.format(
TEMPLATE_MODEL_XML,
new Object[]{
"'" + prefix +":" + modelLocalName + "'",
description,
importStatement,
"'" + uri + "'",
"'" + prefix + "'",
"'" + prefix + ":" + typeName + "'",
"'" + prefix + ":" + propertyName + "'"});
}
}