diff options
author | Robert Godfrey <rgodfrey@apache.org> | 2013-06-18 20:36:45 +0000 |
---|---|---|
committer | Robert Godfrey <rgodfrey@apache.org> | 2013-06-18 20:36:45 +0000 |
commit | 95b97d5b80498dc795852eb86fd7840632a7a60f (patch) | |
tree | 6aa2655514aea5360d7f83f035ebcc013bd1582b | |
parent | c4f7a811226cd0342a6fe3a3845d8aea7fad2a09 (diff) | |
download | qpid-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
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); + + +} |