You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2018/03/06 14:00:42 UTC

qpid-broker-j git commit: QPID-7873: [Broker-J] Make sure that link store structure and preferences store structure are deleted on deletion of the virtual host node

Repository: qpid-broker-j
Updated Branches:
  refs/heads/master dbcbed940 -> bc46f8b37


QPID-7873: [Broker-J] Make sure that link store structure and preferences store structure are deleted on deletion of the virtual host node


Project: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/commit/bc46f8b3
Tree: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/tree/bc46f8b3
Diff: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/diff/bc46f8b3

Branch: refs/heads/master
Commit: bc46f8b37eef8db31779acaf59225e8001f7a479
Parents: dbcbed9
Author: Alex Rudyy <or...@apache.org>
Authored: Tue Mar 6 13:48:29 2018 +0000
Committer: Alex Rudyy <or...@apache.org>
Committed: Tue Mar 6 13:48:29 2018 +0000

----------------------------------------------------------------------
 .../AbstractStandardVirtualHostNode.java        | 11 ++++++
 .../protocol/v1_0/store/jdbc/JDBCLinkStore.java | 18 +++++++---
 .../virtualhost/derby/DerbyVirtualHostImpl.java | 13 +++++++
 .../derby/DerbyVirtualHostNodeImpl.java         | 22 ++++++++++--
 .../jdbc/AbstractJDBCConfigurationStore.java    | 36 +++++++++++++++++---
 .../store/jdbc/AbstractJDBCMessageStore.java    | 26 +++++++++++++-
 .../qpid/server/store/jdbc/JDBCContainer.java   |  5 +++
 .../qpid/server/store/jdbc/JdbcUtils.java       |  2 +-
 .../virtualhost/jdbc/JDBCVirtualHostImpl.java   | 20 ++++++++++-
 .../jdbc/JDBCVirtualHostNodeImpl.java           | 22 ++++++++++--
 .../jdbc/GenericJDBCConfigurationStoreTest.java | 12 +++++++
 .../server/store/jdbc/JDBCMessageStoreTest.java | 12 +++++++
 .../qpid/server/store/jdbc/TestJdbcUtils.java   |  4 +--
 .../virtualhost/jdbc/JDBCVirtualHostTest.java   | 27 +++++++++++++++
 .../jdbc/JDBCVirtualHostNodeTest.java           | 30 ++++++++++++++++
 15 files changed, 241 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/bc46f8b3/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
----------------------------------------------------------------------
diff --git a/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java b/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
index d7de6fd..aaa436b 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
@@ -46,6 +46,8 @@ import org.apache.qpid.server.store.ConfiguredObjectRecordImpl;
 import org.apache.qpid.server.store.DurableConfigurationStore;
 import org.apache.qpid.server.store.MessageStore;
 import org.apache.qpid.server.store.VirtualHostStoreUpgraderAndRecoverer;
+import org.apache.qpid.server.store.preferences.PreferenceStore;
+import org.apache.qpid.server.store.preferences.PreferenceStoreProvider;
 import org.apache.qpid.server.virtualhost.QueueManagingVirtualHost;
 
 public abstract class AbstractStandardVirtualHostNode<X extends AbstractStandardVirtualHostNode<X>> extends AbstractVirtualHostNode<X>
@@ -136,6 +138,15 @@ public abstract class AbstractStandardVirtualHostNode<X extends AbstractStandard
                                      messageStore.onDelete(virtualHost);
                                  }
 
