Merged V3.2 to HEAD

17620: Merged DEV_TEMPORARY to V3.2
      17599: Fix for ETHREEOH-3308: xf:switch cannot be used in repeating field type
   17634: Put back AVM concurrency checks (reverse r17405)
   17644: Fixed up some comments and added return value to in-txn recording of deleted nodes
   17647: Fixed read-only detection of ContentStoreCleaner
   17648: Merged DEV fixes for ETHREEOH-3473 and ETHREEOH-3454 - DB script and iBatis-related changes
   17649: Fixed problem after merge-in: ETHREEOH-3641: build 270: cannot install on PostgreSQL
   17652: Fix ETHREEOH-3376 - Reindexer failure: requires rollback (Cluster)
   17658: Removed failing concurrency test for split person cleanup
   17659: Merged V3.1 to V3.2
      17308: Fixed ETHREEOH-2310: Upgrade from 2.1 E Sp7 to 3.1.1 E build 225 - Duplicate alf_node_status entries detected
             Fixes ETHREEOH-3606 (same as CHK-10454)
   17661: Fixed DB2 iBatis problems related to http://issues.apache.org/jira/browse/IBATIS-536
   17666: ETHREEOH-3376 / ETHREEOH-3637 - reindexer failure in a cluster (dictionary repo bootstrap)
   17678: Follow-on to r17666 (for RM custom model)
   17685: Merged DEV_TEMPORARY to V3.2
      17676: ETHREEOH-3187: Creating Web Content based on Web Form with most elements-read-only/default failed
   17695: Temporarily comment-out testSubmitChangedAssets1
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /alfresco/BRANCHES/DEV/BELARUS/V3.2-2009_11_24:r17632,17636,17676
   Merged /alfresco/BRANCHES/DEV/BELARUS/V3.2-2009_11_09:r17599
   Merged /alfresco/BRANCHES/V3.1:r17308
   Merged /alfresco/BRANCHES/V3.2:r17620,17634,17644,17647-17649,17652,17658-17659,17661,17666,17678,17685,17695


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@18165 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2010-01-20 11:30:46 +00:00
parent 44041e845d
commit 5e86299377
17 changed files with 1329 additions and 1248 deletions

View File

