mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user