+                                 if (AbstractStandardVirtualHostNode.this instanceof PreferenceStoreProvider)
+                                 {
+                                     PreferenceStore preferenceStore =
+                                             ((PreferenceStoreProvider) AbstractStandardVirtualHostNode.this).getPreferenceStore();
+                                     if (preferenceStore != null)
+                                     {
+                                         preferenceStore.onDelete();
+                                     }
+                                 }
                                  DurableConfigurationStore configurationStore = getConfigurationStore();
                                  if (configurationStore != null)
                                  {

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/bc46f8b3/broker-plugins/amqp-1-0-jdbc-store/src/main/java/org/apache/qpid/server/protocol/v1_0/store/jdbc/JDBCLinkStore.java
----------------------------------------------------------------------
diff --git a/broker-plugins/amqp-1-0-jdbc-store/src/main/java/org/apache/qpid/server/protocol/v1_0/store/jdbc/JDBCLinkStore.java b/broker-plugins/amqp-1-0-jdbc-store/src/main/java/org/apache/qpid/server/protocol/v1_0/store/jdbc/JDBCLinkStore.java
index 94de03c..4441d6a 100644
--- a/broker-plugins/amqp-1-0-jdbc-store/src/main/java/org/apache/qpid/server/protocol/v1_0/store/jdbc/JDBCLinkStore.java
+++ b/broker-plugins/amqp-1-0-jdbc-store/src/main/java/org/apache/qpid/server/protocol/v1_0/store/jdbc/JDBCLinkStore.java
@@ -36,6 +36,7 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Base64;
 import java.util.Collection;
 
@@ -62,6 +63,7 @@ import org.apache.qpid.server.store.StoreException;
 import org.apache.qpid.server.store.jdbc.JDBCContainer;
 import org.apache.qpid.server.store.jdbc.JDBCDetails;
 import org.apache.qpid.server.store.jdbc.JdbcUtils;
+import org.apache.qpid.server.util.Action;
 
 public class JDBCLinkStore extends AbstractLinkStore
 {
@@ -72,6 +74,7 @@ public class JDBCLinkStore extends AbstractLinkStore
     private final String _tableNamePrefix;
     private final String _sqlBlobType;
     private final boolean _isUseBytesMethodsForBlob;
+    private final Action<Connection> _cleanUpAction;
 
     JDBCLinkStore(final JDBCContainer jdbcContainer)
     {
@@ -80,6 +83,8 @@ public class JDBCLinkStore extends AbstractLinkStore
         JDBCDetails jdbcDetails = jdbcContainer.getJDBCDetails();
         _sqlBlobType = jdbcDetails.getBlobType();
         _isUseBytesMethodsForBlob = jdbcDetails.isUseBytesMethodsForBlob();
+        _cleanUpAction = this::cleanUp;
+        jdbcContainer.addDeleteAction(_cleanUpAction);
     }
 
     @Override
@@ -186,12 +191,10 @@ public class JDBCLinkStore extends AbstractLinkStore
     @Override
     protected void doDelete()
     {
-        try (Connection connection = getConnection();
-             Statement dropLinksStatement = connection.createStatement();
-             Statement dropVersionsStatement = connection.createStatement())
+        _jdbcContainer.removeDeleteAction(_cleanUpAction);
+        try (Connection connection = getConnection())
         {
-            dropLinksStatement.execute(String.format("DROP TABLE %s", getLinksTableName()));
-            dropVersionsStatement.execute(String.format("DROP TABLE %s", getVersionTableName()));
+            cleanUp(connection);
         }
         catch (IllegalStateException e)
         {
@@ -203,6 +206,11 @@ public class JDBCLinkStore extends AbstractLinkStore
         }
     }
 
+    private void cleanUp(final Connection connection)
+    {
+        JdbcUtils.dropTables(connection, LOGGER, Arrays.asList(getLinksTableName(), getVersionTableName()));
+    }
+
     @Override
     public TerminusDurability getHighestSupportedTerminusDurability()
     {

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/bc46f8b3/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhost/derby/DerbyVirtualHostImpl.java
----------------------------------------------------------------------
diff --git a/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhost/derby/DerbyVirtualHostImpl.java b/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhost/derby/DerbyVirtualHostImpl.java
index 39085c8..5985f51 100644
--- a/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhost/derby/DerbyVirtualHostImpl.java
+++ b/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhost/derby/DerbyVirtualHostImpl.java
@@ -33,6 +33,7 @@ import org.apache.qpid.server.store.derby.DerbyMessageStore;
 import org.apache.qpid.server.store.derby.DerbyUtils;
 import org.apache.qpid.server.store.jdbc.JDBCContainer;
 import org.apache.qpid.server.store.jdbc.JDBCDetails;
+import org.apache.qpid.server.util.Action;
 import org.apache.qpid.server.util.ConnectionScopedRuntimeException;
 import org.apache.qpid.server.util.FileHelper;
 import org.apache.qpid.server.virtualhost.AbstractVirtualHost;
@@ -122,4 +123,16 @@ public class DerbyVirtualHostImpl extends AbstractVirtualHost<DerbyVirtualHostIm
     {
         return "";
     }
+
+    @Override
+    public void addDeleteAction(final Action<Connection> action)
+    {
+        ((DerbyMessageStore) getMessageStore()).addDeleteAction(action);
+    }
+
+    @Override
+    public void removeDeleteAction(final Action<Connection> action)
+    {
+        ((DerbyMessageStore) getMessageStore()).removeDeleteAction(action);
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/bc46f8b3/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhostnode/derby/DerbyVirtualHostNodeImpl.java
----------------------------------------------------------------------
diff --git a/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhostnode/derby/DerbyVirtualHostNodeImpl.java b/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhostnode/derby/DerbyVirtualHostNodeImpl.java
index 8eba861..cdd90e8 100644
--- a/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhostnode/derby/DerbyVirtualHostNodeImpl.java
+++ b/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhostnode/derby/DerbyVirtualHostNodeImpl.java
@@ -40,6 +40,7 @@ import org.apache.qpid.server.store.derby.DerbyUtils;
 import org.apache.qpid.server.store.jdbc.JDBCContainer;
 import org.apache.qpid.server.store.jdbc.JDBCDetails;
 import org.apache.qpid.server.store.preferences.PreferenceStore;
+import org.apache.qpid.server.util.Action;
 import org.apache.qpid.server.util.ConnectionScopedRuntimeException;
 import org.apache.qpid.server.util.FileHelper;
 import org.apache.qpid.server.virtualhostnode.AbstractStandardVirtualHostNode;
@@ -108,7 +109,7 @@ public class DerbyVirtualHostNodeImpl extends AbstractStandardVirtualHostNode<De
     @Override
     public PreferenceStore getPreferenceStore()
     {
-        return ((DerbyConfigurationStore)getConfigurationStore()).getPreferenceStore();
+        return getStore().getPreferenceStore();
     }
 
     @Override
@@ -122,7 +123,7 @@ public class DerbyVirtualHostNodeImpl extends AbstractStandardVirtualHostNode<De
     {
         try
         {
-            return ((DerbyConfigurationStore) getConfigurationStore()).getConnection();
+            return getStore().getConnection();
         }
         catch (SQLException e)
         {
@@ -137,4 +138,21 @@ public class DerbyVirtualHostNodeImpl extends AbstractStandardVirtualHostNode<De
     {
         return "";
     }
+
+    @Override
+    public void addDeleteAction(final Action<Connection> action)
+    {
+        getStore().addDeleteAction(action);
+    }
+
+    @Override
+    public void removeDeleteAction(final Action<Connection> action)
+    {
+        getStore().removeDeleteAction(action);
+    }
+
+    private DerbyConfigurationStore getStore()
+    {
+        return (DerbyConfigurationStore) getConfigurationStore();
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/bc46f8b3/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCConfigurationStore.java
----------------------------------------------------------------------
diff --git a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCConfigurationStore.java b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCConfigurationStore.java
index 1aac9c7..c87d719 100644
--- a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCConfigurationStore.java
+++ b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCConfigurationStore.java
@@ -38,7 +38,9 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.slf4j.Logger;
@@ -51,6 +53,7 @@ import org.apache.qpid.server.store.DurableConfigurationStore;
 import org.apache.qpid.server.store.MessageStoreProvider;
 import org.apache.qpid.server.store.StoreException;
 import org.apache.qpid.server.store.handler.ConfiguredObjectRecordHandler;
+import org.apache.qpid.server.util.Action;
 
 public abstract class AbstractJDBCConfigurationStore implements MessageStoreProvider, DurableConfigurationStore
 {
@@ -59,7 +62,7 @@ public abstract class AbstractJDBCConfigurationStore implements MessageStoreProv
     private final static String CONFIGURED_OBJECT_HIERARCHY_TABLE_NAME_SUFFIX = "QPID_CONFIGURED_OBJECT_HIERARCHY";
 
     private static final int DEFAULT_CONFIG_VERSION = 0;
-
+    private final Set<Action<Connection>> _deleteActions = Collections.newSetFromMap(new ConcurrentHashMap<>());;
 
     public enum State { CLOSED, CONFIGURED, OPEN };
     private State _state = State.CLOSED;
@@ -78,6 +81,7 @@ public abstract class AbstractJDBCConfigurationStore implements MessageStoreProv
                                           final ConfiguredObjectRecord... initialRecords)
     {
         changeState(CONFIGURED, OPEN);
+        _deleteActions.clear();
         try
         {
             Collection<? extends ConfiguredObjectRecord> records = doVisitAllConfiguredObjectRecords(handler);
@@ -734,6 +738,16 @@ public abstract class AbstractJDBCConfigurationStore implements MessageStoreProv
         }
     }
 
+    public void addDeleteAction(final Action<Connection> action)
+    {
+        _deleteActions.add(action);
+    }
+
+    public void removeDeleteAction(final Action<Connection> action)
+    {
+        _deleteActions.remove(action);
+    }
+
     private void updateConfiguredObject(ConfiguredObjectRecord configuredObject,
                                         boolean createIfNecessary,
                                         Connection conn)
@@ -819,11 +833,23 @@ public abstract class AbstractJDBCConfigurationStore implements MessageStoreProv
 
     protected abstract String getBlobAsString(ResultSet rs, int col) throws SQLException;
 
-    void onDelete(final Connection conn) throws SQLException
+    void onDelete(final Connection conn)
     {
-        JdbcUtils.dropTables(conn,
-                             getLogger(),
-                             Arrays.asList(getConfiguredObjectsTableName(), getConfiguredObjectHierarchyTableName()));
+        try
+        {
+            for (Action<Connection> deleteAction : _deleteActions)
+            {
+                deleteAction.performAction(conn);
+            }
+            _deleteActions.clear();
+        }
+        finally
+        {
+            JdbcUtils.dropTables(conn,
+                                 getLogger(),
+                                 Arrays.asList(getConfiguredObjectsTableName(),
+                                               getConfiguredObjectHierarchyTableName()));
+        }
     }
 
     private static final class ConfiguredObjectRecordImpl implements ConfiguredObjectRecord

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/bc46f8b3/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCMessageStore.java
----------------------------------------------------------------------
diff --git a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCMessageStore.java b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCMessageStore.java
index c12e223..0ad638c 100644
--- a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCMessageStore.java
+++ b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCMessageStore.java
@@ -67,6 +67,7 @@ import org.apache.qpid.server.store.handler.DistributedTransactionHandler;
 import org.apache.qpid.server.store.handler.MessageHandler;
 import org.apache.qpid.server.store.handler.MessageInstanceHandler;
 import org.apache.qpid.server.txn.Xid;
+import org.apache.qpid.server.util.Action;
 import org.apache.qpid.server.util.CachingUUIDFactory;
 
 public abstract class AbstractJDBCMessageStore implements MessageStore
@@ -90,6 +91,7 @@ public abstract class AbstractJDBCMessageStore implements MessageStore
     private final AtomicLong _bytesEvacuatedFromMemory = new AtomicLong();
     private final Set<StoredJDBCMessage<?>> _messages = Collections.newSetFromMap(new ConcurrentHashMap<>());
     private final Set<MessageDeleteListener> _messageDeleteListeners = Collections.newSetFromMap(new ConcurrentHashMap<>());
+    private final Set<Action<Connection>> _deleteActions = Collections.newSetFromMap(new ConcurrentHashMap<>());
 
     protected abstract boolean isMessageStoreOpen();
 
@@ -247,6 +249,7 @@ public abstract class AbstractJDBCMessageStore implements MessageStore
 
     protected void createOrOpenMessageStoreDatabase() throws StoreException
     {
+        _deleteActions.clear();
         try(Connection conn =  newAutoCommitConnection())
         {
             createVersionTable(conn);
@@ -735,6 +738,16 @@ public abstract class AbstractJDBCMessageStore implements MessageStore
         return _tablePrefix + XID_ACTIONS_TABLE_NAME_SUFFIX;
     }
 
+    public void addDeleteAction(final Action<Connection> action)
+    {
+        _deleteActions.add(action);
+    }
+
+    public void removeDeleteAction(final Action<Connection> action)
+    {
+        _deleteActions.remove(action);
+    }
+
     private static final class ConnectionWrapper
     {
         private final Connection _connection;
@@ -1816,7 +1829,18 @@ public abstract class AbstractJDBCMessageStore implements MessageStore
 
     protected void onDelete(final Connection conn)
     {
-        JdbcUtils.dropTables(conn, getLogger(), getTableNames());
+        try
+        {
+            for (Action<Connection> deleteAction: _deleteActions)
+            {
+                deleteAction.performAction(conn);
+            }
+            _deleteActions.clear();
+        }
+        finally
+        {
+            JdbcUtils.dropTables(conn, getLogger(), getTableNames());
+        }
     }
 
     public List<String> getTableNames()

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/bc46f8b3/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCContainer.java
----------------------------------------------------------------------
diff --git a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCContainer.java b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCContainer.java
index 2634a14..1566f3f 100644
--- a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCContainer.java
+++ b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCContainer.java
@@ -21,6 +21,8 @@ package org.apache.qpid.server.store.jdbc;
 
 import java.sql.Connection;
 
+import org.apache.qpid.server.util.Action;
+
 public interface JDBCContainer
 {
     JDBCDetails getJDBCDetails();
@@ -28,4 +30,7 @@ public interface JDBCContainer
     Connection getConnection();
 
     String getTableNamePrefix();
+
+    void addDeleteAction(Action<Connection> action);
+    void removeDeleteAction(Action<Connection> action);
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/bc46f8b3/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JdbcUtils.java
----------------------------------------------------------------------
diff --git a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JdbcUtils.java b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JdbcUtils.java
index b6d9f22..d3df9ae 100644
--- a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JdbcUtils.java
+++ b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JdbcUtils.java
@@ -119,7 +119,7 @@ public class JdbcUtils
         }
     }
 
-    static void dropTables(final Connection connection, final Logger logger, Collection<String> tableNames)
+    public static void dropTables(final Connection connection, final Logger logger, Collection<String> tableNames)
     {
         for (String tableName : tableNames)
         {

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/bc46f8b3/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhost/jdbc/JDBCVirtualHostImpl.java
----------------------------------------------------------------------
diff --git a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhost/jdbc/JDBCVirtualHostImpl.java b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhost/jdbc/JDBCVirtualHostImpl.java
index 497f1eb..33ff899 100644
--- a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhost/jdbc/JDBCVirtualHostImpl.java
+++ b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhost/jdbc/JDBCVirtualHostImpl.java
@@ -33,6 +33,7 @@ import org.apache.qpid.server.store.jdbc.AbstractJDBCMessageStore;
 import org.apache.qpid.server.store.jdbc.GenericJDBCMessageStore;
 import org.apache.qpid.server.store.jdbc.JDBCContainer;
 import org.apache.qpid.server.store.jdbc.JDBCDetails;
+import org.apache.qpid.server.util.Action;
 import org.apache.qpid.server.util.ConnectionScopedRuntimeException;
 import org.apache.qpid.server.virtualhost.AbstractVirtualHost;
 
@@ -111,7 +112,7 @@ public class JDBCVirtualHostImpl extends AbstractVirtualHost<JDBCVirtualHostImpl
     {
         try
         {
-            return ((AbstractJDBCMessageStore) getMessageStore()).getConnection();
+            return getStore().getConnection();
         }
         catch (SQLException e)
         {
@@ -129,4 +130,21 @@ public class JDBCVirtualHostImpl extends AbstractVirtualHost<JDBCVirtualHostImpl
                                            ", connectionPoolType=" + getConnectionPoolType() +
                                            ", username=" + getUsername() + "]";
     }
+
+    @Override
+    public void addDeleteAction(final Action<Connection> action)
+    {
+        getStore().addDeleteAction(action);
+    }
+
+    @Override
+    public void removeDeleteAction(final Action<Connection> action)
+    {
+        getStore().removeDeleteAction(action);
+    }
+
+    private AbstractJDBCMessageStore getStore()
+    {
+        return (AbstractJDBCMessageStore) getMessageStore();
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/bc46f8b3/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java
----------------------------------------------------------------------
diff --git a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java
index 77f20f4..7c4efd4 100644
--- a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java
+++ b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java
@@ -36,6 +36,7 @@ import org.apache.qpid.server.store.jdbc.GenericJDBCConfigurationStore;
 import org.apache.qpid.server.store.jdbc.JDBCContainer;
 import org.apache.qpid.server.store.jdbc.JDBCDetails;
 import org.apache.qpid.server.store.preferences.PreferenceStore;
+import org.apache.qpid.server.util.Action;
 import org.apache.qpid.server.util.ConnectionScopedRuntimeException;
 import org.apache.qpid.server.virtualhostnode.AbstractStandardVirtualHostNode;
 
@@ -119,7 +120,7 @@ public class JDBCVirtualHostNodeImpl extends AbstractStandardVirtualHostNode<JDB
     {
         try
         {
-            return ((GenericJDBCConfigurationStore) getConfigurationStore()).getConnection();
+            return getStore().getConnection();
         }
         catch (SQLException e)
         {
@@ -147,6 +148,23 @@ public class JDBCVirtualHostNodeImpl extends AbstractStandardVirtualHostNode<JDB
     @Override
     public PreferenceStore getPreferenceStore()
     {
-        return ((GenericJDBCConfigurationStore) getConfigurationStore()).getPreferenceStore();
+        return getStore().getPreferenceStore();
+    }
+
+    @Override
+    public void addDeleteAction(final Action<Connection> action)
+    {
+        getStore().addDeleteAction(action);
+    }
+
+    @Override
+    public void removeDeleteAction(final Action<Connection> action)
+    {
+        getStore().removeDeleteAction(action);
+    }
+
+    private GenericJDBCConfigurationStore getStore()
+    {
+        return (GenericJDBCConfigurationStore) getConfigurationStore();
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/bc46f8b3/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/GenericJDBCConfigurationStoreTest.java
----------------------------------------------------------------------
diff --git a/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/GenericJDBCConfigurationStoreTest.java b/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/GenericJDBCConfigurationStoreTest.java
index c5d7de4..aca3d9c 100644
--- a/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/GenericJDBCConfigurationStoreTest.java
+++ b/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/GenericJDBCConfigurationStoreTest.java
@@ -30,6 +30,7 @@ import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.qpid.server.model.ConfiguredObjectFactory;
 import org.apache.qpid.server.model.VirtualHost;
@@ -74,6 +75,17 @@ public class GenericJDBCConfigurationStoreTest extends AbstractDurableConfigurat
         }
     }
 
+    public void testDeleteAction()
+    {
+        GenericJDBCConfigurationStore store = (GenericJDBCConfigurationStore) getConfigurationStore();
+        AtomicBoolean deleted = new AtomicBoolean();
+        store.addDeleteAction(object -> deleted.set(true));
+
+        store.closeConfigurationStore();
+        store.onDelete(getVirtualHostNode());
+        assertEquals("Delete action was not invoked", true, deleted.get());
+    }
+
     @Override
     protected VirtualHostNode createVirtualHostNode(final String storeLocation, final ConfiguredObjectFactory factory)
     {

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/bc46f8b3/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/JDBCMessageStoreTest.java
----------------------------------------------------------------------
diff --git a/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/JDBCMessageStoreTest.java b/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/JDBCMessageStoreTest.java
index a2636a2..e392109 100644
--- a/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/JDBCMessageStoreTest.java
+++ b/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/JDBCMessageStoreTest.java
@@ -30,6 +30,7 @@ import java.sql.SQLException;
 import java.util.Collection;
 import java.util.UUID;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -146,6 +147,17 @@ public class JDBCMessageStoreTest extends MessageStoreTestCase
         future.get(1000, TimeUnit.MILLISECONDS);
     }
 
+    public void testDeleteAction()
+    {
+        GenericJDBCMessageStore store = (GenericJDBCMessageStore) getStore();
+        AtomicBoolean deleted = new AtomicBoolean();
+        store.addDeleteAction(object -> deleted.set(true));
+
+        store.closeMessageStore();
+        store.onDelete(getVirtualHost());
+        assertEquals("Delete action was not invoked", true, deleted.get());
+    }
+
     private InternalMessage addTestMessage(final MessageStore store,
                                            final String transactionalLogName,
                                            final String messageContent)

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/bc46f8b3/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/TestJdbcUtils.java
----------------------------------------------------------------------
diff --git a/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/TestJdbcUtils.java b/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/TestJdbcUtils.java
index e1ee362..e0af00a 100644
--- a/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/TestJdbcUtils.java
+++ b/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/store/jdbc/TestJdbcUtils.java
@@ -31,7 +31,7 @@ import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 
-class TestJdbcUtils
+public class TestJdbcUtils
 {
 
     static void assertTablesExistence(Collection<String> expectedTables,
@@ -60,7 +60,7 @@ class TestJdbcUtils
         return tableNames;
     }
 
-    static void shutdownDerby(String connectionURL) throws SQLException
+    public static void shutdownDerby(String connectionURL) throws SQLException
     {
         Connection connection = null;
         try

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/bc46f8b3/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/virtualhost/jdbc/JDBCVirtualHostTest.java
----------------------------------------------------------------------
diff --git a/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/virtualhost/jdbc/JDBCVirtualHostTest.java b/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/virtualhost/jdbc/JDBCVirtualHostTest.java
index 3af9000..3ceda39 100644
--- a/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/virtualhost/jdbc/JDBCVirtualHostTest.java
+++ b/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/virtualhost/jdbc/JDBCVirtualHostTest.java
@@ -27,21 +27,27 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.configuration.updater.CurrentThreadTaskExecutor;
 import org.apache.qpid.server.logging.EventLogger;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.BrokerModel;
+import org.apache.qpid.server.model.BrokerTestHelper;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.ConfiguredObjectFactoryImpl;
 import org.apache.qpid.server.model.SystemConfig;
+import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.model.VirtualHostNode;
+import org.apache.qpid.server.store.jdbc.JDBCContainer;
+import org.apache.qpid.server.store.jdbc.TestJdbcUtils;
 import org.apache.qpid.test.utils.QpidTestCase;
 
 public class JDBCVirtualHostTest extends QpidTestCase
 {
     private CurrentThreadTaskExecutor _taskExecutor;
+    private String _connectionURL;
 
     @Override
     public void setUp() throws Exception
@@ -56,6 +62,10 @@ public class JDBCVirtualHostTest extends QpidTestCase
     {
         super.tearDown();
         _taskExecutor.stopImmediately();
+        if (_connectionURL != null)
+        {
+            TestJdbcUtils.shutdownDerby(_connectionURL);
+        }
     }
 
     public void testInvalidTableNamePrefix() throws Exception
@@ -108,4 +118,21 @@ public class JDBCVirtualHostTest extends QpidTestCase
             }
         }
     }
+
+    public void testDeleteAction()
+    {
+        _connectionURL = "jdbc:derby:memory:/" + getTestName();
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put(ConfiguredObject.NAME, getTestName());
+        attributes.put(ConfiguredObject.TYPE, JDBCVirtualHostImpl.VIRTUAL_HOST_TYPE);
+        attributes.put("connectionUrl", _connectionURL + ";create=true");
+
+        final VirtualHost vh = BrokerTestHelper.createVirtualHost(attributes);
+
+        AtomicBoolean deleted = new AtomicBoolean();
+        ((JDBCContainer)vh).addDeleteAction(object -> deleted.set(true));
+
+        vh.delete();
+        assertEquals("Delete action was not invoked", true, deleted.get());
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/bc46f8b3/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeTest.java
----------------------------------------------------------------------
diff --git a/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeTest.java b/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeTest.java
index 6160dee..b911a51 100644
--- a/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeTest.java
+++ b/broker-plugins/jdbc-store/src/test/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeTest.java
@@ -27,19 +27,25 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.configuration.updater.CurrentThreadTaskExecutor;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.BrokerModel;
+import org.apache.qpid.server.model.BrokerTestHelper;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.ConfiguredObjectFactoryImpl;
 import org.apache.qpid.server.model.SystemConfig;
+import org.apache.qpid.server.model.VirtualHostNode;
+import org.apache.qpid.server.store.jdbc.JDBCContainer;
+import org.apache.qpid.server.store.jdbc.TestJdbcUtils;
 import org.apache.qpid.test.utils.QpidTestCase;
 
 public class JDBCVirtualHostNodeTest extends QpidTestCase
 {
     private CurrentThreadTaskExecutor _taskExecutor;
+    private String _connectionURL;
 
     @Override
     public void setUp() throws Exception
@@ -47,6 +53,10 @@ public class JDBCVirtualHostNodeTest extends QpidTestCase
         super.setUp();
         _taskExecutor = new CurrentThreadTaskExecutor();
         _taskExecutor.start();
+        if (_connectionURL != null)
+        {
+            TestJdbcUtils.shutdownDerby(_connectionURL);
+        }
     }
 
     @Override
@@ -100,4 +110,24 @@ public class JDBCVirtualHostNodeTest extends QpidTestCase
             }
         }
     }
+
+    public void testDeleteAction()
+    {
+        _connectionURL = "jdbc:derby:memory:/" + getTestName();
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put(ConfiguredObject.NAME, getTestName());
+        attributes.put(ConfiguredObject.TYPE, JDBCVirtualHostNodeImpl.VIRTUAL_HOST_NODE_TYPE);
+        attributes.put("connectionUrl", _connectionURL + ";create=true");
+
+        Broker<?> broker = BrokerTestHelper.createBrokerMock();
+        final VirtualHostNode virtualHostNode =
+                broker.getObjectFactory().create(VirtualHostNode.class, attributes, broker);
+        virtualHostNode.start();
+
+        AtomicBoolean deleted = new AtomicBoolean();
+        ((JDBCContainer) virtualHostNode).addDeleteAction(object -> deleted.set(true));
+
+        virtualHostNode.delete();
+        assertEquals("Delete action was not invoked", true, deleted.get());
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org