You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by da...@apache.org on 2005/12/01 00:25:14 UTC

svn commit: r350073 - in /geronimo/trunk/modules/system/src: java/org/apache/geronimo/system/configuration/ test/org/apache/geronimo/system/configuration/

Author: dain
Date: Wed Nov 30 15:25:09 2005
New Revision: 350073

URL: http://svn.apache.org/viewcvs?rev=350073&view=rev
Log:
Split out LocalAttributeManager xml marshaling code, so it can be easily tested and expanded.

Added:
    geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigurationOverride.java   (with props)
    geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/GBeanOverride.java   (with props)
    geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ServerOverride.java   (with props)
    geronimo/trunk/modules/system/src/test/org/apache/geronimo/system/configuration/ServerOverrideTest.java   (with props)
Modified:
    geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/LocalAttributeManager.java

Added: geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigurationOverride.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigurationOverride.java?rev=350073&view=auto
==============================================================================
--- geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigurationOverride.java (added)
+++ geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigurationOverride.java Wed Nov 30 15:25:09 2005
@@ -0,0 +1,109 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ *  Licensed 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.geronimo.system.configuration;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @version $Rev$ $Date$
+ */
+class ConfigurationOverride {
+    private final String name;
+    private boolean load;
+    private final Map gbeans = new LinkedHashMap();
+
+    public ConfigurationOverride(String name, boolean load) {
+        this.name = name;
+        this.load = load;
+    }
+
+    public ConfigurationOverride(Element element) throws MalformedObjectNameException {
+        name = element.getAttribute("name");
+
+        String loadConfigString = element.getAttribute("load");
+        load = !"false".equals(loadConfigString);
+
+        NodeList gbeans = element.getElementsByTagName("gbean");
+        for (int g = 0; g < gbeans.getLength(); g++) {
+            Element gbeanElement = (Element) gbeans.item(g);
+            GBeanOverride gbean = new GBeanOverride(gbeanElement);
+            addGBean(gbean);
+        }
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public boolean isLoad() {
+        return load;
+    }
+
+    public void setLoad(boolean load) {
+        this.load = load;
+    }
+
+    public GBeanOverride getGBean(String gbeanName) {
+        return (GBeanOverride) gbeans.get(gbeanName);
+    }
+
+    public void addGBean(GBeanOverride gbean) {
+        gbeans.put(gbean.getName(), gbean);
+    }
+
+    public void addGBean(String gbeanName, GBeanOverride gbean) {
+        gbeans.put(gbeanName, gbean);
+    }
+
+    public Map getGBeans() {
+        return gbeans;
+    }
+
+    public GBeanOverride getGBean(ObjectName gbeanName) {
+        return (GBeanOverride) gbeans.get(gbeanName);
+    }
+
+    public void addGBean(ObjectName gbeanName, GBeanOverride gbean) {
+        gbeans.put(gbeanName, gbean);
+    }
+
+    public void writeXml(PrintWriter out) {
+        out.print("  <configuration name=\"" + name + "\"");
+        if (!load) {
+            out.print(" load=\"false\"");
+        }
+        out.println(">");
+
+        // GBeans
+        for (Iterator gb = gbeans.entrySet().iterator(); gb.hasNext();) {
+            Map.Entry gbean = (Map.Entry) gb.next();
+
+            GBeanOverride gbeanOverride = (GBeanOverride) gbean.getValue();
+            gbeanOverride.writeXml(out);
+        }
+
+        out.println("  </configuration>");
+    }
+}

Propchange: geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigurationOverride.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ConfigurationOverride.java
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Id"

Added: geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/GBeanOverride.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/GBeanOverride.java?rev=350073&view=auto
==============================================================================
--- geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/GBeanOverride.java (added)
+++ geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/GBeanOverride.java Wed Nov 30 15:25:09 2005
@@ -0,0 +1,123 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ *  Licensed 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.geronimo.system.configuration;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @version $Rev$ $Date$
+ */
+class GBeanOverride {
+    private final Object name;
+    private boolean load;
+    private final Map attributes = new LinkedHashMap();
+
+    public GBeanOverride(String name, boolean load) {
+        this.name = name;
+        this.load = load;
+    }
+
+    public GBeanOverride(ObjectName name, boolean load) {
+        this.name = name;
+        this.load = load;
+    }
+
+    public GBeanOverride(Element gbean) throws MalformedObjectNameException {
+        String nameString = gbean.getAttribute("name");
+        if (nameString.indexOf(':') > -1) {
+            name = ObjectName.getInstance(nameString);
+        } else {
+            name = nameString;
+        }
+
+        String loadString = gbean.getAttribute("load");
+        load = !"false".equals(loadString);
+
+        NodeList attributes = gbean.getElementsByTagName("attribute");
+        for (int a = 0; a < attributes.getLength(); a++) {
+            Element attribute = (Element) attributes.item(a);
+            String attName = attribute.getAttribute("name");
+            String value = "";
+            NodeList text = attribute.getChildNodes();
+            for (int t = 0; t < text.getLength(); t++) {
+                Node n = text.item(t);
+                if (n.getNodeType() == Node.TEXT_NODE) {
+                    value += n.getNodeValue();
+                }
+            }
+            setAttribute(attName, value.trim());
+        }
+    }
+
+    public Object getName() {
+        return name;
+    }
+
+    public boolean isLoad() {
+        return load;
+    }
+
+    public void setLoad(boolean load) {
+        this.load = load;
+    }
+
+    public Map getAttributes() {
+        return attributes;
+    }
+
+    public String getAttribute(String attributeName) {
+        return (String) attributes.get(attributeName);
+    }
+
+    public void setAttribute(String attributeName, String attributeValue) {
+        attributes.put(attributeName, attributeValue);
+    }
+
+    public void writeXml(PrintWriter out) {
+        String gbeanName;
+        if (name instanceof String) {
+            gbeanName = (String) name;
+        } else {
+            gbeanName = ((ObjectName) name).getCanonicalName();
+        }
+
+        out.print("    <gbean name=\"" + gbeanName + "\"");
+        if (!load) {
+            out.print(" load=\"false\"");
+        }
+        out.println(">");
+
+        // Attribute values
+        for (Iterator att = attributes.entrySet().iterator(); att.hasNext();) {
+            Map.Entry attribute = (Map.Entry) att.next();
+            out.print("      <attribute name=\"" + attribute.getKey() + "\">");
+            out.print((String) attribute.getValue());
+            out.println("</attribute>");
+        }
+
+        out.println("    </gbean>");
+    }
+}

Propchange: geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/GBeanOverride.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/GBeanOverride.java
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Id"

Modified: geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/LocalAttributeManager.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/LocalAttributeManager.java?rev=350073&r1=350072&r2=350073&view=diff
==============================================================================
--- geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/LocalAttributeManager.java (original)
+++ geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/LocalAttributeManager.java Wed Nov 30 15:25:09 2005
@@ -27,9 +27,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.Iterator;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Timer;
@@ -53,8 +51,6 @@
 import org.apache.geronimo.system.serverinfo.ServerInfo;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
@@ -67,7 +63,7 @@
     private final static Log log = LogFactory.getLog(LocalAttributeManager.class);
 
     private final static String CONFIG_FILE_PROPERTY = "org.apache.geronimo.config.file";
-    
+
     private final static String BACKUP_EXTENSION = ".bak";
     private final static String TEMP_EXTENSION = ".working";
     private final static int SAVE_BUFFER_MS = 5000;
@@ -79,7 +75,7 @@
     private File attributeFile;
     private File backupFile;
     private File tempFile;
-    private final Map configurations = new LinkedHashMap();
+    private ServerOverride serverOverride;
 
     private Timer timer;
     private TimerTask currentTask;
@@ -96,14 +92,14 @@
         return readOnly;
     }
 
