You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kw...@apache.org on 2014/04/22 14:32:23 UTC

svn commit: r1589112 [1/2] - in /qpid/trunk/qpid/java/broker-core/src: main/java/org/apache/qpid/server/ main/java/org/apache/qpid/server/configuration/startup/ main/java/org/apache/qpid/server/model/ main/java/org/apache/qpid/server/registry/ main/jav...

Author: kwall
Date: Tue Apr 22 12:32:23 2014
New Revision: 1589112

URL: http://svn.apache.org/r1589112
Log:
QPID-5715: [Java Broker] Refactor VirtualHostStoreUpgraderAndRecoverer/BrokerStoreUpgrader to avoid duplicated code

Added:
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecoverer.java
      - copied, changed from r1588966, qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/startup/BrokerStoreUpgrader.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/GenericRecoverer.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/GenericStoreUpgrader.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/StoreUpgraderPhase.java
      - copied, changed from r1588966, qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/startup/StoreUpgraderPhase.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/store/BrokerRecovererTest.java
      - copied, changed from r1588966, qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/startup/BrokerRecovererTest.java
Removed:
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/startup/BrokerStoreUpgrader.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/startup/StoreUpgraderPhase.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/startup/UpgraderPhaseFactory.java
    qpid/trunk/qpid/java/broker-core/src/test/java/org/apache/qpid/server/configuration/startup/BrokerRecovererTest.java
Modified:
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemContext.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemContextImpl.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/VirtualHostStoreUpgraderAndRecoverer.java

Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java?rev=1589112&r1=1589111&r2=1589112&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/Broker.java Tue Apr 22 12:32:23 2014
@@ -25,6 +25,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.security.PrivilegedAction;
 import java.security.PrivilegedExceptionAction;
+import java.util.Collections;
 import java.util.List;
 import java.util.Properties;
 import java.util.Set;
@@ -34,7 +35,6 @@ import javax.security.auth.Subject;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
 import org.apache.log4j.PropertyConfigurator;
-
 import org.apache.qpid.server.configuration.BrokerConfigurationStoreCreator;
 import org.apache.qpid.server.configuration.store.ManagementModeStoreHandler;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
@@ -152,6 +152,8 @@ public class Broker
             store = new ManagementModeStoreHandler(store, options);
         }
 
