Author: orudyy
Date: Fri May  9 13:24:24 2014
New Revision: 1593538

URL: http://svn.apache.org/r1593538
Log:
QPID-5409 : Change BDB HA MBean to delegate operations to BDB HA node instance

Modified:
    
qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBean.java
    
qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanProvider.java
    
qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/ManagedBDBHAMessageStore.java
    
qpid/trunk/qpid/java/bdbstore/jmx/src/test/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanTest.java
    
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
    
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHARemoteReplicationNodeImpl.java
    
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
    
qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
    
qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeRestTest.java
    
qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/HAClusterManagementTest.java
    
qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java

Modified: 
qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBean.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBean.java?rev=1593538&r1=1593537&r2=1593538&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBean.java
 (original)
+++ 
qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBean.java
 Fri May  9 13:24:24 2014
@@ -20,7 +20,9 @@
 package org.apache.qpid.server.store.berkeleydb.jmx;
 
 import java.io.IOException;
-import java.util.List;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
 import java.util.Map;
 
 import javax.management.JMException;
@@ -39,7 +41,10 @@ import org.apache.log4j.Logger;
 import org.apache.qpid.server.jmx.AMQManagedObject;
 import org.apache.qpid.server.jmx.ManagedObject;
 import org.apache.qpid.server.jmx.ManagedObjectRegistry;
