diff --git a/config/alfresco/replication-services-context.xml b/config/alfresco/replication-services-context.xml
index 73a9ce3b55..43688a867b 100644
--- a/config/alfresco/replication-services-context.xml
+++ b/config/alfresco/replication-services-context.xml
@@ -82,6 +82,7 @@
{http://www.alfresco.org/model/content/1.0}folder
+
diff --git a/source/java/org/alfresco/repo/replication/ReplicationActionExecutor.java b/source/java/org/alfresco/repo/replication/ReplicationActionExecutor.java
index 8ecdcf7da3..1ba19fc4e7 100644
--- a/source/java/org/alfresco/repo/replication/ReplicationActionExecutor.java
+++ b/source/java/org/alfresco/repo/replication/ReplicationActionExecutor.java
@@ -37,6 +37,7 @@ import org.alfresco.service.cmr.action.ParameterDefinition;
import org.alfresco.service.cmr.replication.ReplicationDefinition;
import org.alfresco.service.cmr.replication.ReplicationServiceException;
import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.transfer.NodeCrawler;
import org.alfresco.service.cmr.transfer.NodeCrawlerFactory;
import org.alfresco.service.cmr.transfer.TransferCallback;
@@ -63,6 +64,7 @@ public class ReplicationActionExecutor extends ActionExecuterAbstractBase {
*/
private static Log logger = LogFactory.getLog(ReplicationActionExecutor.class);
+ private NodeService nodeService;
private JobLockService jobLockService;
private TransferService2 transferService;
private NodeCrawlerFactory nodeCrawlerFactory;
@@ -76,6 +78,16 @@ public class ReplicationActionExecutor extends ActionExecuterAbstractBase {
*/
private long replicationActionLockDuration = 30*60*1000;
+ /**
+ * Injects the NodeService bean.
+ *
+ * @param nodeService the NodeService.
+ */
+ public void setNodeService(NodeService nodeService)
+ {
+ this.nodeService = nodeService;
+ }
+
/**
* Injects the JobLockService bean.
*
@@ -167,9 +179,17 @@ public class ReplicationActionExecutor extends ActionExecuterAbstractBase {
ContentModel.TYPE_CONTENT
));
- for(NodeRef payload : replicationDef.getPayload()) {
- Set crawledNodes = crawler.crawl(payload);
- toTransfer.addAll(crawledNodes);
+ for(NodeRef payload : replicationDef.getPayload())
+ {
+ if(nodeService.exists(payload))
+ {
+ Set crawledNodes = crawler.crawl(payload);
+ toTransfer.addAll(crawledNodes);
+ }
+ else
+ {
+ logger.warn("Skipping replication of non-existant node " + payload);
+ }
}
return toTransfer;
diff --git a/source/java/org/alfresco/repo/replication/ReplicationServiceIntegrationTest.java b/source/java/org/alfresco/repo/replication/ReplicationServiceIntegrationTest.java
index 75b75d717e..877ee0faa8 100644
--- a/source/java/org/alfresco/repo/replication/ReplicationServiceIntegrationTest.java
+++ b/source/java/org/alfresco/repo/replication/ReplicationServiceIntegrationTest.java
@@ -116,6 +116,7 @@ public class ReplicationServiceIntegrationTest extends TestCase
private NodeRef content2a_1;
private NodeRef thumbnail2a_2; // Thumbnail extends content
private NodeRef zone2a_3; // Zone doesn't
+ private NodeRef deletedFolder;
private final String ACTION_NAME = "testName";
private final String ACTION_NAME2 = "testName2";
@@ -173,6 +174,9 @@ public class ReplicationServiceIntegrationTest extends TestCase
thumbnail2a_2 = makeNode(folder2a, ContentModel.TYPE_THUMBNAIL);
zone2a_3 = makeNode(folder2a, ContentModel.TYPE_ZONE);
+ deletedFolder = makeNode(repositoryHelper.getCompanyHome(), ContentModel.TYPE_FOLDER);
+ nodeService.deleteNode(deletedFolder);
+
// Tell the transfer service not to use HTTP
makeTransferServiceLocal();
@@ -558,6 +562,8 @@ public class ReplicationServiceIntegrationTest extends TestCase
rd = replicationService.createReplicationDefinition(ACTION_NAME, "Test");
rd.setTargetName(TRANSFER_TARGET);
rd.getPayload().add( folder1 );
+ // A deleted folder is fine, will be skipped
+ rd.getPayload().add( deletedFolder );
// Will execute without error
txn = transactionService.getUserTransaction();