+        store.openConfigurationStore(systemContext, Collections.<String, Object>emptyMap());
+
         _applicationRegistry = new ApplicationRegistry(store,systemContext);
         try
         {

Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemContext.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemContext.java?rev=1589112&r1=1589111&r2=1589112&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemContext.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemContext.java Tue Apr 22 12:32:23 2014
@@ -23,13 +23,10 @@ package org.apache.qpid.server.model;
 import org.apache.qpid.server.BrokerOptions;
 import org.apache.qpid.server.logging.EventLogger;
 import org.apache.qpid.server.logging.LogRecorder;
-import org.apache.qpid.server.store.ConfiguredObjectRecord;
 
 @ManagedObject (creatable = false)
 public interface SystemContext<X extends SystemContext<X>> extends ConfiguredObject<X>
 {
-    void resolveObjects(ConfiguredObjectRecord... records);
-
     EventLogger getEventLogger();
 
     BrokerOptions getBrokerOptions();

Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemContextImpl.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemContextImpl.java?rev=1589112&r1=1589111&r2=1589112&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemContextImpl.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/SystemContextImpl.java Tue Apr 22 12:32:23 2014
@@ -84,141 +84,6 @@ public class SystemContextImpl extends A
     }
 
     @Override
-    public void resolveObjects(final ConfiguredObjectRecord... records)
-    {
-        runTask(new TaskExecutor.VoidTask()
-        {
-            @Override
-            public void execute()
-            {
-
-
-                ConfiguredObjectFactory factory = getObjectFactory();
-
-                Map<UUID, ConfiguredObject<?>> resolvedObjects = new HashMap<UUID, ConfiguredObject<?>>();
-                resolvedObjects.put(getId(), SystemContextImpl.this);
-
-                Collection<ConfiguredObjectRecord> recordsWithUnresolvedParents =
-                        new ArrayList<ConfiguredObjectRecord>(Arrays.asList(records));
-                Collection<UnresolvedConfiguredObject<? extends ConfiguredObject>> recordsWithUnresolvedDependencies =
-                        new ArrayList<UnresolvedConfiguredObject<? extends ConfiguredObject>>();
-
-                boolean updatesMade;
-
-                do
-                {
-                    updatesMade = false;
-                    Iterator<ConfiguredObjectRecord> iter = recordsWithUnresolvedParents.iterator();
-                    while (iter.hasNext())
-                    {
-                        ConfiguredObjectRecord record = iter.next();
-                        Collection<ConfiguredObject<?>> parents = new ArrayList<ConfiguredObject<?>>();
-                        boolean foundParents = true;
-                        for (ConfiguredObjectRecord parent : record.getParents().values())
-                        {
-                            if (!resolvedObjects.containsKey(parent.getId()))
-                            {
-                                foundParents = false;
-                                break;
-                            }
-                            else
-                            {
-                                parents.add(resolvedObjects.get(parent.getId()));
-                            }
-                        }
-                        if (foundParents)
-                        {
-                            iter.remove();
-                            UnresolvedConfiguredObject<? extends ConfiguredObject> recovered =
-                                    factory.recover(record, parents.toArray(new ConfiguredObject<?>[parents.size()]));
-                            Collection<ConfiguredObjectDependency<?>> dependencies =
-                                    recovered.getUnresolvedDependencies();
-                            if (dependencies.isEmpty())
-                            {
-                                updatesMade = true;
-                                ConfiguredObject<?> resolved = recovered.resolve();
-                                resolvedObjects.put(resolved.getId(), resolved);
-                            }
-                            else
-                            {
-                                recordsWithUnresolvedDependencies.add(recovered);
-                            }
-                        }
-
-                    }
-
-                    Iterator<UnresolvedConfiguredObject<? extends ConfiguredObject>> unresolvedIter =
-                            recordsWithUnresolvedDependencies.iterator();
-
-                    while (unresolvedIter.hasNext())
-                    {
-                        UnresolvedConfiguredObject<? extends ConfiguredObject> unresolvedObject = unresolvedIter.next();
-                        Collection<ConfiguredObjectDependency<?>> dependencies =
-                                new ArrayList<ConfiguredObjectDependency<?>>(unresolvedObject.getUnresolvedDependencies());
-
-                        for (ConfiguredObjectDependency dependency : dependencies)
-                        {
-                            if (dependency instanceof ConfiguredObjectIdDependency)
-                            {
-                                UUID id = ((ConfiguredObjectIdDependency) dependency).getId();
-                                if (resolvedObjects.containsKey(id))
-                                {
-                                    dependency.resolve(resolvedObjects.get(id));
-                                }
-                            }
-                            else if (dependency instanceof ConfiguredObjectNameDependency)
-                            {
-                                ConfiguredObject<?> dependentObject = null;
-                                for (ConfiguredObject<?> parent : unresolvedObject.getParents())
-                                {
-                                    dependentObject = parent.findConfiguredObject(dependency.getCategoryClass(),
-                                                                                  ((ConfiguredObjectNameDependency) dependency)
-                                                                                          .getName()
-                                                                                 );
-                                    if (dependentObject != null)
-                                    {
-                                        break;
-                                    }
-                                }
-                                if (dependentObject != null)
-                                {
-                                    dependency.resolve(dependentObject);
-                                }
-                            }
-                            else
-                            {
-                                throw new ServerScopedRuntimeException("Unknown dependency type "
-                                                                       + dependency.getClass()
-                                        .getSimpleName());
-                            }
-                        }
-                        if (unresolvedObject.getUnresolvedDependencies().isEmpty())
-                        {
-                            updatesMade = true;
-                            unresolvedIter.remove();
-                            ConfiguredObject<?> resolved = unresolvedObject.resolve();
-                            resolvedObjects.put(resolved.getId(), resolved);
-                        }
-                    }
-
-                } while (updatesMade && !(recordsWithUnresolvedDependencies.isEmpty()
-                                          && recordsWithUnresolvedParents.isEmpty()));
-
-                if (!recordsWithUnresolvedDependencies.isEmpty())
-                {
-                    throw new IllegalArgumentException("Cannot resolve some objects: "
-                                                       + recordsWithUnresolvedDependencies);
-                }
-                if (!recordsWithUnresolvedParents.isEmpty())
-                {
-                    throw new IllegalArgumentException("Cannot resolve object because their parents cannot be found"
-                                                       + recordsWithUnresolvedParents);
-                }
-            }
-        });
-    }
-
-    @Override
     protected boolean setState(final State currentState, final State desiredState)
     {
         throw new IllegalArgumentException("Cannot change the state of the SystemContext object");

Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java?rev=1589112&r1=1589111&r2=1589112&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java Tue Apr 22 12:32:23 2014
@@ -21,11 +21,9 @@
 package org.apache.qpid.server.registry;
 
 import org.apache.log4j.Logger;
-
 import org.apache.qpid.common.QpidProperties;
 import org.apache.qpid.server.BrokerOptions;
 import org.apache.qpid.server.configuration.BrokerProperties;
-import org.apache.qpid.server.configuration.startup.BrokerStoreUpgrader;
 import org.apache.qpid.server.logging.CompositeStartupMessageLogger;
 import org.apache.qpid.server.logging.EventLogger;
 import org.apache.qpid.server.logging.Log4jMessageLogger;
@@ -35,6 +33,7 @@ import org.apache.qpid.server.logging.me
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.SystemContext;
+import org.apache.qpid.server.store.BrokerStoreUpgraderAndRecoverer;
 import org.apache.qpid.server.store.DurableConfigurationStore;
 import org.apache.qpid.util.SystemUtils;
 
@@ -77,8 +76,8 @@ public class ApplicationRegistry impleme
 
         logStartupMessages(startupLogger);
 
-        BrokerStoreUpgrader upgrader = new BrokerStoreUpgrader(_systemContext);
-        _broker = upgrader.upgrade(_store);
+        BrokerStoreUpgraderAndRecoverer upgrader = new BrokerStoreUpgraderAndRecoverer(_systemContext);
+        _broker = upgrader.perform(_store);
 
         _broker.setEventLogger(startupLogger);
         _broker.open();

Copied: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecoverer.java (from r1588966, qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/startup/BrokerStoreUpgrader.java)
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecoverer.java?p2=qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecoverer.java&p1=qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/startup/BrokerStoreUpgrader.java&r1=1588966&r2=1589112&rev=1589112&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/startup/BrokerStoreUpgrader.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/BrokerStoreUpgraderAndRecoverer.java Tue Apr 22 12:32:23 2014
@@ -18,42 +18,30 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.configuration.startup;
+package org.apache.qpid.server.store;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.UUID;
 
-import org.apache.log4j.Logger;
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.configuration.store.StoreConfigurationChangeListener;
 import org.apache.qpid.server.model.Broker;
-import org.apache.qpid.server.model.BrokerModel;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.SystemContext;
-import org.apache.qpid.server.store.ConfiguredObjectRecord;
-import org.apache.qpid.server.store.ConfiguredObjectRecordImpl;
-import org.apache.qpid.server.store.DurableConfigurationStore;
-import org.apache.qpid.server.store.DurableConfigurationStoreUpgrader;
-import org.apache.qpid.server.store.NullUpgrader;
-import org.apache.qpid.server.store.handler.ConfiguredObjectRecordHandler;
 import org.apache.qpid.server.util.Action;
 
-public class BrokerStoreUpgrader
+public class BrokerStoreUpgraderAndRecoverer
 {
-    private final SystemContext _systemContext;
-    private Map<String, UpgraderPhaseFactory> _upgraders = new HashMap<String, UpgraderPhaseFactory>();
-
+    private final SystemContext<?> _systemContext;
+    private final Map<String, StoreUpgraderPhase> _upgraders = new HashMap<String, StoreUpgraderPhase>();
 
     // Note: don't use externally defined constants in upgraders in case they change, the values here MUST stay the same
     // no matter what changes are made to the code in the future
-
-    public BrokerStoreUpgrader(SystemContext systemContext)
+    public BrokerStoreUpgraderAndRecoverer(SystemContext<?> systemContext)
     {
         _systemContext = systemContext;
 
@@ -63,199 +51,171 @@ public class BrokerStoreUpgrader
         register(new Upgrader_1_3_to_1_4());
     }
 
-    private void register(UpgraderPhaseFactory factory)
+    private void register(StoreUpgraderPhase upgrader)
     {
-        _upgraders.put(factory.getFromVersion(), factory);
+        _upgraders.put(upgrader.getFromVersion(), upgrader);
     }
 
-    private final class Upgrader_1_0_to_1_1 extends UpgraderPhaseFactory
+    private static final class Upgrader_1_0_to_1_1 extends StoreUpgraderPhase
     {
         private Upgrader_1_0_to_1_1()
         {
-            super("1.0", "1.1");
+            super("modelVersion", "1.0", "1.1");
         }
 
         @Override
-        public StoreUpgraderPhase newInstance()
+        public void configuredObject(ConfiguredObjectRecord record)
         {
-            return new StoreUpgraderPhase(Broker.MODEL_VERSION, getToVersion())
+            if (record.getType().equals("Broker"))
             {
-                @Override
-                public void configuredObject(ConfiguredObjectRecord record)
-                {
-                    if (record.getType().equals("Broker"))
-                    {
-                        record = upgradeRootRecord(record);
-                    }
-                    else if (record.getType().equals("VirtualHost") && record.getAttributes().containsKey("storeType"))
-                    {
-                        Map<String, Object> updatedAttributes = new HashMap<String, Object>(record.getAttributes());
-                        updatedAttributes.put("type", "STANDARD");
-                        record = new ConfiguredObjectRecordImpl(record.getId(), record.getType(), updatedAttributes, record.getParents());
-                        getUpdateMap().put(record.getId(), record);
-                    }
-
-                    getNextUpgrader().configuredObject(record);
-                }
+                record = upgradeRootRecord(record);
+            }
+            else if (record.getType().equals("VirtualHost") && record.getAttributes().containsKey("storeType"))
+            {
+                Map<String, Object> updatedAttributes = new HashMap<String, Object>(record.getAttributes());
+                updatedAttributes.put("type", "STANDARD");
+                record = new ConfiguredObjectRecordImpl(record.getId(), record.getType(), updatedAttributes, record.getParents());
+                getUpdateMap().put(record.getId(), record);
+            }
 
+            getNextUpgrader().configuredObject(record);
+        }
 
-                @Override
-                public void complete()
-                {
-                    getNextUpgrader().complete();
-                }
-            };
+        @Override
+        public void complete()
+        {
+            getNextUpgrader().complete();
         }
+
     }
 
-    private static final class Upgrader_1_1_to_1_2 extends UpgraderPhaseFactory
+    private static final class Upgrader_1_1_to_1_2 extends StoreUpgraderPhase
     {
         private Upgrader_1_1_to_1_2()
         {
-            super("1.1", "1.2");
+            super("modelVersion", "1.1", "1.2");
         }
 
         @Override
-        public StoreUpgraderPhase newInstance()
+        public void configuredObject(ConfiguredObjectRecord record)
         {
-            return new StoreUpgraderPhase(Broker.MODEL_VERSION, getToVersion())
+            if (record.getType().equals("Broker"))
             {
+                record = upgradeRootRecord(record);
+            }
 
-                @Override
-                public void configuredObject(ConfiguredObjectRecord record)
-                {
-                    if (record.getType().equals("Broker"))
-                    {
-                        record = upgradeRootRecord(record);
-                    }
-
-                    getNextUpgrader().configuredObject(record);
+            getNextUpgrader().configuredObject(record);
 
-                }
+        }
 
-                @Override
-                public void complete()
-                {
-                    getNextUpgrader().complete();
-                }
-            };
+        @Override
+        public void complete()
+        {
+            getNextUpgrader().complete();
         }
+
     }
 
-    private static final class Upgrader_1_2_to_1_3 extends UpgraderPhaseFactory
+    private static final class Upgrader_1_2_to_1_3 extends StoreUpgraderPhase
     {
         private Upgrader_1_2_to_1_3()
         {
-            super("1.2", "1.3");
+            super("modelVersion", "1.2", "1.3");
         }
 
         @Override
-        public StoreUpgraderPhase newInstance()
+        public void configuredObject(ConfiguredObjectRecord record)
         {
-            return new StoreUpgraderPhase(Broker.MODEL_VERSION, getToVersion())
+            if (record.getType().equals("TrustStore") && record.getAttributes().containsKey("type"))
             {
+                Map<String, Object> updatedAttributes = new HashMap<String, Object>(record.getAttributes());
+                updatedAttributes.put("trustStoreType", updatedAttributes.remove("type"));
+                record = new ConfiguredObjectRecordImpl(record.getId(), record.getType(), updatedAttributes, record.getParents());
+                getUpdateMap().put(record.getId(), record);
 
-                @Override
-                public void configuredObject(ConfiguredObjectRecord record)
-                {
-                    if (record.getType().equals("TrustStore") && record.getAttributes().containsKey("type"))
-                    {
-                        Map<String, Object> updatedAttributes = new HashMap<String, Object>(record.getAttributes());
-                        updatedAttributes.put("trustStoreType", updatedAttributes.remove("type"));
-                        record = new ConfiguredObjectRecordImpl(record.getId(), record.getType(), updatedAttributes, record.getParents());
-                        getUpdateMap().put(record.getId(), record);
-
-                    }
-                    else if (record.getType().equals("KeyStore") && record.getAttributes().containsKey("type"))
-                    {
-                        Map<String, Object> updatedAttributes = new HashMap<String, Object>(record.getAttributes());
-                        updatedAttributes.put("keyStoreType", updatedAttributes.remove("type"));
-                        record = new ConfiguredObjectRecordImpl(record.getId(), record.getType(), updatedAttributes, record.getParents());
-                        getUpdateMap().put(record.getId(), record);
+            }
+            else if (record.getType().equals("KeyStore") && record.getAttributes().containsKey("type"))
+            {
+                Map<String, Object> updatedAttributes = new HashMap<String, Object>(record.getAttributes());
+                updatedAttributes.put("keyStoreType", updatedAttributes.remove("type"));
+                record = new ConfiguredObjectRecordImpl(record.getId(), record.getType(), updatedAttributes, record.getParents());
+                getUpdateMap().put(record.getId(), record);
 
-                    }
-                    else if (record.getType().equals("Broker"))
-                    {
-                        record = upgradeRootRecord(record);
-                    }
+            }
+            else if (record.getType().equals("Broker"))
+            {
+                record = upgradeRootRecord(record);
+            }
 
-                    getNextUpgrader().configuredObject(record);
+            getNextUpgrader().configuredObject(record);
 
-                }
+        }
 
-                @Override
-                public void complete()
-                {
-                    getNextUpgrader().complete();
-                }
-            };
+        @Override
+        public void complete()
+        {
+            getNextUpgrader().complete();
         }
+
     }
 
