From 91aa8759f5b9e0e2143ea9de0838b4d36bd96d35 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Tue, 27 Jul 2010 15:01:02 +0000 Subject: [PATCH] Replication Service tweaks In preparation for writing the webscripts, add a rename service method, and change the user facing type of the name from QName to string git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@21440 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../ReplicationActionExecutor.java | 8 +-- .../ReplicationDefinitionImpl.java | 27 ++++++-- .../ReplicationDefinitionPersister.java | 18 +++++- .../ReplicationDefinitionPersisterImpl.java | 54 +++++++++++++++- .../replication/ReplicationServiceImpl.java | 16 ++++- .../ReplicationServiceImplTest.java | 6 +- .../ReplicationServiceIntegrationTest.java | 63 +++++++++++++++++-- .../replication/ReplicationDefinition.java | 7 ++- .../cmr/replication/ReplicationService.java | 3 +- 9 files changed, 173 insertions(+), 29 deletions(-) diff --git a/source/java/org/alfresco/repo/replication/ReplicationActionExecutor.java b/source/java/org/alfresco/repo/replication/ReplicationActionExecutor.java index 450e3700b8..3a9e38266b 100644 --- a/source/java/org/alfresco/repo/replication/ReplicationActionExecutor.java +++ b/source/java/org/alfresco/repo/replication/ReplicationActionExecutor.java @@ -304,7 +304,7 @@ public class ReplicationActionExecutor extends ActionExecuterAbstractBase { try { // Quick try lockToken = jobLockService.getLock( - replicationDef.getReplicationName(), + replicationDef.getReplicationQName(), replicationActionLockDuration, 5 * 1000, // Every 5 seconds 6 // 6 times = wait up to 30 seconds @@ -312,7 +312,7 @@ public class ReplicationActionExecutor extends ActionExecuterAbstractBase { } catch(LockAcquisitionException e) { // Long try - every 30 seconds lockToken = jobLockService.getLock( - replicationDef.getReplicationName(), + replicationDef.getReplicationQName(), replicationActionLockDuration, retryTime, retries @@ -323,7 +323,7 @@ public class ReplicationActionExecutor extends ActionExecuterAbstractBase { { jobLockService.refreshLock( lockToken, - replicationDef.getReplicationName(), + replicationDef.getReplicationQName(), replicationActionLockDuration ); } @@ -331,7 +331,7 @@ public class ReplicationActionExecutor extends ActionExecuterAbstractBase { { jobLockService.releaseLock( lockToken, - replicationDef.getReplicationName() + replicationDef.getReplicationQName() ); } } diff --git a/source/java/org/alfresco/repo/replication/ReplicationDefinitionImpl.java b/source/java/org/alfresco/repo/replication/ReplicationDefinitionImpl.java index d242c650e6..d12e8c3a54 100644 --- a/source/java/org/alfresco/repo/replication/ReplicationDefinitionImpl.java +++ b/source/java/org/alfresco/repo/replication/ReplicationDefinitionImpl.java @@ -52,7 +52,7 @@ public class ReplicationDefinitionImpl extends ActionImpl implements Replication * @param replicationName * a unique name for the replication action. */ - public ReplicationDefinitionImpl(String id, QName replicationName) + public ReplicationDefinitionImpl(String id, String replicationName) { this(id, replicationName, null); } @@ -65,10 +65,10 @@ public class ReplicationDefinitionImpl extends ActionImpl implements Replication * @param description * a description of the replication */ - public ReplicationDefinitionImpl(String id, QName replicationName, String description) + public ReplicationDefinitionImpl(String id, String replicationName, String description) { super(null, id, "replicationActionExecutor"); - setParameterValue(REPLICATION_DEFINITION_NAME, replicationName); + setReplicationQName(QName.createQName(null, replicationName)); setDescription(description); } @@ -80,10 +80,27 @@ public class ReplicationDefinitionImpl extends ActionImpl implements Replication /* * @see org.alfresco.service.cmr.replication.ReplicationDefinition#getReplicationName() */ - public QName getReplicationName() + public String getReplicationName() + { + return getReplicationQName().getLocalName(); + } + + /* + * @see org.alfresco.service.cmr.replication.ReplicationDefinition#getReplicationQName() + */ + public QName getReplicationQName() { Serializable parameterValue = getParameterValue(REPLICATION_DEFINITION_NAME); - return (QName) parameterValue; + return (QName)parameterValue; + } + + /* + * Sets or changes the replication name, which should match + * the association name in the data dictionary + */ + protected void setReplicationQName(QName replicationName) + { + setParameterValue(REPLICATION_DEFINITION_NAME, replicationName); } /* diff --git a/source/java/org/alfresco/repo/replication/ReplicationDefinitionPersister.java b/source/java/org/alfresco/repo/replication/ReplicationDefinitionPersister.java index 0fb3644062..1869280870 100644 --- a/source/java/org/alfresco/repo/replication/ReplicationDefinitionPersister.java +++ b/source/java/org/alfresco/repo/replication/ReplicationDefinitionPersister.java @@ -22,7 +22,6 @@ package org.alfresco.repo.replication; import java.util.List; import org.alfresco.service.cmr.replication.ReplicationDefinition; -import org.alfresco.service.namespace.QName; /** * This class provides the implementation of ReplicationDefinition persistence. @@ -52,17 +51,30 @@ public interface ReplicationDefinitionPersister */ void deleteReplicationDefinition(ReplicationDefinition replicationDefinition); + /** + * This method renames a {@link ReplicationDefinition} that has been stored + * in the repository using the save() method. + * If no {@link ReplicationDefinition} exists in the repository with the specified + * replication name, then nothing happens. + * + * @param oldReplicationName The unique identifier used to specify the + * {@link ReplicationDefinition} to rename. + * @param newReplicationName The unique identifier used to specify the + * new {@link ReplicationDefinition} name. + */ + void renameReplicationDefinition(String oldReplicationName, String newReplicationName); + /** * This method retrieves a {@link ReplicationDefinition} that has been stored * in the repository using the save() method. If no * {@link ReplicationDefinition} exists in the repository with the specified - * rendition name then this method returns null. + * replication name then this method returns null. * * @param replicationName The unique identifier used to specify the * {@link ReplicationDefinition} to retrieve. * @return The specified {@link ReplicationDefinition} or null. */ - ReplicationDefinition loadReplicationDefinition(QName replicationName); + ReplicationDefinition loadReplicationDefinition(String replicationName); /** * This method retrieves the {@link ReplicationDefinition}s that have been diff --git a/source/java/org/alfresco/repo/replication/ReplicationDefinitionPersisterImpl.java b/source/java/org/alfresco/repo/replication/ReplicationDefinitionPersisterImpl.java index 105a999f28..78310d1f2e 100644 --- a/source/java/org/alfresco/repo/replication/ReplicationDefinitionPersisterImpl.java +++ b/source/java/org/alfresco/repo/replication/ReplicationDefinitionPersisterImpl.java @@ -118,6 +118,10 @@ public class ReplicationDefinitionPersisterImpl implements ReplicationDefinition } + public ReplicationDefinition loadReplicationDefinition(String replicationDefinitionName) + { + return loadReplicationDefinition( buildReplicationQName(replicationDefinitionName) ); + } public ReplicationDefinition loadReplicationDefinition(QName replicationDefinitionName) { NodeRef actionNode = findActionNode(replicationDefinitionName); @@ -130,6 +134,47 @@ public class ReplicationDefinitionPersisterImpl implements ReplicationDefinition return null; } + public void renameReplicationDefinition(String oldReplicationName, String newReplicationName) + { + renameReplicationDefinition( + buildReplicationQName(oldReplicationName), + buildReplicationQName(newReplicationName) + ); + } + public void renameReplicationDefinition(QName oldReplicationName, QName newReplicationName) + { + NodeRef actionNode = findActionNode(oldReplicationName); + if(actionNode == null) + { + // No current definition with this name + // So, nothing to do + return; + } + + // Ensure the destination name is free + if(findActionNode(newReplicationName) != null) + { + throw new ReplicationServiceException("Can't rename to '" + newReplicationName + + "' as a definition with that name already exists"); + } + + // Rename the node + nodeService.moveNode( + actionNode, REPLICATION_ACTION_ROOT_NODE_REF, + ContentModel.ASSOC_CONTAINS, newReplicationName + ); + + // Update the definition properties + ReplicationDefinition rd = loadReplicationDefinition(newReplicationName); + rd.setParameterValue( + ReplicationDefinitionImpl.REPLICATION_DEFINITION_NAME, + newReplicationName + ); + saveReplicationDefinition(rd); + + // All done + } + public void saveReplicationDefinition(ReplicationDefinition replicationAction) { NodeRef actionNodeRef = findOrCreateActionNode(replicationAction); @@ -143,7 +188,7 @@ public class ReplicationDefinitionPersisterImpl implements ReplicationDefinition public void deleteReplicationDefinition(ReplicationDefinition replicationAction) { - QName actionName = replicationAction.getReplicationName(); + QName actionName = replicationAction.getReplicationQName(); NodeRef actionNode = findActionNode(actionName); if(actionNode != null) { nodeService.deleteNode(actionNode); @@ -174,7 +219,7 @@ public class ReplicationDefinitionPersisterImpl implements ReplicationDefinition private NodeRef findOrCreateActionNode(ReplicationDefinition replicationAction) { - QName actionName = replicationAction.getReplicationName(); + QName actionName = replicationAction.getReplicationQName(); NodeRef actionNode = findActionNode(actionName); if (actionNode == null) { @@ -200,4 +245,9 @@ public class ReplicationDefinitionPersisterImpl implements ReplicationDefinition throw new ReplicationServiceException("Unable to find replication action root node."); } } + + private static QName buildReplicationQName(String name) + { + return QName.createQName(null, name); + } } diff --git a/source/java/org/alfresco/repo/replication/ReplicationServiceImpl.java b/source/java/org/alfresco/repo/replication/ReplicationServiceImpl.java index eeae242f00..21ee444166 100644 --- a/source/java/org/alfresco/repo/replication/ReplicationServiceImpl.java +++ b/source/java/org/alfresco/repo/replication/ReplicationServiceImpl.java @@ -26,7 +26,6 @@ import org.alfresco.service.cmr.replication.ReplicationDefinition; import org.alfresco.service.cmr.replication.ReplicationService; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.transfer.TransferService; -import org.alfresco.service.namespace.QName; import org.alfresco.util.GUID; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -97,7 +96,7 @@ public class ReplicationServiceImpl implements ReplicationService, ReplicationDe * (org.alfresco.service.namespace.QName, java.lang.String) */ public ReplicationDefinition createReplicationDefinition( - QName replicationDefinitionName, String description) { + String replicationDefinitionName, String description) { if (log.isDebugEnabled()) { StringBuilder msg = new StringBuilder(); @@ -114,7 +113,7 @@ public class ReplicationServiceImpl implements ReplicationService, ReplicationDe * org.alfresco.service.cmr.replication.ReplicationService#loadReplicationDefinition * (org.alfresco.service.namespace.QName) */ - public ReplicationDefinition loadReplicationDefinition(QName replicationDefinitionName) { + public ReplicationDefinition loadReplicationDefinition(String replicationDefinitionName) { return replicationDefinitionPersister.loadReplicationDefinition(replicationDefinitionName); } @@ -136,6 +135,17 @@ public class ReplicationServiceImpl implements ReplicationService, ReplicationDe public List loadReplicationDefinitions(String target) { return replicationDefinitionPersister.loadReplicationDefinitions(target); // TODO is this right } + + /* + * (non-Javadoc) + * @see + * org.alfresco.service.cmr.replication.ReplicationService#renameReplicationDefinition + * (String,String) + */ + public void renameReplicationDefinition(String oldReplicationName, String newReplicationName) + { + replicationDefinitionPersister.renameReplicationDefinition(oldReplicationName, newReplicationName); + } /* * (non-Javadoc) diff --git a/source/java/org/alfresco/repo/replication/ReplicationServiceImplTest.java b/source/java/org/alfresco/repo/replication/ReplicationServiceImplTest.java index 854ebaac68..665b0a2074 100644 --- a/source/java/org/alfresco/repo/replication/ReplicationServiceImplTest.java +++ b/source/java/org/alfresco/repo/replication/ReplicationServiceImplTest.java @@ -25,8 +25,6 @@ import junit.framework.TestCase; import org.alfresco.service.cmr.action.ActionService; import org.alfresco.service.cmr.replication.ReplicationDefinition; import org.alfresco.service.cmr.repository.NodeService; -import org.alfresco.service.namespace.NamespaceService; -import org.alfresco.service.namespace.QName; /** * @author Nick Burch @@ -39,8 +37,8 @@ public class ReplicationServiceImplTest extends TestCase private final ReplicationDefinitionPersisterImpl replicationDefinitionPersister = mock(ReplicationDefinitionPersisterImpl.class); private ReplicationServiceImpl replicationService; - private final QName ACTION_NAME = QName.createQName(NamespaceService.ALFRESCO_URI, "testName"); - private final QName ACTION_NAME2 = QName.createQName(NamespaceService.ALFRESCO_URI, "testName2"); + private final String ACTION_NAME = "testName"; + private final String ACTION_NAME2 = "testName2"; @Override protected void setUp() throws Exception diff --git a/source/java/org/alfresco/repo/replication/ReplicationServiceIntegrationTest.java b/source/java/org/alfresco/repo/replication/ReplicationServiceIntegrationTest.java index a2c007c4bb..11585dbd19 100644 --- a/source/java/org/alfresco/repo/replication/ReplicationServiceIntegrationTest.java +++ b/source/java/org/alfresco/repo/replication/ReplicationServiceIntegrationTest.java @@ -100,8 +100,10 @@ public class ReplicationServiceIntegrationTest extends TestCase private NodeRef thumbnail2a_2; // Thumbnail extends content private NodeRef zone2a_3; // Zone doesn't - private final QName ACTION_NAME = QName.createQName(NamespaceService.ALFRESCO_URI, "testName"); - private final QName ACTION_NAME2 = QName.createQName(NamespaceService.ALFRESCO_URI, "testName2"); + private final String ACTION_NAME = "testName"; + private final String ACTION_NAME2 = "testName2"; + private final QName ACTION_QNAME = QName.createQName(null, ACTION_NAME); + private final QName ACTION_QNAME2 = QName.createQName(null, ACTION_NAME2); private final String TRANSFER_TARGET = "TestTransferTarget"; @@ -192,6 +194,7 @@ public class ReplicationServiceIntegrationTest extends TestCase assertNotNull(replicationAction); assertEquals("Test Definition", replicationAction.getDescription()); assertEquals(ACTION_NAME, replicationAction.getReplicationName()); + assertEquals(ACTION_QNAME, replicationAction.getReplicationQName()); String id = replicationAction.getId(); assertNotNull(id); @@ -224,6 +227,7 @@ public class ReplicationServiceIntegrationTest extends TestCase assertNotNull(retrieved); assertEquals(initialId, retrieved.getId()); assertEquals(ACTION_NAME, retrieved.getReplicationName()); + assertEquals(ACTION_QNAME, retrieved.getReplicationQName()); assertEquals("Test Definition", retrieved.getDescription()); assertEquals(2, retrieved.getPayload().size()); @@ -233,6 +237,7 @@ public class ReplicationServiceIntegrationTest extends TestCase assertNotNull(second); assertEquals(initialId, second.getId()); assertEquals(ACTION_NAME, second.getReplicationName()); + assertEquals(ACTION_QNAME, second.getReplicationQName()); assertEquals("Test Definition", second.getDescription()); assertEquals(2, second.getPayload().size()); } @@ -393,6 +398,54 @@ public class ReplicationServiceIntegrationTest extends TestCase assertEquals(1, rdTT.getPayload().size()); assertEquals(content1_1, rdTT.getPayload().get(0)); } + + /** + * Tests that we can rename definitions + */ + public void testRenaming() throws Exception + { + // Create one instance + ReplicationDefinition rdTT = replicationService.createReplicationDefinition(ACTION_NAME, "Test"); + rdTT.setTargetName("TestTarget"); + replicationService.saveReplicationDefinition(rdTT); + assertEquals(1, replicationService.loadReplicationDefinitions().size()); + + + // Rename it + replicationService.renameReplicationDefinition(ACTION_NAME, ACTION_NAME2); + + assertEquals(1, replicationService.loadReplicationDefinitions().size()); + assertEquals(null, replicationService.loadReplicationDefinition(ACTION_NAME)); + + rdTT = replicationService.loadReplicationDefinition(ACTION_NAME2); + assertNotNull(rdTT); + assertEquals(ACTION_NAME2, rdTT.getReplicationName()); + assertEquals(ACTION_QNAME2, rdTT.getReplicationQName()); + + + // If the source name doesn't exist, does nothing + replicationService.renameReplicationDefinition(ACTION_NAME, ACTION_NAME2); + + assertEquals(1, replicationService.loadReplicationDefinitions().size()); + assertEquals(null, replicationService.loadReplicationDefinition(ACTION_NAME)); + + rdTT = replicationService.loadReplicationDefinition(ACTION_NAME2); + assertNotNull(rdTT); + assertEquals(ACTION_NAME2, rdTT.getReplicationName()); + assertEquals(ACTION_QNAME2, rdTT.getReplicationQName()); + + + // Renaming to a duplicate name breaks + rdTT = replicationService.createReplicationDefinition(ACTION_NAME, "Test"); + rdTT.setTargetName("TestTarget"); + replicationService.saveReplicationDefinition(rdTT); + assertEquals(2, replicationService.loadReplicationDefinitions().size()); + + try { + replicationService.renameReplicationDefinition(ACTION_NAME, ACTION_NAME2); + fail("Shouldn't be able to rename onto a duplicate name"); + } catch(ReplicationServiceException e) {} + } /** * Test that the action service can find the executor @@ -503,7 +556,7 @@ public class ReplicationServiceIntegrationTest extends TestCase // Get the lock, and run long start = System.currentTimeMillis(); String token = jobLockService.getLock( - rd.getReplicationName(), + rd.getReplicationQName(), 10 * 1000, 1, 1 @@ -540,7 +593,7 @@ public class ReplicationServiceIntegrationTest extends TestCase // Get the lock for 2 seconds String token = jobLockService.getLock( - rd.getReplicationName(), + rd.getReplicationQName(), 2 * 1000, 1, 1 @@ -564,7 +617,7 @@ public class ReplicationServiceIntegrationTest extends TestCase // Release our lock, should allow the replication task // to get going and spot the cancel - jobLockService.releaseLock(token, rd.getReplicationName()); + jobLockService.releaseLock(token, rd.getReplicationQName()); // Let the main replication task run to cancelled/completed // This can take quite some time though... diff --git a/source/java/org/alfresco/service/cmr/replication/ReplicationDefinition.java b/source/java/org/alfresco/service/cmr/replication/ReplicationDefinition.java index 333643f9fb..faa2d0b63c 100644 --- a/source/java/org/alfresco/service/cmr/replication/ReplicationDefinition.java +++ b/source/java/org/alfresco/service/cmr/replication/ReplicationDefinition.java @@ -39,7 +39,12 @@ public interface ReplicationDefinition extends CancellableAction, Serializable { /** * @return the name which uniquely identifies this replication definition. */ - QName getReplicationName(); + String getReplicationName(); + + /** + * @return the qualified name which uniquely identifies this replication definition. + */ + QName getReplicationQName(); /** * @return the name of the target repository. diff --git a/source/java/org/alfresco/service/cmr/replication/ReplicationService.java b/source/java/org/alfresco/service/cmr/replication/ReplicationService.java index 953b05b401..54c7916abc 100644 --- a/source/java/org/alfresco/service/cmr/replication/ReplicationService.java +++ b/source/java/org/alfresco/service/cmr/replication/ReplicationService.java @@ -21,7 +21,6 @@ package org.alfresco.service.cmr.replication; import org.alfresco.repo.replication.ReplicationDefinitionPersister; import org.alfresco.service.NotAuditable; import org.alfresco.service.PublicService; -import org.alfresco.service.namespace.QName; /** * The Replication service. @@ -38,7 +37,7 @@ public interface ReplicationService extends ReplicationDefinitionPersister { * @return the created {@link ReplicationDefinition} */ @NotAuditable - ReplicationDefinition createReplicationDefinition(QName replicationName, String description); + ReplicationDefinition createReplicationDefinition(String replicationName, String description); /** * Runs the specified replication.