From 3129923af707252c28253117f903b7d19c89f50d Mon Sep 17 00:00:00 2001 From: David Caruana Date: Tue, 31 Jan 2006 18:52:25 +0000 Subject: [PATCH] Fix AR-378 - Items with multiple categories export successfully but when imported, only one category is set. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2269 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../repo/importer/ImporterComponent.java | 168 +++++++++++------- 1 file changed, 107 insertions(+), 61 deletions(-) diff --git a/source/java/org/alfresco/repo/importer/ImporterComponent.java b/source/java/org/alfresco/repo/importer/ImporterComponent.java index 84ca2b6ae4..fd5b5543e5 100644 --- a/source/java/org/alfresco/repo/importer/ImporterComponent.java +++ b/source/java/org/alfresco/repo/importer/ImporterComponent.java @@ -644,66 +644,36 @@ public class ImporterComponent // Bind all node references to destination space for (ImportedNodeRef importedRef : nodeRefs) { - // Resolve path to node reference - NodeRef nodeRef = null; - - if (importedRef.value.startsWith("/")) + Serializable refProperty = null; + if (importedRef.value != null) { - // resolve absolute path - SearchParameters searchParameters = new SearchParameters(); - searchParameters.addStore(importedRef.context.getNodeRef().getStoreRef()); - searchParameters.setLanguage(SearchService.LANGUAGE_LUCENE); - searchParameters.setQuery("PATH:\"" + importedRef.value + "\""); - searchParameters.excludeDataInTheCurrentTransaction((binding == null) ? true : !binding.allowReferenceWithinTransaction()); - ResultSet resultSet = searchService.query(searchParameters); - try + if (importedRef.value instanceof Collection) { - if (resultSet.length() > 0) + Collection unresolvedRefs = (Collection)importedRef.value; + List resolvedRefs = new ArrayList(unresolvedRefs.size()); + for (String unresolvedRef : unresolvedRefs) { - nodeRef = resultSet.getNodeRef(0); - } - } - finally - { - resultSet.close(); - } - } - else - { - // resolve relative path - try - { - List nodeRefs = searchService.selectNodes(importedRef.context.getNodeRef(), importedRef.value, null, namespaceService, false); - if (nodeRefs.size() > 0) - { - nodeRef = nodeRefs.get(0); - } - } - catch(XPathException e) - { - // attempt to resolve as a node reference - try - { - NodeRef directRef = new NodeRef(importedRef.value); - if (nodeService.exists(directRef)) + NodeRef nodeRef = resolveImportedNodeRef(importedRef.context.getNodeRef(), unresolvedRef); + if (nodeRef == null) { - nodeRef = directRef; + // TODO: Probably need an alternative mechanism here e.g. report warning + throw new ImporterException("Failed to find item referenced (in property " + importedRef.property + ") as " + importedRef.value); } + resolvedRefs.add(nodeRef); } - catch(AlfrescoRuntimeException e1) + refProperty = (Serializable)resolvedRefs; + } + else + { + refProperty = resolveImportedNodeRef(importedRef.context.getNodeRef(), (String)importedRef.value); + if (refProperty == null) { - // Note: Invalid reference format + // TODO: Probably need an alternative mechanism here e.g. report warning + throw new ImporterException("Failed to find item referenced (in property " + importedRef.property + ") as " + importedRef.value); } } } - // check that reference could be bound - if (nodeRef == null) - { - // TODO: Probably need an alternative mechanism here e.g. report warning - throw new ImporterException("Failed to find item referenced as " + importedRef.value); - } - // Set node reference on source node Set disabledBehaviours = getDisabledBehaviours(importedRef.context); try @@ -712,7 +682,11 @@ public class ImporterComponent { behaviourFilter.disableBehaviour(importedRef.context.getNodeRef(), disabledBehaviour); } - nodeService.setProperty(importedRef.context.getNodeRef(), importedRef.property, nodeRef); + nodeService.setProperty(importedRef.context.getNodeRef(), importedRef.property, refProperty); + if (progress != null) + { + progress.propertySet(importedRef.context.getNodeRef(), importedRef.property, refProperty); + } } finally { @@ -912,7 +886,19 @@ public class ImporterComponent { value = bindValue(context, property, valueDataType, (String)value); } - boundProperties.put(property, value); + + // choose to provide property on node creation or at end of import for lazy binding + if (valueDataType != null && (valueDataType.getName().equals(DataTypeDefinition.NODE_REF) || valueDataType.getName().equals(DataTypeDefinition.CATEGORY))) + { + // record node reference for end-of-import binding + ImportedNodeRef importedRef = new ImportedNodeRef(context, property, value); + nodeRefs.add(importedRef); + } + else + { + // property ready to be set on Node creation / update + boundProperties.put(property, value); + } } return boundProperties; @@ -931,24 +917,84 @@ public class ImporterComponent if (value != null && valueType != null) { String strValue = bindPlaceHolder(value, binding); - if (valueType.getName().equals(DataTypeDefinition.NODE_REF) || valueType.getName().equals(DataTypeDefinition.CATEGORY)) + if ((valueType.getName().equals(DataTypeDefinition.NODE_REF) || valueType.getName().equals(DataTypeDefinition.CATEGORY))) { - if (value.length() > 0) - { - // record node reference for end-of-import binding - ImportedNodeRef importedRef = new ImportedNodeRef(context, property, strValue); - nodeRefs.add(importedRef); - objValue = new NodeRef(rootRef.getStoreRef(), "unresolved reference"); - } + objValue = strValue; } else { objValue = (Serializable)DefaultTypeConverter.INSTANCE.convert(valueType, strValue); } + } return objValue; } + /** + * Resolve imported reference relative to specified node + * + * @param sourceNodeRef context to resolve within + * @param importedRef reference to resolve + * @return + */ + private NodeRef resolveImportedNodeRef(NodeRef sourceNodeRef, String importedRef) + { + // Resolve path to node reference + NodeRef nodeRef = null; + + if (importedRef.startsWith("/")) + { + // resolve absolute path + SearchParameters searchParameters = new SearchParameters(); + searchParameters.addStore(sourceNodeRef.getStoreRef()); + searchParameters.setLanguage(SearchService.LANGUAGE_LUCENE); + searchParameters.setQuery("PATH:\"" + importedRef + "\""); + searchParameters.excludeDataInTheCurrentTransaction((binding == null) ? true : !binding.allowReferenceWithinTransaction()); + ResultSet resultSet = searchService.query(searchParameters); + try + { + if (resultSet.length() > 0) + { + nodeRef = resultSet.getNodeRef(0); + } + } + finally + { + resultSet.close(); + } + } + else + { + // resolve relative path + try + { + List nodeRefs = searchService.selectNodes(sourceNodeRef, importedRef, null, namespaceService, false); + if (nodeRefs.size() > 0) + { + nodeRef = nodeRefs.get(0); + } + } + catch(XPathException e) + { + // attempt to resolve as a node reference + try + { + NodeRef directRef = new NodeRef(importedRef); + if (nodeService.exists(directRef)) + { + nodeRef = directRef; + } + } + catch(AlfrescoRuntimeException e1) + { + // Note: Invalid reference format + } + } + } + + return nodeRef; + } + /** * Helper to report start of import */ @@ -1366,7 +1412,7 @@ public class ImporterComponent * @param property * @param value */ - private ImportedNodeRef(ImportNode context, QName property, String value) + private ImportedNodeRef(ImportNode context, QName property, Serializable value) { this.context = context; this.property = property; @@ -1375,7 +1421,7 @@ public class ImporterComponent private ImportNode context; private QName property; - private String value; + private Serializable value; } /**