-    private static final class Upgrader_1_3_to_1_4 extends UpgraderPhaseFactory
+    private static final class Upgrader_1_3_to_1_4 extends StoreUpgraderPhase
     {
         private Upgrader_1_3_to_1_4()
         {
-            super("1.3", "1.4");
+            super("modelVersion", "1.3", "1.4");
         }
 
+        @SuppressWarnings("serial")
+        private Map<String, VirtualHostEntryUpgrader> _vhostUpgraderMap = new HashMap<String, VirtualHostEntryUpgrader>()
+        {{
+            put("BDB_HA", new BdbHaVirtualHostUpgrader());
+            put("STANDARD", new StandardVirtualHostUpgrader());
+        }};
+
         @Override
-        public StoreUpgraderPhase newInstance()
+        public void configuredObject(ConfiguredObjectRecord record)
         {
-            return new StoreUpgraderPhase(Broker.MODEL_VERSION, getToVersion())
+            if (record.getType().equals("VirtualHost"))
             {
-
-                @SuppressWarnings("serial")
-                private Map<String, VirtualHostEntryUpgrader> _vhostUpgraderMap = new HashMap<String, VirtualHostEntryUpgrader>()
-                {{
-                    put("BDB_HA", new BdbHaVirtualHostUpgrader());
-                    put("STANDARD", new StandardVirtualHostUpgrader());
-                }};
-
-                @Override
-                public void configuredObject(ConfiguredObjectRecord record)
+                Map<String, Object> attributes = record.getAttributes();
+                if (attributes.containsKey("configPath"))
                 {
-                    if (record.getType().equals("VirtualHost"))
-                    {
-                        Map<String, Object> attributes = record.getAttributes();
-                        if (attributes.containsKey("configPath"))
-                        {
-                            throw new IllegalConfigurationException("Auto-upgrade of virtual host " + attributes.get("name") + " having XML configuration is not supported. Virtual host configuration file is " + attributes.get("configPath"));
-                        }
+                    throw new IllegalConfigurationException("Auto-upgrade of virtual host " + attributes.get("name") + " having XML configuration is not supported. Virtual host configuration file is " + attributes.get("configPath"));
+                }
 
-                        String type = (String) attributes.get("type");
-                        VirtualHostEntryUpgrader vhostUpgrader = _vhostUpgraderMap.get(type);
-                        if (vhostUpgrader == null)
-                        {
-                            throw new IllegalConfigurationException("Don't know how to perform an upgrade from version for virtualhost type " + type);
-                        }
-                        record = vhostUpgrader.upgrade(record);
-                        getUpdateMap().put(record.getId(), record);
-                    }
-                    else if (record.getType().equals("Plugin") && record.getAttributes().containsKey("pluginType"))
-                    {
-                        Map<String, Object> updatedAttributes = new HashMap<String, Object>(record.getAttributes());
-                        updatedAttributes.put("type", updatedAttributes.remove("pluginType"));
-                        record = new ConfiguredObjectRecordImpl(record.getId(), record.getType(), updatedAttributes, record.getParents());
-                        getUpdateMap().put(record.getId(), record);
+                String type = (String) attributes.get("type");
+                VirtualHostEntryUpgrader vhostUpgrader = _vhostUpgraderMap.get(type);
+                if (vhostUpgrader == null)
+                {
+                    throw new IllegalConfigurationException("Don't know how to perform an upgrade from version for virtualhost type " + type);
+                }
+                record = vhostUpgrader.upgrade(record);
+                getUpdateMap().put(record.getId(), record);
+            }
+            else if (record.getType().equals("Plugin") && record.getAttributes().containsKey("pluginType"))
+            {
+                Map<String, Object> updatedAttributes = new HashMap<String, Object>(record.getAttributes());
+                updatedAttributes.put("type", updatedAttributes.remove("pluginType"));
+                record = new ConfiguredObjectRecordImpl(record.getId(), record.getType(), updatedAttributes, record.getParents());
+                getUpdateMap().put(record.getId(), record);
 
-                    }
-                    else if (record.getType().equals("Broker"))
-                    {
-                        record = upgradeRootRecord(record);
-                    }
+            }
+            else if (record.getType().equals("Broker"))
+            {
+                record = upgradeRootRecord(record);
+            }
 
-                    getNextUpgrader().configuredObject(record);
+            getNextUpgrader().configuredObject(record);
 
-                }
+        }
 
