From 95b97d5b80498dc795852eb86fd7840632a7a60f Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Tue, 18 Jun 2013 20:36:45 +0000 Subject: 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 --- .../configuration/startup/BrokerRecoverer.java | 25 ++++++- .../configuration/startup/StoreUpgrader.java | 86 ++++++++++++++++++++++ 2 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 java/broker/src/main/java/org/apache/qpid/server/configuration/startup/StoreUpgrader.java (limited to 'java') 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 @Override public Broker create(RecovererProvider recovererProvider, ConfigurationEntry entry, ConfiguredObject... parents) { - Map attributes = entry.getAttributes(); - validateAttributes(attributes); + //Map attributes = entry.getAttributes(); + Map attributesCopy = validateAttributes(entry); - Map attributesCopy = new HashMap(attributes); attributesCopy.put(Broker.MODEL_VERSION, Model.MODEL_VERSION); StoreConfigurationChangeListener storeChangeListener = new StoreConfigurationChangeListener(entry.getStore()); @@ -128,8 +127,10 @@ public class BrokerRecoverer implements ConfiguredObjectRecoverer return broker; } - private void validateAttributes(Map attributes) + private Map validateAttributes(ConfigurationEntry entry) { + Map attributes = entry.getAttributes(); + String modelVersion = null; if (attributes.containsKey(Broker.MODEL_VERSION)) { @@ -157,6 +158,22 @@ public class BrokerRecoverer implements ConfiguredObjectRecoverer 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(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 _upgraders = new HashMap(); + + // 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> children = root.getChildren(); + Collection vhosts = children.get("VirtualHost"); + Collection changed = new HashSet(); + for(ConfigurationEntry vhost : vhosts) + { + Map attributes = vhost.getAttributes(); + if(attributes.containsKey("storeType")) + { + attributes = new HashMap(attributes); + attributes.put("type", "STANDARD"); + + changed.add(new ConfigurationEntry(vhost.getId(),vhost.getType(),attributes,vhost.getChildrenIds(),store)); + + } + + } + Map attributes = new HashMap(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); + + +} -- cgit v1.2.1