-import 
org.apache.qpid.server.store.berkeleydb.replication.ReplicatedEnvironmentFacade;
+import org.apache.qpid.server.model.IllegalStateTransitionException;
+import org.apache.qpid.server.model.RemoteReplicationNode;
+import 
org.apache.qpid.server.virtualhostnode.berkeleydb.BDBHARemoteReplicationNode;
+import org.apache.qpid.server.virtualhostnode.berkeleydb.BDBHAVirtualHostNode;
 
 /**
  * Management mbean for BDB HA.
@@ -57,7 +62,7 @@ public class BDBHAMessageStoreManagerMBe
         try
         {
             GROUP_MEMBER_ATTRIBUTE_TYPES = new OpenType<?>[] 
{SimpleType.STRING, SimpleType.STRING};
-            final String[] itemNames = new String[] 
{ReplicatedEnvironmentFacade.GRP_MEM_COL_NODE_NAME, 
ReplicatedEnvironmentFacade.GRP_MEM_COL_NODE_HOST_PORT};
+            final String[] itemNames = new String[] {GRP_MEM_COL_NODE_NAME, 
GRP_MEM_COL_NODE_HOST_PORT};
             final String[] itemDescriptions = new String[] {"Unique node 
name", "Node host / port "};
             GROUP_MEMBER_ROW = new CompositeType("GroupMember", "Replication 
group member",
                                                 itemNames,
@@ -65,7 +70,7 @@ public class BDBHAMessageStoreManagerMBe
                                                 GROUP_MEMBER_ATTRIBUTE_TYPES );
             GROUP_MEMBERS_TABLE = new TabularType("GroupMembers", "Replication 
group memebers",
                                                 GROUP_MEMBER_ROW,
-                                                new String[] 
{ReplicatedEnvironmentFacade.GRP_MEM_COL_NODE_NAME});
+                                                new String[] 
{GRP_MEM_COL_NODE_NAME});
         }
         catch (final OpenDataException ode)
         {
@@ -73,15 +78,15 @@ public class BDBHAMessageStoreManagerMBe
         }
     }
 
-    private final ReplicatedEnvironmentFacade _replicatedEnvironmentFacade;
+    private final BDBHAVirtualHostNode<?> _virtualHostNode;
     private final String _objectName;
 
-    protected BDBHAMessageStoreManagerMBean(String virtualHostName, 
ReplicatedEnvironmentFacade replicatedEnvironmentFacade, ManagedObjectRegistry 
registry) throws JMException
+    protected BDBHAMessageStoreManagerMBean(BDBHAVirtualHostNode<?> 
virtualHostNode, ManagedObjectRegistry registry) throws JMException
     {
         super(ManagedBDBHAMessageStore.class, ManagedBDBHAMessageStore.TYPE, 
registry);
-        LOGGER.debug("Creating BDBHAMessageStoreManagerMBean for " + 
virtualHostName);
-        _replicatedEnvironmentFacade = replicatedEnvironmentFacade;
-        _objectName = ObjectName.quote(virtualHostName);
+        LOGGER.debug("Creating BDBHAMessageStoreManagerMBean for " + 
virtualHostNode.getName());
+        _virtualHostNode = virtualHostNode;
+        _objectName = ObjectName.quote( virtualHostNode.getGroupName());
         register();
     }
 
@@ -94,46 +99,38 @@ public class BDBHAMessageStoreManagerMBe
     @Override
     public String getGroupName()
     {
-        return _replicatedEnvironmentFacade.getGroupName();
+        return _virtualHostNode.getGroupName();
     }
 
     @Override
     public String getNodeName()
     {
-        return _replicatedEnvironmentFacade.getNodeName();
+        return _virtualHostNode.getName();
     }
 
     @Override
     public String getNodeHostPort()
     {
-        return _replicatedEnvironmentFacade.getHostPort();
+        return _virtualHostNode.getAddress();
     }
 
     @Override
     public String getHelperHostPort()
     {
-        return _replicatedEnvironmentFacade.getHelperHostPort();
+        return _virtualHostNode.getHelperAddress();
     }
 
     @Override
     public String getDurability() throws IOException, JMException
     {
-        try
-        {
-            return _replicatedEnvironmentFacade.getDurability();
-        }
-        catch (RuntimeException e)
-        {
-            LOGGER.debug("Failed query replication policy", e);
-            throw new JMException(e.getMessage());
-        }
+        return _virtualHostNode.getDurability();
     }
 
 
     @Override
     public boolean getCoalescingSync() throws IOException, JMException
     {
-        return _replicatedEnvironmentFacade.isCoalescingSync();
+        return _virtualHostNode.isCoalescingSync();
     }
 
     @Override
@@ -141,11 +138,11 @@ public class BDBHAMessageStoreManagerMBe
     {
         try
         {
-            return _replicatedEnvironmentFacade.getNodeState();
+            return _virtualHostNode.getRole();
         }
         catch (RuntimeException e)
         {
-            LOGGER.debug("Failed query node state", e);
+            LOGGER.debug("Failed query node role", e);
             throw new JMException(e.getMessage());
         }
     }
@@ -153,26 +150,30 @@ public class BDBHAMessageStoreManagerMBe
     @Override
     public boolean getDesignatedPrimary() throws IOException, JMException
     {
-        try
-        {
-            return _replicatedEnvironmentFacade.isDesignatedPrimary();
-        }
-        catch (RuntimeException e)
-        {
-            LOGGER.debug("Failed query designated primary", e);
-            throw new JMException(e.getMessage());
-        }
+        return _virtualHostNode.isDesignatedPrimary();
     }
 
     @Override
     public TabularData getAllNodesInGroup() throws IOException, JMException
     {
         final TabularDataSupport data = new 
TabularDataSupport(GROUP_MEMBERS_TABLE);
-        final List<Map<String, String>> members = 
_replicatedEnvironmentFacade.getGroupMembers();
 
-        for (Map<String, String> map : members)
-        {
-            CompositeData memberData = new 
CompositeDataSupport(GROUP_MEMBER_ROW, map);
+        Map<String, String> localNodeMap = new HashMap<String, String>();
+        localNodeMap.put(GRP_MEM_COL_NODE_NAME, _virtualHostNode.getName());
+        localNodeMap.put(GRP_MEM_COL_NODE_HOST_PORT, 
_virtualHostNode.getAddress());
+        CompositeData localNodeData = new 
CompositeDataSupport(GROUP_MEMBER_ROW, localNodeMap);
+        data.put(localNodeData);
+
+        @SuppressWarnings("rawtypes")
+        final Collection<? extends RemoteReplicationNode> members = 
_virtualHostNode.getRemoteReplicationNodes();
+        for (RemoteReplicationNode<?> remoteNode : members)
+        {
+            BDBHARemoteReplicationNode<?> haReplicationNode = 
(BDBHARemoteReplicationNode<?>)remoteNode;
+            Map<String, String> nodeMap = new HashMap<String, String>();
+            nodeMap.put(GRP_MEM_COL_NODE_NAME, haReplicationNode.getName());
+            nodeMap.put(GRP_MEM_COL_NODE_HOST_PORT, 
haReplicationNode.getAddress());
+
+            CompositeData memberData = new 
CompositeDataSupport(GROUP_MEMBER_ROW, nodeMap);
             data.put(memberData);
         }
         return data;
@@ -181,14 +182,32 @@ public class BDBHAMessageStoreManagerMBe
     @Override
     public void removeNodeFromGroup(String nodeName) throws JMException
     {
-        try
+        if (getNodeName().equals(nodeName))
         {
-            _replicatedEnvironmentFacade.removeNodeFromGroup(nodeName);
+            _virtualHostNode.delete();
         }
-        catch (RuntimeException e)
+        else
         {
-            LOGGER.error("Failed to remove node " + nodeName + " from group", 
e);
-            throw new JMException(e.getMessage());
+            @SuppressWarnings("rawtypes")
+            Collection<? extends RemoteReplicationNode> remoteNodes = 
_virtualHostNode.getRemoteReplicationNodes();
+            for (RemoteReplicationNode<?> remoteNode : remoteNodes)
+            {
+                if (remoteNode.getName().equals(nodeName))
+                {
+                    try
+                    {
+                        remoteNode.delete();
+                        return;
+                    }
+                    catch(IllegalStateTransitionException e)
+                    {
+                        LOGGER.error("Cannot remove node '" + nodeName + "' 
from the group", e);
+                        throw new JMException("Cannot remove node '" + 
nodeName + "' from the group:" + e.getMessage());
+                    }
+                }
+            }
+
+            throw new JMException("Failed to find replication node with name 
'" + nodeName + "'.");
         }
     }
 
@@ -197,11 +216,11 @@ public class BDBHAMessageStoreManagerMBe
     {
         try
         {
-            _replicatedEnvironmentFacade.setDesignatedPrimary(primary);
+            _virtualHostNode.setAttributes(Collections.<String, 
Object>singletonMap(BDBHAVirtualHostNode.DESIGNATED_PRIMARY, primary));
         }
         catch (RuntimeException e)
         {
-            LOGGER.error("Failed to set node " + 
_replicatedEnvironmentFacade.getNodeName() + " as designated primary", e);
+            LOGGER.error("Failed to set node " + _virtualHostNode.getName() + 
" as designated primary", e);
             throw new JMException(e.getMessage());
         }
     }
@@ -209,15 +228,7 @@ public class BDBHAMessageStoreManagerMBe
     @Override
     public void updateAddress(String nodeName, String newHostName, int 
newPort) throws JMException
     {
-        try
-        {
-            _replicatedEnvironmentFacade.updateAddress(nodeName, newHostName, 
newPort);
-        }
-        catch(RuntimeException e)
-        {
-            LOGGER.error("Failed to update address for node " + nodeName + " 
to " + newHostName + ":" + newPort, e);
-            throw new JMException(e.getMessage());
-        }
+        throw new UnsupportedOperationException("Unsupported operation.  
Delete the node then add a new node in its place.");
     }
 
     @Override

Modified: 
qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanProvider.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanProvider.java?rev=1593538&r1=1593537&r2=1593538&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanProvider.java
 (original)
+++ 
qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanProvider.java
 Fri May  9 13:24:24 2014
@@ -21,17 +21,12 @@
 package org.apache.qpid.server.store.berkeleydb.jmx;
 
 import javax.management.JMException;
-import javax.management.StandardMBean;
 
 import org.apache.log4j.Logger;
 import org.apache.qpid.server.jmx.MBeanProvider;
 import org.apache.qpid.server.jmx.ManagedObject;
 import org.apache.qpid.server.jmx.ManagedObjectRegistry;
 import org.apache.qpid.server.model.ConfiguredObject;
-import org.apache.qpid.server.model.VirtualHost;
-import org.apache.qpid.server.model.VirtualHostNode;
-import org.apache.qpid.server.store.berkeleydb.BDBHAVirtualHost;
-import org.apache.qpid.server.store.berkeleydb.BDBMessageStore;
 import 
org.apache.qpid.server.store.berkeleydb.replication.ReplicatedEnvironmentFacade;
 import org.apache.qpid.server.virtualhostnode.berkeleydb.BDBHAVirtualHostNode;
 
@@ -58,17 +53,12 @@ public class BDBHAMessageStoreManagerMBe
     @Override
     public ManagedObject createMBean(ConfiguredObject child, 
ManagedObjectRegistry registry) throws JMException
     {
-        BDBHAVirtualHostNode<?> virtualHostNode = (BDBHAVirtualHostNode<?>) 
child;
-
-        BDBMessageStore messageStore = (BDBMessageStore) 
virtualHostNode.getConfigurationStore();
-
         if (LOGGER.isDebugEnabled())
         {
             LOGGER.debug("Creating mBean for child " + child);
         }
 
-        ReplicatedEnvironmentFacade replicatedEnvironmentFacade = 
(ReplicatedEnvironmentFacade)messageStore.getEnvironmentFacade();
-        return new 
BDBHAMessageStoreManagerMBean(virtualHostNode.getGroupName(), 
replicatedEnvironmentFacade, registry);
+        return new BDBHAMessageStoreManagerMBean((BDBHAVirtualHostNode<?>) 
child, registry);
     }
 
     @Override

Modified: 
qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/ManagedBDBHAMessageStore.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/ManagedBDBHAMessageStore.java?rev=1593538&r1=1593537&r2=1593538&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/ManagedBDBHAMessageStore.java
 (original)
+++ 
qpid/trunk/qpid/java/bdbstore/jmx/src/main/java/org/apache/qpid/server/store/berkeleydb/jmx/ManagedBDBHAMessageStore.java
 Fri May  9 13:24:24 2014
@@ -41,6 +41,9 @@ public interface ManagedBDBHAMessageStor
     public static final String ATTR_DESIGNATED_PRIMARY = "DesignatedPrimary";
     public static final String ATTR_COALESCING_SYNC = "CoalescingSync";
 
+    public static final String GRP_MEM_COL_NODE_HOST_PORT = "NodeHostPort";
+    public static final String GRP_MEM_COL_NODE_NAME = "NodeName";
+
     @MBeanAttribute(name=ATTR_GROUP_NAME, description="Name identifying the 
group")
     String getGroupName() throws IOException, JMException;
 

Modified: 
qpid/trunk/qpid/java/bdbstore/jmx/src/test/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/jmx/src/test/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanTest.java?rev=1593538&r1=1593537&r2=1593538&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/bdbstore/jmx/src/test/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanTest.java
 (original)
+++ 
qpid/trunk/qpid/java/bdbstore/jmx/src/test/java/org/apache/qpid/server/store/berkeleydb/jmx/BDBHAMessageStoreManagerMBeanTest.java
 Fri May  9 13:24:24 2014
@@ -19,15 +19,16 @@
  */
 package org.apache.qpid.server.store.berkeleydb.jmx;
 
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.Iterator;
 
 import javax.management.JMException;
 import javax.management.ObjectName;