-                @Override
-                public void complete()
-                {
-                    getNextUpgrader().complete();
-                }
-            };
+        @Override
+        public void complete()
+        {
+            getNextUpgrader().complete();
         }
+
     }
 
     private static interface VirtualHostEntryUpgrader
@@ -560,163 +520,52 @@ public class BrokerStoreUpgrader
         }
     }
 
-    public Broker<?> upgrade(DurableConfigurationStore store)
-    {
-        final BrokerStoreRecoveryHandler recoveryHandler = new BrokerStoreRecoveryHandler(_systemContext, store, _upgraders);
-        store.openConfigurationStore(_systemContext, Collections.<String,Object>emptyMap());
-        store.visitConfiguredObjectRecords(recoveryHandler);
-
-        return recoveryHandler.getBroker();
-    }
-
-
-    private static class BrokerStoreRecoveryHandler implements ConfiguredObjectRecordHandler
+    public Broker<?> perform(final DurableConfigurationStore store)
     {
-        private static Logger LOGGER = Logger.getLogger(BrokerStoreRecoveryHandler.class);
-
-        private DurableConfigurationStoreUpgrader _upgrader;
-        private DurableConfigurationStore _store;
-        private final Map<UUID, ConfiguredObjectRecord> _records = new HashMap<UUID, ConfiguredObjectRecord>();
-        private final SystemContext _systemContext;
-        private Map<String, UpgraderPhaseFactory> _upgraders;
-
-        private BrokerStoreRecoveryHandler(final SystemContext systemContext, DurableConfigurationStore store, Map<String, UpgraderPhaseFactory> upgraders)
-        {
-            _systemContext = systemContext;
-            _store = store;
-            _upgraders = upgraders;
-        }
-
+        final String brokerCategory = Broker.class.getSimpleName();
+        final GenericStoreUpgrader upgrader = new GenericStoreUpgrader(brokerCategory, Broker.MODEL_VERSION, store, _upgraders);
+        upgrader.upgrade();
 
-        @Override
-        public void begin()
-        {
-        }
+        new GenericRecoverer(_systemContext, brokerCategory).recover(upgrader.getRecords());
 
-        @Override
-        public boolean handle(final ConfiguredObjectRecord object)
+        final StoreConfigurationChangeListener configChangeListener = new StoreConfigurationChangeListener(store);
+        applyRecursively(_systemContext.getBroker(), new Action<ConfiguredObject<?>>()
         {
-            _records.put(object.getId(), object);
-            return true;
-        }
-
-        @Override
-        public void end()
-        {
-            String version = getCurrentVersion();
-
-            while(!BrokerModel.MODEL_VERSION.equals(version))
-            {
-                LOGGER.debug("Adding broker store upgrader from model version: " + version);
-                final UpgraderPhaseFactory upgraderPhaseFactory = _upgraders.get(version);
-                StoreUpgraderPhase upgrader = upgraderPhaseFactory.newInstance();
-                if(_upgrader == null)
-                {
-                    _upgrader = upgrader;
-                }
-                else
-                {
-                    _upgrader.setNextUpgrader(upgrader);
-                }
-                version = upgraderPhaseFactory.getToVersion();
-            }
-
-            if(_upgrader == null)
-            {
-                _upgrader = new NullUpgrader();
-            }
-            else
+            @Override
+            public void performAction(final ConfiguredObject<?> object)
             {
-                _upgrader.setNextUpgrader(new NullUpgrader());
+                 object.addChangeListener(configChangeListener);
             }
+        });
 
-            for(ConfiguredObjectRecord record : _records.values())
-            {
-                _upgrader.configuredObject(record);
-            }
-
-            Map<UUID, ConfiguredObjectRecord> deletedRecords = _upgrader.getDeletedRecords();
-            Map<UUID, ConfiguredObjectRecord> updatedRecords = _upgrader.getUpdatedRecords();
-
-            LOGGER.debug("Broker store upgrade: " + deletedRecords.size() + " records deleted");
-            LOGGER.debug("Broker store upgrade: " + updatedRecords.size() + " records updated");
-            LOGGER.debug("Broker store upgrade: " + _records.size() + " total records");
-
-            _store.update(true, updatedRecords.values().toArray(new ConfiguredObjectRecord[updatedRecords.size()]));
-            _store.remove(deletedRecords.values().toArray(new ConfiguredObjectRecord[deletedRecords.size()]));
-
-
-
-
-            _records.keySet().removeAll(deletedRecords.keySet());
-            _records.putAll(updatedRecords);
-
-            _systemContext.resolveObjects(_records.values().toArray(new ConfiguredObjectRecord[_records.size()]));
-
-            final StoreConfigurationChangeListener configChangeListener = new StoreConfigurationChangeListener(_store);
-            applyRecursively(_systemContext.getBroker(),
-                             new Action<ConfiguredObject<?>>()
-                             {
-                                 @Override
-                                 public void performAction(final ConfiguredObject<?> object)
-                                 {
-                                     object.addChangeListener(configChangeListener);
-                                 }
-
-
-                             });
-
-        }
-
-        private void applyRecursively(final ConfiguredObject<?> object, final Action<ConfiguredObject<?>> action)
-        {
-            applyRecursively(object, action, new HashSet<ConfiguredObject<?>>());
-        }
+        return _systemContext.getBroker();
+    }
 
