Author: kwall
Date: Fri Jun 20 12:42:40 2014
New Revision: 1604164

URL: http://svn.apache.org/r1604164
Log:
QPID-5803: [Java Broker] Add a utilised flag to the VHN context after the 
blueprint has been used.

This prevents the virtualhost from being automatically recreated by the 
blueprint, should the user choose to the VH.
Strenghthen unit tests.

Modified:
    
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
    
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNodeTest.java

Modified: 
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java?rev=1604164&r1=1604163&r2=1604164&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
 (original)
+++ 
qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNode.java
 Fri Jun 20 12:42:40 2014
@@ -45,6 +45,7 @@ public abstract class AbstractStandardVi
 {
     private static final Logger LOGGER = 
Logger.getLogger(AbstractStandardVirtualHostNode.class);
     public static final String VIRTUALHOST_BLUEPRINT_CONTEXT_VAR = 
"virtualhostBlueprint";
+    public static final String VIRTUALHOST_BLUEPRINT_UTILISED_CONTEXT_VAR = 
"virtualhostBlueprintUtilised";
 
     public AbstractStandardVirtualHostNode(Map<String, Object> attributes,
                                            Broker<?> parent)
@@ -97,7 +98,12 @@ public abstract class AbstractStandardVi
 
         if (host == null)
         {
-            if (getContext() != null && 
getContext().containsKey(VIRTUALHOST_BLUEPRINT_CONTEXT_VAR))
+
+            boolean hasBlueprint = 
getContext().containsKey(VIRTUALHOST_BLUEPRINT_CONTEXT_VAR);
+            boolean blueprintUtilised = 
getContext().containsKey(VIRTUALHOST_BLUEPRINT_UTILISED_CONTEXT_VAR)
+                    && 
Boolean.parseBoolean(String.valueOf(getContext().get(VIRTUALHOST_BLUEPRINT_UTILISED_CONTEXT_VAR)));
+
+            if (hasBlueprint && !blueprintUtilised)
             {
                 Map<String, Object> virtualhostBlueprint = 
getContextValue(Map.class, VIRTUALHOST_BLUEPRINT_CONTEXT_VAR);
 
@@ -122,6 +128,12 @@ public abstract class AbstractStandardVi
                 {
                     LOGGER.debug("Created new virtualhost: " + host);
                 }
+
+                // Update the context with the utilised flag
+                Map<String, String> actualContext = (Map<String, String>) 
getActualAttributes().get(CONTEXT);
+                Map<String, String> context = new HashMap<>(actualContext);
+                context.put(VIRTUALHOST_BLUEPRINT_UTILISED_CONTEXT_VAR, 
Boolean.TRUE.toString());
+                setAttribute(CONTEXT, getContext(), context);
             }
         }
         else

Modified: 
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNodeTest.java
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNodeTest.java?rev=1604164&r1=1604163&r2=1604164&view=diff
==============================================================================
--- 
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNodeTest.java
 (original)
+++ 
qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/virtualhostnode/AbstractStandardVirtualHostNodeTest.java
 Fri Jun 20 12:42:40 2014
@@ -20,9 +20,11 @@
  */
 package org.apache.qpid.server.virtualhostnode;
 
+import static 
org.apache.qpid.server.virtualhostnode.AbstractStandardVirtualHostNode.*;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
@@ -53,8 +55,6 @@ public class AbstractStandardVirtualHost
 
     private UUID _nodeId = UUID.randomUUID();
     private Broker<?> _broker;
-    private DurableConfigurationStore _configStore;
-    private ConfiguredObjectRecord _record;
     private TaskExecutor _taskExecutor;
 
     @Override
@@ -83,27 +83,22 @@ public class AbstractStandardVirtualHost
             super.tearDown();
         }
     }
-    public void testActivationOpensConfigStoreWithExistingVirtualHostRecord() 
throws Exception
+
+    /**
+     *  Tests activating a virtualhostnode with a config store that specifies a
+     *  virtualhost.  Ensures that the virtualhost created.
+     */
+    public void testActivateVHN_StoreHasVH() throws Exception
     {
         UUID virtualHostId = UUID.randomUUID();
-        _record = createMockVirtualHostCOR(virtualHostId);
-
-        _configStore = new NullMessageStore(){
+        ConfiguredObjectRecord vhostRecord = 
createVirtualHostConfiguredObjectRecord(virtualHostId);
+        DurableConfigurationStore configStore = 
configStoreThatProduces(vhostRecord);
 
-            @Override
-            public void 
visitConfiguredObjectRecords(ConfiguredObjectRecordHandler handler) throws 
StoreException
-            {
-                handler.begin();
-                handler.handle(_record);
-                handler.end();
-            }
-        };
-
-        Map<String, Object> nodeAttributes = new HashMap<String, Object>();
+        Map<String, Object> nodeAttributes = new HashMap<>();
         nodeAttributes.put(VirtualHostNode.NAME, TEST_VIRTUAL_HOST_NODE_NAME);
         nodeAttributes.put(VirtualHostNode.ID, _nodeId);
 
-        VirtualHostNode<?> node = new TestVirtualHostNode(_broker, 
nodeAttributes, _configStore);
+        VirtualHostNode<?> node = new TestVirtualHostNode(_broker, 
nodeAttributes, configStore);
         node.open();
         node.start();
 
@@ -114,24 +109,20 @@ public class AbstractStandardVirtualHost
         assertEquals("Unexpected virtual host id", virtualHostId, 
virtualHost.getId());
     }
 
