From 985138446cfaa3485ed43a124b02a21c497d900d Mon Sep 17 00:00:00 2001 From: David Caruana Date: Fri, 13 Jan 2006 16:01:38 +0000 Subject: [PATCH] Addition of Update Node import strategy git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2110 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../repo/importer/ImporterComponent.java | 60 +++++++++++++++++++ .../service/cmr/view/ImporterBinding.java | 2 +- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/source/java/org/alfresco/repo/importer/ImporterComponent.java b/source/java/org/alfresco/repo/importer/ImporterComponent.java index eefa2a056f..40668fa912 100644 --- a/source/java/org/alfresco/repo/importer/ImporterComponent.java +++ b/source/java/org/alfresco/repo/importer/ImporterComponent.java @@ -418,6 +418,10 @@ public class ImporterComponent { return new ReplaceExistingNodeImporterStrategy(); } + else if (uuidBinding.equals(UUID_BINDING.UPDATE_EXISTING)) + { + return new UpdateExistingNodeImporterStrategy(); + } else if (uuidBinding.equals(UUID_BINDING.THROW_ON_COLLISION)) { return new ThrowOnCollisionNodeImporterStrategy(); @@ -1121,6 +1125,62 @@ public class ImporterComponent return createNewStrategy.importNode(node); } } + + /** + * Import strategy where imported nodes are updated if a node with the same UUID + * already exists in the repository. + * + * Note: this will only allow incremental update of an existing node - it does not + * delete properties or associations. + */ + private class UpdateExistingNodeImporterStrategy implements NodeImporterStrategy + { + private NodeImporterStrategy createNewStrategy = new CreateNewNodeImporterStrategy(false); + + /* + * (non-Javadoc) + * @see org.alfresco.repo.importer.ImporterComponent.NodeImporterStrategy#importNode(org.alfresco.repo.importer.ImportNode) + */ + public NodeRef importNode(ImportNode node) + { + // replace existing node, if node to import has a UUID and an existing node of the same + // uuid already exists + String uuid = node.getUUID(); + if (uuid != null && uuid.length() > 0) + { + NodeRef existingNodeRef = new NodeRef(rootRef.getStoreRef(), uuid); + if (nodeService.exists(existingNodeRef)) + { + // do the update + Map existingProperties = nodeService.getProperties(existingNodeRef); + Map updateProperties = bindProperties(node); + existingProperties.putAll(updateProperties); + nodeService.setProperties(existingNodeRef, existingProperties); + + // Apply permissions + boolean inheritPermissions = node.getInheritPermissions(); + if (!inheritPermissions) + { + permissionService.setInheritParentPermissions(existingNodeRef, false); + } + List permissions = node.getAccessControlEntries(); + for (AccessPermission permission : permissions) + { + permissionService.setPermission(existingNodeRef, permission.getAuthority(), permission.getPermission(), permission.getAccessStatus().equals(AccessStatus.ALLOWED)); + } + + // report update + reportPropertySet(existingNodeRef, updateProperties); + reportPermissionSet(existingNodeRef, permissions); + + return existingNodeRef; + } + } + + // import as if a new node + return createNewStrategy.importNode(node); + } + } } /** diff --git a/source/java/org/alfresco/service/cmr/view/ImporterBinding.java b/source/java/org/alfresco/service/cmr/view/ImporterBinding.java index 6f79f100b5..8146a9d4d7 100644 --- a/source/java/org/alfresco/service/cmr/view/ImporterBinding.java +++ b/source/java/org/alfresco/service/cmr/view/ImporterBinding.java @@ -30,7 +30,7 @@ public interface ImporterBinding */ public enum UUID_BINDING { - CREATE_NEW, REMOVE_EXISTING, REPLACE_EXISTING, THROW_ON_COLLISION + CREATE_NEW, REMOVE_EXISTING, REPLACE_EXISTING, UPDATE_EXISTING, THROW_ON_COLLISION } /**