summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Godfrey <rgodfrey@apache.org>2013-06-18 20:36:45 +0000
committerRobert Godfrey <rgodfrey@apache.org>2013-06-18 20:36:45 +0000
commit95b97d5b80498dc795852eb86fd7840632a7a60f (patch)
tree6aa2655514aea5360d7f83f035ebcc013bd1582b
parentc4f7a811226cd0342a6fe3a3845d8aea7fad2a09 (diff)
downloadqpid-python-95b97d5b80498dc795852eb86fd7840632a7a60f.tar.gz
Add config store upgrader
git-svn-id: https://svn.apache.org/repos/asf/qpid/branches/java-broker-vhost-refactor@1494289 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/configuration/startup/BrokerRecoverer.java25
-rw-r--r--java/broker/src/main/java/org/apache/qpid/server/configuration/startup/StoreUpgrader.java86
2 files changed, 107 insertions, 4 deletions
diff --git a/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/BrokerRecoverer.java b/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/BrokerRecoverer.java
index 4b7b9e3254..d6b7dec1aa 100644
--- a/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/BrokerRecoverer.java
+++ b/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/BrokerRecoverer.java
@@ -85,10 +85,9 @@ public class BrokerRecoverer implements ConfiguredObjectRecoverer<Broker>
@Override
public Broker create(RecovererProvider recovererProvider, ConfigurationEntry entry, ConfiguredObject... parents)
{
- Map<String, Object> attributes = entry.getAttributes();
- validateAttributes(attributes);
+ //Map<String, Object> attributes = entry.getAttributes();
+ Map<String, Object> attributesCopy = validateAttributes(entry);
- Map<String, Object> attributesCopy = new HashMap<String, Object>(attributes);
attributesCopy.put(Broker.MODEL_VERSION, Model.MODEL_VERSION);
StoreConfigurationChangeListener storeChangeListener = new StoreConfigurationChangeListener(entry.getStore());
@@ -128,8 +127,10 @@ public class BrokerRecoverer implements ConfiguredObjectRecoverer<Broker>
return broker;
}
- private void validateAttributes(Map<String, Object> attributes)
+ private Map<String, Object> validateAttributes(ConfigurationEntry entry)
{
+ Map<String, Object> attributes = entry.getAttributes();
+
String modelVersion = null;
if (attributes.containsKey(Broker.MODEL_VERSION))
{
@@ -157,6 +158,22 @@ public class BrokerRecoverer implements ConfiguredObjectRecoverer<Broker>
throw new IllegalConfigurationException("The model version '" + modelVersion
+ "' in configuration is incompatible with the broker model version '" + Model.MODEL_VERSION + "'");
}
+
+ if(!Model.MODEL_VERSION.equals(modelVersion))
+ {
+ String oldVersion;
+ do
+ {
+ oldVersion = modelVersion;
+ StoreUpgrader.upgrade(entry.getStore());
+ modelVersion = MapValueConverter.getStringAttribute(Broker.MODEL_VERSION, attributes, null);
+ }
+ while(!(modelVersion.equals(oldVersion) || modelVersion.equals(Model.MODEL_VERSION)));
+ }
+
+ attributes.put(Broker.MODEL_VERSION, Model.MODEL_VERSION);
+
+ return new HashMap<String, Object>(attributes);
}
private void recoverType(RecovererProvider recovererProvider,
diff --git a/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/StoreUpgrader.java b/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/StoreUpgrader.java
new file mode 100644
index 0000000000..0789664dd8
--- /dev/null
+++ b/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/StoreUpgrader.java
@@ -0,0 +1,86 @@
+package org.apache.qpid.server.configuration.startup;/*
+ *
+ * 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.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import org.apache.qpid.server.configuration.ConfigurationEntry;
+import org.apache.qpid.server.configuration.ConfigurationEntryStore;
+import org.apache.qpid.server.model.Broker;
+
+public abstract class StoreUpgrader
+{
+
+ private static Map<String, StoreUpgrader> _upgraders = new HashMap<String, StoreUpgrader>();
+
+ // 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
+
+ private final static StoreUpgrader UPGRADE_1_0 = new StoreUpgrader("1.0")
+ {
+ @Override
+ protected void doUpgrade(ConfigurationEntryStore store)
+ {
+ ConfigurationEntry root = store.getRootEntry();
+ Map<String, Collection<ConfigurationEntry>> children = root.getChildren();
+ Collection<ConfigurationEntry> vhosts = children.get("VirtualHost");
+ Collection<ConfigurationEntry> changed = new HashSet<ConfigurationEntry>();
+ for(ConfigurationEntry vhost : vhosts)
+ {
+ Map<String, Object> attributes = vhost.getAttributes();
+ if(attributes.containsKey("storeType"))
+ {
+ attributes = new HashMap<String, Object>(attributes);
+ attributes.put("type", "STANDARD");
+
+ changed.add(new ConfigurationEntry(vhost.getId(),vhost.getType(),attributes,vhost.getChildrenIds(),store));
+
+ }
+
+ }
+ Map<String, Object> attributes = new HashMap<String, Object>(root.getAttributes());
+ attributes.put(Broker.MODEL_VERSION, "1.1");
+ changed.add(new ConfigurationEntry(root.getId(),root.getType(),attributes,root.getChildrenIds(),store));
+
+ store.save(changed.toArray(new ConfigurationEntry[changed.size()]));
+
+ }
+ };
+
+ private StoreUpgrader(String version)
+ {
+ _upgraders.put(version, this);
+ }
+
+ public static void upgrade(ConfigurationEntryStore store)
+ {
+ StoreUpgrader upgrader = _upgraders.get(store.getRootEntry().getAttributes().get(Broker.MODEL_VERSION).toString());
+ if(upgrader != null)
+ {
+ upgrader.doUpgrade(store);
+ }
+ }
+
+ protected abstract void doUpgrade(ConfigurationEntryStore store);
+
+
+}