@@ -26,25 +26,27 @@ package org.alfresco.repo.dictionary;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.i18n.MessageDeployer;
import org.alfresco.repo.i18n.MessageService;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.repo.tenant.TenantAdminService;
import org.alfresco.repo.tenant.TenantDeployer;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.search.SearchService;
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.springframework.extensions.surf.util.AbstractLifecycleBean;
import org.apache.commons.logging.Log;
@@ -71,9 +73,6 @@ public class DictionaryRepositoryBootstrap extends AbstractLifecycleBean impleme
/** Dictionary DAO */
private DictionaryDAO dictionaryDAO = null;
/** Search service */
private SearchService searchService;
/** The content service */
private ContentService contentService;
@@ -102,16 +101,6 @@ public class DictionaryRepositoryBootstrap extends AbstractLifecycleBean impleme
this.dictionaryDAO = dictionaryDAO;
}
/**
* Set the search search service
*
* @param searchService the search service
*/
public void setSearchService(SearchService searchService)
{
this.searchService = searchService;
}
/**
* Set the content service
*
@@ -224,11 +213,11 @@ public class DictionaryRepositoryBootstrap extends AbstractLifecycleBean impleme
public void onDictionaryInit()
{
if (this.repositoryModelsLocations != null)
{
{
Map<String, M2Model> modelMap = new HashMap<String, M2Model>();
// Register the models found in the repository
for (RepositoryLocation repositoryLocation : this.repositoryModelsLocations)
{
StoreRef storeRef = repositoryLocation.getStoreRef();
@@ -238,37 +227,36 @@ public class DictionaryRepositoryBootstrap extends AbstractLifecycleBean impleme
logger.warn("StoreRef '"+ storeRef+"' does not exist");
continue; // skip this location
}
if (repositoryLocation.getQueryLanguage().equals(SearchService.LANGUAGE_XPATH))
List<NodeRef> nodeRefs = null;
if (repositoryLocation.getQueryLanguage().equals(RepositoryLocation.LANGUAGE_PATH))
{
NodeRef rootNode = nodeService.getRootNode(storeRef);
nodeRefs = getNodes(storeRef, repositoryLocation, ContentModel.TYPE_DICTIONARY_MODEL);
List<NodeRef> nodeRefs = searchService.selectNodes(rootNode,
repositoryLocation.getXPathQueryStatement(ContentModel.TYPE_DICTIONARY_MODEL.getPrefixedQName(namespaceService)),
null,
namespaceService,
false);
for (NodeRef dictionaryModel : nodeRefs)
if (nodeRefs.size() > 0)
{
// Ignore if the node is a working copy or archived, or if its inactive
if (! (nodeService.hasAspect(dictionaryModel, ContentModel.ASPECT_WORKING_COPY) || nodeService.hasAspect(dictionaryModel, ContentModel.ASPECT_ARCHIVED)))
for (NodeRef dictionaryModel : nodeRefs)
{
Boolean isActive = (Boolean)nodeService.getProperty(dictionaryModel, ContentModel.PROP_MODEL_ACTIVE);
if ((isActive != null) && (isActive.booleanValue() == true))
// Ignore if the node is a working copy or archived, or if its inactive
if (! (nodeService.hasAspect(dictionaryModel, ContentModel.ASPECT_WORKING_COPY) || nodeService.hasAspect(dictionaryModel, ContentModel.ASPECT_ARCHIVED)))
{
M2Model model = createM2Model(dictionaryModel);
if (model != null)
Boolean isActive = (Boolean)nodeService.getProperty(dictionaryModel, ContentModel.PROP_MODEL_ACTIVE);
if ((isActive != null) && (isActive.booleanValue() == true))
{
if (logger.isTraceEnabled())
M2Model model = createM2Model(dictionaryModel);
if (model != null)
{
logger.trace("onDictionaryInit: "+model.getName()+" ("+dictionaryModel+")");
}
for (M2Namespace namespace : model.getNamespaces())
{
modelMap.put(namespace.getUri(), model);
if (logger.isTraceEnabled())
{
logger.trace("onDictionaryInit: "+model.getName()+" ("+dictionaryModel+")");
}
for (M2Namespace namespace : model.getNamespaces())
{
modelMap.put(namespace.getUri(), model);
}
}
}
}
@@ -277,10 +265,10 @@ public class DictionaryRepositoryBootstrap extends AbstractLifecycleBean impleme
}
else
{
logger.error("Unsupported query language for models location: " + repositoryLocation.getQueryLanguage());
logger.error("Unsupported query language for models location: " + repositoryLocation.getQueryLanguage());
}
}
// Load the models ensuring that they are loaded in the correct order
List<String> loadedModels = new ArrayList<String>();
for (Map.Entry<String, M2Model> entry : modelMap.entrySet())
@@ -312,7 +300,7 @@ public class DictionaryRepositoryBootstrap extends AbstractLifecycleBean impleme
{
// Register the messages found in the repository
for (RepositoryLocation repositoryLocation : this.repositoryMessagesLocations)
{
{
StoreRef storeRef = repositoryLocation.getStoreRef();
if (! nodeService.exists(storeRef))
@@ -321,39 +309,64 @@ public class DictionaryRepositoryBootstrap extends AbstractLifecycleBean impleme
continue; // skip this location
}
if (repositoryLocation.getQueryLanguage().equals(SearchService.LANGUAGE_XPATH))
if (repositoryLocation.getQueryLanguage().equals(RepositoryLocation.LANGUAGE_PATH))
{
NodeRef rootNode = nodeService.getRootNode(storeRef);
List<NodeRef> nodeRefs = getNodes(storeRef, repositoryLocation, ContentModel.TYPE_CONTENT);
List<NodeRef> nodeRefs = searchService.selectNodes(rootNode,
repositoryLocation.getXPathQueryStatement(ContentModel.TYPE_CONTENT.getPrefixedQName(namespaceService)),
null,
namespaceService,
false);
List<String> resourceBundleBaseNames = new ArrayList<String>();
for (NodeRef messageResource : nodeRefs)
if (nodeRefs.size() > 0)
{
String resourceName = (String) nodeService.getProperty(
messageResource, ContentModel.PROP_NAME);
List<String> resourceBundleBaseNames = new ArrayList<String>();
String bundleBaseName = messageService.getBaseBundleName(resourceName);
if (!resourceBundleBaseNames.contains(bundleBaseName))
for (NodeRef messageResource : nodeRefs)
{
resourceBundleBaseNames.add(bundleBaseName);
String resourceName = (String) nodeService.getProperty(messageResource, ContentModel.PROP_NAME);
String bundleBaseName = messageService.getBaseBundleName(resourceName);
if (!resourceBundleBaseNames.contains(bundleBaseName))
{
resourceBundleBaseNames.add(bundleBaseName);
}
}
}
}
else
{
logger.error("Unsupported query language for messages location: " + repositoryLocation.getQueryLanguage());
logger.error("Unsupported query language for messages location: " + repositoryLocation.getQueryLanguage());
}
}
}
}
protected List<NodeRef> getNodes(StoreRef storeRef, RepositoryLocation repositoryLocation, QName nodeType)
{
List<NodeRef> nodeRefs = new ArrayList<NodeRef>();
NodeRef rootNodeRef = nodeService.getRootNode(storeRef);
String[] pathElements = repositoryLocation.getPathElements();
NodeRef folderNodeRef = rootNodeRef;
if (pathElements.length > 0)
{
folderNodeRef = resolveQNameFolderPath(rootNodeRef, pathElements);
}
Set<QName> types = new HashSet<QName>(1);
types.add(nodeType);
List<ChildAssociationRef> childAssocRefs = nodeService.getChildAssocs(folderNodeRef, types);
if (childAssocRefs.size() > 0)
{
nodeRefs = new ArrayList<NodeRef>(childAssocRefs.size());
for (ChildAssociationRef childAssocRef : childAssocRefs)
{
nodeRefs.add(childAssocRef.getChildRef());
}
}
return nodeRefs;
}
/**
* Loads a model (and its dependents) if it does not exist in the list of loaded models.
*
@@ -468,4 +481,25 @@ public class DictionaryRepositoryBootstrap extends AbstractLifecycleBean impleme
tenantAdminService.unregister(messageService);
}
}
protected NodeRef resolveQNameFolderPath(NodeRef rootNodeRef, String[] pathQNames)
{
if (pathQNames.length == 0)
{
throw new IllegalArgumentException("Path array is empty");
}
// walk the folder tree
NodeRef parentNodeRef = rootNodeRef;
for (int i = 0; i < pathQNames.length; i++)
{
String pathQName = pathQNames[i];
List<ChildAssociationRef> childAssocRefs = nodeService.getChildAssocs(parentNodeRef, RegexQNamePattern.MATCH_ALL, QName.createQName(pathQName, namespaceService));
if (childAssocRefs.size() != 1)
{
return null;
}
parentNodeRef = childAssocRefs.get(0).getChildRef();
}
return parentNodeRef;
}
}