From ca174bab71e2117e30a95be1c7a3beb5729e50ac Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Fri, 16 May 2014 16:34:47 +0000 Subject: [PATCH] Merged HEAD-BUG-FIX (4.3/Cloud) to HEAD (4.3/Cloud) 68535: Merged V4.2-BUG-FIX (4.2.3) to HEAD-BUG-FIX (4.3/Cloud) 68313: Merged V4.1-BUG-FIX (4.1.9) to V4.2-BUG-FIX (4.2.3) 68271: MNT-11348: Merged V4.1.1 (4.1.1.28) to V4.1-BUG-FIX (4.1.9) 67447: MNT-11057: Bug in replication process on Aliens. Ignore a node that has no invadedBy property value (has no alien aspect). Implemented unit-test. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@70415 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../repo/transfer/AlienProcessorImpl.java | 5 +- .../RepoTransferReceiverImplTest.java | 160 +++++++++++++++++- 2 files changed, 160 insertions(+), 5 deletions(-) diff --git a/source/java/org/alfresco/repo/transfer/AlienProcessorImpl.java b/source/java/org/alfresco/repo/transfer/AlienProcessorImpl.java index 24a387da09..4f859ff19b 100644 --- a/source/java/org/alfresco/repo/transfer/AlienProcessorImpl.java +++ b/source/java/org/alfresco/repo/transfer/AlienProcessorImpl.java @@ -153,8 +153,9 @@ public class AlienProcessorImpl implements AlienProcessor public void beforeDeleteAlien(NodeRef deletedNodeRef, ChildAssociationRef oldAssoc) { log.debug("before delete node - need to check for alien invaders"); - - Liststuff = (List)nodeService.getProperty(deletedNodeRef, TransferModel.PROP_INVADED_BY); + + Liststuff = (List)nodeService.getProperty(deletedNodeRef, TransferModel.PROP_INVADED_BY); + if (stuff == null) return; Vector exInvaders = new Vector(stuff); /** diff --git a/source/test-java/org/alfresco/repo/transfer/RepoTransferReceiverImplTest.java b/source/test-java/org/alfresco/repo/transfer/RepoTransferReceiverImplTest.java index 29fb399908..92b2e6d7a0 100644 --- a/source/test-java/org/alfresco/repo/transfer/RepoTransferReceiverImplTest.java +++ b/source/test-java/org/alfresco/repo/transfer/RepoTransferReceiverImplTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2013 Alfresco Software Limited. + * Copyright (C) 2009-2010 Alfresco Software Limited. * * This file is part of Alfresco * @@ -1289,6 +1289,150 @@ public class RepoTransferReceiverImplTest extends BaseAlfrescoSpringTest } } + + /** + * Test for fault raised as MNT-11057 + * (https://issues.alfresco.com/jira/browse/MNT-11057) Bug in replication process on Aliens. + * + * @throws Exception + */ + + public void testMNT11057() throws Exception + { + String folder1Name = "H1"; + String folder2Name = "H2"; + String folder3Name = "H3"; + + //Step 1 transfer from repo A (H1 -> H2) + setDefaultRollback(true); + startNewTransaction(); + + String transferIdA1 = receiver.start("transferFromRepoA1", true, receiver.getVersion()); + + TransferManifestNormalNode folder1A1 = createFolderNode(transferIdA1, folder1Name); + TransferManifestNormalNode folder2A1 = createFolderNode(transferIdA1, folder2Name); + TransferManifestNormalNode folder3A1 = createFolderNode(transferIdA1, folder3Name); + moveNode(folder2A1, folder1A1); + + List nodesA1 = new ArrayList(); + + nodesA1.add(folder1A1); + nodesA1.add(folder2A1); + + endTransaction(); + + this.setDefaultRollback(false); + startNewTransaction(); + try + { + String snapshot = createSnapshot(nodesA1, "repo A"); + log.debug(snapshot); + receiver.saveSnapshot(transferIdA1, new StringInputStream(snapshot, "UTF-8")); + + for (TransferManifestNode node : nodesA1) + { + receiver.saveContent(transferIdA1, node.getUuid(), new ByteArrayInputStream(dummyContentBytes)); + } + receiver.commit(transferIdA1); + + for (TransferManifestNode node : nodesA1) + { + assertTrue(nodeService.exists(node.getNodeRef())); + } + } + finally + { + receiver.end(transferIdA1); + endTransaction(); + } + + //Step 2 trasfer from repo B (H1 -> H3) + setDefaultRollback(true); + startNewTransaction(); + + String transferIdB1 = receiver.start("transferFromRepoB1", true, receiver.getVersion()); + + TransferManifestNormalNode folder1B1 = createFolderNode(transferIdB1, folder1Name); + TransferManifestNormalNode folder3B1 = createFolderNode(transferIdB1, folder3Name); + moveNode(folder3B1, folder1B1); + + List nodesB1 = new ArrayList(); + + nodesB1.add(folder1B1); + nodesB1.add(folder3B1); + + endTransaction(); + + this.setDefaultRollback(false); + startNewTransaction(); + try + { + String snapshot = createSnapshot(nodesB1, "repo B"); + log.debug(snapshot); + receiver.saveSnapshot(transferIdB1, new StringInputStream(snapshot, "UTF-8")); + + for (TransferManifestNode node : nodesB1) + { + receiver.saveContent(transferIdB1, node.getUuid(), new ByteArrayInputStream(dummyContentBytes)); + } + receiver.commit(transferIdB1); + } + finally + { + receiver.end(transferIdB1); + endTransaction(); + } + + assertTrue(nodeService.exists(folder1A1.getNodeRef())); + log.info("has Alien"); + log.info(nodeService.hasAspect(folder1A1.getNodeRef(), TransferModel.ASPECT_ALIEN)); + + assertTrue(nodeService.exists(folder2A1.getNodeRef())); + log.info("has Alien"); + assertFalse(nodeService.hasAspect(folder2A1.getNodeRef(), TransferModel.ASPECT_ALIEN)); + + assertFalse(nodeService.exists(folder1B1.getNodeRef())); + + assertTrue(nodeService.exists(folder3B1.getNodeRef())); + log.info("has Alien"); + assertTrue(nodeService.hasAspect(folder3B1.getNodeRef(), TransferModel.ASPECT_ALIEN)); + + startNewTransaction(); + + moveNode(folder3A1, folder1A1); + moveNode(folder2A1, folder3A1); + + nodesA1 = new ArrayList(); + + nodesA1.add(folder1A1); + nodesA1.add(folder3A1); + nodesA1.add(folder2A1); + + endTransaction(); + + + //Step 3 transfer from repo A again (H2 is moved to newly created H3 on A: H1 -> H3 -> H2) + startNewTransaction(); + try + { + String transferId = receiver.start("transferFromRepoA1Again", true, receiver.getVersion()); + String snapshot = createSnapshot(nodesA1, "repo A"); + log.debug(snapshot); + receiver.saveSnapshot(transferId, new StringInputStream(snapshot, "UTF-8")); + receiver.commit(transferId); + } + catch(Exception ex) + { + if(ex instanceof NullPointerException) + { + fail("Test of MNT-11057 failed: " + ex.getMessage()); + } + } + finally + { + endTransaction(); + } + } public void testAsyncCommit() throws Exception @@ -1458,6 +1602,11 @@ public class RepoTransferReceiverImplTest extends BaseAlfrescoSpringTest } private String createSnapshot(List nodes) throws Exception + { + return createSnapshot(nodes, "repo 1"); + } + + private String createSnapshot(List nodes, String repoID) throws Exception { XMLTransferManifestWriter manifestWriter = new XMLTransferManifestWriter(); StringWriter output = new StringWriter(); @@ -1465,7 +1614,7 @@ public class RepoTransferReceiverImplTest extends BaseAlfrescoSpringTest TransferManifestHeader header = new TransferManifestHeader(); header.setCreatedDate(new Date()); header.setNodeCount(nodes.size()); - header.setRepositoryId("repo 1"); + header.setRepositoryId(repoID); manifestWriter.writeTransferManifestHeader(header); for (TransferManifestNode node : nodes) { @@ -1517,6 +1666,11 @@ public class RepoTransferReceiverImplTest extends BaseAlfrescoSpringTest } private TransferManifestNormalNode createFolderNode(/*String transferId*/) throws Exception + { + return createFolderNode(transferId, null); + } + + private TransferManifestNormalNode createFolderNode(String transferId, String folderName) throws Exception { TransferManifestNormalNode node = new TransferManifestNormalNode(); String uuid = GUID.generate(); @@ -1535,7 +1689,7 @@ public class RepoTransferReceiverImplTest extends BaseAlfrescoSpringTest NodeRef guestHome = guestHomeResult.getNodeRef(0); NodeRef parentFolder = guestHome; - String nodeName = uuid + ".folder" + getNameSuffix(); + String nodeName = folderName == null ? uuid + ".folder" + getNameSuffix() : folderName; List parents = new ArrayList(); ChildAssociationRef primaryAssoc = new ChildAssociationRef(ContentModel.ASSOC_CONTAINS, parentFolder, QName