@@ -37,22 +38,24 @@ import javax.management.openmbean.Tabula
 
 import junit.framework.TestCase;
 
-import org.apache.qpid.server.jmx.AMQManagedObject;
 import org.apache.qpid.server.jmx.ManagedObjectRegistry;
-import 
org.apache.qpid.server.store.berkeleydb.replication.ReplicatedEnvironmentFacade;
+import org.apache.qpid.server.model.IllegalStateTransitionException;
+import org.apache.qpid.server.model.RemoteReplicationNode;
+import 
org.apache.qpid.server.virtualhostnode.berkeleydb.BDBHARemoteReplicationNode;
+import org.apache.qpid.server.virtualhostnode.berkeleydb.BDBHAVirtualHostNode;
 
 public class BDBHAMessageStoreManagerMBeanTest extends TestCase
 {
-    private static final String TEST_GROUP_NAME = "testGroupName";
+    private static final String TEST_VHOST_NAME = "test";
+    private static final String TEST_GROUP_NAME = TEST_VHOST_NAME;
     private static final String TEST_NODE_NAME = "testNodeName";
     private static final String TEST_NODE_HOST_PORT = "host:1234";
     private static final String TEST_HELPER_HOST_PORT = "host:5678";
     private static final String TEST_DURABILITY = "sync,sync,all";
     private static final String TEST_NODE_STATE = "MASTER";
-    private static final String TEST_STORE_NAME = "testStoreName";
     private static final boolean TEST_DESIGNATED_PRIMARY_FLAG = false;
 
-    private ReplicatedEnvironmentFacade _replicatedEnvironmentFacade;
+    private BDBHAVirtualHostNode<?> _virtualHostNode;
     private BDBHAMessageStoreManagerMBean _mBean;
 
     @Override
@@ -60,9 +63,13 @@ public class BDBHAMessageStoreManagerMBe
     {
         super.setUp();
 
-        _replicatedEnvironmentFacade = mock(ReplicatedEnvironmentFacade.class);
+        _virtualHostNode = mock(BDBHAVirtualHostNode.class);
+        when(_virtualHostNode.getName()).thenReturn(TEST_NODE_NAME);
+        when(_virtualHostNode.getGroupName()).thenReturn(TEST_GROUP_NAME);
+        when(_virtualHostNode.getAddress()).thenReturn(TEST_NODE_HOST_PORT);
+
         ManagedObjectRegistry registry = mock(ManagedObjectRegistry.class);
-        _mBean = new BDBHAMessageStoreManagerMBean(TEST_STORE_NAME, 
_replicatedEnvironmentFacade, registry);
+        _mBean = new BDBHAMessageStoreManagerMBean(_virtualHostNode, registry);
     }
 
     @Override
@@ -73,101 +80,110 @@ public class BDBHAMessageStoreManagerMBe
 
     public void testObjectName() throws Exception
     {
-        String expectedObjectName = 
"org.apache.qpid:type=BDBHAMessageStore,name=" + 
ObjectName.quote(TEST_STORE_NAME);
+        String expectedObjectName = 
"org.apache.qpid:type=BDBHAMessageStore,name=" + 
ObjectName.quote(TEST_VHOST_NAME);
         assertEquals(expectedObjectName, _mBean.getObjectName().toString());
     }
 
     public void testGroupName() throws Exception
     {
-        
when(_replicatedEnvironmentFacade.getGroupName()).thenReturn(TEST_GROUP_NAME);
+        when(_virtualHostNode.getGroupName()).thenReturn(TEST_GROUP_NAME);
 
         assertEquals(TEST_GROUP_NAME, 
_mBean.getAttribute(ManagedBDBHAMessageStore.ATTR_GROUP_NAME));
     }
 
     public void testNodeName() throws Exception
     {
-        
when(_replicatedEnvironmentFacade.getNodeName()).thenReturn(TEST_NODE_NAME);
+        when(_virtualHostNode.getName()).thenReturn(TEST_NODE_NAME);
 
         assertEquals(TEST_NODE_NAME, 
_mBean.getAttribute(ManagedBDBHAMessageStore.ATTR_NODE_NAME));
     }
 
     public void testNodeHostPort() throws Exception
     {
-        
when(_replicatedEnvironmentFacade.getHostPort()).thenReturn(TEST_NODE_HOST_PORT);
+        when(_virtualHostNode.getAddress()).thenReturn(TEST_NODE_HOST_PORT);
 
         assertEquals(TEST_NODE_HOST_PORT, 
_mBean.getAttribute(ManagedBDBHAMessageStore.ATTR_NODE_HOST_PORT));
     }
 
     public void testHelperHostPort() throws Exception
     {
-        
when(_replicatedEnvironmentFacade.getHelperHostPort()).thenReturn(TEST_HELPER_HOST_PORT);
+        
when(_virtualHostNode.getHelperAddress()).thenReturn(TEST_HELPER_HOST_PORT);
 
         assertEquals(TEST_HELPER_HOST_PORT, 
_mBean.getAttribute(ManagedBDBHAMessageStore.ATTR_HELPER_HOST_PORT));
     }
 
     public void testDurability() throws Exception
     {
-        
when(_replicatedEnvironmentFacade.getDurability()).thenReturn(TEST_DURABILITY);
+        when(_virtualHostNode.getDurability()).thenReturn(TEST_DURABILITY);
 
         assertEquals(TEST_DURABILITY, 
_mBean.getAttribute(ManagedBDBHAMessageStore.ATTR_DURABILITY));
     }
 
     public void testCoalescingSync() throws Exception
     {
-        when(_replicatedEnvironmentFacade.isCoalescingSync()).thenReturn(true);
+        when(_virtualHostNode.isCoalescingSync()).thenReturn(true);
 
         assertEquals(true, 
_mBean.getAttribute(ManagedBDBHAMessageStore.ATTR_COALESCING_SYNC));
     }
 
     public void testNodeState() throws Exception
     {
-        
when(_replicatedEnvironmentFacade.getNodeState()).thenReturn(TEST_NODE_STATE);
+        when(_virtualHostNode.getRole()).thenReturn(TEST_NODE_STATE);
 
         assertEquals(TEST_NODE_STATE, 
_mBean.getAttribute(ManagedBDBHAMessageStore.ATTR_NODE_STATE));
     }
 
     public void testDesignatedPrimaryFlag() throws Exception
     {
-        
when(_replicatedEnvironmentFacade.isDesignatedPrimary()).thenReturn(TEST_DESIGNATED_PRIMARY_FLAG);
+        
when(_virtualHostNode.isDesignatedPrimary()).thenReturn(TEST_DESIGNATED_PRIMARY_FLAG);
 
         assertEquals(TEST_DESIGNATED_PRIMARY_FLAG, 
_mBean.getAttribute(ManagedBDBHAMessageStore.ATTR_DESIGNATED_PRIMARY));
     }
 
     public void testGroupMembersForGroupWithOneNode() throws Exception
     {
-        List<Map<String, String>> members = 
Collections.singletonList(createTestNodeResult());
-        
when(_replicatedEnvironmentFacade.getGroupMembers()).thenReturn(members);
+        BDBHARemoteReplicationNode<?> node = mockRemoteNode();
 
         final TabularData resultsTable = _mBean.getAllNodesInGroup();
 
-        assertTableHasHeadingsNamed(resultsTable, 
ReplicatedEnvironmentFacade.GRP_MEM_COL_NODE_NAME, 
ReplicatedEnvironmentFacade.GRP_MEM_COL_NODE_HOST_PORT);
+        assertTableHasHeadingsNamed(resultsTable, 
BDBHAMessageStoreManagerMBean.GRP_MEM_COL_NODE_NAME,
+                BDBHAMessageStoreManagerMBean.GRP_MEM_COL_NODE_HOST_PORT);
 
         final int numberOfDataRows = resultsTable.size();
-        assertEquals("Unexpected number of data rows", 1 ,numberOfDataRows);
-        final CompositeData row = (CompositeData) 
resultsTable.values().iterator().next();
-        assertEquals(TEST_NODE_NAME, 
row.get(ReplicatedEnvironmentFacade.GRP_MEM_COL_NODE_NAME));
-        assertEquals(TEST_NODE_HOST_PORT, 
row.get(ReplicatedEnvironmentFacade.GRP_MEM_COL_NODE_HOST_PORT));
+        assertEquals("Unexpected number of data rows", 2, numberOfDataRows);
+        Iterator<?> iterator = resultsTable.values().iterator();
+
+        final CompositeData firstRow = (CompositeData) iterator.next();
+        assertEquals(TEST_NODE_NAME, 
firstRow.get(BDBHAMessageStoreManagerMBean.GRP_MEM_COL_NODE_NAME));
+        assertEquals(TEST_NODE_HOST_PORT, 
firstRow.get(BDBHAMessageStoreManagerMBean.GRP_MEM_COL_NODE_HOST_PORT));
+
+        final CompositeData secondRow = (CompositeData) iterator.next();
+        assertEquals(node.getName(), 
secondRow.get(BDBHAMessageStoreManagerMBean.GRP_MEM_COL_NODE_NAME));
+        assertEquals(node.getAddress(), 
secondRow.get(BDBHAMessageStoreManagerMBean.GRP_MEM_COL_NODE_HOST_PORT));
     }
 
     public void testRemoveNodeFromReplicationGroup() throws Exception
     {
-        _mBean.removeNodeFromGroup(TEST_NODE_NAME);
+        BDBHARemoteReplicationNode<?> node = mockRemoteNode();
+
+        _mBean.removeNodeFromGroup(node.getName());
 
-        
verify(_replicatedEnvironmentFacade).removeNodeFromGroup(TEST_NODE_NAME);
+        verify(node).delete();
     }
 
-    public void testRemoveNodeFromReplicationGroupWithError() throws Exception
+    public void 
testRemoveNodeFromReplicationGroupOnIllegalStateTransitionException() throws 
Exception
     {
-        doThrow(new RuntimeException("mocked 
exception")).when(_replicatedEnvironmentFacade).removeNodeFromGroup(TEST_NODE_NAME);
+        BDBHARemoteReplicationNode<?> node = mockRemoteNode();
+         doThrow(new 
IllegalStateTransitionException("test")).when(node).delete();
 
-        try
+         try
         {
-            _mBean.removeNodeFromGroup(TEST_NODE_NAME);
+            _mBean.removeNodeFromGroup("remotenode");
             fail("Exception not thrown");
         }
         catch (JMException je)
         {
-            // PASS
+            // PASS#
         }
     }
 
@@ -175,32 +191,8 @@ public class BDBHAMessageStoreManagerMBe
     {
         _mBean.setDesignatedPrimary(true);
 
-        verify(_replicatedEnvironmentFacade).setDesignatedPrimary(true);
-    }
-
-    public void testSetAsDesignatedPrimaryWithError() throws Exception
-    {
-        doThrow(new RuntimeException("mocked 
exception")).when(_replicatedEnvironmentFacade).setDesignatedPrimary(true);
-
-        try
-        {
-            _mBean.setDesignatedPrimary(true);
-            fail("Exception not thrown");
-        }
-        catch (JMException je)
-        {
-            // PASS
-        }
-    }
-
-    public void testUpdateAddress() throws Exception
-    {
-        String newHostName = "newHostName";
-        int newPort = 1967;
-
-        _mBean.updateAddress(TEST_NODE_NAME, newHostName, newPort);
-
-        verify(_replicatedEnvironmentFacade).updateAddress(TEST_NODE_NAME, 
newHostName, newPort);
+        verify(_virtualHostNode).setAttributes(
+                eq(Collections.<String, Object> 
singletonMap(BDBHAVirtualHostNode.DESIGNATED_PRIMARY, true)));
     }
 
     private void assertTableHasHeadingsNamed(final TabularData resultsTable, 
String... headingNames)
@@ -212,11 +204,16 @@ public class BDBHAMessageStoreManagerMBe
         }
     }
 
-    private Map<String, String> createTestNodeResult()
+    private BDBHARemoteReplicationNode<?> mockRemoteNode()
     {
-        Map<String, String> items = new HashMap<String, String>();
-        items.put(ReplicatedEnvironmentFacade.GRP_MEM_COL_NODE_NAME, 
TEST_NODE_NAME);
-        items.put(ReplicatedEnvironmentFacade.GRP_MEM_COL_NODE_HOST_PORT, 
TEST_NODE_HOST_PORT);
-        return items;
+        BDBHARemoteReplicationNode<?> remoteNode = 
mock(BDBHARemoteReplicationNode.class);
+        when(remoteNode.getName()).thenReturn("remotenode");
+        when(remoteNode.getAddress()).thenReturn("remotehost:port");
+
+        @SuppressWarnings("rawtypes")
+        Collection<? extends RemoteReplicationNode> remoteNodes = 
Collections.singletonList(remoteNode);
+        
doReturn(remoteNodes).when(_virtualHostNode).getRemoteReplicationNodes();
+
+        return remoteNode;
     }
 }

Modified: 
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java?rev=1593538&r1=1593537&r2=1593538&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
 (original)
+++ 
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
 Fri May  9 13:24:24 2014
@@ -135,10 +135,6 @@ public class ReplicatedEnvironmentFacade
 
     public static final String TYPE = "BDB-HA";
 
-    // TODO: JMX will change to observe the model, at that point these names 
will disappear
-    public static final String GRP_MEM_COL_NODE_HOST_PORT = "NodeHostPort";
-    public static final String GRP_MEM_COL_NODE_NAME = "NodeName";
-
     private final ReplicatedEnvironmentConfiguration _configuration;
     private final Durability _durability;
     private final Boolean _coalescingSync;
@@ -718,21 +714,6 @@ public class ReplicatedEnvironmentFacade
         }
     }
 
