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)