-        private void applyRecursively(final ConfiguredObject<?> object,
-                                      final Action<ConfiguredObject<?>> action,
-                                      final HashSet<ConfiguredObject<?>> visited)
-        {
-            if(!visited.contains(object))
-            {
-                visited.add(object);
-                action.performAction(object);
-                for(Class<? extends ConfiguredObject> childClass : object.getModel().getChildTypes(object.getCategoryClass()))
-                {
-                    Collection<? extends ConfiguredObject> children = object.getChildren(childClass);
-                    if(children != null)
-                    {
-                        for(ConfiguredObject<?> child : children)
-                        {
-                            applyRecursively(child, action, visited);
-                        }
-                    }
-                }
-            }
-        }
+    private void applyRecursively(final ConfiguredObject<?> object, final Action<ConfiguredObject<?>> action)
+    {
+        applyRecursively(object, action, new HashSet<ConfiguredObject<?>>());
+    }
 
-        private String getCurrentVersion()
+    private void applyRecursively(final ConfiguredObject<?> object,
+                                  final Action<ConfiguredObject<?>> action,
+                                  final HashSet<ConfiguredObject<?>> visited)
+    {
+        if(!visited.contains(object))
         {
-            for(ConfiguredObjectRecord record : _records.values())
+            visited.add(object);
+            action.performAction(object);
+            for(Class<? extends ConfiguredObject> childClass : object.getModel().getChildTypes(object.getCategoryClass()))
             {
-                if(record.getType().equals("Broker"))
+                Collection<? extends ConfiguredObject> children = object.getChildren(childClass);
+                if(children != null)
                 {
-                    String version = (String) record.getAttributes().get(Broker.MODEL_VERSION);
-                    if(version == null)
+                    for(ConfiguredObject<?> child : children)
                     {
-                        version = "1.0";
+                        applyRecursively(child, action, visited);
                     }
-                    return version;
                 }
             }
-            return BrokerModel.MODEL_VERSION;
-        }
-
-        public Broker getBroker()
-        {
-            return _systemContext.getBroker();
         }
     }
 
