From 7c79fcea5828e6e94eee34aca02dd06ab0666003 Mon Sep 17 00:00:00 2001 From: Derek Hulley Date: Fri, 3 Sep 2010 13:09:31 +0000 Subject: [PATCH] ALF-588: MT - delete tenant requires deleteStore git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@22230 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../node-common-SqlMap.xml | 8 ++++++ .../repo/domain/node/AbstractNodeDAOImpl.java | 23 +++++++++++++++++ .../alfresco/repo/domain/node/NodeDAO.java | 8 ++++++ .../repo/domain/node/ibatis/NodeDAOImpl.java | 7 ++++++ .../repo/node/BaseNodeServiceTest.java | 25 +++++++++++++++++++ .../repo/node/db/DbNodeServiceImpl.java | 21 ++++++++++++++-- .../alfresco/repo/node/index/NodeIndexer.java | 14 ++++++----- 7 files changed, 98 insertions(+), 8 deletions(-) diff --git a/config/alfresco/ibatis/org.hibernate.dialect.Dialect/node-common-SqlMap.xml b/config/alfresco/ibatis/org.hibernate.dialect.Dialect/node-common-SqlMap.xml index a8970e4d87..a45d84e348 100644 --- a/config/alfresco/ibatis/org.hibernate.dialect.Dialect/node-common-SqlMap.xml +++ b/config/alfresco/ibatis/org.hibernate.dialect.Dialect/node-common-SqlMap.xml @@ -331,6 +331,14 @@ id = #id# + + update alf_store set + protocol = #protocol#, + identifier = #identifier# + where + id = #id# + + update alf_node set version = #version# diff --git a/source/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java b/source/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java index 687380d3d0..fb7fb6bef1 100644 --- a/source/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java +++ b/source/java/org/alfresco/repo/domain/node/AbstractNodeDAOImpl.java @@ -645,6 +645,28 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO return new Pair(rootNode.getId(), rootNode.getNodeRef()); } + @Override + public void moveStore(StoreRef oldStoreRef, StoreRef newStoreRef) + { + StoreEntity store = getStoreNotNull(oldStoreRef); + store.setProtocol(newStoreRef.getProtocol()); + store.setIdentifier(newStoreRef.getIdentifier()); + // Update it + int count = updateStore(store); + if (count != 1) + { + throw new ConcurrencyFailureException("Store not updated: " + oldStoreRef); + } + // All the NodeRef-based caches are invalid. ID-based caches are fine. + rootNodesCache.removeByKey(oldStoreRef); + nodesCache.clear(); + + if (isDebugEnabled) + { + logger.debug("Moved store: " + oldStoreRef + " --> " + newStoreRef); + } + } + /** * Callback to cache store root nodes by {@link StoreRef}. * @@ -3139,6 +3161,7 @@ public abstract class AbstractNodeDAOImpl implements NodeDAO, BatchingDAO protected abstract NodeEntity selectStoreRootNode(StoreRef storeRef); protected abstract Long insertStore(StoreEntity store); protected abstract int updateStoreRoot(StoreEntity store); + protected abstract int updateStore(StoreEntity store); protected abstract Long insertNode(NodeEntity node); protected abstract int updateNode(NodeUpdateEntity nodeUpdate); protected abstract int updateNodePatchAcl(NodeUpdateEntity nodeUpdate); diff --git a/source/java/org/alfresco/repo/domain/node/NodeDAO.java b/source/java/org/alfresco/repo/domain/node/NodeDAO.java index 8f7644731a..9f99e1499b 100644 --- a/source/java/org/alfresco/repo/domain/node/NodeDAO.java +++ b/source/java/org/alfresco/repo/domain/node/NodeDAO.java @@ -103,6 +103,14 @@ public interface NodeDAO extends NodeBulkLoader */ public Pair newStore(StoreRef storeRef); + /** + * Changes the old store reference to the new store reference. + * + * @param oldStoreRef the existing store + * @param newStoreRef the new store + */ + public void moveStore(StoreRef oldStoreRef, StoreRef newStoreRef); + public Pair getRootNode(StoreRef storeRef); /* diff --git a/source/java/org/alfresco/repo/domain/node/ibatis/NodeDAOImpl.java b/source/java/org/alfresco/repo/domain/node/ibatis/NodeDAOImpl.java index b229d77374..1eacb4a2eb 100644 --- a/source/java/org/alfresco/repo/domain/node/ibatis/NodeDAOImpl.java +++ b/source/java/org/alfresco/repo/domain/node/ibatis/NodeDAOImpl.java @@ -80,6 +80,7 @@ public class NodeDAOImpl extends AbstractNodeDAOImpl private static final String DELETE_TRANSACTION_BY_ID = "alfresco.node.delete_TransactionById"; private static final String INSERT_STORE = "alfresco.node.insert_Store"; private static final String UPDATE_STORE_ROOT = "alfresco.node.update_StoreRoot"; + private static final String UPDATE_STORE = "alfresco.node.update_Store"; private static final String SELECT_STORE_ALL = "alfresco.node.select_StoreAll"; private static final String SELECT_STORE_ROOT_NODE_BY_ID = "alfresco.node.select_StoreRootNodeById"; private static final String SELECT_STORE_ROOT_NODE_BY_REF = "alfresco.node.select_StoreRootNodeByRef"; @@ -269,6 +270,12 @@ public class NodeDAOImpl extends AbstractNodeDAOImpl return template.update(UPDATE_STORE_ROOT, store); } + @Override + protected int updateStore(StoreEntity store) + { + return template.update(UPDATE_STORE, store); + } + @Override protected Long insertNode(NodeEntity node) { diff --git a/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java b/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java index eec1123ee4..9b1ed11796 100644 --- a/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java +++ b/source/java/org/alfresco/repo/node/BaseNodeServiceTest.java @@ -463,6 +463,31 @@ public abstract class BaseNodeServiceTest extends BaseSpringTest assertTrue("New store not present is list of stores", storeRefs.contains(storeRef)); } + public void testDeleteStore() throws Exception + { + StoreRef storeRef = createStore(); + // get all stores + List storeRefs = nodeService.getStores(); + // check that the store ref is present + assertTrue("New store not present is list of stores", storeRefs.contains(storeRef)); + // Delete it + nodeService.deleteStore(storeRef); + storeRefs = nodeService.getStores(); + assertFalse("Deleted store should not present is list of stores", storeRefs.contains(storeRef)); + // Now make sure that none of the stores have the "deleted" protocol + for (StoreRef retrievedStoreRef : storeRefs) + { + if (retrievedStoreRef.getProtocol().equals(StoreRef.PROTOCOL_DELETED)) + { + fail("NodeService should not have returned 'deleted' stores." + storeRefs); + } + } + + // Commit to ensure all is well + setComplete(); + endTransaction(); + } + public void testExists() throws Exception { StoreRef storeRef = createStore(); diff --git a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java index 94938192c9..deb222d0d7 100644 --- a/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java +++ b/source/java/org/alfresco/repo/node/db/DbNodeServiceImpl.java @@ -67,6 +67,7 @@ import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QNamePattern; import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.util.EqualsHelper; +import org.alfresco.util.GUID; import org.alfresco.util.Pair; import org.alfresco.util.ParameterCheck; import org.alfresco.util.PropertyMap; @@ -171,7 +172,13 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl List storeRefs = new ArrayList(50); for (Pair pair : stores) { - storeRefs.add(pair.getSecond()); + StoreRef storeRef = pair.getSecond(); + if (storeRef.getProtocol().equals(StoreRef.PROTOCOL_DELETED)) + { + // Ignore + continue; + } + storeRefs.add(storeRef); } // Now get the AVMStores. List avmStores = avmNodeService.getStores(); @@ -211,7 +218,17 @@ public class DbNodeServiceImpl extends AbstractNodeServiceImpl */ public void deleteStore(StoreRef storeRef) throws InvalidStoreRefException { - throw new UnsupportedOperationException(); + // Delete the index + nodeIndexer.indexDeleteStore(storeRef); + // Rename the store + StoreRef deletedStoreRef = new StoreRef(StoreRef.PROTOCOL_DELETED, GUID.generate()); + nodeDAO.moveStore(storeRef, deletedStoreRef); + + // Done + if (logger.isDebugEnabled()) + { + logger.debug("Marked store for deletion: " + storeRef + " --> " + deletedStoreRef); + } } public NodeRef getRootNode(StoreRef storeRef) throws InvalidStoreRefException diff --git a/source/java/org/alfresco/repo/node/index/NodeIndexer.java b/source/java/org/alfresco/repo/node/index/NodeIndexer.java index 01d080ac76..7628954881 100644 --- a/source/java/org/alfresco/repo/node/index/NodeIndexer.java +++ b/source/java/org/alfresco/repo/node/index/NodeIndexer.java @@ -24,6 +24,7 @@ import org.alfresco.repo.search.Indexer; import org.alfresco.repo.tenant.TenantService; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.StoreRef; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -69,13 +70,14 @@ public class NodeIndexer { this.enabled = enabled; } - - /** - * @deprecated - */ - public void init() + + public void indexDeleteStore(StoreRef storeRef) { - logger.warn("NodeIndexer.init() has been deprecated."); + if (logger.isDebugEnabled()) + { + logger.debug("indexDeleteNode", new Exception("Stack Trace")); + } + indexer.deleteIndex(storeRef); } public void indexCreateNode(ChildAssociationRef childAssocRef)