-    public void testActivationOpensConfigStoreWithoutVirtualHostRecord() 
throws Exception
-    {
-        _configStore = new NullMessageStore() {
 
-            @Override
-            public void 
visitConfiguredObjectRecords(ConfiguredObjectRecordHandler handler) throws 
StoreException
-            {
-                handler.begin();
-                // No records
-                handler.end();
-            }
-        };
+    /**
+     *  Tests activating a virtualhostnode with a config store which does not 
specify
+     *  a virtualhost.  Checks no virtualhost is created.
+     */
+    public void testActivateVHN_StoreHasNoVH() throws Exception
+    {
+        DurableConfigurationStore configStore = 
configStoreThatProducesNoRecords();
 
-        Map<String, Object> nodeAttributes = new HashMap<String, Object>();
+        Map<String, Object> nodeAttributes = new HashMap<>();
         nodeAttributes.put(VirtualHostNode.NAME, TEST_VIRTUAL_HOST_NODE_NAME);
         nodeAttributes.put(VirtualHostNode.ID, _nodeId);
 
-        VirtualHostNode<?> node = new TestVirtualHostNode(_broker, 
nodeAttributes, _configStore);
+        VirtualHostNode<?> node = new TestVirtualHostNode(_broker, 
nodeAttributes, configStore);
         node.open();
         node.start();
 
@@ -140,9 +131,111 @@ public class AbstractStandardVirtualHost
 
     }
 
-    private ConfiguredObjectRecord createMockVirtualHostCOR(UUID virtualHostId)
+    /**
+     *  Tests activating a virtualhostnode with a blueprint context variable.  
Config store
+     *  does not specify a virtualhost.  Checks virtualhost is created from 
the blueprint.
+     */
+    public void testActivateVHNWithVHBlueprint_StoreHasNoVH() throws Exception
     {
-        Map<String, Object> virtualHostAttributes = new HashMap<String, 
Object>();
+        DurableConfigurationStore configStore = 
configStoreThatProducesNoRecords();
+
+        String vhBlueprint = String.format("{ \"type\" : \"%s\", \"name\" : 
\"%s\"}",
+                                           
TestMemoryVirtualHost.VIRTUAL_HOST_TYPE,
+                                           TEST_VIRTUAL_HOST_NAME);
+        Map<String, String> context = 
Collections.singletonMap(VIRTUALHOST_BLUEPRINT_CONTEXT_VAR, vhBlueprint);
+
+        Map<String, Object> nodeAttributes = new HashMap<>();
+        nodeAttributes.put(VirtualHostNode.NAME, TEST_VIRTUAL_HOST_NODE_NAME);
+        nodeAttributes.put(VirtualHostNode.ID, _nodeId);
+        nodeAttributes.put(VirtualHostNode.CONTEXT, context);
+
+        VirtualHostNode<?> node = new TestVirtualHostNode(_broker, 
nodeAttributes, configStore);
+        node.open();
+        node.start();
+
+        VirtualHost<?, ?, ?> virtualHost = node.getVirtualHost();
+
+        assertNotNull("Virtual host should be created by blueprint", 
virtualHost);
+        assertEquals("Unexpected virtual host name", TEST_VIRTUAL_HOST_NAME, 
virtualHost.getName());
+        assertEquals("Unexpected virtual host state", State.ACTIVE, 
virtualHost.getState());
+        assertNotNull("Unexpected virtual host id", virtualHost.getId());
+
+        Map<String, String> updatedContext = node.getContext();
+
+        assertTrue("Context should now have utilised flag", 
updatedContext.containsKey(
+                VIRTUALHOST_BLUEPRINT_UTILISED_CONTEXT_VAR));
+        assertEquals("Utilised flag should be true",
+                     Boolean.TRUE.toString(),
+                     
updatedContext.get(VIRTUALHOST_BLUEPRINT_UTILISED_CONTEXT_VAR));
+    }
+
+    /**
+     *  Tests activating a virtualhostnode with blueprint context variable and 
the
+     *  marked utilised flag.  Config store does not specify a virtualhost.
+     *  Checks virtualhost is not recreated from the blueprint.
+     */
+    public void testActivateVHNWithVHBlueprintUsed_StoreHasNoVH() throws 
Exception
+    {
+        DurableConfigurationStore configStore = 
configStoreThatProducesNoRecords();
+
+        String vhBlueprint = String.format("{ \"type\" : \"%s\", \"name\" : 
\"%s\"}",
+                                           
TestMemoryVirtualHost.VIRTUAL_HOST_TYPE,
+                                           TEST_VIRTUAL_HOST_NAME);
+        Map<String, String> context = new HashMap<>();
+        context.put(VIRTUALHOST_BLUEPRINT_CONTEXT_VAR, vhBlueprint);
+        context.put(VIRTUALHOST_BLUEPRINT_UTILISED_CONTEXT_VAR, 
Boolean.TRUE.toString());
+
+        Map<String, Object> nodeAttributes = new HashMap<>();
+        nodeAttributes.put(VirtualHostNode.NAME, TEST_VIRTUAL_HOST_NODE_NAME);
+        nodeAttributes.put(VirtualHostNode.ID, _nodeId);
+        nodeAttributes.put(VirtualHostNode.CONTEXT, context);
+
+        VirtualHostNode<?> node = new TestVirtualHostNode(_broker, 
nodeAttributes, configStore);
+        node.open();
+        node.start();
+
+        VirtualHost<?, ?, ?> virtualHost = node.getVirtualHost();
+
+        assertNull("Virtual host should not be created by blueprint", 
virtualHost);
+    }
+
+    /**
+     *  Tests activating a virtualhostnode with a blueprint context variable.  
Config store
+     *  does specify a virtualhost.  Checks that virtualhost is recovered from 
store and
+     *  blueprint is ignored..
+     */
+    public void testActivateVHNWithVHBlueprint_StoreHasExistingVH() throws 
Exception
+    {
+        UUID virtualHostId = UUID.randomUUID();
+        ConfiguredObjectRecord record = 
createVirtualHostConfiguredObjectRecord(virtualHostId);
+
+        DurableConfigurationStore configStore = 
configStoreThatProduces(record);
+
+        String vhBlueprint = String.format("{ \"type\" : \"%s\", \"name\" : 
\"%s\"}",
+                                           
TestMemoryVirtualHost.VIRTUAL_HOST_TYPE,
+                                           "vhFromBlueprint");
+        Map<String, String> context = 
Collections.singletonMap(VIRTUALHOST_BLUEPRINT_CONTEXT_VAR, vhBlueprint);
+
+        Map<String, Object> nodeAttributes = new HashMap<>();
+        nodeAttributes.put(VirtualHostNode.NAME, TEST_VIRTUAL_HOST_NODE_NAME);
+        nodeAttributes.put(VirtualHostNode.ID, _nodeId);
+        nodeAttributes.put(VirtualHostNode.CONTEXT, context);
+
+        VirtualHostNode<?> node = new TestVirtualHostNode(_broker, 
nodeAttributes, configStore);
+        node.open();
+        node.start();
+
+        VirtualHost<?, ?, ?> virtualHost = node.getVirtualHost();
+
+        assertNotNull("Virtual host should be recovered", virtualHost);
+        assertEquals("Unexpected virtual host name", TEST_VIRTUAL_HOST_NAME, 
virtualHost.getName());
+        assertEquals("Unexpected virtual host state", State.ACTIVE, 
virtualHost.getState());
+        assertEquals("Unexpected virtual host id", virtualHostId, 
virtualHost.getId());
+    }
+
+    private ConfiguredObjectRecord 
createVirtualHostConfiguredObjectRecord(UUID virtualHostId)
+    {
+        Map<String, Object> virtualHostAttributes = new HashMap<>();
         virtualHostAttributes.put(VirtualHost.NAME, TEST_VIRTUAL_HOST_NAME);
         virtualHostAttributes.put(VirtualHost.TYPE, 
TestMemoryVirtualHost.VIRTUAL_HOST_TYPE);
         virtualHostAttributes.put(VirtualHost.MODEL_VERSION, 
BrokerModel.MODEL_VERSION);
@@ -153,4 +246,26 @@ public class AbstractStandardVirtualHost
         when(record.getType()).thenReturn(VirtualHost.class.getSimpleName());
         return record;
     }
+
+    private NullMessageStore configStoreThatProduces(final 
ConfiguredObjectRecord record)
+    {
+        return new NullMessageStore(){
+
+            @Override
+            public void 
visitConfiguredObjectRecords(ConfiguredObjectRecordHandler handler) throws 
StoreException
+            {
+                handler.begin();
+                if (record != null)
+                {
+                    handler.handle(record);
+                }
+                handler.end();
+            }
+        };
+    }
+    private NullMessageStore configStoreThatProducesNoRecords()
+    {
+        return configStoreThatProduces(null);
+    }
+
 }



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

Reply via email to