-    public List<Map<String, String>> getGroupMembers()
-    {
-        List<Map<String, String>> members = new ArrayList<Map<String, 
String>>();
-
-        for (ReplicationNode node : _environment.getGroup().getNodes())
-        {
-            Map<String, String> nodeMap = new HashMap<String, String>();
-            nodeMap.put(ReplicatedEnvironmentFacade.GRP_MEM_COL_NODE_NAME, 
node.getName());
-            
nodeMap.put(ReplicatedEnvironmentFacade.GRP_MEM_COL_NODE_HOST_PORT, 
node.getHostName() + ":" + node.getPort());
-            members.add(nodeMap);
-        }
-
-        return members;
-    }
-
     private ReplicationGroupAdmin createReplicationGroupAdmin()
     {
         final Set<InetSocketAddress> helpers = new 
HashSet<InetSocketAddress>();

Modified: 
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHARemoteReplicationNodeImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHARemoteReplicationNodeImpl.java?rev=1593538&r1=1593537&r2=1593538&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHARemoteReplicationNodeImpl.java
 (original)
+++ 
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHARemoteReplicationNodeImpl.java
 Fri May  9 13:24:24 2014
@@ -21,14 +21,15 @@
 
 package org.apache.qpid.server.virtualhostnode.berkeleydb;
 
+import java.io.File;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicReference;
 
 import com.sleepycat.je.rep.MasterStateException;
 import com.sleepycat.je.rep.ReplicatedEnvironment;
-import org.apache.log4j.Logger;
 
+import org.apache.log4j.Logger;
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.model.AbstractConfiguredObject;
 import org.apache.qpid.server.model.ConfiguredObject;
@@ -53,7 +54,7 @@ public class BDBHARemoteReplicationNodeI
 
     private final AtomicReference<State> _state;
 
-    public BDBHARemoteReplicationNodeImpl(BDBHAVirtualHostNodeImpl 
virtualHostNode, Map<String, Object> attributes, ReplicatedEnvironmentFacade 
replicatedEnvironmentFacade)
+    public BDBHARemoteReplicationNodeImpl(BDBHAVirtualHostNode<?> 
virtualHostNode, Map<String, Object> attributes, ReplicatedEnvironmentFacade 
replicatedEnvironmentFacade)
     {
         super(parentsMap(virtualHostNode), attributes);
         _address = (String)attributes.get(ADDRESS);
@@ -97,10 +98,30 @@ public class BDBHARemoteReplicationNodeI
         return _lastTransactionId;
     }
 
-    @StateTransition(currentState = {State.ACTIVE, State.QUIESCED, 
State.STOPPED, State.ERRORED}, desiredState = State.DELETED)
+    @StateTransition(currentState = {State.ACTIVE, State.STOPPED}, 
desiredState = State.DELETED)
     private void doDelete()
     {
-        this.deleted();
+        String nodeName = getName();
+
+        if (LOGGER.isDebugEnabled())
+        {
+            LOGGER.debug("Deleting node '"  + nodeName + "' from group '" + 
getGroupName() + "'");
+        }
+
+        try
+        {
+            _replicatedEnvironmentFacade.removeNodeFromGroup(nodeName);
+            _state.set(State.DELETED);
+            deleted();
+        }
+        catch(MasterStateException e)
+        {
+            throw new IllegalStateTransitionException("Node '" + nodeName + "' 
cannot be deleted when role is a master");
+        }
+        catch (Exception e)
+        {
+            throw new IllegalStateTransitionException("Unexpected exception on 
node '" + nodeName + "' deletion", e);
+        }
     }
 
     protected void afterSetRole()
@@ -127,37 +148,6 @@ public class BDBHARemoteReplicationNodeI
     }
 
     @Override
-    protected boolean setState(State desiredState)
-    {
-        if (desiredState == State.DELETED)
-        {
-            String nodeName = getName();
-
-            if (LOGGER.isDebugEnabled())
-            {
-                LOGGER.debug("Deleting node '"  + nodeName + "' from group '" 
+ getGroupName() + "'");
-            }
-
-            try
-            {
-                _replicatedEnvironmentFacade.removeNodeFromGroup(nodeName);
-                _state.set(State.DELETED);
-                delete();
-                return true;
-            }
-            catch(MasterStateException e)
-            {
-                throw new IllegalStateTransitionException("Node '" + nodeName 
+ "' cannot be deleted when role is a master");
-            }
-            catch (Exception e)
-            {
-                throw new IllegalStateTransitionException("Unexpected 
exception on node '" + nodeName + "' deletion", e);
-            }
-        }
-        return false;
-    }
-
-    @Override
     protected void validateChange(final ConfiguredObject<?> 
proxyForValidation, final Set<String> changedAttributes)
     {
         super.validateChange(proxyForValidation, changedAttributes);

Modified: 
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java?rev=1593538&r1=1593537&r2=1593538&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
 (original)
+++ 
qpid/trunk/qpid/java/bdbstore/src/main/java/org/apache/qpid/server/virtualhostnode/berkeleydb/BDBHAVirtualHostNodeImpl.java
 Fri May  9 13:24:24 2014
@@ -37,8 +37,8 @@ import com.sleepycat.je.rep.ReplicatedEn
 import com.sleepycat.je.rep.ReplicationNode;
 import com.sleepycat.je.rep.StateChangeEvent;
 import com.sleepycat.je.rep.StateChangeListener;
-import org.apache.log4j.Logger;
 
+import org.apache.log4j.Logger;
 import org.apache.qpid.server.logging.messages.ConfigStoreMessages;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.BrokerModel;

Modified: 
qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java?rev=1593538&r1=1593537&r2=1593538&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
 (original)
+++ 
qpid/trunk/qpid/java/bdbstore/src/test/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeTest.java
 Fri May  9 13:24:24 2014
@@ -403,16 +403,32 @@ public class BDBHAVirtualHostNodeTest ex
 
         assertTrue("Replication nodes have not been seen during 5s", 
remoteNodeLatch.await(5, TimeUnit.SECONDS));
 
-        Collection<? extends RemoteReplicationNode> remoteNodes = 
node1.getRemoteReplicationNodes();
-        BDBHARemoteReplicationNodeImpl replicaRemoteNode = 
(BDBHARemoteReplicationNodeImpl)remoteNodes.iterator().next();
+        BDBHARemoteReplicationNodeImpl replicaRemoteNode = null;
 
         long awaitReplicaRoleCount = 0;
-        while(!"REPLICA".equals(replicaRemoteNode.getRole()))
+        while(replicaRemoteNode == null)
         {
+            Collection<? extends RemoteReplicationNode> remoteNodes = 
node1.getRemoteReplicationNodes();
+            if (remoteNodes != null)
+            {
+                for (RemoteReplicationNode node : remoteNodes)
+                {
+                    BDBHARemoteReplicationNodeImpl bdbNode = 
(BDBHARemoteReplicationNodeImpl)node;
+                    if ("REPLICA".equals(bdbNode.getRole()))
+                    {
+                        replicaRemoteNode = bdbNode;
+                        break;
+                    }
+                }
+                if (replicaRemoteNode != null)
+                {
+                    break;
+                }
+            }
             Thread.sleep(100);
             if (awaitReplicaRoleCount > 50)
             {
-                fail("Remote replication node is not in a REPLICA role");
+                fail("Remote replication node is not in a REPLICA role: " + 
remoteNodes);
             }
             awaitReplicaRoleCount++;
         }

Modified: 
qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeRestTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeRestTest.java?rev=1593538&r1=1593537&r2=1593538&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeRestTest.java
 (original)
+++ 
qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/BDBHAVirtualHostNodeRestTest.java
 Fri May  9 13:24:24 2014
@@ -123,26 +123,24 @@ public class BDBHAVirtualHostNodeRestTes
     private void assertNode(String nodeName, int nodePort, int nodeHelperPort, 
String masterNode) throws Exception
     {
         boolean isMaster = nodeName.equals(masterNode);
-        waitForAttributeChanged(_baseNodeRestUrl + nodeName + "?depth=0", 
BDBHAVirtualHostNode.ROLE, isMaster? "MASTER" : "REPLICA");
+        String expectedRole = isMaster? "MASTER" : "REPLICA";
+        waitForAttributeChanged(_baseNodeRestUrl + nodeName + "?depth=0", 
BDBHAVirtualHostNode.ROLE, expectedRole);
 
-        Map<String, Object> nodeData = 
getRestTestHelper().getJsonAsSingletonList(_baseNodeRestUrl + nodeName);
+        Map<String, Object> nodeData = 
getRestTestHelper().getJsonAsSingletonList(_baseNodeRestUrl + nodeName + 
"?depth=0");
         assertEquals("Unexpected name", nodeName, 
nodeData.get(BDBHAVirtualHostNode.NAME));
         assertEquals("Unexpected type", "BDB_HA", 
nodeData.get(BDBHAVirtualHostNode.TYPE));
         assertEquals("Unexpected path", new File(_storeBaseDir, 
nodeName).getPath(), nodeData.get(BDBHAVirtualHostNode.STORE_PATH));
         assertEquals("Unexpected address", "localhost:" + nodePort, 
nodeData.get(BDBHAVirtualHostNode.ADDRESS));
         assertEquals("Unexpected helper address", "localhost:" + 
nodeHelperPort, nodeData.get(BDBHAVirtualHostNode.HELPER_ADDRESS));
         assertEquals("Unexpected group name", _hostName, 
nodeData.get(BDBHAVirtualHostNode.GROUP_NAME));;
+        assertEquals("Unexpected role", expectedRole, 
nodeData.get(BDBHAVirtualHostNode.ROLE));
 
         if (isMaster)
         {
-            assertEquals("Unexpected role", "MASTER", 
nodeData.get(BDBHAVirtualHostNode.ROLE));
             Map<String, Object> hostData = 
getRestTestHelper().getJsonAsSingletonList("virtualhost/" + masterNode + "/" + 
_hostName + "?depth=0");
             assertEquals("Unexpected host name", _hostName, 
hostData.get(VirtualHost.NAME));
         }
-        else
-        {
-            assertEquals("Unexpected role", "REPLICA", 
nodeData.get(BDBHAVirtualHostNode.ROLE));
-        }
+
     }
 
     private void assertRemoteNodes(String masterNode, String... replicaNodes) 
throws Exception

Modified: 
qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/HAClusterManagementTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/HAClusterManagementTest.java?rev=1593538&r1=1593537&r2=1593538&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/HAClusterManagementTest.java
 (original)
+++ 
qpid/trunk/qpid/java/bdbstore/systests/src/main/java/org/apache/qpid/server/store/berkeleydb/HAClusterManagementTest.java
 Fri May  9 13:24:24 2014
@@ -38,7 +38,6 @@ import org.apache.log4j.Logger;
 import org.apache.qpid.jms.ConnectionURL;
 import org.apache.qpid.management.common.mbeans.ManagedBroker;
 import org.apache.qpid.server.store.berkeleydb.jmx.ManagedBDBHAMessageStore;
-import 
org.apache.qpid.server.store.berkeleydb.replication.ReplicatedEnvironmentFacade;
 import org.apache.qpid.test.utils.JMXTestUtils;
 import org.apache.qpid.test.utils.QpidBrokerTestCase;
 
@@ -144,11 +143,11 @@ public class HAClusterManagementTest ext
 
             CompositeData row = groupMembers.get(new Object[] {nodeName});
             assertNotNull("Table does not contain row for node name " + 
nodeName, row);
-            assertEquals(nodeHostPort, 
row.get(ReplicatedEnvironmentFacade.GRP_MEM_COL_NODE_HOST_PORT));
+            assertEquals(nodeHostPort, 
row.get(ManagedBDBHAMessageStore.GRP_MEM_COL_NODE_HOST_PORT));
         }
     }
 
-    public void testRemoveNodeFromGroup() throws Exception
+    public void testRemoveRemoteNodeFromGroup() throws Exception
     {
         final Iterator<Integer> brokerPortNumberIterator = 
getBrokerPortNumbers().iterator();
         final int brokerPortNumberToMakeObservation = 
brokerPortNumberIterator.next();
@@ -158,70 +157,17 @@ public class HAClusterManagementTest ext
 
         final String removedNodeName = 
_clusterCreator.getNodeNameForNodeAt(_clusterCreator.getBdbPortForBrokerPort(brokerPortNumberToBeRemoved));
         _clusterCreator.stopNode(brokerPortNumberToBeRemoved);
-        storeBean.removeNodeFromGroup(removedNodeName);
-
-        final int numberOfDataRowsAfterRemoval = 
storeBean.getAllNodesInGroup().size();
-        assertEquals("Unexpected number of data rows before test", 
NUMBER_OF_NODES - 1,numberOfDataRowsAfterRemoval);
-    }
-
-    /**
-     * Updates the address of a node.
-     *
-     * If the broker (node) can subsequently start without error then the 
update was a success, hence no need for an explicit
-     * assert.
-     *
-     * @see 
#testRestartNodeWithNewPortNumberWithoutFirstCallingUpdateAddressThrowsAnException()
 for converse case
-     */
-    public void testUpdateAddress() throws Exception
-    {
-        final Iterator<Integer> brokerPortNumberIterator = 
getBrokerPortNumbers().iterator();
-        final int brokerPortNumberToPerformUpdate = 
brokerPortNumberIterator.next();
-        final int brokerPortNumberToBeMoved = brokerPortNumberIterator.next();
-        final ManagedBDBHAMessageStore storeBean = 
getStoreBeanForNodeAtBrokerPort(brokerPortNumberToPerformUpdate);
-
-        _clusterCreator.stopNode(brokerPortNumberToBeMoved);
-
-        final int oldBdbPort = 
_clusterCreator.getBdbPortForBrokerPort(brokerPortNumberToBeMoved);
-        final int newBdbPort = getNextAvailable(oldBdbPort + 1);
-
-        
storeBean.updateAddress(_clusterCreator.getNodeNameForNodeAt(oldBdbPort), 
_clusterCreator.getIpAddressOfBrokerHost(), newBdbPort);
-
-        _clusterCreator.modifyClusterNodeBdbAddress(brokerPortNumberToBeMoved, 
newBdbPort);
-
-        _clusterCreator.startNode(brokerPortNumberToBeMoved);
-    }
-
-    /**
-     * @see #testUpdateAddress()
-     */
-    public void 
testRestartNodeWithNewPortNumberWithoutFirstCallingUpdateAddressThrowsAnException()
 throws Exception
-    {
-        final Iterator<Integer> brokerPortNumberIterator = 
getBrokerPortNumbers().iterator();
-        final int brokerPortNumberToBeMoved = brokerPortNumberIterator.next();
 
-        _clusterCreator.stopNode(brokerPortNumberToBeMoved);
-
-        final int oldBdbPort = 
_clusterCreator.getBdbPortForBrokerPort(brokerPortNumberToBeMoved);
-        final int newBdbPort = getNextAvailable(oldBdbPort + 1);
-
-        // now deliberately don't call updateAddress
-
-        _clusterCreator.modifyClusterNodeBdbAddress(brokerPortNumberToBeMoved, 
newBdbPort);
+        storeBean.removeNodeFromGroup(removedNodeName);
 
-        try
-        {
-            _clusterCreator.startNode(brokerPortNumberToBeMoved);
-            fail("Exception not thrown");
-        }
-        catch(RuntimeException rte)
+        long limitTime = System.currentTimeMillis() + 5000;
+        while((NUMBER_OF_NODES == storeBean.getAllNodesInGroup().size()) && 
System.currentTimeMillis() < limitTime)
         {
-            //check cause was BDBs EnvironmentFailureException
-            assertTrue("Message '"+rte.getMessage()+"' does not contain '"
-                       + EnvironmentFailureException.class.getName()
-                       + "'.",
-                       
rte.getMessage().contains(EnvironmentFailureException.class.getName()));
-            // PASS
+            Thread.sleep(100l);
         }
+
+        int numberOfDataRowsAfterRemoval = 
storeBean.getAllNodesInGroup().size();
+        assertEquals("Unexpected number of data rows after test", 
NUMBER_OF_NODES - 1, numberOfDataRowsAfterRemoval);
     }
 
     public void testVirtualHostOperationsDeniedForNonMasterNode() throws 
Exception
@@ -254,6 +200,20 @@ public class HAClusterManagementTest ext
         }
     }
 