-    public Collection setAttributes(URI configurationName, Collection datas) throws InvalidConfigException {
+    public synchronized Collection setAttributes(URI configurationName, Collection datas) throws InvalidConfigException {
         String configName = configurationName.toString();
-        ConfigInfo configInfo = (ConfigInfo) configurations.get(configName);
-        if (configInfo != null) {
-            if (configInfo.isLoad()) {
+        ConfigurationOverride configurationOverride = serverOverride.getConfiguration(configName);
+        if (configurationOverride != null) {
+            if (configurationOverride.isLoad()) {
                 for (Iterator iterator = datas.iterator(); iterator.hasNext();) {
                     GBeanData data = (GBeanData) iterator.next();
-                    boolean load = setAttributes(data, configInfo, configName);
+                    boolean load = setAttributes(data, configurationOverride, configName);
                     if (!load) {
                         iterator.remove();
                     }
@@ -119,17 +115,17 @@
      * Set the attributes from the attribute store on a single gbean, and return whether or not to load the gbean.
      *
      * @param data
-     * @param configInfo
+     * @param configurationOverride
      * @param configName
      * @return true if the gbean should be loaded, false otherwise.
-     * @throws InvalidConfigException
+     * @throws org.apache.geronimo.kernel.config.InvalidConfigException
      */
-    private boolean setAttributes(GBeanData data, ConfigInfo configInfo, String configName) throws InvalidConfigException {
+    private synchronized boolean setAttributes(GBeanData data, ConfigurationOverride configurationOverride, String configName) throws InvalidConfigException {
         ObjectName gbeanName = data.getName();
         GBeanInfo gBeanInfo = data.getGBeanInfo();
-        GBeanAttrsInfo attributeMap = configInfo.getGBean(gbeanName);
+        GBeanOverride attributeMap = configurationOverride.getGBean(gbeanName);
         if (attributeMap == null) {
-            attributeMap = configInfo.getGBean(gbeanName.getKeyProperty("name"));
+            attributeMap = configurationOverride.getGBean(gbeanName.getKeyProperty("name"));
         }
         if (attributeMap != null) {
             if (attributeMap.isLoad()) {
@@ -154,7 +150,7 @@
     }
 
 
-    private Object getValue(GAttributeInfo attribute, String value, String configurationName, ObjectName gbeanName) {
+    private synchronized Object getValue(GAttributeInfo attribute, String value, String configurationName, ObjectName gbeanName) {
         if (value == null) {
             return null;
         }
@@ -174,21 +170,17 @@
         }
     }
 
-    public synchronized void setValue(String configurationName, ObjectName gbean, GAttributeInfo attribute, Object value) {
+    public synchronized void setValue(String configurationName, ObjectName gbeanName, GAttributeInfo attribute, Object value) {
         if (readOnly) {
             return;
         }
-        ConfigInfo config = (ConfigInfo) configurations.get(configurationName);
-        if (config == null) {
-            config = new ConfigInfo(true);
-            configurations.put(configurationName, config);
-        }
-        GBeanAttrsInfo atts = config.getGBean(gbean);
-        if (atts == null) {
-            atts = config.getGBean(gbean.getKeyProperty("name"));
-            if (atts == null) {
-                atts = new GBeanAttrsInfo(true);
-                config.addGBean(gbean, atts);
+        ConfigurationOverride config = serverOverride.getConfiguration(configurationName, true);
+        GBeanOverride gbeanOverride = config.getGBean(gbeanName);
+        if (gbeanOverride == null) {
+            gbeanOverride = config.getGBean(gbeanName.getKeyProperty("name"));
+            if (gbeanOverride == null) {
+                gbeanOverride = new GBeanOverride(gbeanName, true);
+                config.addGBean(gbeanName, gbeanOverride);
             }
         }
         try {
@@ -202,7 +194,7 @@
                 editor.setValue(value);
                 string = editor.getAsText();
             }
-            Map attrMap = atts.getAttributes();
+            Map attrMap = gbeanOverride.getAttributes();
             attrMap.put(attribute.getName(), string);
             attributeChanged();
         } catch (ClassNotFoundException e) {
@@ -211,80 +203,38 @@
         }
     }
 
-    public synchronized void setShouldLoad(String configurationName, ObjectName gbean, boolean load) {
+    public synchronized void setShouldLoad(String configurationName, ObjectName gbeanName, boolean load) {
         if (readOnly) {
             return;
         }
-        ConfigInfo config = (ConfigInfo) configurations.get(configurationName);
-        if (config == null) {
-            config = new ConfigInfo(true);
-            configurations.put(configurationName, config);
+        ConfigurationOverride config = serverOverride.getConfiguration(configurationName, true);
+
+        GBeanOverride atts = config.getGBean(gbeanName);
+        if (atts == null) {
+            // attempt to lookup by short name
+            atts = config.getGBean(gbeanName.getKeyProperty("name"));
         }
-        GBeanAttrsInfo atts = config.getGBean(gbean);
+
         if (atts == null) {
-            atts = config.getGBean(gbean.getKeyProperty("name"));
-            if (atts == null) {
-                atts = new GBeanAttrsInfo(load);
-                config.addGBean(gbean, atts);
-            } else {
-                atts.setLoad(load);
-            }
+            atts = new GBeanOverride(gbeanName, load);
+            config.addGBean(gbeanName, atts);
         } else {
             atts.setLoad(load);
         }
         attributeChanged();
     }
 
-    public void load() throws IOException {
+    public synchronized void load() throws IOException {
         ensureParentDirectory();
         if (!attributeFile.exists()) {
             return;
         }
-        configurations.clear();
-        Map results = new LinkedHashMap();
         InputSource in = new InputSource(new FileInputStream(attributeFile));
         DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
         try {
             Document doc = dfactory.newDocumentBuilder().parse(in);
             Element root = doc.getDocumentElement();
-            NodeList configs = root.getElementsByTagName("configuration");
-            for (int c = 0; c < configs.getLength(); c++) {
-                Element config = (Element) configs.item(c);
-                String configName = config.getAttribute("name");
-                String loadConfigString = config.getAttribute("load");
-                boolean loadConfig = !"false".equals(loadConfigString);
-                ConfigInfo configInfo = new ConfigInfo(loadConfig);
-                results.put(configName, configInfo);
-                NodeList gbeans = config.getElementsByTagName("gbean");
-                for (int g = 0; g < gbeans.getLength(); g++) {
-                    Element gbean = (Element) gbeans.item(g);
-                    String gbeanName = gbean.getAttribute("name");
-                    String loadGBeanString = gbean.getAttribute("load");
-                    boolean loadGBean = !"false".equals(loadGBeanString);
-                    GBeanAttrsInfo gbeanAttrs = new GBeanAttrsInfo(loadGBean);
-                    if (gbeanName.indexOf(':') > -1) {
-                        ObjectName name = ObjectName.getInstance(gbeanName);
-                        configInfo.addGBean(name, gbeanAttrs);
-                    } else {
-                        configInfo.addGBean(gbeanName, gbeanAttrs);
-                    }
-                    NodeList attributes = gbean.getElementsByTagName("attribute");
-                    for (int a = 0; a < attributes.getLength(); a++) {
-                        Element attribute = (Element) attributes.item(a);
-                        String attName = attribute.getAttribute("name");
-                        String value = "";
-                        NodeList text = attribute.getChildNodes();
-                        for (int t = 0; t < text.getLength(); t++) {
-                            Node n = text.item(t);
-                            if (n.getNodeType() == Node.TEXT_NODE) {
-                                value += n.getNodeValue();
-                            }
-                        }
-                        gbeanAttrs.setAttribute(attName, value.trim());
-                    }
-                }
-            }
-            configurations.putAll(results);
+            serverOverride = new ServerOverride(root);
         } catch (SAXException e) {
             log.error("Unable to read saved manageable attributes", e);
         } catch (ParserConfigurationException e) {
@@ -294,7 +244,7 @@
         }
     }
 
-     public synchronized void save() throws IOException {
+    public synchronized void save() throws IOException {
         if (readOnly) {
             return;
         }
@@ -305,63 +255,47 @@
         if (!tempFile.canWrite()) {
             throw new IOException("Unable to write to manageable attribute working file for save " + tempFile.getAbsolutePath());
         }
+
+        // write the new configuration to the temp file
         PrintWriter out = new PrintWriter(new FileWriter(tempFile), true);
-        out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
-        out.println();
-        out.println("<attributes xmlns=\"http://geronimo.apache.org/xml/ns/attributes\">");
-        for (Iterator it = configurations.entrySet().iterator(); it.hasNext();) {
-            Map.Entry entry = (Map.Entry) it.next();
-            ConfigInfo configInfo = (ConfigInfo) entry.getValue();
-            boolean configLoaded = configInfo.isLoad();
-            out.println("  <configuration name=\"" + entry.getKey() + (configLoaded ? "\">" : "\" load=\"false\">"));
-            for (Iterator gb = configInfo.getGBeans().entrySet().iterator(); gb.hasNext();) {
-                Map.Entry gbean = (Map.Entry) gb.next();
-                String gbeanName = gbean.getKey() instanceof String ? (String) gbean.getKey() : ((ObjectName) gbean.getKey()).getCanonicalName();
-                GBeanAttrsInfo atts = (GBeanAttrsInfo) gbean.getValue();
-                boolean gbeanLoaded = atts.isLoad();
-                out.println("    <gbean name=\"" + gbeanName + (gbeanLoaded ? "\">" : "\" load=\"false\">"));
-                for (Iterator att = atts.getAttributes().entrySet().iterator(); att.hasNext();) {
-                    Map.Entry attribute = (Map.Entry) att.next();
-                    out.print("      <attribute name=\"" + attribute.getKey() + "\">");
-                    out.print((String) attribute.getValue());
-                    out.println("</attribute>");
-                }
-                out.println("    </gbean>");
-            }
-            out.println("  </configuration>");
-        }
-        out.println("</attributes>");
+        serverOverride.writeXml(out);
         out.close();
+
+        // delete the current backup file
         if (backupFile.exists()) {
             if (!backupFile.delete()) {
                 throw new IOException("Unable to delete old backup file in order to back up current manageable attribute working file for save");
             }
         }
+
+        // rename the existing configuration file to the backup file
         if (attributeFile.exists()) {
             if (!attributeFile.renameTo(backupFile)) {
                 throw new IOException("Unable to rename " + attributeFile.getAbsolutePath() + " to " + backupFile.getAbsolutePath() + " in order to back up manageable attribute save file");
             }
         }
+
+        // rename the temp file the the configuration file
         if (!tempFile.renameTo(attributeFile)) {
             throw new IOException("EXTREMELY CRITICAL!  Unable to move manageable attributes working file to proper file name!  Configuration will revert to defaults unless this is manually corrected!  (could not rename " + tempFile.getAbsolutePath() + " to " + attributeFile.getAbsolutePath() + ")");
         }
     }
 
     //PersistentConfigurationList
-    public boolean isKernelFullyStarted() {
-         return kernelFullyStarted;
-     }
-
-     public void setKernelFullyStarted(boolean kernelFullyStarted) {
-         this.kernelFullyStarted = kernelFullyStarted;
-     }
+    public synchronized boolean isKernelFullyStarted() {
+        return kernelFullyStarted;
+    }
+
+    public synchronized void setKernelFullyStarted(boolean kernelFullyStarted) {
+        this.kernelFullyStarted = kernelFullyStarted;
+    }
 
-    public List restore() throws IOException {
+    public synchronized List restore() throws IOException {
         List configs = new ArrayList();
-        for (Iterator iterator = configurations.entrySet().iterator(); iterator.hasNext();) {
+        for (Iterator iterator = serverOverride.getConfigurations().entrySet().iterator(); iterator.hasNext();) {
             Map.Entry entry = (Map.Entry) iterator.next();
-            ConfigInfo configInfo = (ConfigInfo) entry.getValue();
-            if (configInfo.isLoad()) {
+            ConfigurationOverride configurationOverride = (ConfigurationOverride) entry.getValue();
+            if (configurationOverride.isLoad()) {
                 String configName = (String) entry.getKey();
                 try {
                     URI configID = new URI(configName);
@@ -374,40 +308,34 @@
         return configs;
     }
 
-    public synchronized void addConfiguration(String configName) {
-        ConfigInfo configInfo = (ConfigInfo) configurations.get(configName);
-        if (configInfo == null) {
-            configInfo = new ConfigInfo(true);
-            configurations.put(configName, configInfo);
-        } else {
-            configInfo.setLoad(true);
-        }
+    public synchronized void addConfiguration(String configurationName) {
+        ConfigurationOverride config = serverOverride.getConfiguration(configurationName, true);
+        config.setLoad(true);
     }
 
     public synchronized void removeConfiguration(String configName) {
-        ConfigInfo configInfo = (ConfigInfo) configurations.get(configName);
-        if (configInfo == null) {
+        ConfigurationOverride configuration = serverOverride.getConfiguration(configName);
+        if (configuration == null) {
             log.error("Trying to stop unknown configuration: " + configName);
         } else {
-            Map gbeans = configInfo.getGBeans();
-            if (gbeans.isEmpty()) {
-                configurations.remove(configName);
+            if (configuration.getGBeans().isEmpty()) {
+                serverOverride.removeConfiguration(configName);
             } else {
-                configInfo.setLoad(false);
+                configuration.setLoad(false);
             }
         }
     }
 
     //GBeanLifeCycle
-    public void doStart() throws Exception {
+    public synchronized void doStart() throws Exception {
         load();
         if (!readOnly) {
             timer = new Timer();
         }
-        log.info("Started LocalAttributeManager with data on " + configurations.size() + " configurations");
+        log.info("Started LocalAttributeManager with data on " + serverOverride.getConfigurations().size() + " configurations");
     }
 
-    public void doStop() throws Exception {
+    public synchronized void doStop() throws Exception {
         boolean doSave = false;
         synchronized (this) {
             if (timer != null) {
@@ -421,11 +349,11 @@
         if (doSave) {
             save();
         }
-        log.info("Stopped LocalAttributeManager with data on " + configurations.size() + " configurations");
-        configurations.clear();
+        log.info("Stopped LocalAttributeManager with data on " + serverOverride.getConfigurations().size() + " configurations");
+        serverOverride = new ServerOverride();
     }
 
-    public void doFail() {
+    public synchronized void doFail() {
         synchronized (this) {
             if (timer != null) {
                 timer.cancel();
@@ -434,10 +362,10 @@
                 }
             }
         }
-        configurations.clear();
+        serverOverride = new ServerOverride();
     }
 
-    private void ensureParentDirectory() throws IOException {
+    private synchronized void ensureParentDirectory() throws IOException {
         if (attributeFile == null) {
             attributeFile = serverInfo.resolve(configFile);
             tempFile = new File(attributeFile.getAbsolutePath() + TEMP_EXTENSION);
@@ -470,72 +398,6 @@
             }
         };
         timer.schedule(currentTask, SAVE_BUFFER_MS);
-    }
-
-    private static class ConfigInfo {
-        private boolean load;
-        private final Map gbeans = new HashMap();
-
-        public ConfigInfo(boolean load) {
-            this.load = load;
-        }
-
-        public boolean isLoad() {
-            return load;
-        }
-
-        public void setLoad(boolean load) {
-            this.load = load;
-        }
-
-        public GBeanAttrsInfo getGBean(String gbeanName) {
-            return (GBeanAttrsInfo) gbeans.get(gbeanName);
-        }
-
-        public void addGBean(String gbeanName, GBeanAttrsInfo gbean) {
-            gbeans.put(gbeanName, gbean);
-        }
-
-        public Map getGBeans() {
-            return gbeans;
-        }
-
-        public GBeanAttrsInfo getGBean(ObjectName gbeanName) {
-            return (GBeanAttrsInfo) gbeans.get(gbeanName);
-        }
-
-        public void addGBean(ObjectName gbeanName, GBeanAttrsInfo gbean) {
-            gbeans.put(gbeanName, gbean);
-        }
-    }
-
-    private static class GBeanAttrsInfo {
-        private boolean load;
-        private final Map attributes = new HashMap();
-
-        public GBeanAttrsInfo(boolean load) {
-            this.load = load;
-        }
-
-        public boolean isLoad() {
-            return load;
-        }
-
-        public void setLoad(boolean load) {
-            this.load = load;
-        }
-
-        public Map getAttributes() {
-            return attributes;
-        }
-
-        public String getAttribute(String attributeName) {
-            return (String) attributes.get(attributeName);
-        }
-
-        public void setAttribute(String attributeName, String attributeValue) {
-            attributes.put(attributeName, attributeValue);
-        }
     }
 
     public static final GBeanInfo GBEAN_INFO;

Added: geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ServerOverride.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ServerOverride.java?rev=350073&view=auto
==============================================================================
--- geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ServerOverride.java (added)
+++ geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ServerOverride.java Wed Nov 30 15:25:09 2005
@@ -0,0 +1,83 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ *  Licensed 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.geronimo.system.configuration;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import javax.management.MalformedObjectNameException;
+import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @version $Rev$ $Date$
+ */
+class ServerOverride {
+    private final Map configurations = new LinkedHashMap();
+
+    public ServerOverride() {
+    }
+
+    public ServerOverride(Element element) throws MalformedObjectNameException {
+        NodeList configs = element.getElementsByTagName("configuration");
+        for (int i = 0; i < configs.getLength(); i++) {
+            Element configurationElement = (Element) configs.item(i);
+            ConfigurationOverride configuration = new ConfigurationOverride(configurationElement);
+            addConfiguration(configuration);
+        }
+    }
+
+    public ConfigurationOverride getConfiguration(String configurationName) {
+        return getConfiguration(configurationName, false);
+    }
+
+    public ConfigurationOverride getConfiguration(String configurationName, boolean create) {
+        ConfigurationOverride configuration = (ConfigurationOverride) configurations.get(configurationName);
+        if (create && configuration == null) {
+            configuration = new ConfigurationOverride(configurationName, true);
+            configurations.put(configurationName, configuration);
+        }
+        return configuration;
+    }
+
+    public void addConfiguration(ConfigurationOverride configuration) {
+        configurations.put(configuration.getName(), configuration);
+    }
+
+    public void removeConfiguration(String configurationName) {
+        configurations.remove(configurationName);
+    }
+
+    public Map getConfigurations() {
+        return configurations;
+    }
+
+    public void writeXml(PrintWriter out) {
+        out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+        out.println();
+        out.println("<attributes xmlns=\"http://geronimo.apache.org/xml/ns/attributes\">");
+        for (Iterator it = configurations.entrySet().iterator(); it.hasNext();) {
+            Map.Entry entry = (Map.Entry) it.next();
+            ConfigurationOverride configurationOverride = (ConfigurationOverride) entry.getValue();
+            configurationOverride.writeXml(out);
+        }
+        out.println("</attributes>");
+        out.close();
+    }
+}

Propchange: geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ServerOverride.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/trunk/modules/system/src/java/org/apache/geronimo/system/configuration/ServerOverride.java
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Id"

Added: geronimo/trunk/modules/system/src/test/org/apache/geronimo/system/configuration/ServerOverrideTest.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/system/src/test/org/apache/geronimo/system/configuration/ServerOverrideTest.java?rev=350073&view=auto
==============================================================================
--- geronimo/trunk/modules/system/src/test/org/apache/geronimo/system/configuration/ServerOverrideTest.java (added)
+++ geronimo/trunk/modules/system/src/test/org/apache/geronimo/system/configuration/ServerOverrideTest.java Wed Nov 30 15:25:09 2005
@@ -0,0 +1,208 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ *  Licensed 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.geronimo.system.configuration;
+
+import junit.framework.TestCase;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
+import java.util.Map;
+import java.util.Iterator;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ServerOverrideTest extends TestCase {
+    public void testBasics() throws Exception {
+        GBeanOverride pizza = new GBeanOverride("Pizza", true);
+        assertTrue(pizza.isLoad());
+
+        pizza.setLoad(false);
+        assertFalse(pizza.isLoad());
+
+        pizza.setAttribute("cheese", "mozzarella");
+        assertEquals("mozzarella", pizza.getAttribute("cheese"));
+
+        ConfigurationOverride dinnerMenu = new ConfigurationOverride("Dinner Menu", true);
+        assertTrue(dinnerMenu.isLoad());
+
+        dinnerMenu.setLoad(false);
+        assertFalse(dinnerMenu.isLoad());
+
+        dinnerMenu.addGBean(pizza);
+        assertSame(pizza, dinnerMenu.getGBean("Pizza"));
+
+        ServerOverride restaurant = new ServerOverride();
+        restaurant.addConfiguration(dinnerMenu);
+        assertSame(dinnerMenu, restaurant.getConfiguration("Dinner Menu"));
+    }
+
+    public void testGBeanXml() throws Exception {
+        GBeanOverride pizza = new GBeanOverride("Pizza", true);
+        assertCopyIdentical(pizza);
+
+        pizza.setLoad(false);
+        assertCopyIdentical(pizza);
+
+        pizza.setAttribute("cheese", "mozzarella");
+        assertCopyIdentical(pizza);
+
+        pizza.setAttribute("size", "x-large");
+        assertCopyIdentical(pizza);
+    }
+
+    public void testConfigurationXml() throws Exception {
+        ConfigurationOverride dinnerMenu = new ConfigurationOverride("Dinner Menu", true);
+        assertCopyIdentical(dinnerMenu);
+
+        dinnerMenu.setLoad(false);
+        assertCopyIdentical(dinnerMenu);
+
+        GBeanOverride pizza = new GBeanOverride("Pizza", false);
+        pizza.setAttribute("cheese", "mozzarella");
+        pizza.setAttribute("size", "x-large");
+        dinnerMenu.addGBean(pizza);
+        assertCopyIdentical(dinnerMenu);
+
+        GBeanOverride garlicCheeseBread = new GBeanOverride("Garlic Cheese Bread", true);
+        dinnerMenu.addGBean(garlicCheeseBread);
+        assertCopyIdentical(dinnerMenu);
+    }
+
+    public void testServerXml() throws Exception {
+        ServerOverride restaurant = new ServerOverride();
+        assertCopyIdentical(restaurant);
+
+        ConfigurationOverride dinnerMenu = new ConfigurationOverride("Dinner Menu", false);
+        GBeanOverride pizza = new GBeanOverride("Pizza", false);
+        pizza.setAttribute("cheese", "mozzarella");
+        pizza.setAttribute("size", "x-large");
+        dinnerMenu.addGBean(pizza);
+        GBeanOverride garlicCheeseBread = new GBeanOverride("Garlic Cheese Bread", true);
+        dinnerMenu.addGBean(garlicCheeseBread);
+        assertCopyIdentical(restaurant);
+
+        ConfigurationOverride drinkMenu = new ConfigurationOverride("Drink Menu", false);
+        GBeanOverride beer = new GBeanOverride("Beer", true);
+        drinkMenu.addGBean(beer);
+        GBeanOverride wine = new GBeanOverride("Wine", true);
+        drinkMenu.addGBean(wine);
+        assertCopyIdentical(restaurant);
+    }
+
+    private void assertCopyIdentical(ServerOverride server) throws Exception {
+        ServerOverride copy = copy(server);
+        assertIdentical(server, copy);
+    }
+
+    private void assertCopyIdentical(ConfigurationOverride configuration) throws Exception {
+        ConfigurationOverride copy = copy(configuration);
+        assertIdentical(configuration, copy);
+    }
+
+    private void assertCopyIdentical(GBeanOverride gbean) throws Exception {
+        GBeanOverride copy = copy(gbean);
+        assertIdentical(gbean, copy);
+    }
+
+    private void assertIdentical(ServerOverride expected, ServerOverride actual) {
+        assertNotNull(expected);
+        assertNotNull(actual);
+        assertNotSame(expected, actual);
+
+        Map expectedGBeans = expected.getConfigurations();
+        Map actualGBeans = actual.getConfigurations();
+        assertEquals(expectedGBeans.size(), actualGBeans.size());
+
+        for (Iterator iterator = expectedGBeans.entrySet().iterator(); iterator.hasNext();) {
+            Map.Entry entry = (Map.Entry) iterator.next();
+            Object name = entry.getKey();
+            ConfigurationOverride expectedConfiguration = (ConfigurationOverride) entry.getValue();
+            ConfigurationOverride actualConfiguration = (ConfigurationOverride) actualGBeans.get(name);
+            assertIdentical(expectedConfiguration, actualConfiguration);
+        }
+    }
+
+    private void assertIdentical(ConfigurationOverride expected, ConfigurationOverride actual) {
+        assertNotNull(expected);
+        assertNotNull(actual);
+        assertNotSame(expected, actual);
+        assertEquals(expected.getName(), actual.getName());
+        assertEquals(expected.isLoad(), actual.isLoad());
+
+        Map expectedGBeans = expected.getGBeans();
+        Map actualGBeans = actual.getGBeans();
+        assertEquals(expectedGBeans.size(), actualGBeans.size());
+
+        for (Iterator iterator = expectedGBeans.entrySet().iterator(); iterator.hasNext();) {
+            Map.Entry entry = (Map.Entry) iterator.next();
+            Object name = entry.getKey();
+            GBeanOverride expectedGBean = (GBeanOverride) entry.getValue();
+            GBeanOverride actualGBean = (GBeanOverride) actualGBeans.get(name);
+            assertIdentical(expectedGBean, actualGBean);
+        }
+    }
+
+    private void assertIdentical(GBeanOverride expected, GBeanOverride actual) {
+        assertNotNull(expected);
+        assertNotNull(actual);
+        assertNotSame(expected, actual);
+        assertEquals(expected.getName(), actual.getName());
+        assertEquals(expected.isLoad(), actual.isLoad());
+        assertEquals(expected.getAttributes(), actual.getAttributes());
+    }
+
+    private ServerOverride copy(ServerOverride server) throws Exception {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        server.writeXml(new PrintWriter(out, true));
+        System.out.println(new String(out.toByteArray()));
+        ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+        Element element = parseXml(in);
+        ServerOverride copy = new ServerOverride(element);
+        return copy;
+    }
+
+    private ConfigurationOverride copy(ConfigurationOverride configuration) throws Exception {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        configuration.writeXml(new PrintWriter(out, true));
+        System.out.println(new String(out.toByteArray()));
+        ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+        Element element = parseXml(in);
+        ConfigurationOverride copy = new ConfigurationOverride(element);
+        return copy;
+    }
+
+    private GBeanOverride copy(GBeanOverride gbean) throws Exception {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        gbean.writeXml(new PrintWriter(out, true));
+        ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+        Element element = parseXml(in);
+        GBeanOverride copy = new GBeanOverride(element);
+        return copy;
+    }
+
+    private Element parseXml(InputStream in) throws Exception {
+        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
+        Document doc = documentBuilderFactory.newDocumentBuilder().parse(in);
+        return doc.getDocumentElement();
+    }
+}

Propchange: geronimo/trunk/modules/system/src/test/org/apache/geronimo/system/configuration/ServerOverrideTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: geronimo/trunk/modules/system/src/test/org/apache/geronimo/system/configuration/ServerOverrideTest.java
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Id"