You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rg...@apache.org on 2013/06/17 10:11:07 UTC

svn commit: r1493675 [2/3] - in /qpid/branches/java-broker-vhost-refactor: doc/book/src/java-broker/ java/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/ java/bdbstore/src/main/java/resources/ java/bdbstore/src/main/java/resources/js/ j...

Modified: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java?rev=1493675&r1=1493674&r2=1493675&view=diff
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/model/adapter/VirtualHostAdapter.java Mon Jun 17 08:11:06 2013
@@ -79,7 +79,7 @@ import org.apache.qpid.server.store.Mess
 import org.apache.qpid.server.txn.LocalTransaction;
 import org.apache.qpid.server.txn.ServerTransaction;
 import org.apache.qpid.server.util.MapValueConverter;
-import org.apache.qpid.server.virtualhost.VirtualHostImpl;
+import org.apache.qpid.server.plugin.VirtualHostFactory;
 import org.apache.qpid.server.virtualhost.VirtualHostRegistry;
 
 public final class VirtualHostAdapter extends AbstractAdapter implements VirtualHost, ExchangeRegistry.RegistryChangeListener,
@@ -91,6 +91,7 @@ public final class VirtualHostAdapter ex
     @SuppressWarnings("serial")
     public static final Map<String, Type> ATTRIBUTE_TYPES = Collections.unmodifiableMap(new HashMap<String, Type>(){{
         put(NAME, String.class);
+        put(TYPE, String.class);
         put(STORE_PATH, String.class);
         put(STORE_TYPE, String.class);
         put(CONFIG_PATH, String.class);
@@ -114,7 +115,7 @@ public final class VirtualHostAdapter ex
 
     public VirtualHostAdapter(UUID id, Map<String, Object> attributes, Broker broker, StatisticsGatherer brokerStatisticsGatherer, TaskExecutor taskExecutor)
     {
-        super(id, null, MapValueConverter.convert(attributes, ATTRIBUTE_TYPES), taskExecutor);
+        super(id, null, MapValueConverter.convert(attributes, ATTRIBUTE_TYPES, false), taskExecutor, false);
         _broker = broker;
         _brokerStatisticsGatherer = brokerStatisticsGatherer;
         validateAttributes();
@@ -130,18 +131,23 @@ public final class VirtualHostAdapter ex
         }
 
         String configurationFile = (String) getAttribute(CONFIG_PATH);
-        String storeType = (String) getAttribute(STORE_TYPE);
+        String type = (String) getAttribute(TYPE);
+
         boolean invalidAttributes = false;
         if (configurationFile == null)
         {
-            if (storeType == null)
+            if (type == null)
             {
                 invalidAttributes = true;
             }
+            else
+            {
+                validateAttributes(type);
+            }
         }
         else
         {
-            if (storeType != null)
+            if (type != null)
             {
                 invalidAttributes = true;
             }
@@ -149,7 +155,7 @@ public final class VirtualHostAdapter ex
         }
         if (invalidAttributes)
         {
-            throw new IllegalConfigurationException("Please specify either the 'configPath' attribute or 'storeType' and 'storePath' attributes");
+            throw new IllegalConfigurationException("Please specify either the 'configPath' attribute or 'type' attributes");
         }
 
         // pre-load the configuration in order to validate
@@ -163,6 +169,17 @@ public final class VirtualHostAdapter ex
         }
     }
 
+    private void validateAttributes(String type)
+    {
+        final VirtualHostFactory factory = VirtualHostFactory.FACTORIES.get(type);
+        if(factory == null)
+        {
+            throw new IllegalArgumentException("Unknown virtual host type '"+ type +"'.  Valid types are: " + VirtualHostFactory.TYPES.get());
+        }
+        factory.validateAttributes(getActualAttributes());
+
+    }
+
     private void populateExchanges()
     {
         Collection<org.apache.qpid.server.exchange.Exchange> actualExchanges =
@@ -295,7 +312,7 @@ public final class VirtualHostAdapter ex
                 _virtualHost.getExchangeRegistry().registerExchange(exchange);
                 if(durable)
                 {
-                    _virtualHost.getMessageStore().createExchange(exchange);
+                    _virtualHost.getDurableConfigurationStore().createExchange(exchange);
                 }
                 synchronized (_exchangeAdapters)
                 {
@@ -417,7 +434,7 @@ public final class VirtualHostAdapter ex
 
                 if(durable)
                 {
-                    _virtualHost.getMessageStore().createQueue(queue, FieldTable.convertToFieldTable(attributes));
+                    _virtualHost.getDurableConfigurationStore().createQueue(queue, FieldTable.convertToFieldTable(attributes));
                 }
                 synchronized (_queueAdapters)
                 {
@@ -444,6 +461,19 @@ public final class VirtualHostAdapter ex
         throw new IllegalStateException();
     }
 
+
+    public String getType()
+    {
+        return (String)getAttribute(TYPE);
+    }
+
+    public String setType(final String currentType, final String desiredType)
+            throws IllegalStateException, AccessControlException
+    {
+        throw new IllegalStateException();
+    }
+
+
     @Override
     public State getActualState()
     {
@@ -1070,7 +1100,19 @@ public final class VirtualHostAdapter ex
         try
         {
             VirtualHostConfiguration configuration = createVirtualHostConfiguration(virtualHostName);
-            _virtualHost = new VirtualHostImpl(_broker.getVirtualHostRegistry(), _brokerStatisticsGatherer, _broker.getSecurityManager(), configuration);
+            String type = configuration.getType();
+            final VirtualHostFactory factory = VirtualHostFactory.FACTORIES.get(type);
+            if(factory == null)
+            {
+                throw new IllegalArgumentException("Unknown virtual host type: " + type);
+            }
+            else
+            {
+                _virtualHost = factory.createVirtualHost(_broker.getVirtualHostRegistry(),
+                        _brokerStatisticsGatherer,
+                        _broker.getSecurityManager(),
+                        configuration);
+            }
         }
         catch (Exception e)
         {
@@ -1106,8 +1148,16 @@ public final class VirtualHostAdapter ex
         {
             final MyConfiguration basicConfiguration = new MyConfiguration();
             PropertiesConfiguration config = new PropertiesConfiguration();
-            config.addProperty("store.type", (String)getAttribute(STORE_TYPE));
-            config.addProperty("store.environment-path", (String)getAttribute(STORE_PATH));
+            final String type = (String) getAttribute(TYPE);
+            config.addProperty("type", type);
+            VirtualHostFactory factory = VirtualHostFactory.FACTORIES.get(type);
+            if(factory != null)
+            {
+                for(Map.Entry<String,Object> entry : factory.createVirtualHostConfiguration(this).entrySet())
+                {
+                    config.addProperty(entry.getKey(), entry.getValue());
+                }
+            }
             basicConfiguration.addConfiguration(config);
 
             CompositeConfiguration compositeConfiguration = new CompositeConfiguration();

Added: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/plugin/VirtualHostFactory.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/plugin/VirtualHostFactory.java?rev=1493675&view=auto
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/plugin/VirtualHostFactory.java (added)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/plugin/VirtualHostFactory.java Mon Jun 17 08:11:06 2013
@@ -0,0 +1,88 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.plugin;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import org.apache.qpid.server.configuration.VirtualHostConfiguration;
+import org.apache.qpid.server.model.adapter.VirtualHostAdapter;
+import org.apache.qpid.server.security.SecurityManager;
+import org.apache.qpid.server.stats.StatisticsGatherer;
+import org.apache.qpid.server.virtualhost.VirtualHost;
+import org.apache.qpid.server.virtualhost.VirtualHostRegistry;
+
+public interface VirtualHostFactory
+{
+    String getType();
+
+    VirtualHost createVirtualHost(VirtualHostRegistry virtualHostRegistry,
+                                  StatisticsGatherer brokerStatisticsGatherer,
+                                  SecurityManager parentSecurityManager,
+                                  VirtualHostConfiguration hostConfig) throws Exception;
+
+    void validateAttributes(Map<String, Object> attributes);
+
+    Map<String, Object> createVirtualHostConfiguration(VirtualHostAdapter virtualHostAdapter);
+
+    static final class TYPES
+    {
+        private TYPES()
+        {
+        }
+
+        public static Collection<String> get()
+        {
+            QpidServiceLoader<VirtualHostFactory> qpidServiceLoader = new QpidServiceLoader<VirtualHostFactory>();
+            Iterable<VirtualHostFactory> factories = qpidServiceLoader.atLeastOneInstanceOf(VirtualHostFactory.class);
+            List<String> names = new ArrayList<String>();
+            for(VirtualHostFactory factory : factories)
+            {
+                names.add(factory.getType());
+            }
+            return Collections.unmodifiableCollection(names);
+        }
+    }
+
+
+    static final class FACTORIES
+    {
+        private FACTORIES()
+        {
+        }
+
+        public static VirtualHostFactory get(String type)
+        {
+            QpidServiceLoader<VirtualHostFactory> qpidServiceLoader = new QpidServiceLoader<VirtualHostFactory>();
+            Iterable<VirtualHostFactory> factories = qpidServiceLoader.atLeastOneInstanceOf(VirtualHostFactory.class);
+            for(VirtualHostFactory factory : factories)
+            {
+                if(factory.getType().equals(type))
+                {
+                    return factory;
+                }
+            }
+            return null;
+        }
+    }
+}

Propchange: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/plugin/VirtualHostFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueFactory.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueFactory.java?rev=1493675&r1=1493674&r2=1493675&view=diff
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueFactory.java (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueFactory.java Mon Jun 17 08:11:06 2013
@@ -315,7 +315,7 @@ public class AMQQueueFactory
                     exchangeRegistry.registerExchange(dlExchange);
 
                     //enter the dle in the persistent store
-                    virtualHost.getMessageStore().createExchange(dlExchange);
+                    virtualHost.getDurableConfigurationStore().createExchange(dlExchange);
                 }
             }
 
@@ -335,7 +335,7 @@ public class AMQQueueFactory
                     dlQueue = createAMQQueueImpl(UUIDGenerator.generateQueueUUID(dlQueueName, virtualHost.getName()), dlQueueName, true, owner, false, exclusive, virtualHost, args);
 
                     //enter the dlq in the persistent store
-                    virtualHost.getMessageStore().createQueue(dlQueue, FieldTable.convertToFieldTable(args));
+                    virtualHost.getDurableConfigurationStore().createQueue(dlQueue, FieldTable.convertToFieldTable(args));
                 }
             }
 

Modified: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/AbstractJDBCMessageStore.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/AbstractJDBCMessageStore.java?rev=1493675&r1=1493674&r2=1493675&view=diff
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/AbstractJDBCMessageStore.java (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/AbstractJDBCMessageStore.java Mon Jun 17 08:11:06 2013
@@ -55,7 +55,7 @@ import org.apache.qpid.server.store.Conf
 import org.apache.qpid.server.store.ConfigurationRecoveryHandler.ExchangeRecoveryHandler;
 import org.apache.qpid.server.store.ConfigurationRecoveryHandler.QueueRecoveryHandler;
 
-abstract public class AbstractJDBCMessageStore implements MessageStore
+abstract public class AbstractJDBCMessageStore implements MessageStore, DurableConfigurationStore
 {
     private static final String DB_VERSION_TABLE_NAME = "QPID_DB_VERSION";
 

Modified: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java?rev=1493675&r1=1493674&r2=1493675&view=diff
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/DurableConfigurationStore.java Mon Jun 17 08:11:06 2013
@@ -33,7 +33,7 @@ public interface DurableConfigurationSto
 
     public static interface Source
     {
-        DurableConfigurationStore getMessageStore();
+        DurableConfigurationStore getDurableConfigurationStore();
     }
 
     /**
@@ -107,11 +107,11 @@ public interface DurableConfigurationSto
      * Removes the specified queue from the persistent store.
      *
      * @param queue The queue to remove.
-     * 
+     *
      * @throws AMQStoreException If the operation fails for any reason.
      */
     void removeQueue(AMQQueue queue) throws AMQStoreException;
-    
+
     /**
      * Updates the specified queue in the persistent store, IF it is already present. If the queue
      * is not present in the store, it will not be added.

Modified: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java?rev=1493675&r1=1493674&r2=1493675&view=diff
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/MessageStore.java Mon Jun 17 08:11:06 2013
@@ -26,7 +26,7 @@ import org.apache.commons.configuration.
  * MessageStore defines the interface to a storage area, which can be used to preserve the state of messages.
  *
  */
-public interface MessageStore extends DurableConfigurationStore
+public interface MessageStore
 {
     /**
      * Called after instantiation in order to configure the message store. A particular implementation can define

Modified: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreCreator.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreCreator.java?rev=1493675&r1=1493674&r2=1493675&view=diff
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreCreator.java (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/MessageStoreCreator.java Mon Jun 17 08:11:06 2013
@@ -50,6 +50,12 @@ public class MessageStoreCreator
         }
     }
 
+    public boolean isValidType(String storeType)
+    {
+        return _factories.containsKey(storeType.toLowerCase());
+    }
+
+
     public MessageStore createMessageStore(String storeType)
     {
         MessageStoreFactory factory = _factories.get(storeType.toLowerCase());

Modified: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/NullMessageStore.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/NullMessageStore.java?rev=1493675&r1=1493674&r2=1493675&view=diff
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/NullMessageStore.java (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/NullMessageStore.java Mon Jun 17 08:11:06 2013
@@ -26,7 +26,7 @@ import org.apache.qpid.server.binding.Bi
 import org.apache.qpid.server.exchange.Exchange;
 import org.apache.qpid.server.queue.AMQQueue;
 
-public abstract class NullMessageStore implements MessageStore
+public abstract class NullMessageStore implements MessageStore, DurableConfigurationStore
 {
     @Override
     public void configureConfigStore(String name,
@@ -125,4 +125,4 @@ public abstract class NullMessageStore i
     public void onDelete()
     {
     }
-}
\ No newline at end of file
+}

Modified: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStore.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStore.java?rev=1493675&r1=1493674&r2=1493675&view=diff
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStore.java (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/store/derby/DerbyMessageStore.java Mon Jun 17 08:11:06 2013
@@ -35,6 +35,7 @@ import java.util.List;
 import org.apache.commons.configuration.Configuration;
 import org.apache.log4j.Logger;
 import org.apache.qpid.server.store.AbstractJDBCMessageStore;
+import org.apache.qpid.server.store.DurableConfigurationStore;
 import org.apache.qpid.server.store.Event;
 import org.apache.qpid.server.store.EventListener;
 import org.apache.qpid.server.store.MessageStore;
@@ -46,7 +47,7 @@ import org.apache.qpid.util.FileUtils;
  * mechanism.
  *
  */
-public class DerbyMessageStore extends AbstractJDBCMessageStore implements MessageStore
+public class DerbyMessageStore extends AbstractJDBCMessageStore implements MessageStore, DurableConfigurationStore
 {
 
     private static final Logger _logger = Logger.getLogger(DerbyMessageStore.class);

Modified: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java?rev=1493675&r1=1493674&r2=1493675&view=diff
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java Mon Jun 17 08:11:06 2013
@@ -762,7 +762,7 @@ public class ServerSessionDelegate exten
                             {
                                 if (exchange.isDurable())
                                 {
-                                    DurableConfigurationStore store = virtualHost.getMessageStore();
+                                    DurableConfigurationStore store = virtualHost.getDurableConfigurationStore();
                                     store.createExchange(exchange);
                                 }
                                 exchangeRegistry.registerExchange(exchange);
@@ -917,7 +917,7 @@ public class ServerSessionDelegate exten
 
                 if (exchange.isDurable() && !exchange.isAutoDelete())
                 {
-                    DurableConfigurationStore store = virtualHost.getMessageStore();
+                    DurableConfigurationStore store = virtualHost.getDurableConfigurationStore();
                     store.removeExchange(exchange);
                 }
             }
@@ -1241,7 +1241,7 @@ public class ServerSessionDelegate exten
     {
 
         VirtualHost virtualHost = getVirtualHost(session);
-        DurableConfigurationStore store = virtualHost.getMessageStore();
+        DurableConfigurationStore store = virtualHost.getDurableConfigurationStore();
 
         String queueName = method.getQueue();
         AMQQueue queue;
@@ -1468,7 +1468,7 @@ public class ServerSessionDelegate exten
                         queue.delete();
                         if (queue.isDurable() && !queue.isAutoDelete())
                         {
-                            DurableConfigurationStore store = virtualHost.getMessageStore();
+                            DurableConfigurationStore store = virtualHost.getDurableConfigurationStore();
                             store.removeQueue(queue);
                         }
                     }

Modified: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/util/MapValueConverter.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/util/MapValueConverter.java?rev=1493675&r1=1493674&r2=1493675&view=diff
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/util/MapValueConverter.java (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/util/MapValueConverter.java Mon Jun 17 08:11:06 2013
@@ -127,7 +127,13 @@ public class MapValueConverter
         }
         else if (rawValue instanceof String)
         {
-            return (T) Enum.valueOf(enumType, (String) rawValue);
+            final String stringValue = (String) rawValue;
+
+            return "null".equals(stringValue) ? null : (T) Enum.valueOf(enumType, stringValue);
+        }
+        else if(rawValue == null)
+        {
+            return null;
         }
         else
         {
@@ -281,14 +287,23 @@ public class MapValueConverter
 
     public static Map<String, Object> convert(Map<String, Object> configurationAttributes, Map<String, Type> attributeTypes)
     {
+        return convert(configurationAttributes, attributeTypes, true);
+    }
+
+    public static Map<String, Object> convert(Map<String, Object> configurationAttributes,
+                                              Map<String, Type> attributeTypes,
+                                              boolean exclusive)
+    {
         Map<String, Object> attributes = new HashMap<String, Object>();
-        for (Map.Entry<String, Type> attributeEntry : attributeTypes.entrySet())
+        for (Map.Entry<String, Object> attribute : configurationAttributes.entrySet())
         {
-            String attributeName = attributeEntry.getKey();
-            if (configurationAttributes.containsKey(attributeName))
+            String attributeName = attribute.getKey();
+            Object rawValue = attribute.getValue();
+
+            if (attributeTypes.containsKey(attributeName))
             {
-                Type typeObject = attributeEntry.getValue();
-                Object rawValue = configurationAttributes.get(attributeName);
+                Type typeObject = attributeTypes.get(attributeName);
+
                 Object value = null;
                 if (typeObject instanceof Class)
                 {
@@ -311,16 +326,21 @@ public class MapValueConverter
                     }
                     else
                     {
-                        throw new IllegalArgumentException("Convertion into " + parameterizedType + " is not yet supported");
+                        throw new IllegalArgumentException("Conversion into " + parameterizedType + " is not yet supported");
                     }
                 }
                 else
                 {
-                    throw new IllegalArgumentException("Convertion into " + typeObject + " is not yet supported");
+                    throw new IllegalArgumentException("Conversion into " + typeObject + " is not yet supported");
                 }
                 attributes.put(attributeName, value);
             }
+            else if(!exclusive)
+            {
+                attributes.put(attributeName, rawValue);
+            }
         }
+
         return attributes;
     }
 

Copied: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java (from r1481480, qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java)
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java?p2=qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java&p1=qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java&r1=1481480&r2=1493675&rev=1493675&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostImpl.java (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/AbstractVirtualHost.java Mon Jun 17 08:11:06 2013
@@ -57,17 +57,17 @@ import org.apache.qpid.server.queue.Queu
 import org.apache.qpid.server.security.SecurityManager;
 import org.apache.qpid.server.stats.StatisticsCounter;
 import org.apache.qpid.server.stats.StatisticsGatherer;
+import org.apache.qpid.server.store.DurableConfigurationStore;
 import org.apache.qpid.server.store.Event;
 import org.apache.qpid.server.store.EventListener;
-import org.apache.qpid.server.store.HAMessageStore;
 import org.apache.qpid.server.store.MessageStore;
 import org.apache.qpid.server.store.MessageStoreCreator;
 import org.apache.qpid.server.store.OperationalLoggingListener;
 import org.apache.qpid.server.txn.DtxRegistry;
 
-public class VirtualHostImpl implements VirtualHost, IConnectionRegistry.RegistryChangeListener, EventListener
+public abstract class AbstractVirtualHost implements VirtualHost, IConnectionRegistry.RegistryChangeListener, EventListener
 {
-    private static final Logger _logger = Logger.getLogger(VirtualHostImpl.class);
+    private static final Logger _logger = Logger.getLogger(AbstractVirtualHost.class);
 
     private static final int HOUSEKEEPING_SHUTDOWN_TIMEOUT = 5;
 
@@ -97,8 +97,6 @@ public class VirtualHostImpl implements 
 
     private final DtxRegistry _dtxRegistry;
 
-    private final MessageStore _messageStore;
-
     private volatile State _state = State.INITIALISING;
 
     private StatisticsCounter _messagesDelivered, _dataDelivered, _messagesReceived, _dataReceived;
@@ -106,7 +104,10 @@ public class VirtualHostImpl implements 
     private final Map<String, LinkRegistry> _linkRegistry = new HashMap<String, LinkRegistry>();
     private boolean _blocked;
 
-    public VirtualHostImpl(VirtualHostRegistry virtualHostRegistry, StatisticsGatherer brokerStatisticsGatherer, SecurityManager parentSecurityManager, VirtualHostConfiguration hostConfig) throws Exception
+    public AbstractVirtualHost(VirtualHostRegistry virtualHostRegistry,
+                               StatisticsGatherer brokerStatisticsGatherer,
+                               SecurityManager parentSecurityManager,
+                               VirtualHostConfiguration hostConfig) throws Exception
     {
         if (hostConfig == null)
         {
@@ -141,18 +142,16 @@ public class VirtualHostImpl implements 
 
         _exchangeRegistry = new DefaultExchangeRegistry(this);
 
-        _messageStore = initialiseMessageStore(hostConfig);
-
-        configureMessageStore(hostConfig);
-
-        activateNonHAMessageStore();
-
         initialiseStatistics();
 
-        _messageStore.addEventListener(this, Event.PERSISTENT_MESSAGE_SIZE_OVERFULL);
-        _messageStore.addEventListener(this, Event.PERSISTENT_MESSAGE_SIZE_UNDERFULL);
+        initialiseStorage(hostConfig);
+
+        getMessageStore().addEventListener(this, Event.PERSISTENT_MESSAGE_SIZE_OVERFULL);
+        getMessageStore().addEventListener(this, Event.PERSISTENT_MESSAGE_SIZE_UNDERFULL);
     }
 
+    abstract protected void initialiseStorage(VirtualHostConfiguration hostConfig) throws Exception;
+
     public IConnectionRegistry getConnectionRegistry()
     {
         return _connectionRegistry;
@@ -187,25 +186,25 @@ public class VirtualHostImpl implements 
         }
     }
 
-    private void shutdownHouseKeeping()
+    protected void shutdownHouseKeeping()
     {
         _houseKeepingTasks.shutdown();
 
-           try
-           {
-               if (!_houseKeepingTasks.awaitTermination(HOUSEKEEPING_SHUTDOWN_TIMEOUT, TimeUnit.SECONDS))
-               {
-                   _houseKeepingTasks.shutdownNow();
-               }
-           }
-           catch (InterruptedException e)
-           {
-               _logger.warn("Interrupted during Housekeeping shutdown:", e);
-               Thread.currentThread().interrupt();
-           }
+        try
+        {
+            if (!_houseKeepingTasks.awaitTermination(HOUSEKEEPING_SHUTDOWN_TIMEOUT, TimeUnit.SECONDS))
+            {
+                _houseKeepingTasks.shutdownNow();
+            }
+        }
+        catch (InterruptedException e)
+        {
+            _logger.warn("Interrupted during Housekeeping shutdown:", e);
+            Thread.currentThread().interrupt();
+        }
     }
 
-    private void removeHouseKeepingTasks()
+    protected void removeHouseKeepingTasks()
     {
         BlockingQueue<Runnable> taskQueue = _houseKeepingTasks.getQueue();
         for (final Runnable runnable : taskQueue)
@@ -257,62 +256,13 @@ public class VirtualHostImpl implements 
         return _houseKeepingTasks.getActiveCount();
     }
 
-    private MessageStore initialiseMessageStore(VirtualHostConfiguration hostConfig) throws Exception
-    {
-        String storeType = hostConfig.getConfig().getString("store.type");
-        MessageStore  messageStore = null;
-        if (storeType == null)
-        {
-            final Class<?> clazz = Class.forName(hostConfig.getMessageStoreClass());
-            final Object o = clazz.newInstance();
 
-            if (!(o instanceof MessageStore))
-            {
-                throw new ClassCastException(clazz + " does not implement " + MessageStore.class);
-            }
-
-            messageStore = (MessageStore) o;
-        }
-        else
-        {
-            messageStore = new MessageStoreCreator().createMessageStore(storeType);
-        }
-
-        final MessageStoreLogSubject storeLogSubject = new MessageStoreLogSubject(this, messageStore.getClass().getSimpleName());
-        OperationalLoggingListener.listen(messageStore, storeLogSubject);
-
-        messageStore.addEventListener(new BeforeActivationListener(), Event.BEFORE_ACTIVATE);
-        messageStore.addEventListener(new AfterActivationListener(), Event.AFTER_ACTIVATE);
-        messageStore.addEventListener(new BeforeCloseListener(), Event.BEFORE_CLOSE);
-        messageStore.addEventListener(new BeforePassivationListener(), Event.BEFORE_PASSIVATE);
-        if (messageStore instanceof HAMessageStore)
-        {
-            messageStore.addEventListener(new AfterInitialisationListener(), Event.AFTER_INIT);
-        }
-
-        return messageStore;
-    }
-
-    private void activateNonHAMessageStore() throws Exception
-    {
-        if (!(_messageStore instanceof HAMessageStore))
-        {
-            _messageStore.activate();
-        }
-    }
-
-    private void configureMessageStore(VirtualHostConfiguration hostConfig) throws Exception
-    {
-        VirtualHostConfigRecoveryHandler recoveryHandler = new VirtualHostConfigRecoveryHandler(this);
-
-        _messageStore.configureConfigStore(getName(), recoveryHandler, hostConfig.getStoreConfiguration());
-        _messageStore.configureMessageStore(getName(), recoveryHandler, recoveryHandler, hostConfig.getStoreConfiguration());
-    }
-
-    private void initialiseModel(VirtualHostConfiguration config) throws ConfigurationException, AMQException
+    protected void initialiseModel(VirtualHostConfiguration config) throws ConfigurationException, AMQException
     {
         _logger.debug("Loading configuration for virtualhost: " + config.getName());
 
+        _exchangeRegistry.initialise();
+
         List<String> exchangeNames = config.getExchanges();
 
         for (String exchangeName : exchangeNames)
@@ -347,7 +297,7 @@ public class VirtualHostImpl implements 
 
             if (newExchange.isDurable())
             {
-                _messageStore.createExchange(newExchange);
+                getDurableConfigurationStore().createExchange(newExchange);
             }
         }
     }
@@ -359,7 +309,7 @@ public class VirtualHostImpl implements 
 
         if (queue.isDurable())
         {
-            getMessageStore().createQueue(queue);
+            getDurableConfigurationStore().createQueue(queue);
         }
 
         //get the exchange name (returns default exchange name if none was specified)
@@ -390,25 +340,25 @@ public class VirtualHostImpl implements 
             }
             else
             {
-                configureBinding(queue, exchange, routingKey);
+                configureBinding(queue, exchange, routingKey, (Map) queueConfiguration.getBindingArguments(routingKey));
             }
         }
 
-        if (!exchange.equals(defaultExchange))
+        if (!exchange.equals(defaultExchange) && !routingKeys.contains(queueName))
         {
             //bind the queue to the named exchange using its name
-            configureBinding(queue, exchange, queueName);
+            configureBinding(queue, exchange, queueName, null);
         }
 
     }
 
-    private void configureBinding(AMQQueue queue, Exchange exchange, String routingKey) throws AMQException
+    private void configureBinding(AMQQueue queue, Exchange exchange, String routingKey, Map<String,Object> arguments) throws AMQException
     {
         if (_logger.isInfoEnabled())
         {
             _logger.info("Binding queue:" + queue + " with routing key '" + routingKey + "' to exchange:" + exchange.getName());
         }
-        exchange.addBinding(routingKey, queue, null);
+        exchange.addBinding(routingKey, queue, arguments);
     }
 
     public String getName()
@@ -436,11 +386,6 @@ public class VirtualHostImpl implements 
         return _exchangeFactory;
     }
 
-    public MessageStore getMessageStore()
-    {
-        return _messageStore;
-    }
-
     public SecurityManager getSecurityManager()
     {
         return _securityManager;
@@ -452,26 +397,42 @@ public class VirtualHostImpl implements 
         _connectionRegistry.close();
         _queueRegistry.stopAllAndUnregisterMBeans();
         _dtxRegistry.close();
+        closeStorage();
+        shutdownHouseKeeping();
 
+        // clear exchange objects
+        _exchangeRegistry.clearAndUnregisterMbeans();
+
+        _state = State.STOPPED;
+
+        CurrentActor.get().message(VirtualHostMessages.CLOSED());
+    }
+
+    protected void closeStorage()
+    {
         //Close MessageStore
-        if (_messageStore != null)
+        if (getMessageStore() != null)
         {
             //Remove MessageStore Interface should not throw Exception
             try
             {
-                _messageStore.close();
+                getMessageStore().close();
             }
             catch (Exception e)
             {
                 _logger.error("Failed to close message store", e);
             }
         }
+    }
 
-        _state = State.STOPPED;
 
-        CurrentActor.get().message(VirtualHostMessages.CLOSED());
+    protected Logger getLogger()
+    {
+        return _logger;
     }
 
+
+
     public VirtualHostRegistry getVirtualHostRegistry()
     {
         return _virtualHostRegistry;
@@ -614,94 +575,28 @@ public class VirtualHostImpl implements 
         }
     }
 
-    private final class BeforeActivationListener implements EventListener
-   {
-       @Override
-       public void event(Event event)
-       {
-           try
-           {
-               _exchangeRegistry.initialise();
-               initialiseModel(_vhostConfig);
-           }
-           catch (Exception e)
-           {
-               throw new RuntimeException("Failed to initialise virtual host after state change", e);
-           }
-       }
-   }
-
-   private final class AfterActivationListener implements EventListener
-   {
-       @Override
-       public void event(Event event)
-       {
-           State finalState = State.ERRORED;
-
-           try
-           {
-               initialiseHouseKeeping(_vhostConfig.getHousekeepingCheckPeriod());
-               finalState = State.ACTIVE;
-           }
-           finally
-           {
-               _state = finalState;
-               reportIfError(_state);
-           }
-       }
-   }
-
-    private final class BeforePassivationListener implements EventListener
+    protected void setState(State state)
     {
-        public void event(Event event)
-        {
-            State finalState = State.ERRORED;
-
-            try
-            {
-                /* the approach here is not ideal as there is a race condition where a
-                 * queue etc could be created while the virtual host is on the way to
-                 * the passivated state.  However the store state change from MASTER to UNKNOWN
-                 * is documented as exceptionally rare..
-                 */
-
-                _connectionRegistry.close(IConnectionRegistry.VHOST_PASSIVATE_REPLY_TEXT);
-                removeHouseKeepingTasks();
-
-                _queueRegistry.stopAllAndUnregisterMBeans();
-                _exchangeRegistry.clearAndUnregisterMbeans();
-                _dtxRegistry.close();
-
-                finalState = State.PASSIVE;
-            }
-            finally
-            {
-                _state = finalState;
-                reportIfError(_state);
-            }
-        }
-
+        _state = state;
     }
 
-    private final class AfterInitialisationListener implements EventListener
+    protected void attainActivation()
     {
-        public void event(Event event)
+        State finalState = State.ERRORED;
+
+        try
         {
-            _state = State.PASSIVE;
+            initialiseHouseKeeping(_vhostConfig.getHousekeepingCheckPeriod());
+            finalState = State.ACTIVE;
         }
-
-    }
-
-    private final class BeforeCloseListener implements EventListener
-    {
-        @Override
-        public void event(Event event)
+        finally
         {
-            shutdownHouseKeeping();
+            _state = finalState;
+            reportIfError(_state);
         }
     }
 
-    private void reportIfError(State state)
+    protected void reportIfError(State state)
     {
         if (state == State.ERRORED)
         {
@@ -713,7 +608,7 @@ public class VirtualHostImpl implements 
     {
         public VirtualHostHouseKeepingTask()
         {
-            super(VirtualHostImpl.this);
+            super(AbstractVirtualHost.this);
         }
 
         public void execute()

Added: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/StandardVirtualHost.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/StandardVirtualHost.java?rev=1493675&view=auto
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/StandardVirtualHost.java (added)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/StandardVirtualHost.java Mon Jun 17 08:11:06 2013
@@ -0,0 +1,145 @@
+package org.apache.qpid.server.virtualhost;/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.qpid.server.configuration.VirtualHostConfiguration;
+import org.apache.qpid.server.logging.subjects.MessageStoreLogSubject;
+import org.apache.qpid.server.stats.StatisticsGatherer;
+import org.apache.qpid.server.store.DurableConfigurationStore;
+import org.apache.qpid.server.store.Event;
+import org.apache.qpid.server.store.MessageStore;
+import org.apache.qpid.server.store.MessageStoreCreator;
+import org.apache.qpid.server.store.OperationalLoggingListener;
+
+public class StandardVirtualHost extends AbstractVirtualHost
+{
+    private MessageStore _messageStore;
+
+    private DurableConfigurationStore _durableConfigurationStore;
+
+    StandardVirtualHost(VirtualHostRegistry virtualHostRegistry,
+                               StatisticsGatherer brokerStatisticsGatherer,
+                               org.apache.qpid.server.security.SecurityManager parentSecurityManager,
+                               VirtualHostConfiguration hostConfig) throws Exception
+    {
+        super(virtualHostRegistry, brokerStatisticsGatherer, parentSecurityManager, hostConfig);
+    }
+
+
+
+    private MessageStore initialiseMessageStore(VirtualHostConfiguration hostConfig) throws Exception
+    {
+        String storeType = hostConfig.getConfig().getString("store.type");
+        MessageStore  messageStore = null;
+        if (storeType == null)
+        {
+            final Class<?> clazz = Class.forName(hostConfig.getMessageStoreClass());
+            final Object o = clazz.newInstance();
+
+            if (!(o instanceof MessageStore))
+            {
+                throw new ClassCastException(clazz + " does not implement " + MessageStore.class);
+            }
+
+            messageStore = (MessageStore) o;
+        }
+        else
+        {
+            messageStore = new MessageStoreCreator().createMessageStore(storeType);
+        }
+
+        final
+        MessageStoreLogSubject
+                storeLogSubject = new MessageStoreLogSubject(this, messageStore.getClass().getSimpleName());
+        OperationalLoggingListener.listen(messageStore, storeLogSubject);
+
+        return messageStore;
+    }
+
+    private DurableConfigurationStore initialiseConfigurationStore(VirtualHostConfiguration hostConfig) throws Exception
+    {
+        DurableConfigurationStore configurationStore;
+        if(getMessageStore() instanceof DurableConfigurationStore)
+        {
+            configurationStore = (DurableConfigurationStore) getMessageStore();
+        }
+        else
+        {
+            throw new ClassCastException(getMessageStore().getClass().getSimpleName() +
+                                         " is not an instance of DurableConfigurationStore");
+        }
+        return configurationStore;
+    }
+
+
+    protected void initialiseStorage(VirtualHostConfiguration hostConfig) throws Exception
+    {
+        _messageStore = initialiseMessageStore(hostConfig);
+
+        _durableConfigurationStore = initialiseConfigurationStore(hostConfig);
+
+        VirtualHostConfigRecoveryHandler recoveryHandler = new VirtualHostConfigRecoveryHandler(this);
+
+        final Configuration storeConfiguration = hostConfig.getStoreConfiguration();
+
+        _durableConfigurationStore.configureConfigStore(getName(), recoveryHandler, storeConfiguration);
+
+        _messageStore.configureMessageStore(getName(), recoveryHandler, recoveryHandler, storeConfiguration);
+
+        initialiseModel(hostConfig);
+
+        _messageStore.activate();
+
+        attainActivation();
+    }
+
+
+    protected void closeStorage()
+    {
+        //Close MessageStore
+        if (_messageStore != null)
+        {
+            //Remove MessageStore Interface should not throw Exception
+            try
+            {
+                getMessageStore().close();
+            }
+            catch (Exception e)
+            {
+                getLogger().error("Failed to close message store", e);
+            }
+        }
+    }
+
+
+    @Override
+    public MessageStore getMessageStore()
+    {
+        return _messageStore;
+    }
+
+    @Override
+    public DurableConfigurationStore getDurableConfigurationStore()
+    {
+        return _durableConfigurationStore;
+    }
+
+}

Propchange: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/StandardVirtualHost.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/StandardVirtualHostFactory.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/StandardVirtualHostFactory.java?rev=1493675&view=auto
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/StandardVirtualHostFactory.java (added)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/StandardVirtualHostFactory.java Mon Jun 17 08:11:06 2013
@@ -0,0 +1,98 @@
+package org.apache.qpid.server.virtualhost;/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import org.apache.qpid.server.configuration.VirtualHostConfiguration;
+import org.apache.qpid.server.model.adapter.VirtualHostAdapter;
+import org.apache.qpid.server.plugin.VirtualHostFactory;
+import org.apache.qpid.server.stats.StatisticsGatherer;
+import org.apache.qpid.server.store.MemoryMessageStore;
+import org.apache.qpid.server.store.MessageStoreCreator;
+
+public class StandardVirtualHostFactory implements VirtualHostFactory
+{
+
+    public static final String TYPE = "STANDARD";
+
+    @Override
+    public String getType()
+    {
+        return TYPE;
+    }
+
+    @Override
+    public VirtualHost createVirtualHost(VirtualHostRegistry virtualHostRegistry,
+                                         StatisticsGatherer brokerStatisticsGatherer,
+                                         org.apache.qpid.server.security.SecurityManager parentSecurityManager,
+                                         VirtualHostConfiguration hostConfig) throws Exception
+    {
+        return new StandardVirtualHost(virtualHostRegistry, brokerStatisticsGatherer, parentSecurityManager, hostConfig);
+    }
+
+
+    private static final String STORE_TYPE_ATTRIBUTE = org.apache.qpid.server.model.VirtualHost.STORE_TYPE;
+    private static final String STORE_PATH_ATTRIBUTE = org.apache.qpid.server.model.VirtualHost.STORE_PATH;
+
+    @Override
+    public void validateAttributes(Map<String, Object> attributes)
+    {
+
+        // need store type and path
+        Object storeType = attributes.get(STORE_TYPE_ATTRIBUTE);
+        if(!(storeType instanceof String))
+        {
+
+            throw new IllegalArgumentException("Attribute '"+ STORE_TYPE_ATTRIBUTE
+                                               +"' is required and must be of type String.");
+        }
+        final MessageStoreCreator storeCreator = new MessageStoreCreator();
+        if(!storeCreator.isValidType((String)storeType))
+        {
+            throw new IllegalArgumentException("Attribute '"+ STORE_TYPE_ATTRIBUTE
+                                                +"' has value '"+storeType+"' which is not one of the valid values: "
+                                                + storeCreator.getStoreTypes() + ".");
+
+        }
+
+        // TODO - each store type should validate its own attributes
+        if(!((String) storeType).equalsIgnoreCase(MemoryMessageStore.TYPE))
+        {
+            Object storePath = attributes.get(STORE_PATH_ATTRIBUTE);
+            if(!(storePath instanceof String))
+            {
+                throw new IllegalArgumentException("Attribute '"+ STORE_PATH_ATTRIBUTE
+                                                               +"' is required and must be of type String.");
+
+            }
+        }
+
+    }
+
+    @Override
+    public Map<String,Object> createVirtualHostConfiguration(VirtualHostAdapter virtualHostAdapter)
+    {
+        Map<String,Object> convertedMap = new LinkedHashMap<String, Object>();
+        convertedMap.put("store.type", virtualHostAdapter.getAttribute(org.apache.qpid.server.model.VirtualHost.STORE_TYPE));
+        convertedMap.put("store.environment-path", virtualHostAdapter.getAttribute(org.apache.qpid.server.model.VirtualHost.STORE_PATH));
+        return convertedMap;
+    }
+}

Propchange: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/StandardVirtualHostFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHost.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHost.java?rev=1493675&r1=1493674&r2=1493675&view=diff
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHost.java (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHost.java Mon Jun 17 08:11:06 2013
@@ -49,6 +49,8 @@ public interface VirtualHost extends Dur
 
     ExchangeFactory getExchangeFactory();
 
+    DurableConfigurationStore getDurableConfigurationStore();
+
     MessageStore getMessageStore();
 
     SecurityManager getSecurityManager();

Added: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostFactoryRegistry.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostFactoryRegistry.java?rev=1493675&view=auto
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostFactoryRegistry.java (added)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostFactoryRegistry.java Mon Jun 17 08:11:06 2013
@@ -0,0 +1,65 @@
+package org.apache.qpid.server.virtualhost;/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.qpid.server.plugin.QpidServiceLoader;
+import org.apache.qpid.server.plugin.VirtualHostFactory;
+
+public class VirtualHostFactoryRegistry
+{
+    private static Map<String, VirtualHostFactory> getFactoryMap()
+    {
+        Map<String, VirtualHostFactory> virtualHostFactories = new HashMap<String, VirtualHostFactory>();
+        QpidServiceLoader<VirtualHostFactory> qpidServiceLoader = new QpidServiceLoader<VirtualHostFactory>();
+        Iterable<VirtualHostFactory> factories = qpidServiceLoader.atLeastOneInstanceOf(VirtualHostFactory.class);
+        for (VirtualHostFactory virtualHostFactory : factories)
+        {
+            String type = virtualHostFactory.getType();
+            VirtualHostFactory factory = virtualHostFactories.put(type, virtualHostFactory);
+            if (factory != null)
+            {
+                throw new IllegalStateException("VirtualHostFactory with type name '" + type
+                        + "' is already registered using class '" + factory.getClass().getName() + "', can not register class '"
+                        + virtualHostFactory.getClass().getName() + "'");
+            }
+        }
+        return virtualHostFactories;
+    }
+
+
+    public static Collection<VirtualHostFactory> getFactories()
+    {
+        return Collections.unmodifiableCollection(getFactoryMap().values());
+    }
+
+    public static Collection<String> getVirtualHostTypes()
+    {
+        return Collections.unmodifiableCollection(getFactoryMap().keySet());
+    }
+
+    public static VirtualHostFactory getFactory(String type)
+    {
+        return getFactoryMap().get(type);
+    }
+}

Propchange: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/java/org/apache/qpid/server/virtualhost/VirtualHostFactoryRegistry.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.VirtualHostFactory (from r1481480, qpid/trunk/qpid/java/broker/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.MessageStoreFactory)
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.VirtualHostFactory?p2=qpid/branches/java-broker-vhost-refactor/java/broker/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.VirtualHostFactory&p1=qpid/trunk/qpid/java/broker/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.MessageStoreFactory&r1=1481480&r2=1493675&rev=1493675&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.MessageStoreFactory (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/resources/META-INF/services/org.apache.qpid.server.plugin.VirtualHostFactory Mon Jun 17 08:11:06 2013
@@ -16,6 +16,4 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-org.apache.qpid.server.store.derby.DerbyMessageStoreFactory
-org.apache.qpid.server.store.MemoryMessageStoreFactory
-org.apache.qpid.server.store.jdbc.JDBCMessageStoreFactory
+org.apache.qpid.server.virtualhost.StandardVirtualHostFactory

Modified: qpid/branches/java-broker-vhost-refactor/java/broker/src/main/resources/initial-config.json
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/main/resources/initial-config.json?rev=1493675&r1=1493674&r2=1493675&view=diff
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/main/resources/initial-config.json (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/main/resources/initial-config.json Mon Jun 17 08:11:06 2013
@@ -21,7 +21,7 @@
 {
   "name": "Broker",
   "storeVersion": 1,
-  "modelVersion": "1.0",
+  "modelVersion": "1.1",
   "defaultVirtualHost" : "default",
   "authenticationproviders" : [ {
     "name" : "passwordFile",
@@ -49,6 +49,7 @@
   }],
   "virtualhosts" : [ {
     "name" : "default",
+    "type" : "STANDARD",
     "storeType" : "DERBY",
     "storePath" : "${qpid.work_dir}/derbystore/default"
   } ],
@@ -59,4 +60,4 @@
     "pluginType" : "MANAGEMENT-JMX",
     "name" : "jmxManagement"
   } ]
-}
\ No newline at end of file
+}

Modified: qpid/branches/java-broker-vhost-refactor/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/VirtualHostRecovererTest.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/VirtualHostRecovererTest.java?rev=1493675&r1=1493674&r2=1493675&view=diff
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/VirtualHostRecovererTest.java (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/VirtualHostRecovererTest.java Mon Jun 17 08:11:06 2013
@@ -35,6 +35,7 @@ import org.apache.qpid.server.model.Brok
 import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.security.SecurityManager;
 import org.apache.qpid.server.stats.StatisticsGatherer;
+import org.apache.qpid.server.virtualhost.StandardVirtualHostFactory;
 import org.apache.qpid.test.utils.TestFileUtils;
 
 public class VirtualHostRecovererTest extends TestCase
@@ -75,6 +76,8 @@ public class VirtualHostRecovererTest ex
         VirtualHostRecoverer recoverer = new VirtualHostRecoverer(statisticsGatherer);
         Map<String, Object> attributes = new HashMap<String, Object>();
         attributes.put(VirtualHost.NAME, getName());
+        attributes.put(VirtualHost.TYPE, StandardVirtualHostFactory.TYPE);
+
         attributes.put(VirtualHost.STORE_PATH, "/path/to/virtualhost/store");
         attributes.put(VirtualHost.STORE_TYPE, "DERBY");
         when(entry.getAttributes()).thenReturn(attributes);

Modified: qpid/branches/java-broker-vhost-refactor/java/broker/src/test/java/org/apache/qpid/server/model/VirtualHostTest.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/test/java/org/apache/qpid/server/model/VirtualHostTest.java?rev=1493675&r1=1493674&r2=1493675&view=diff
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/test/java/org/apache/qpid/server/model/VirtualHostTest.java (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/test/java/org/apache/qpid/server/model/VirtualHostTest.java Mon Jun 17 08:11:06 2013
@@ -23,7 +23,6 @@ package org.apache.qpid.server.model;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.io.File;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -39,14 +38,10 @@ import org.apache.qpid.server.logging.Sy
 import org.apache.qpid.server.logging.actors.CurrentActor;
 import org.apache.qpid.server.logging.actors.TestLogActor;
 import org.apache.qpid.server.stats.StatisticsGatherer;
-import org.apache.qpid.server.store.Event;
-import org.apache.qpid.server.store.EventListener;
-import org.apache.qpid.server.store.EventManager;
 import org.apache.qpid.server.store.MemoryMessageStore;
-import org.apache.qpid.server.store.NullMessageStore;
-import org.apache.qpid.server.store.StateManager;
 import org.apache.qpid.server.util.BrokerTestHelper;
-import org.apache.qpid.test.utils.TestFileUtils;
+import org.apache.qpid.server.virtualhost.StandardVirtualHost;
+import org.apache.qpid.server.virtualhost.StandardVirtualHostFactory;
 
 public class VirtualHostTest extends TestCase
 {
@@ -96,6 +91,7 @@ public class VirtualHostTest extends Tes
     {
         Map<String, Object> attributes = new HashMap<String, Object>();
         attributes.put(VirtualHost.NAME, getName());
+        attributes.put(VirtualHost.TYPE, StandardVirtualHostFactory.TYPE);
         attributes.put(VirtualHost.STORE_TYPE, MemoryMessageStore.TYPE);
         attributes.put(VirtualHost.STATE, State.QUIESCED);
 
@@ -130,36 +126,11 @@ public class VirtualHostTest extends Tes
         assertEquals("Unexpected state", State.DELETED, host.getAttribute(VirtualHost.STATE));
     }
 
-    public void testReplicaState()
-    {
-        String hostName = getName();
-        File configPath = TestFileUtils.createTempFile(this, ".xml", "<virtualhosts><virtualhost><" + hostName
-                + "><store><class>" + ReplicaMessageStore.class.getName() + "</class></store></" + hostName
-                + "></virtualhost></virtualhosts>");
-        try
-        {
-            Map<String, Object> attributes = new HashMap<String, Object>();
-            attributes.put(VirtualHost.NAME, hostName);
-            attributes.put(VirtualHost.CONFIG_PATH, configPath.getAbsolutePath());
-
-            VirtualHost host = createHost(attributes);
-
-            assertEquals("Unexpected state", State.INITIALISING, host.getAttribute(VirtualHost.STATE));
-
-            host.setDesiredState(State.INITIALISING, State.ACTIVE);
-
-            assertEquals("Unexpected state", State.REPLICA, host.getAttribute(VirtualHost.STATE));
-        }
-        finally
-        {
-            configPath.delete();
-        }
-    }
-
     private VirtualHost createHost()
     {
         Map<String, Object> attributes = new HashMap<String, Object>();
         attributes.put(VirtualHost.NAME, getName());
+        attributes.put(VirtualHost.TYPE, StandardVirtualHostFactory.TYPE);
         attributes.put(VirtualHost.STORE_TYPE, MemoryMessageStore.TYPE);
 
         VirtualHost host = createHost(attributes);
@@ -174,34 +145,4 @@ public class VirtualHostTest extends Tes
         return new VirtualHostRecoverer(_statisticsGatherer).create(_recovererProvider, entry, _broker);
     }
 
-    public static final class ReplicaMessageStore extends NullMessageStore
-    {
-        private final EventManager _eventManager = new EventManager();
-        private final StateManager _stateManager = new StateManager(_eventManager);
-
-        @Override
-        public void activate() throws Exception
-        {
-            _stateManager.attainState(org.apache.qpid.server.store.State.INITIALISING);
-            _stateManager.attainState(org.apache.qpid.server.store.State.INITIALISED);
-            _stateManager.attainState(org.apache.qpid.server.store.State.ACTIVATING);
-            _stateManager.attainState(org.apache.qpid.server.store.State.ACTIVE);
-
-            // this should change the virtual host state to PASSIVE
-            _stateManager.attainState(org.apache.qpid.server.store.State.INITIALISED);
-        }
-
-        @Override
-        public void addEventListener(EventListener eventListener, Event... events)
-        {
-            _eventManager.addEventListener(eventListener, events);
-        }
-
-        @Override
-        public String getStoreType()
-        {
-            return ReplicaMessageStore.class.getSimpleName();
-        }
-    }
-
 }

Modified: qpid/branches/java-broker-vhost-refactor/java/broker/src/test/java/org/apache/qpid/server/store/DurableConfigurationStoreTest.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/test/java/org/apache/qpid/server/store/DurableConfigurationStoreTest.java?rev=1493675&r1=1493674&r2=1493675&view=diff
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/test/java/org/apache/qpid/server/store/DurableConfigurationStoreTest.java (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/test/java/org/apache/qpid/server/store/DurableConfigurationStoreTest.java Mon Jun 17 08:11:06 2013
@@ -65,7 +65,7 @@ public class DurableConfigurationStoreTe
     private static final String EXCHANGE_NAME = "exchangeName";
     private String _storePath;
     private String _storeName;
-    private MessageStore _store;
+    private MessageStore _messageStore;
     private Configuration _configuration;
 
     private ConfigurationRecoveryHandler _recoveryHandler;
@@ -84,6 +84,7 @@ public class DurableConfigurationStoreTe
     private FieldTable _bindingArgs;
     private UUID _queueId;
     private UUID _exchangeId;
+    private DurableConfigurationStore _configStore;
 
     public void setUp() throws Exception
     {
@@ -135,7 +136,7 @@ public class DurableConfigurationStoreTe
     public void testCreateExchange() throws Exception
     {
         Exchange exchange = createTestExchange();
-        _store.createExchange(exchange);
+        _configStore.createExchange(exchange);
 
         reopenStore();
         verify(_exchangeRecoveryHandler).exchange(_exchangeId, getName(), getName() + "Type", true);
@@ -144,9 +145,9 @@ public class DurableConfigurationStoreTe
     public void testRemoveExchange() throws Exception
     {
         Exchange exchange = createTestExchange();
-        _store.createExchange(exchange);
+        _configStore.createExchange(exchange);
 
-        _store.removeExchange(exchange);
+        _configStore.removeExchange(exchange);
 
         reopenStore();
         verify(_exchangeRecoveryHandler, never()).exchange(any(UUID.class), anyString(), anyString(), anyBoolean());
@@ -157,7 +158,7 @@ public class DurableConfigurationStoreTe
         AMQQueue queue = createTestQueue(QUEUE_NAME, "queueOwner", false);
         Binding binding = new Binding(UUIDGenerator.generateRandomUUID(), ROUTING_KEY, queue,
                 _exchange, FieldTable.convertToMap(_bindingArgs));
-        _store.bindQueue(binding);
+        _configStore.bindQueue(binding);
 
         reopenStore();
 
@@ -171,9 +172,9 @@ public class DurableConfigurationStoreTe
         AMQQueue queue = createTestQueue(QUEUE_NAME, "queueOwner", false);
         Binding binding = new Binding(UUIDGenerator.generateRandomUUID(), ROUTING_KEY, queue,
                 _exchange, FieldTable.convertToMap(_bindingArgs));
-        _store.bindQueue(binding);
+        _configStore.bindQueue(binding);
 
-        _store.unbindQueue(binding);
+        _configStore.unbindQueue(binding);
         reopenStore();
 
         verify(_bindingRecoveryHandler, never()).binding(any(UUID.class), any(UUID.class), any(UUID.class), anyString(),
@@ -183,7 +184,7 @@ public class DurableConfigurationStoreTe
     public void testCreateQueueAMQQueue() throws Exception
     {
         AMQQueue queue = createTestQueue(getName(), getName() + "Owner", true);
-        _store.createQueue(queue);
+        _configStore.createQueue(queue);
 
         reopenStore();
         verify(_queueRecoveryHandler).queue(_queueId, getName(), getName() + "Owner", true, null, null);
@@ -197,7 +198,7 @@ public class DurableConfigurationStoreTe
         attributes.put("x-qpid-maximum-delivery-count", new Integer(10));
 
         FieldTable arguments = FieldTable.convertToFieldTable(attributes);
-        _store.createQueue(queue, arguments);
+        _configStore.createQueue(queue, arguments);
 
         reopenStore();
         verify(_queueRecoveryHandler).queue(_queueId, getName(), getName() + "Owner", true, arguments, null);
@@ -208,7 +209,7 @@ public class DurableConfigurationStoreTe
         Exchange alternateExchange = createTestAlternateExchange();
 
         AMQQueue queue = createTestQueue(getName(), getName() + "Owner", true, alternateExchange);
-        _store.createQueue(queue);
+        _configStore.createQueue(queue);
 
         reopenStore();
         verify(_queueRecoveryHandler).queue(_queueId, getName(), getName() + "Owner", true, null, alternateExchange.getId());
@@ -230,11 +231,11 @@ public class DurableConfigurationStoreTe
         attributes.put("x-qpid-dlq-enabled", Boolean.TRUE);
         attributes.put("x-qpid-maximum-delivery-count", new Integer(10));
         FieldTable arguments = FieldTable.convertToFieldTable(attributes);
-        _store.createQueue(queue, arguments);
+        _configStore.createQueue(queue, arguments);
 
         // update the queue to have exclusive=false
         queue = createTestQueue(getName(), getName() + "Owner", false);
-        _store.updateQueue(queue);
+        _configStore.updateQueue(queue);
 
         reopenStore();
         verify(_queueRecoveryHandler).queue(_queueId, getName(), getName() + "Owner", false, arguments, null);
@@ -248,12 +249,12 @@ public class DurableConfigurationStoreTe
         attributes.put("x-qpid-dlq-enabled", Boolean.TRUE);
         attributes.put("x-qpid-maximum-delivery-count", new Integer(10));
         FieldTable arguments = FieldTable.convertToFieldTable(attributes);
-        _store.createQueue(queue, arguments);
+        _configStore.createQueue(queue, arguments);
 
         // update the queue to have exclusive=false
         Exchange alternateExchange = createTestAlternateExchange();
         queue = createTestQueue(getName(), getName() + "Owner", false, alternateExchange);
-        _store.updateQueue(queue);
+        _configStore.updateQueue(queue);
 
         reopenStore();
         verify(_queueRecoveryHandler).queue(_queueId, getName(), getName() + "Owner", false, arguments, alternateExchange.getId());
@@ -267,10 +268,10 @@ public class DurableConfigurationStoreTe
         attributes.put("x-qpid-dlq-enabled", Boolean.TRUE);
         attributes.put("x-qpid-maximum-delivery-count", new Integer(10));
         FieldTable arguments = FieldTable.convertToFieldTable(attributes);
-        _store.createQueue(queue, arguments);
+        _configStore.createQueue(queue, arguments);
 
         // remove queue
-        _store.removeQueue(queue);
+        _configStore.removeQueue(queue);
         reopenStore();
         verify(_queueRecoveryHandler, never()).queue(any(UUID.class), anyString(), anyString(), anyBoolean(),
                 any(FieldTable.class), any(UUID.class));
@@ -306,18 +307,19 @@ public class DurableConfigurationStoreTe
 
     private void reopenStore() throws Exception
     {
-        if (_store != null)
+        if (_messageStore != null)
         {
-            _store.close();
+            _messageStore.close();
         }
-        _store = createStore();
+        _messageStore = createMessageStore();
+        _configStore = createConfigStore();
 
-        _store.configureConfigStore(_storeName, _recoveryHandler, _configuration);
-        _store.configureMessageStore(_storeName, _messageStoreRecoveryHandler, _logRecoveryHandler, _configuration);
-        _store.activate();
+        _configStore.configureConfigStore(_storeName, _recoveryHandler, _configuration);
+        _messageStore.configureMessageStore(_storeName, _messageStoreRecoveryHandler, _logRecoveryHandler, _configuration);
+        _messageStore.activate();
     }
 
-    protected MessageStore createStore() throws Exception
+    protected MessageStore createMessageStore() throws Exception
     {
         String storeClass = System.getProperty(MESSAGE_STORE_CLASS_NAME_KEY);
         if (storeClass == null)
@@ -329,6 +331,26 @@ public class DurableConfigurationStoreTe
         return messageStore;
     }
 
+    protected DurableConfigurationStore createConfigStore() throws Exception
+    {
+        String storeClass = System.getProperty(CONFIGURATION_STORE_CLASS_NAME_KEY);
+        if (storeClass == null)
+        {
+            storeClass = DerbyMessageStore.class.getName();
+        }
+        Class<DurableConfigurationStore> clazz = (Class<DurableConfigurationStore>) Class.forName(storeClass);
+        DurableConfigurationStore configurationStore ;
+        if(clazz.isInstance(_messageStore))
+        {
+            configurationStore = (DurableConfigurationStore) _messageStore;
+        }
+        else
+        {
+            configurationStore = (DurableConfigurationStore) Class.forName(storeClass).newInstance();
+        }
+        return configurationStore;
+    }
+
     public void testRecordXid() throws Exception
     {
         Record enqueueRecord = getTestRecord(1);
@@ -338,13 +360,13 @@ public class DurableConfigurationStoreTe
         byte[] globalId = new byte[] { 1 };
         byte[] branchId = new byte[] { 2 };
 
-        Transaction transaction = _store.newTransaction();
+        Transaction transaction = _messageStore.newTransaction();
         transaction.recordXid(1l, globalId, branchId, enqueues, dequeues);
         transaction.commitTran();
         reopenStore();
         verify(_dtxRecordRecoveryHandler).dtxRecord(1l, globalId, branchId, enqueues, dequeues);
 
-        transaction = _store.newTransaction();
+        transaction = _messageStore.newTransaction();
         transaction.removeXid(1l, globalId, branchId);
         transaction.commitTran();
 

Modified: qpid/branches/java-broker-vhost-refactor/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreQuotaEventsTestBase.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-broker-vhost-refactor/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreQuotaEventsTestBase.java?rev=1493675&r1=1493674&r2=1493675&view=diff
==============================================================================
--- qpid/branches/java-broker-vhost-refactor/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreQuotaEventsTestBase.java (original)
+++ qpid/branches/java-broker-vhost-refactor/java/broker/src/test/java/org/apache/qpid/server/store/MessageStoreQuotaEventsTestBase.java Mon Jun 17 08:11:06 2013
@@ -71,7 +71,7 @@ public abstract class MessageStoreQuotaE
         applyStoreSpecificConfiguration(config);
 
         _store = createStore();
-        _store.configureConfigStore("test", null, config);
+        ((DurableConfigurationStore)_store).configureConfigStore("test", null, config);
 
         _transactionResource = UUID.randomUUID();
         _events = new ArrayList<Event>();



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