+    public void testSetDesignatedPrimary() throws Exception
+    {
+        int brokerPort = 
_clusterCreator.getBrokerPortNumbersForNodes().iterator().next();
+        final ManagedBDBHAMessageStore storeBean = 
getStoreBeanForNodeAtBrokerPort(brokerPort);
+        assertFalse("Unexpected designated primary before change", 
storeBean.getDesignatedPrimary());
+        storeBean.setDesignatedPrimary(true);
+        long limit = System.currentTimeMillis() + 5000;
+        while(!storeBean.getDesignatedPrimary() && System.currentTimeMillis() 
< limit)
+        {
+            Thread.sleep(100l);
+        }
+        assertTrue("Unexpected designated primary after change", 
storeBean.getDesignatedPrimary());
+    }
+
     private ManagedBDBHAMessageStore getStoreBeanForNodeAtBrokerPort(final int 
brokerPortNumber) throws Exception
     {
         _jmxUtils.open(brokerPortNumber);

Modified: 
qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java?rev=1593538&r1=1593537&r2=1593538&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java
 (original)
+++ 
qpid/trunk/qpid/java/broker-plugins/management-jmx/src/main/java/org/apache/qpid/server/jmx/JMXManagementPluginImpl.java
 Fri May  9 13:24:24 2014
@@ -23,15 +23,16 @@ package org.apache.qpid.server.jmx;
 
 import java.io.IOException;
 import java.lang.reflect.Type;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import javax.management.JMException;
 
 import org.apache.log4j.Logger;
-
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.jmx.mbeans.LoggingManagementMBean;
 import org.apache.qpid.server.jmx.mbeans.ServerInformationMBean;
@@ -81,7 +82,7 @@ public class JMXManagementPluginImpl
     private JMXManagedObjectRegistry _objectRegistry;
 
     private final Object _childrenLock = new Object();
-    private final Map<ConfiguredObject, AMQManagedObject> _children = new 
HashMap<ConfiguredObject, AMQManagedObject>();
+    private final Map<ConfiguredObject, List<ManagedObject>> _children = new 
HashMap<ConfiguredObject, List<ManagedObject>>();
 
     @ManagedAttributeField
     private boolean _usePlatformMBeanServer;
@@ -157,7 +158,7 @@ public class JMXManagementPluginImpl
                 if (host != null)
                 {
                     VirtualHostMBean mbean = new VirtualHostMBean(host, 
_objectRegistry);
-                    _children.put(host, mbean);
+                    addMBean(host, mbean);
                 }
                 createAdditionalMBeansFromProviders(virtualHostNode, 
_objectRegistry);
             }