-
 }

Added: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/GenericRecoverer.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/GenericRecoverer.java?rev=1589112&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/GenericRecoverer.java (added)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/GenericRecoverer.java Tue Apr 22 12:32:23 2014
@@ -0,0 +1,218 @@
+/*
+ *
+ * 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.store;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.log4j.Logger;
+import org.apache.qpid.server.configuration.updater.TaskExecutor;
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.ConfiguredObjectFactory;
+import org.apache.qpid.server.util.ServerScopedRuntimeException;
+
+public class GenericRecoverer
+{
+    private static final Logger LOGGER = Logger.getLogger(GenericRecoverer.class);
+
+    private final ConfiguredObject<?> _parentOfRoot;
+    private final String _rootCategory;
+
+    public GenericRecoverer(ConfiguredObject<?> parentOfRoot, String rootCategory)
+    {
+        _parentOfRoot = parentOfRoot;
+        _rootCategory = rootCategory;
+    }
+
+    public void recover(final List<ConfiguredObjectRecord> records)
+    {
+        _parentOfRoot.getTaskExecutor().run(new TaskExecutor.VoidTask()
+        {
+            @Override
+            public void execute()
+            {
+                performRecover(records);
+            }
+
+            @Override
+            public String toString()
+            {
+                return _rootCategory + " recovery";
+            }
+        });
+
+    }
+
+    private void performRecover(List<ConfiguredObjectRecord> records)
+    {
+        ConfiguredObjectRecord rootRecord = null;
+        for (ConfiguredObjectRecord record : records)
+        {
+            if (_rootCategory.equals(record.getType()))
+            {
+                rootRecord = record;
+                break;
+            }
+        }
+
+        if (LOGGER.isDebugEnabled())
+        {
+            LOGGER.debug("Root record " + rootRecord);
+        }
+
+        if (rootRecord != null)
+        {
+
+            if (rootRecord.getParents() == null || rootRecord.getParents().isEmpty())
+            {
+                records = new ArrayList<ConfiguredObjectRecord>(records);
+
+                String parentOfRootCategory = _parentOfRoot.getCategoryClass().getSimpleName();
+                ConfiguredObjectRecord parentRecord = new ConfiguredObjectRecordImpl(_parentOfRoot.getId(), parentOfRootCategory, Collections.<String, Object>emptyMap());
+                Map<String, ConfiguredObjectRecord> rootParents = Collections.<String, ConfiguredObjectRecord>singletonMap(parentOfRootCategory, parentRecord);
+                records.remove(rootRecord);
+                records.add(new ConfiguredObjectRecordImpl(rootRecord.getId(), _rootCategory, rootRecord.getAttributes(), rootParents));
+            }
+
+            resolveObjects(_parentOfRoot, records);
+        }
+    }
+
+    private void resolveObjects(ConfiguredObject<?> parentObject, List<ConfiguredObjectRecord> records)
+    {
+        ConfiguredObjectFactory factory = parentObject.getObjectFactory();
+        Map<UUID, ConfiguredObject<?>> resolvedObjects = new HashMap<UUID, ConfiguredObject<?>>();
+        resolvedObjects.put(parentObject.getId(), parentObject);
+
+        Collection<ConfiguredObjectRecord> recordsWithUnresolvedParents = new ArrayList<ConfiguredObjectRecord>(records);
+        Collection<UnresolvedConfiguredObject<? extends ConfiguredObject>> recordsWithUnresolvedDependencies =
+                new ArrayList<UnresolvedConfiguredObject<? extends ConfiguredObject>>();
+
+        boolean updatesMade;
+
+        do
+        {
+            updatesMade = false;
+            Iterator<ConfiguredObjectRecord> iter = recordsWithUnresolvedParents.iterator();
+            while (iter.hasNext())
+            {
+                ConfiguredObjectRecord record = iter.next();
+                Collection<ConfiguredObject<?>> parents = new ArrayList<ConfiguredObject<?>>();
+                boolean foundParents = true;
+                for (ConfiguredObjectRecord parent : record.getParents().values())
+                {
+                    if (!resolvedObjects.containsKey(parent.getId()))
+                    {
+                        foundParents = false;
+                        break;
+                    }
+                    else
+                    {
+                        parents.add(resolvedObjects.get(parent.getId()));
+                    }
+                }
+                if (foundParents)
+                {
+                    iter.remove();
+                    ConfiguredObject<?>[] parentArray = parents.toArray(new ConfiguredObject<?>[parents.size()]);
+                    UnresolvedConfiguredObject<? extends ConfiguredObject> recovered =  factory.recover(record, parentArray);
+                    Collection<ConfiguredObjectDependency<?>> dependencies = recovered.getUnresolvedDependencies();
+                    if (dependencies.isEmpty())
+                    {
+                        updatesMade = true;
+                        ConfiguredObject<?> resolved = recovered.resolve();
+                        resolvedObjects.put(resolved.getId(), resolved);
+                    }
+                    else
+                    {
+                        recordsWithUnresolvedDependencies.add(recovered);
+                    }
+                }
+
+            }
+
+            Iterator<UnresolvedConfiguredObject<? extends ConfiguredObject>> unresolvedIter = recordsWithUnresolvedDependencies.iterator();
+
+            while(unresolvedIter.hasNext())
+            {
+                UnresolvedConfiguredObject<? extends ConfiguredObject> unresolvedObject = unresolvedIter.next();
+                Collection<ConfiguredObjectDependency<?>> dependencies =
+                        new ArrayList<ConfiguredObjectDependency<?>>(unresolvedObject.getUnresolvedDependencies());
+
+                for(ConfiguredObjectDependency dependency : dependencies)
+                {
+                    if(dependency instanceof ConfiguredObjectIdDependency)
+                    {
+                        UUID id = ((ConfiguredObjectIdDependency)dependency).getId();
+                        if(resolvedObjects.containsKey(id))
+                        {
+                            dependency.resolve(resolvedObjects.get(id));
+                        }
+                    }
+                    else if(dependency instanceof ConfiguredObjectNameDependency)
+                    {
+                        ConfiguredObject<?> dependentObject = null;
+                        for(ConfiguredObject<?> parent : unresolvedObject.getParents())
+                        {
+                            dependentObject = parent.findConfiguredObject(dependency.getCategoryClass(), ((ConfiguredObjectNameDependency)dependency).getName());
+                            if(dependentObject != null)
+                            {
+                                break;
+                            }
+                        }
+                        if(dependentObject != null)
+                        {
+                            dependency.resolve(dependentObject);
+                        }
+                    }
+                    else
+                    {
+                        throw new ServerScopedRuntimeException("Unknown dependency type " + dependency.getClass().getSimpleName());
+                    }
+                }
+                if(unresolvedObject.getUnresolvedDependencies().isEmpty())
+                {
+                    updatesMade = true;
+                    unresolvedIter.remove();
+                    ConfiguredObject<?> resolved = unresolvedObject.resolve();
+                    resolvedObjects.put(resolved.getId(), resolved);
+                }
+            }
+
+        } while(updatesMade && !(recordsWithUnresolvedDependencies.isEmpty() && recordsWithUnresolvedParents.isEmpty()));
+
+        if(!recordsWithUnresolvedDependencies.isEmpty())
+        {
+            throw new IllegalArgumentException("Cannot resolve some objects: " + recordsWithUnresolvedDependencies);
+        }
+        if(!recordsWithUnresolvedParents.isEmpty())
+        {
+            throw new IllegalArgumentException("Cannot resolve object because their parents cannot be found" + recordsWithUnresolvedParents);
+        }
+    }
+
+}
\ No newline at end of file

Added: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/GenericStoreUpgrader.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/GenericStoreUpgrader.java?rev=1589112&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/GenericStoreUpgrader.java (added)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/GenericStoreUpgrader.java Tue Apr 22 12:32:23 2014
@@ -0,0 +1,170 @@
+/*
+ *
+ * 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.store;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.log4j.Logger;
+import org.apache.qpid.server.configuration.IllegalConfigurationException;
+import org.apache.qpid.server.model.BrokerModel;
+import org.apache.qpid.server.store.handler.ConfiguredObjectRecordHandler;
+
+public class GenericStoreUpgrader
+{
+    private static final Logger LOGGER = Logger.getLogger(GenericStoreUpgrader.class);
+
+    private final Map<UUID, ConfiguredObjectRecord> _records = new HashMap<UUID, ConfiguredObjectRecord>();
+    private final Map<String, StoreUpgraderPhase> _upgraders;
+    private final DurableConfigurationStore _store;
+    private final String _rootCategory;
+    private final String _modelVersionAttributeName;
+
+    public GenericStoreUpgrader(String rootCategory, String rootModelVersionAttributeName, DurableConfigurationStore configurationStore, Map<String, StoreUpgraderPhase> upgraders)
+    {
+        super();
+        _upgraders = upgraders;
+        _store = configurationStore;
+        _rootCategory = rootCategory;
+        _modelVersionAttributeName = rootModelVersionAttributeName;
+    }
+
+
+    public List<ConfiguredObjectRecord> getRecords()
+    {
+        return new ArrayList<ConfiguredObjectRecord>(_records.values());
+    }
+
+    public void upgrade()
+    {
+        ConfiguredObjectRecordHandler handler = new ConfiguredObjectRecordHandler()
+        {
+            @Override
+            public void begin()
+            {
+            }
+
+            @Override
+            public boolean handle(final ConfiguredObjectRecord record)
+            {
+                _records.put(record.getId(), record);
+                return true;
+            }
+
+            @Override
+            public void end()
+            {
+                performUpgrade();
+            }
+        };
+
+        _store.visitConfiguredObjectRecords(handler);
+    }
+
+    private void performUpgrade()
+    {
+        String version = getCurrentVersion();
+
+        if (LOGGER.isInfoEnabled())
+        {
+            LOGGER.info(_rootCategory + " store has model version " + version + ". Number of record(s) " + _records.size());
+        }
+
+        DurableConfigurationStoreUpgrader upgrader = buildUpgraderChain(version);
+
+        for(ConfiguredObjectRecord record : _records.values())
+        {
+            upgrader.configuredObject(record);
+        }
+
+        upgrader.complete();
+
+        Map<UUID, ConfiguredObjectRecord> deletedRecords = upgrader.getDeletedRecords();
+        Map<UUID, ConfiguredObjectRecord> updatedRecords = upgrader.getUpdatedRecords();
+
+        if (LOGGER.isDebugEnabled())
+        {
+            LOGGER.debug(_rootCategory + " store upgrade is about to complete. " + _records.size() + " total record(s)."
+                    + " Records to update " + updatedRecords.size()
+                    + " Records to delete " + deletedRecords.size());
+        }
+
+        _store.update(true, updatedRecords.values().toArray(new ConfiguredObjectRecord[updatedRecords.size()]));
+        _store.remove(deletedRecords.values().toArray(new ConfiguredObjectRecord[deletedRecords.size()]));
+
+        _records.keySet().removeAll(deletedRecords.keySet());
+        _records.putAll(updatedRecords);
+    }
+
+    private DurableConfigurationStoreUpgrader buildUpgraderChain(String version)
+    {
+        DurableConfigurationStoreUpgrader head = null;
+        while(!BrokerModel.MODEL_VERSION.equals(version))
+        {
+            if (LOGGER.isDebugEnabled())
+            {
+                LOGGER.debug("Adding " + _rootCategory + " store upgrader from model version: " + version);
+            }
+
+            StoreUpgraderPhase upgrader = _upgraders.get(version);
+            if (upgrader == null)
+            {
+                throw new IllegalConfigurationException("No phase upgrader for version " + version);
+            }
+
+            if(head == null)
+            {
+                head = upgrader;
+            }
+            else
+            {
+                head.setNextUpgrader(upgrader);
+            }
+            version = upgrader.getToVersion();
+        }
+
+        if(head == null)
+        {
+            head = new NullUpgrader();
+        }
+        else
+        {
+            head.setNextUpgrader(new NullUpgrader());
+        }
+
+        return head;
+    }
+
+    private String getCurrentVersion()
+    {
+        for(ConfiguredObjectRecord record : _records.values())
+        {
+            if(_rootCategory.equals(record.getType()))
+            {
+                return (String) record.getAttributes().get(_modelVersionAttributeName);
+            }
+        }
+        return BrokerModel.MODEL_VERSION;
+    }
+}
\ No newline at end of file

Copied: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/StoreUpgraderPhase.java (from r1588966, qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/startup/StoreUpgraderPhase.java)
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/StoreUpgraderPhase.java?p2=qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/StoreUpgraderPhase.java&p1=qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/startup/StoreUpgraderPhase.java&r1=1588966&r2=1589112&rev=1589112&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/configuration/startup/StoreUpgraderPhase.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/store/StoreUpgraderPhase.java Tue Apr 22 12:32:23 2014
@@ -18,23 +18,21 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.configuration.startup;
+package org.apache.qpid.server.store;
 
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.qpid.server.store.ConfiguredObjectRecord;
-import org.apache.qpid.server.store.ConfiguredObjectRecordImpl;
-import org.apache.qpid.server.store.NonNullUpgrader;
-
 public abstract class StoreUpgraderPhase extends NonNullUpgrader
 {
+    private final String _fromVersion;
     private final String _toVersion;
     private final String _versionAttributeName;
 
-    protected StoreUpgraderPhase(String versionAttributeName, String toVersion)
+    public StoreUpgraderPhase(String versionAttributeName, String fromVersion, String toVersion)
     {
         _toVersion = toVersion;
+        _fromVersion = fromVersion;
         _versionAttributeName = versionAttributeName;
     }
 
@@ -46,4 +44,15 @@ public abstract class StoreUpgraderPhase
         getUpdateMap().put(record.getId(), record);
         return record;
     }
+
+    public String getFromVersion()
+    {
+        return _fromVersion;
+    }
+
+    public String getToVersion()
+    {
+        return _toVersion;
+    }
+
 }
\ No newline at end of file



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