From edd333a0294fc83d29e3d063e7d1657a3e40a4a4 Mon Sep 17 00:00:00 2001 From: Britt Park Date: Wed, 11 Jul 2007 21:03:48 +0000 Subject: [PATCH] Deployment stuff. Filesystem deployment can now run a given java class, or external program on commit. Changed signatures of DeploymentService methods to take a NameMatcher to act as an exclusion filter for deployment. This works for filesystem deployment but isn't in place for alfresco->alfresco deployment. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@6214 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org/alfresco/repo/avm/AVMServiceTest.java | 16 ++-- .../avm/actions/AVMDeploySnapshotAction.java | 8 +- .../repo/deploy/DeploymentServiceImpl.java | 75 ++++++++++++++----- .../repo/deploy/FSDeploymentTest.java | 23 ++++-- .../cmr/avm/deploy/DeploymentService.java | 4 + 5 files changed, 91 insertions(+), 35 deletions(-) diff --git a/source/java/org/alfresco/repo/avm/AVMServiceTest.java b/source/java/org/alfresco/repo/avm/AVMServiceTest.java index 6a444ae2e7..b9ba7746a1 100644 --- a/source/java/org/alfresco/repo/avm/AVMServiceTest.java +++ b/source/java/org/alfresco/repo/avm/AVMServiceTest.java @@ -487,7 +487,7 @@ public class AVMServiceTest extends AVMServiceTestBase // TestDeploymentCallback callback = new TestDeploymentCallback(); fService.createStore("target"); DeploymentReport report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", - "target:/a", false, false, false, null); + "target:/a", null, false, false, false, null); runQueriesAgainstBasicTreeWithAOnly("target"); System.out.println(report); assertEquals(fService.lookup(-1, "main:/a/b/c/foo").getGuid(), fService.lookup(-1, "target:/a/b/c/foo") @@ -498,39 +498,39 @@ public class AVMServiceTest extends AVMServiceTestBase ContentData dstCD = fService.getContentDataForRead(-1, "target:/a/b/c/foo"); assertEquals(srcCD.getMimetype(), dstCD.getMimetype()); fService.createFile("main:/a/b", "biz").close(); - report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", + report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", null, false, false, true, null); // Nothing was done runQueriesAgainstBasicTreeWithAOnly("target"); System.out.println(report); System.out.println(recursiveList("target", -1, true)); assertNull(fService.lookup(-1, "target:/a/b/biz")); - report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", + report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", null, false, false, false, null); System.out.println(report); runQueriesForCreateAndDeploy("target"); assertEquals(fService.lookup(-1, "main:/a/b/biz").getGuid(), fService.lookup(-1, "target:/a/b/biz") .getGuid()); fService.removeNode("main:/a/b/c/foo"); - report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", + report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", null, false, true, false, null); runQueriesForCreateAndDeploy("target"); System.out.println(report); assertNotNull(fService.lookup(-1, "target:/a/b/c/foo")); - report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", + report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", null, false, false, false, null); System.out.println(report); runQueriesForRemoveAndDelpoy("target"); assertNull(fService.lookup(-1, "target:/a/b/c/foo")); fService.removeNode("main:/a/b/c/bar"); fService.createDirectory("main:/a/b/c", "bar"); - report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", + report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", null, false, false, false, null); System.out.println(report); runQueriesForRemoveFileAndCreateDirectoryAndDeploy("target"); - report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", + report = depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target:/a", null, false, false, false, null); - depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target2:/wiggly/diggly", + depService.deployDifference(-1, "main:/a", "localhost", 50500, "admin", "admin", "target2:/wiggly/diggly", null, true, false, false, null); System.out.println(report); } diff --git a/source/java/org/alfresco/repo/avm/actions/AVMDeploySnapshotAction.java b/source/java/org/alfresco/repo/avm/actions/AVMDeploySnapshotAction.java index 2540b06a5c..5080824fc6 100644 --- a/source/java/org/alfresco/repo/avm/actions/AVMDeploySnapshotAction.java +++ b/source/java/org/alfresco/repo/avm/actions/AVMDeploySnapshotAction.java @@ -235,16 +235,20 @@ public class AVMDeploySnapshotAction extends ActionExecuterAbstractBase if (logger.isDebugEnabled()) logger.debug("Performing file server deployment to " + host + ":" + port); + // TODO Added new NameMatcher parameter to deploy methods. It acts as a filter. + // Any matching path names are ignored for deployment purposes. report = this.deployService.deployDifferenceFS(version, path, host, port, - remoteUsername, remotePassword, "/", true, false, false, callback); + remoteUsername, remotePassword, "/", null, true, false, false, callback); } else { if (logger.isDebugEnabled()) logger.debug("Performing Alfresco deployment to " + host + ":" + port); + // TODO Added new NameMatcher parameter to deploy methods. It acts as a filter. + // Any matching path names are ignored for deployment purposes. report = this.deployService.deployDifference(version, path, host, port, - remoteUsername, remotePassword, targetPath, true, false, false, callback); + remoteUsername, remotePassword, targetPath, null, true, false, false, callback); } } catch (Throwable err) diff --git a/source/java/org/alfresco/repo/deploy/DeploymentServiceImpl.java b/source/java/org/alfresco/repo/deploy/DeploymentServiceImpl.java index d2bb76dd3b..fc29393749 100644 --- a/source/java/org/alfresco/repo/deploy/DeploymentServiceImpl.java +++ b/source/java/org/alfresco/repo/deploy/DeploymentServiceImpl.java @@ -62,6 +62,7 @@ import org.alfresco.service.cmr.remote.AVMRemoteTransport; import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.security.AuthenticationService; import org.alfresco.service.namespace.QName; +import org.alfresco.util.NameMatcher; import org.alfresco.util.Pair; import org.springframework.remoting.rmi.RmiProxyFactoryBean; @@ -101,7 +102,7 @@ public class DeploymentServiceImpl implements DeploymentService /* (non-Javadoc) * @see org.alfresco.service.cmr.avm.deploy.DeploymentService#deployDifference(int, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String, boolean, boolean) */ - public DeploymentReport deployDifference(int version, String srcPath, String hostName, int port, String userName, String password, String dstPath, boolean createDst, boolean dontDelete, boolean dontDo, DeploymentCallback callback) + public DeploymentReport deployDifference(int version, String srcPath, String hostName, int port, String userName, String password, String dstPath, NameMatcher matcher, boolean createDst, boolean dontDelete, boolean dontDo, DeploymentCallback callback) { try { @@ -624,7 +625,7 @@ public class DeploymentServiceImpl implements DeploymentService /* (non-Javadoc) * @see org.alfresco.service.cmr.avm.deploy.DeploymentService#deployDifferenceFS(int, java.lang.String, java.lang.String, int, java.lang.String, java.lang.String, java.lang.String, boolean, boolean) */ - public DeploymentReport deployDifferenceFS(int version, String srcPath, String hostName, int port, String userName, String password, String target, boolean createDst, boolean dontDelete, boolean dontDo, DeploymentCallback callback) + public DeploymentReport deployDifferenceFS(int version, String srcPath, String hostName, int port, String userName, String password, String target, NameMatcher matcher, boolean createDst, boolean dontDelete, boolean dontDo, DeploymentCallback callback) { DeploymentReport report = new DeploymentReport(); DeploymentReceiverService service = getReceiver(hostName, port); @@ -643,7 +644,7 @@ public class DeploymentServiceImpl implements DeploymentService version = fAVMService.createSnapshot(storeName, null, null).get(storeName); } String ticket = service.begin(target, userName, password); - deployDirectoryPush(service, ticket, report, callback, version, srcPath, "/"); + deployDirectoryPush(service, ticket, report, callback, version, srcPath, "/", matcher); service.commit(ticket); event = new DeploymentEvent(DeploymentEvent.Type.END, new Pair(version, srcPath), @@ -659,7 +660,7 @@ public class DeploymentServiceImpl implements DeploymentService private void deployDirectoryPush(DeploymentReceiverService service, String ticket, DeploymentReport report, DeploymentCallback callback, int version, - String srcPath, String dstPath) + String srcPath, String dstPath, NameMatcher matcher) { Map srcListing = fAVMService.getDirectoryListing(version, srcPath); List dstListing = service.getListing(ticket, dstPath); @@ -687,30 +688,38 @@ public class DeploymentServiceImpl implements DeploymentService if (src == null) { String newDstPath = extendPath(dstPath, dst.getName()); - service.delete(ticket, newDstPath); - DeploymentEvent event = new DeploymentEvent(DeploymentEvent.Type.DELETED, - new Pair(version, extendPath(srcPath, dst.getName())), - newDstPath); - if (callback != null) + if (!excluded(matcher, null, newDstPath)) { - callback.eventOccurred(event); + service.delete(ticket, newDstPath); + DeploymentEvent event = new DeploymentEvent(DeploymentEvent.Type.DELETED, + new Pair(version, extendPath(srcPath, dst.getName())), + newDstPath); + if (callback != null) + { + callback.eventOccurred(event); + } + report.add(event); } - report.add(event); dst = null; continue; } // Nothing on the destination so copy over. if (dst == null) { - copy(service, ticket, report, callback, version, src, dstPath); + if (!excluded(matcher, src.getPath(), null)) + { + copy(service, ticket, report, callback, version, src, dstPath, matcher); + } src = null; continue; } int diff = src.getName().compareTo(dst.getName()); if (diff < 0) { - // No corresponding destination. - copy(service, ticket, report, callback, version, src, dstPath); + if (!excluded(matcher, src.getPath(), null)) + { + copy(service, ticket, report, callback, version, src, dstPath, matcher); + } src = null; continue; } @@ -724,8 +733,12 @@ public class DeploymentServiceImpl implements DeploymentService } if (src.isFile()) { - copyFile(service, ticket, report, callback, version, src, - extendPath(dstPath, dst.getName())); + String extendedPath = extendPath(dstPath, dst.getName()); + if (!excluded(matcher, src.getPath(), extendedPath)) + { + copyFile(service, ticket, report, callback, version, src, + extendedPath); + } src = null; dst = null; continue; @@ -737,12 +750,19 @@ public class DeploymentServiceImpl implements DeploymentService { service.setGuid(ticket, dstPath, src.getGuid()); } - deployDirectoryPush(service, ticket, report, callback, version, src.getPath(), extendPath(dstPath, dst.getName())); + String extendedPath = extendPath(dstPath, dst.getName()); + if (!excluded(matcher, src.getPath(), extendedPath)) + { + deployDirectoryPush(service, ticket, report, callback, version, src.getPath(), extendPath(dstPath, dst.getName()), matcher); + } src = null; dst = null; continue; } - copy(service, ticket, report, callback, version, src, dstPath); + if (!excluded(matcher, src.getPath(), null)) + { + copy(service, ticket, report, callback, version, src, dstPath, matcher); + } src = null; dst = null; continue; @@ -811,7 +831,7 @@ public class DeploymentServiceImpl implements DeploymentService */ private void copy(DeploymentReceiverService service, String ticket, DeploymentReport report, DeploymentCallback callback, - int version, AVMNodeDescriptor src, String parentPath) + int version, AVMNodeDescriptor src, String parentPath, NameMatcher matcher) { String dstPath = extendPath(parentPath, src.getName()); if (src.isFile()) @@ -832,7 +852,10 @@ public class DeploymentServiceImpl implements DeploymentService Map listing = fAVMService.getDirectoryListing(src); for (AVMNodeDescriptor child : listing.values()) { - copy(service, ticket, report, callback, version, child, dstPath); + if (!excluded(matcher, child.getPath(), null)) + { + copy(service, ticket, report, callback, version, child, dstPath, matcher); + } } } @@ -850,4 +873,16 @@ public class DeploymentServiceImpl implements DeploymentService } return path + '/' + name; } + + /** + * Returns true if either srcPath or dstPath are matched by matcher. + * @param matcher + * @param srcPath + * @param dstPath + * @return + */ + private boolean excluded(NameMatcher matcher, String srcPath, String dstPath) + { + return matcher != null && ((srcPath != null && matcher.matches(srcPath)) || (dstPath != null && matcher.matches(dstPath))); + } } diff --git a/source/java/org/alfresco/repo/deploy/FSDeploymentTest.java b/source/java/org/alfresco/repo/deploy/FSDeploymentTest.java index 33863cabeb..69daa60363 100644 --- a/source/java/org/alfresco/repo/deploy/FSDeploymentTest.java +++ b/source/java/org/alfresco/repo/deploy/FSDeploymentTest.java @@ -32,6 +32,7 @@ import org.alfresco.service.cmr.avm.deploy.DeploymentEvent; import org.alfresco.service.cmr.avm.deploy.DeploymentReport; import org.alfresco.service.cmr.avm.deploy.DeploymentService; import org.alfresco.util.Deleter; +import org.alfresco.util.NameMatcher; import org.springframework.context.support.FileSystemXmlApplicationContext; /** @@ -56,8 +57,10 @@ public class FSDeploymentTest extends AVMServiceTestBase FileSystemXmlApplicationContext receiverContext = new FileSystemXmlApplicationContext("../deployment/config/application-context.xml"); DeploymentService service = (DeploymentService)fContext.getBean("DeploymentService"); + NameMatcher matcher = (NameMatcher)fContext.getBean("globalPathExcluder"); setupBasicTree(); - DeploymentReport report = service.deployDifferenceFS(-1, "main:/", "localhost", 44100, "Giles", "Watcher", "sampleTarget", false, false, false, null); + fService.createFile("main:/a/b", "fudge.bak").close(); + DeploymentReport report = service.deployDifferenceFS(-1, "main:/", "localhost", 44100, "Giles", "Watcher", "sampleTarget", matcher, false, false, false, null); int count = 0; for (DeploymentEvent event : report) { @@ -65,7 +68,7 @@ public class FSDeploymentTest extends AVMServiceTestBase count++; } assertEquals(10, count); - report = service.deployDifferenceFS(-1, "main:/", "localhost", 44100, "Giles", "Watcher", "sampleTarget", false, false, false, null); + report = service.deployDifferenceFS(-1, "main:/", "localhost", 44100, "Giles", "Watcher", "sampleTarget", matcher, false, false, false, null); count = 0; for (DeploymentEvent event : report) { @@ -75,7 +78,7 @@ public class FSDeploymentTest extends AVMServiceTestBase assertEquals(2, count); fService.createFile("main:/d", "jonathan").close(); fService.removeNode("main:/a/b"); - report = service.deployDifferenceFS(-1, "main:/", "localhost", 44100, "Giles", "Watcher", "sampleTarget", false, false, false, null); + report = service.deployDifferenceFS(-1, "main:/", "localhost", 44100, "Giles", "Watcher", "sampleTarget", matcher, false, false, false, null); count = 0; for (DeploymentEvent event : report) { @@ -85,7 +88,7 @@ public class FSDeploymentTest extends AVMServiceTestBase assertEquals(4, count); fService.removeNode("main:/d/e"); fService.createFile("main:/d", "e").close(); - report = service.deployDifferenceFS(-1, "main:/", "localhost", 44100, "Giles", "Watcher", "sampleTarget", false, false, false, null); + report = service.deployDifferenceFS(-1, "main:/", "localhost", 44100, "Giles", "Watcher", "sampleTarget", matcher, false, false, false, null); count = 0; for (DeploymentEvent event : report) { @@ -96,7 +99,7 @@ public class FSDeploymentTest extends AVMServiceTestBase fService.removeNode("main:/d/e"); fService.createDirectory("main:/d", "e"); fService.createFile("main:/d/e", "Warren.txt").close(); - report = service.deployDifferenceFS(-1, "main:/", "localhost", 44100, "Giles", "Watcher", "sampleTarget", false, false, false, null); + report = service.deployDifferenceFS(-1, "main:/", "localhost", 44100, "Giles", "Watcher", "sampleTarget", matcher, false, false, false, null); count = 0; for (DeploymentEvent event : report) { @@ -116,6 +119,16 @@ public class FSDeploymentTest extends AVMServiceTestBase Deleter.Delete(data); Deleter.Delete(metadata); Deleter.Delete(target); + File dot = new File("."); + String[] listing = dot.list(); + for (String name : listing) + { + if (name.startsWith("dep-record-")) + { + File file = new File(name); + file.delete(); + } + } } } } diff --git a/source/java/org/alfresco/service/cmr/avm/deploy/DeploymentService.java b/source/java/org/alfresco/service/cmr/avm/deploy/DeploymentService.java index b819c43953..c07c3b5387 100644 --- a/source/java/org/alfresco/service/cmr/avm/deploy/DeploymentService.java +++ b/source/java/org/alfresco/service/cmr/avm/deploy/DeploymentService.java @@ -3,6 +3,8 @@ */ package org.alfresco.service.cmr.avm.deploy; +import org.alfresco.util.NameMatcher; + /** * A service to handle AVM repository to remote AVM repository deployment. * @author britt @@ -28,6 +30,7 @@ public interface DeploymentService String hostName, int port, String userName, String password, String dstPath, + NameMatcher matcher, boolean createDst, boolean dontDelete, boolean dontDo, @@ -51,6 +54,7 @@ public interface DeploymentService String hostName, int port, String userName, String password, String dstTarget, + NameMatcher matcher, boolean createDst, boolean dontDelete, boolean dontDo,