@@ -170,7 +171,7 @@ public class JMXManagementPluginImpl
                     UserManagementMBean mbean = new UserManagementMBean(
                             (PasswordCredentialManagingAuthenticationProvider) 
authenticationProvider,
                             _objectRegistry);
-                    _children.put(authenticationProvider, mbean);
+                    addMBean(authenticationProvider, mbean);
                 }
                 createAdditionalMBeansFromProviders(authenticationProvider, 
_objectRegistry);
             }
@@ -186,6 +187,17 @@ public class JMXManagementPluginImpl
         _allowPortActivation = false;
     }
 
+    private void addMBean(ConfiguredObject configuredObject, ManagedObject 
mbean)
+    {
+        List<ManagedObject> mbeanList = _children.get(configuredObject);
+        if (mbeanList == null)
+        {
+            mbeanList = new ArrayList<ManagedObject>();
+            _children.put(configuredObject, mbeanList);
+        }
+        mbeanList.add(mbean);
+    }
+
     @Override
     public boolean isActivationAllowed(final Port<?> port)
     {
@@ -223,7 +235,21 @@ public class JMXManagementPluginImpl
         {
             for(ConfiguredObject object : _children.keySet())
             {
-                AMQManagedObject mbean = _children.get(object);
+                unregisterChildMBeans(object);
+            }
+            _children.clear();
+        }
+        getBroker().removeChangeListener(this);
+        closeObjectRegistry();
+    }
+
+    private void unregisterChildMBeans(ConfiguredObject object)
+    {
+        List<ManagedObject> mbeans = _children.get(object);
+        if (mbeans != null)
+        {
+            for (ManagedObject mbean : mbeans)
+            {
                 if (mbean instanceof ConfigurationChangeListener)
                 {
                     
object.removeChangeListener((ConfigurationChangeListener)mbean);
@@ -237,10 +263,7 @@ public class JMXManagementPluginImpl
                     LOGGER.error("Exception while unregistering mbean for " + 
object.getClass().getSimpleName() + " " + object.getName(), e);
                 }
             }
-            _children.clear();
         }
-        getBroker().removeChangeListener(this);
-        closeObjectRegistry();
     }
 
     @Override
@@ -278,7 +301,7 @@ public class JMXManagementPluginImpl
 
                 if (mbean != null)
                 {
-                    _children.put(child, mbean);
+                    addMBean(child, mbean);
                 }
                 createAdditionalMBeansFromProviders(child, _objectRegistry);
             }
@@ -296,20 +319,8 @@ public class JMXManagementPluginImpl
         synchronized (_childrenLock)
         {
             child.removeChangeListener(this);
-
-            AMQManagedObject mbean = _children.remove(child);
-            if(mbean != null)
-            {
-                try
-                {
-                    mbean.unregister();
-                }
-                catch(Exception e)
-                {
-                    LOGGER.error("Exception while unregistering mbean for " + 
child.getClass().getSimpleName() + " " + child.getName(), e);
-                    //TODO - report error on removing child MBean
-                }
-            }
+            unregisterChildMBeans(child);
+            _children.remove(child);
         }
     }
 
@@ -337,8 +348,10 @@ public class JMXManagementPluginImpl
                     LOGGER.debug("Provider will create mbean");
                 }
                 mBean = provider.createMBean(child, registry);
-                // TODO track the mbeans that have been created on behalf of a 
child in a map, then
-                // if the child is ever removed, destroy these beans too.
+                if (mBean != null)
+                {
+                    addMBean(child, mBean);
+                }
             }
 
             if(LOGGER.isDebugEnabled())



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to