[hornetq-commits] JBoss hornetq SVN: r8868 - in trunk: src/main/org/hornetq/core/config/impl and 5 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Wed Feb 10 09:15:25 EST 2010


Author: clebert.suconic at jboss.com
Date: 2010-02-10 09:15:24 -0500 (Wed, 10 Feb 2010)
New Revision: 8868

Added:
   trunk/src/main/org/hornetq/core/deployers/impl/FileConfigurationParser.java
Modified:
   trunk/src/main/org/hornetq/core/config/Configuration.java
   trunk/src/main/org/hornetq/core/config/impl/ConfigurationImpl.java
   trunk/src/main/org/hornetq/core/config/impl/FileConfiguration.java
   trunk/src/main/org/hornetq/core/deployers/impl/AddressSettingsDeployer.java
   trunk/src/main/org/hornetq/core/deployers/impl/QueueDeployer.java
   trunk/src/main/org/hornetq/core/deployers/impl/SecurityDeployer.java
   trunk/src/main/org/hornetq/core/server/impl/HornetQServerImpl.java
   trunk/src/main/org/hornetq/core/settings/impl/AddressSettings.java
   trunk/tests/config/ConfigurationTest-full-config.xml
   trunk/tests/src/org/hornetq/tests/unit/core/config/impl/FileConfigurationTest.java
Log:
Improvements on configuration and parsing for better integration with AS

Modified: trunk/src/main/org/hornetq/core/config/Configuration.java
===================================================================
--- trunk/src/main/org/hornetq/core/config/Configuration.java	2010-02-08 10:28:19 UTC (rev 8867)
+++ trunk/src/main/org/hornetq/core/config/Configuration.java	2010-02-10 14:15:24 UTC (rev 8868)
@@ -21,7 +21,7 @@
 import org.hornetq.api.core.Interceptor;
 import org.hornetq.api.core.SimpleString;
 import org.hornetq.api.core.TransportConfiguration;
-import org.hornetq.core.config.impl.ConfigurationImpl;
+import org.hornetq.core.security.Role;
 import org.hornetq.core.server.JournalType;
 import org.hornetq.core.server.cluster.BridgeConfiguration;
 import org.hornetq.core.server.cluster.BroadcastGroupConfiguration;
@@ -30,6 +30,7 @@
 import org.hornetq.core.server.cluster.DivertConfiguration;
 import org.hornetq.core.server.cluster.QueueConfiguration;
 import org.hornetq.core.server.group.impl.GroupingHandlerConfiguration;
+import org.hornetq.core.settings.impl.AddressSettings;
 import org.hornetq.spi.core.logging.LogDelegateFactory;
 
 /**
@@ -804,4 +805,27 @@
     */
    void setMessageExpiryThreadPriority(int messageExpiryThreadPriority);
 
+   /**
+    * 
+    * @return A list of AddressSettings per matching to be deployed to the address settings repository
+    */
+   Map<String, AddressSettings> getAddressesSettings();
+
+   /**
+    * @param A list of AddressSettings per matching to be deployed to the address settings repository
+    */
+   void setAddressesSettings(Map<String, AddressSettings> addressesSettings);
+
+   /**
+    * 
+    * @param roles a list of roles per matching
+    */
+   void setSecurityRoles(Map<String, Set<Role>> roles);
+
+   /**
+    * 
+    * @return a list of roles per matching
+    */
+   Map<String, Set<Role>> getSecurityRoles();
+
 }

Modified: trunk/src/main/org/hornetq/core/config/impl/ConfigurationImpl.java
===================================================================
--- trunk/src/main/org/hornetq/core/config/impl/ConfigurationImpl.java	2010-02-08 10:28:19 UTC (rev 8867)
+++ trunk/src/main/org/hornetq/core/config/impl/ConfigurationImpl.java	2010-02-10 14:15:24 UTC (rev 8868)
@@ -25,6 +25,7 @@
 import org.hornetq.api.core.TransportConfiguration;
 import org.hornetq.core.config.Configuration;
 import org.hornetq.core.logging.impl.JULLogDelegateFactory;
+import org.hornetq.core.security.Role;
 import org.hornetq.core.server.JournalType;
 import org.hornetq.core.server.cluster.BridgeConfiguration;
 import org.hornetq.core.server.cluster.BroadcastGroupConfiguration;
@@ -33,6 +34,7 @@
 import org.hornetq.core.server.cluster.DivertConfiguration;
 import org.hornetq.core.server.cluster.QueueConfiguration;
 import org.hornetq.core.server.group.impl.GroupingHandlerConfiguration;
+import org.hornetq.core.settings.impl.AddressSettings;
 
 /**
  * @author <a href="mailto:ataylor at redhat.com>Andy Taylor</a>
@@ -316,6 +318,10 @@
 
    protected GroupingHandlerConfiguration groupingHandlerConfiguration;
 
+   private Map<String, AddressSettings> addressesSettings = new HashMap<String, AddressSettings>();
+
+   private Map<String, Set<Role>> securitySettings = new HashMap<String, Set<Role>>();
+
    // Public -------------------------------------------------------------------------
 
    public boolean isClustered()
@@ -805,10 +811,10 @@
    {
       return messageCounterSamplePeriod;
    }
-   
-   public void setMessageCounterSamplePeriod(long period)
+
+   public void setMessageCounterSamplePeriod(final long period)
    {
-      this.messageCounterSamplePeriod = period;
+      messageCounterSamplePeriod = period;
    }
 
    public int getMessageCounterMaxDayHistory()
@@ -1277,4 +1283,36 @@
       return true;
    }
 
+   /* (non-Javadoc)
+    * @see org.hornetq.core.config.Configuration#getAddressesSettings()
+    */
+   public Map<String, AddressSettings> getAddressesSettings()
+   {
+      return addressesSettings;
+   }
+
+   /* (non-Javadoc)
+    * @see org.hornetq.core.config.Configuration#setAddressesSettings(java.util.Map)
+    */
+   public void setAddressesSettings(final Map<String, AddressSettings> addressesSettings)
+   {
+      this.addressesSettings = addressesSettings;
+   }
+
+   /* (non-Javadoc)
+    * @see org.hornetq.core.config.Configuration#getSecurityRoles()
+    */
+   public Map<String, Set<Role>> getSecurityRoles()
+   {
+      return securitySettings;
+   }
+
+   /* (non-Javadoc)
+    * @see org.hornetq.core.config.Configuration#setSecuritySettings(java.util.Map)
+    */
+   public void setSecurityRoles(final Map<String, Set<Role>> securitySettings)
+   {
+      this.securitySettings = securitySettings;
+   }
+
 }

Modified: trunk/src/main/org/hornetq/core/config/impl/FileConfiguration.java
===================================================================
--- trunk/src/main/org/hornetq/core/config/impl/FileConfiguration.java	2010-02-08 10:28:19 UTC (rev 8867)
+++ trunk/src/main/org/hornetq/core/config/impl/FileConfiguration.java	2010-02-10 14:15:24 UTC (rev 8868)
@@ -16,29 +16,11 @@
 import java.io.InputStreamReader;
 import java.io.Reader;
 import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
-import org.hornetq.api.core.Pair;
-import org.hornetq.api.core.SimpleString;
-import org.hornetq.api.core.TransportConfiguration;
-import org.hornetq.api.core.client.HornetQClient;
+import org.hornetq.core.deployers.impl.FileConfigurationParser;
 import org.hornetq.core.logging.Logger;
-import org.hornetq.core.server.JournalType;
-import org.hornetq.core.server.cluster.BridgeConfiguration;
-import org.hornetq.core.server.cluster.BroadcastGroupConfiguration;
-import org.hornetq.core.server.cluster.ClusterConnectionConfiguration;
-import org.hornetq.core.server.cluster.DiscoveryGroupConfiguration;
-import org.hornetq.core.server.cluster.DivertConfiguration;
-import org.hornetq.core.server.group.impl.GroupingHandlerConfiguration;
-import org.hornetq.utils.XMLConfigurationUtil;
 import org.hornetq.utils.XMLUtil;
 import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
 
 /**
  * ConfigurationImpl
@@ -57,8 +39,6 @@
 
    private static final String DEFAULT_CONFIGURATION_URL = "hornetq-configuration.xml";
 
-   private static final String CONFIGURATION_SCHEMA_URL = "schema/hornetq-configuration.xsd";
-
    // For a bridge confirmations must be activated or send acknowledgements won't return
 
    public static final int DEFAULT_CONFIRMATION_WINDOW_SIZE = 1024 * 1024;
@@ -87,359 +67,13 @@
       String xml = org.hornetq.utils.XMLUtil.readerToString(reader);
       xml = XMLUtil.replaceSystemProps(xml);
       Element e = org.hornetq.utils.XMLUtil.stringToElement(xml);
-      org.hornetq.utils.XMLUtil.validate(e, FileConfiguration.CONFIGURATION_SCHEMA_URL);
+      
+      FileConfigurationParser parser = new FileConfigurationParser();
 
-      clustered = XMLConfigurationUtil.getBoolean(e, "clustered", clustered);
+      parser.parseMainConfig(e, this);
 
-      backup = XMLConfigurationUtil.getBoolean(e, "backup", backup);
-
-      sharedStore = XMLConfigurationUtil.getBoolean(e, "shared-store", sharedStore);
-
-      // Defaults to true when using FileConfiguration
-      fileDeploymentEnabled = XMLConfigurationUtil.getBoolean(e, "file-deployment-enabled", true);
-
-      persistenceEnabled = XMLConfigurationUtil.getBoolean(e, "persistence-enabled", persistenceEnabled);
-
-      persistDeliveryCountBeforeDelivery = XMLConfigurationUtil.getBoolean(e,
-                                                                           "persist-delivery-count-before-delivery",
-                                                                           persistDeliveryCountBeforeDelivery);
-
-      // NOTE! All the defaults come from the super class
-
-      scheduledThreadPoolMaxSize = XMLConfigurationUtil.getInteger(e,
-                                                                   "scheduled-thread-pool-max-size",
-                                                                   scheduledThreadPoolMaxSize,
-                                                                   Validators.GT_ZERO);
-
-      threadPoolMaxSize = XMLConfigurationUtil.getInteger(e,
-                                                          "thread-pool-max-size",
-                                                          threadPoolMaxSize,
-                                                          Validators.MINUS_ONE_OR_GT_ZERO);
-
-      securityEnabled = XMLConfigurationUtil.getBoolean(e, "security-enabled", securityEnabled);
-
-      jmxManagementEnabled = XMLConfigurationUtil.getBoolean(e, "jmx-management-enabled", jmxManagementEnabled);
-
-      jmxDomain = XMLConfigurationUtil.getString(e, "jmx-domain", jmxDomain, Validators.NOT_NULL_OR_EMPTY);
-
-      securityInvalidationInterval = XMLConfigurationUtil.getLong(e,
-                                                                  "security-invalidation-interval",
-                                                                  securityInvalidationInterval,
-                                                                  Validators.GT_ZERO);
-
-      connectionTTLOverride = XMLConfigurationUtil.getLong(e,
-                                                           "connection-ttl-override",
-                                                           connectionTTLOverride,
-                                                           Validators.MINUS_ONE_OR_GT_ZERO);
-
-      asyncConnectionExecutionEnabled = XMLConfigurationUtil.getBoolean(e,
-                                                                        "async-connection-execution-enabled",
-                                                                        asyncConnectionExecutionEnabled);
-
-      transactionTimeout = XMLConfigurationUtil.getLong(e,
-                                                        "transaction-timeout",
-                                                        transactionTimeout,
-                                                        Validators.GT_ZERO);
-
-      transactionTimeoutScanPeriod = XMLConfigurationUtil.getLong(e,
-                                                                  "transaction-timeout-scan-period",
-                                                                  transactionTimeoutScanPeriod,
-                                                                  Validators.GT_ZERO);
-
-      messageExpiryScanPeriod = XMLConfigurationUtil.getLong(e,
-                                                             "message-expiry-scan-period",
-                                                             messageExpiryScanPeriod,
-                                                             Validators.GT_ZERO);
-
-      messageExpiryThreadPriority = XMLConfigurationUtil.getInteger(e,
-                                                                    "message-expiry-thread-priority",
-                                                                    messageExpiryThreadPriority,
-                                                                    Validators.THREAD_PRIORITY_RANGE);
-
-      idCacheSize = XMLConfigurationUtil.getInteger(e, "id-cache-size", idCacheSize, Validators.GT_ZERO);
-
-      persistIDCache = XMLConfigurationUtil.getBoolean(e, "persist-id-cache", persistIDCache);
-
-      managementAddress = new SimpleString(XMLConfigurationUtil.getString(e,
-                                                                          "management-address",
-                                                                          managementAddress.toString(),
-                                                                          Validators.NOT_NULL_OR_EMPTY));
-
-      managementNotificationAddress = new SimpleString(XMLConfigurationUtil.getString(e,
-                                                                                      "management-notification-address",
-                                                                                      managementNotificationAddress.toString(),
-                                                                                      Validators.NOT_NULL_OR_EMPTY));
-
-      clusterPassword = XMLConfigurationUtil.getString(e,
-                                                       "cluster-password",
-                                                       clusterPassword,
-                                                       Validators.NO_CHECK);
-
-      clusterUser = XMLConfigurationUtil.getString(e,
-                                                   "cluster-user",
-                                                   clusterUser,
-                                                   Validators.NO_CHECK);
-
-      logDelegateFactoryClassName = XMLConfigurationUtil.getString(e,
-                                                                   "log-delegate-factory-class-name",
-                                                                   logDelegateFactoryClassName,
-                                                                   Validators.NOT_NULL_OR_EMPTY);
-
-      NodeList interceptorNodes = e.getElementsByTagName("remoting-interceptors");
-
-      ArrayList<String> interceptorList = new ArrayList<String>();
-
-      if (interceptorNodes.getLength() > 0)
-      {
-         NodeList interceptors = interceptorNodes.item(0).getChildNodes();
-
-         for (int i = 0; i < interceptors.getLength(); i++)
-         {
-            if ("class-name".equalsIgnoreCase(interceptors.item(i).getNodeName()))
-            {
-               String clazz = interceptors.item(i).getTextContent();
-
-               interceptorList.add(clazz);
-            }
-         }
-      }
-
-      interceptorClassNames = interceptorList;
-
-      NodeList backups = e.getElementsByTagName("backup-connector-ref");
-
-      // There should be only one - this will be enforced by the DTD
-
-      if (backups.getLength() > 0)
-      {
-         Node backupNode = backups.item(0);
-
-         backupConnectorName = backupNode.getAttributes().getNamedItem("connector-name").getNodeValue();
-      }
-
-      NodeList connectorNodes = e.getElementsByTagName("connector");
-
-      for (int i = 0; i < connectorNodes.getLength(); i++)
-      {
-         Element connectorNode = (Element)connectorNodes.item(i);
-
-         TransportConfiguration connectorConfig = parseTransportConfiguration(connectorNode);
-
-         if (connectorConfig.getName() == null)
-         {
-            FileConfiguration.log.warn("Cannot deploy a connector with no name specified.");
-
-            continue;
-         }
-
-         if (connectorConfigs.containsKey(connectorConfig.getName()))
-         {
-            FileConfiguration.log.warn("There is already a connector with name " + connectorConfig.getName() +
-                                       " deployed. This one will not be deployed.");
-
-            continue;
-         }
-
-         connectorConfigs.put(connectorConfig.getName(), connectorConfig);
-      }
-
-      NodeList acceptorNodes = e.getElementsByTagName("acceptor");
-
-      for (int i = 0; i < acceptorNodes.getLength(); i++)
-      {
-         Element acceptorNode = (Element)acceptorNodes.item(i);
-
-         TransportConfiguration acceptorConfig = parseTransportConfiguration(acceptorNode);
-
-         acceptorConfigs.add(acceptorConfig);
-      }
-
-      NodeList bgNodes = e.getElementsByTagName("broadcast-group");
-
-      for (int i = 0; i < bgNodes.getLength(); i++)
-      {
-         Element bgNode = (Element)bgNodes.item(i);
-
-         parseBroadcastGroupConfiguration(bgNode);
-      }
-
-      NodeList dgNodes = e.getElementsByTagName("discovery-group");
-
-      for (int i = 0; i < dgNodes.getLength(); i++)
-      {
-         Element dgNode = (Element)dgNodes.item(i);
-
-         parseDiscoveryGroupConfiguration(dgNode);
-      }
-
-      NodeList brNodes = e.getElementsByTagName("bridge");
-
-      for (int i = 0; i < brNodes.getLength(); i++)
-      {
-         Element mfNode = (Element)brNodes.item(i);
-
-         parseBridgeConfiguration(mfNode);
-      }
-
-      NodeList gaNodes = e.getElementsByTagName("grouping-handler");
-
-      for (int i = 0; i < gaNodes.getLength(); i++)
-      {
-         Element gaNode = (Element)gaNodes.item(i);
-
-         parseGroupingHandlerConfiguration(gaNode);
-      }
-
-      NodeList ccNodes = e.getElementsByTagName("cluster-connection");
-
-      for (int i = 0; i < ccNodes.getLength(); i++)
-      {
-         Element ccNode = (Element)ccNodes.item(i);
-
-         parseClusterConnectionConfiguration(ccNode);
-      }
-
-      NodeList dvNodes = e.getElementsByTagName("divert");
-
-      for (int i = 0; i < dvNodes.getLength(); i++)
-      {
-         Element dvNode = (Element)dvNodes.item(i);
-
-         parseDivertConfiguration(dvNode);
-      }
-
-      // Persistence config
-
-      largeMessagesDirectory = XMLConfigurationUtil.getString(e,
-                                                              "large-messages-directory",
-                                                              largeMessagesDirectory,
-                                                              Validators.NOT_NULL_OR_EMPTY);
-
-      bindingsDirectory = XMLConfigurationUtil.getString(e,
-                                                         "bindings-directory",
-                                                         bindingsDirectory,
-                                                         Validators.NOT_NULL_OR_EMPTY);
-
-      createBindingsDir = XMLConfigurationUtil.getBoolean(e, "create-bindings-dir", createBindingsDir);
-
-      journalDirectory = XMLConfigurationUtil.getString(e,
-                                                        "journal-directory",
-                                                        journalDirectory,
-                                                        Validators.NOT_NULL_OR_EMPTY);
-
-      pagingDirectory = XMLConfigurationUtil.getString(e,
-                                                       "paging-directory",
-                                                       pagingDirectory,
-                                                       Validators.NOT_NULL_OR_EMPTY);
-
-      createJournalDir = XMLConfigurationUtil.getBoolean(e, "create-journal-dir", createJournalDir);
-
-      String s = XMLConfigurationUtil.getString(e, "journal-type", journalType.toString(), Validators.JOURNAL_TYPE);
-
-      if (s.equals(JournalType.NIO.toString()))
-      {
-         journalType = JournalType.NIO;
-      }
-      else if (s.equals(JournalType.ASYNCIO.toString()))
-      {
-         journalType = JournalType.ASYNCIO;
-      }
-
-      journalSyncTransactional = XMLConfigurationUtil.getBoolean(e,
-                                                                 "journal-sync-transactional",
-                                                                 journalSyncTransactional);
-
-      journalSyncNonTransactional = XMLConfigurationUtil.getBoolean(e,
-                                                                    "journal-sync-non-transactional",
-                                                                    journalSyncNonTransactional);
-
-      journalFileSize = XMLConfigurationUtil.getInteger(e, "journal-file-size", journalFileSize, Validators.GT_ZERO);
-
-      int journalBufferTimeout = XMLConfigurationUtil.getInteger(e,
-                                                                 "journal-buffer-timeout",
-                                                                 journalType == JournalType.ASYNCIO ? ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO
-                                                                                                   : ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO,
-                                                                 Validators.GT_ZERO);
-
-      int journalBufferSize = XMLConfigurationUtil.getInteger(e,
-                                                              "journal-buffer-size",
-                                                              journalType == JournalType.ASYNCIO ? ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_SIZE_AIO
-                                                                                                : ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_SIZE_NIO,
-                                                              Validators.GT_ZERO);
-
-      int journalMaxIO = XMLConfigurationUtil.getInteger(e,
-                                                         "journal-max-io",
-                                                         journalType == JournalType.ASYNCIO ? ConfigurationImpl.DEFAULT_JOURNAL_MAX_IO_AIO
-                                                                                           : ConfigurationImpl.DEFAULT_JOURNAL_MAX_IO_NIO,
-                                                         Validators.GT_ZERO);
-
-      if (journalType == JournalType.ASYNCIO)
-      {
-         journalBufferTimeout_AIO = journalBufferTimeout;
-         journalBufferSize_AIO = journalBufferSize;
-         journalMaxIO_AIO = journalMaxIO;
-      }
-      else
-      {
-         journalBufferTimeout_NIO = journalBufferTimeout;
-         journalBufferSize_NIO = journalBufferSize;
-         journalMaxIO_NIO = journalMaxIO;
-      }
-
-      journalMinFiles = XMLConfigurationUtil.getInteger(e, "journal-min-files", journalMinFiles, Validators.GT_ZERO);
-
-      journalCompactMinFiles = XMLConfigurationUtil.getInteger(e,
-                                                               "journal-compact-min-files",
-                                                               journalCompactMinFiles,
-                                                               Validators.GE_ZERO);
-
-      journalCompactPercentage = XMLConfigurationUtil.getInteger(e,
-                                                                 "journal-compact-percentage",
-                                                                 journalCompactPercentage,
-                                                                 Validators.PERCENTAGE);
-
-      logJournalWriteRate = XMLConfigurationUtil.getBoolean(e,
-                                                            "log-journal-write-rate",
-                                                            ConfigurationImpl.DEFAULT_JOURNAL_LOG_WRITE_RATE);
-
-      journalPerfBlastPages = XMLConfigurationUtil.getInteger(e,
-                                                              "perf-blast-pages",
-                                                              ConfigurationImpl.DEFAULT_JOURNAL_PERF_BLAST_PAGES,
-                                                              Validators.MINUS_ONE_OR_GT_ZERO);
-
-      runSyncSpeedTest = XMLConfigurationUtil.getBoolean(e, "run-sync-speed-test", runSyncSpeedTest);
-
-      wildcardRoutingEnabled = XMLConfigurationUtil.getBoolean(e, "wild-card-routing-enabled", wildcardRoutingEnabled);
-
-      messageCounterEnabled = XMLConfigurationUtil.getBoolean(e, "message-counter-enabled", messageCounterEnabled);
-
-      messageCounterSamplePeriod = XMLConfigurationUtil.getLong(e,
-                                                                "message-counter-sample-period",
-                                                                messageCounterSamplePeriod,
-                                                                Validators.GT_ZERO);
-
-      messageCounterMaxDayHistory = XMLConfigurationUtil.getInteger(e,
-                                                                    "message-counter-max-day-history",
-                                                                    messageCounterMaxDayHistory,
-                                                                    Validators.GT_ZERO);
-
-      serverDumpInterval = XMLConfigurationUtil.getLong(e,
-                                                        "server-dump-interval",
-                                                        serverDumpInterval,
-                                                        Validators.MINUS_ONE_OR_GT_ZERO); // in
-      // milliseconds
-
-      memoryWarningThreshold = XMLConfigurationUtil.getInteger(e,
-                                                               "memory-warning-threshold",
-                                                               memoryWarningThreshold,
-                                                               Validators.PERCENTAGE);
-
-      memoryMeasureInterval = XMLConfigurationUtil.getLong(e,
-                                                           "memory-measure-interval",
-                                                           memoryMeasureInterval,
-                                                           Validators.MINUS_ONE_OR_GT_ZERO); // in
-
       started = true;
+
    }
 
    public synchronized void stop() throws Exception
@@ -458,398 +92,4 @@
    }
 
    // Private -------------------------------------------------------------------------
-
-   private TransportConfiguration parseTransportConfiguration(final Element e)
-   {
-      Node nameNode = e.getAttributes().getNamedItem("name");
-
-      String name = nameNode != null ? nameNode.getNodeValue() : null;
-
-      String clazz = XMLConfigurationUtil.getString(e, "factory-class", null, Validators.NOT_NULL_OR_EMPTY);
-
-      Map<String, Object> params = new HashMap<String, Object>();
-
-      NodeList paramsNodes = e.getElementsByTagName("param");
-
-      for (int i = 0; i < paramsNodes.getLength(); i++)
-      {
-         Node paramNode = paramsNodes.item(i);
-         NamedNodeMap attributes = paramNode.getAttributes();
-
-         Node nkey = attributes.getNamedItem("key");
-
-         String key = nkey.getTextContent();
-
-         Node nValue = attributes.getNamedItem("value");
-
-         params.put(key, nValue.getTextContent());
-      }
-
-      return new TransportConfiguration(clazz, params, name);
-   }
-
-   private void parseBroadcastGroupConfiguration(final Element e)
-   {
-      String name = e.getAttribute("name");
-
-      String localAddress = XMLConfigurationUtil.getString(e, "local-bind-address", null, Validators.NO_CHECK);
-
-      int localBindPort = XMLConfigurationUtil.getInteger(e, "local-bind-port", -1, Validators.MINUS_ONE_OR_GT_ZERO);
-
-      String groupAddress = XMLConfigurationUtil.getString(e, "group-address", null, Validators.NOT_NULL_OR_EMPTY);
-
-      int groupPort = XMLConfigurationUtil.getInteger(e, "group-port", -1, Validators.GT_ZERO);
-
-      long broadcastPeriod = XMLConfigurationUtil.getLong(e,
-                                                          "broadcast-period",
-                                                          ConfigurationImpl.DEFAULT_BROADCAST_PERIOD,
-                                                          Validators.GT_ZERO);
-
-      NodeList children = e.getChildNodes();
-
-      List<Pair<String, String>> connectorNames = new ArrayList<Pair<String, String>>();
-
-      for (int j = 0; j < children.getLength(); j++)
-      {
-         Node child = children.item(j);
-
-         if (child.getNodeName().equals("connector-ref"))
-         {
-            String connectorName = child.getAttributes().getNamedItem("connector-name").getNodeValue();
-
-            Node backupConnectorNode = child.getAttributes().getNamedItem("backup-connector-name");
-
-            String backupConnectorName = null;
-
-            if (backupConnectorNode != null)
-            {
-               backupConnectorName = backupConnectorNode.getNodeValue();
-            }
-
-            Pair<String, String> connectorInfo = new Pair<String, String>(connectorName, backupConnectorName);
-
-            connectorNames.add(connectorInfo);
-         }
-      }
-
-      BroadcastGroupConfiguration config = new BroadcastGroupConfiguration(name,
-                                                                           localAddress,
-                                                                           localBindPort,
-                                                                           groupAddress,
-                                                                           groupPort,
-                                                                           broadcastPeriod,
-                                                                           connectorNames);
-
-      broadcastGroupConfigurations.add(config);
-   }
-
-   private void parseDiscoveryGroupConfiguration(final Element e)
-   {
-      String name = e.getAttribute("name");
-
-      String groupAddress = XMLConfigurationUtil.getString(e, "group-address", null, Validators.NOT_NULL_OR_EMPTY);
-
-      int groupPort = XMLConfigurationUtil.getInteger(e, "group-port", -1, Validators.MINUS_ONE_OR_GT_ZERO);
-
-      long refreshTimeout = XMLConfigurationUtil.getLong(e,
-                                                         "refresh-timeout",
-                                                         ConfigurationImpl.DEFAULT_BROADCAST_REFRESH_TIMEOUT,
-                                                         Validators.GT_ZERO);
-
-      DiscoveryGroupConfiguration config = new DiscoveryGroupConfiguration(name,
-                                                                           groupAddress,
-                                                                           groupPort,
-                                                                           refreshTimeout);
-
-      if (discoveryGroupConfigurations.containsKey(name))
-      {
-         FileConfiguration.log.warn("There is already a discovery group with name " + name +
-                                    " deployed. This one will not be deployed.");
-
-         return;
-      }
-      else
-      {
-         discoveryGroupConfigurations.put(name, config);
-      }
-   }
-
-   private void parseClusterConnectionConfiguration(final Element e)
-   {
-      String name = e.getAttribute("name");
-
-      String address = XMLConfigurationUtil.getString(e, "address", null, Validators.NOT_NULL_OR_EMPTY);
-
-      boolean duplicateDetection = XMLConfigurationUtil.getBoolean(e,
-                                                                   "use-duplicate-detection",
-                                                                   ConfigurationImpl.DEFAULT_CLUSTER_DUPLICATE_DETECTION);
-
-      boolean forwardWhenNoConsumers = XMLConfigurationUtil.getBoolean(e,
-                                                                       "forward-when-no-consumers",
-                                                                       ConfigurationImpl.DEFAULT_CLUSTER_FORWARD_WHEN_NO_CONSUMERS);
-
-      int maxHops = XMLConfigurationUtil.getInteger(e,
-                                                    "max-hops",
-                                                    ConfigurationImpl.DEFAULT_CLUSTER_MAX_HOPS,
-                                                    Validators.GE_ZERO);
-
-      long retryInterval = XMLConfigurationUtil.getLong(e,
-                                                        "retry-interval",
-                                                        ConfigurationImpl.DEFAULT_CLUSTER_RETRY_INTERVAL,
-                                                        Validators.GT_ZERO);
-
-      int confirmationWindowSize = XMLConfigurationUtil.getInteger(e,
-                                                                   "confirmation-window-size",
-                                                                   FileConfiguration.DEFAULT_CONFIRMATION_WINDOW_SIZE,
-                                                                   Validators.GT_ZERO);
-
-      String discoveryGroupName = null;
-
-      List<Pair<String, String>> connectorPairs = new ArrayList<Pair<String, String>>();
-
-      NodeList children = e.getChildNodes();
-
-      for (int j = 0; j < children.getLength(); j++)
-      {
-         Node child = children.item(j);
-
-         if (child.getNodeName().equals("discovery-group-ref"))
-         {
-            discoveryGroupName = child.getAttributes().getNamedItem("discovery-group-name").getNodeValue();
-         }
-         else if (child.getNodeName().equals("connector-ref"))
-         {
-            String connectorName = child.getAttributes().getNamedItem("connector-name").getNodeValue();
-
-            Node backupNode = child.getAttributes().getNamedItem("backup-connector-name");
-
-            String backupConnectorName = null;
-
-            if (backupNode != null)
-            {
-               backupConnectorName = backupNode.getNodeValue();
-            }
-
-            Pair<String, String> connectorPair = new Pair<String, String>(connectorName, backupConnectorName);
-
-            connectorPairs.add(connectorPair);
-         }
-      }
-
-      ClusterConnectionConfiguration config;
-
-      if (discoveryGroupName == null)
-      {
-         config = new ClusterConnectionConfiguration(name,
-                                                     address,
-                                                     retryInterval,
-                                                     duplicateDetection,
-                                                     forwardWhenNoConsumers,
-                                                     maxHops,
-                                                     confirmationWindowSize,
-                                                     connectorPairs);
-      }
-      else
-      {
-         config = new ClusterConnectionConfiguration(name,
-                                                     address,
-                                                     retryInterval,
-                                                     duplicateDetection,
-                                                     forwardWhenNoConsumers,
-                                                     maxHops,
-                                                     confirmationWindowSize,
-                                                     discoveryGroupName);
-      }
-
-      clusterConfigurations.add(config);
-   }
-
-   private void parseGroupingHandlerConfiguration(final Element node)
-   {
-      String name = node.getAttribute("name");
-      String type = XMLConfigurationUtil.getString(node, "type", null, Validators.NOT_NULL_OR_EMPTY);
-      String address = XMLConfigurationUtil.getString(node, "address", null, Validators.NOT_NULL_OR_EMPTY);
-      Integer timeout = XMLConfigurationUtil.getInteger(node,
-                                                        "timeout",
-                                                        GroupingHandlerConfiguration.DEFAULT_TIMEOUT,
-                                                        Validators.GT_ZERO);
-      groupingHandlerConfiguration = new GroupingHandlerConfiguration(new SimpleString(name),
-                                                                      type.equals(GroupingHandlerConfiguration.TYPE.LOCAL.getType()) ? GroupingHandlerConfiguration.TYPE.LOCAL
-                                                                                                                                    : GroupingHandlerConfiguration.TYPE.REMOTE,
-                                                                      new SimpleString(address),
-                                                                      timeout);
-   }
-
-   private void parseBridgeConfiguration(final Element brNode)
-   {
-      String name = brNode.getAttribute("name");
-
-      String queueName = XMLConfigurationUtil.getString(brNode, "queue-name", null, Validators.NOT_NULL_OR_EMPTY);           
-
-      String forwardingAddress = XMLConfigurationUtil.getString(brNode,
-                                                                "forwarding-address",
-                                                                null,
-                                                                Validators.NOT_NULL_OR_EMPTY);
-
-      String transformerClassName = XMLConfigurationUtil.getString(brNode,
-                                                                   "transformer-class-name",
-                                                                   null,
-                                                                   Validators.NO_CHECK);
-
-      long retryInterval = XMLConfigurationUtil.getLong(brNode,
-                                                        "retry-interval",
-                                                        HornetQClient.DEFAULT_RETRY_INTERVAL,
-                                                        Validators.GT_ZERO);
-
-      // Default bridge conf
-      int confirmationWindowSize = XMLConfigurationUtil.getInteger(brNode,
-                                                                   "confirmation-window-size",
-                                                                   FileConfiguration.DEFAULT_CONFIRMATION_WINDOW_SIZE,
-                                                                   Validators.GT_ZERO);
-
-      double retryIntervalMultiplier = XMLConfigurationUtil.getDouble(brNode,
-                                                                      "retry-interval-multiplier",
-                                                                      HornetQClient.DEFAULT_RETRY_INTERVAL_MULTIPLIER,
-                                                                      Validators.GT_ZERO);
-
-      int reconnectAttempts = XMLConfigurationUtil.getInteger(brNode,
-                                                              "reconnect-attempts",
-                                                              ConfigurationImpl.DEFAULT_BRIDGE_RECONNECT_ATTEMPTS,
-                                                              Validators.MINUS_ONE_OR_GE_ZERO);
-
-      boolean failoverOnServerShutdown = XMLConfigurationUtil.getBoolean(brNode,
-                                                                         "failover-on-server-shutdown",
-                                                                         HornetQClient.DEFAULT_FAILOVER_ON_SERVER_SHUTDOWN);
-
-      boolean useDuplicateDetection = XMLConfigurationUtil.getBoolean(brNode,
-                                                                      "use-duplicate-detection",
-                                                                      ConfigurationImpl.DEFAULT_BRIDGE_DUPLICATE_DETECTION);
-
-      String user = XMLConfigurationUtil.getString(brNode, "user", ConfigurationImpl.DEFAULT_CLUSTER_USER, Validators.NO_CHECK);
-      
-      String password = XMLConfigurationUtil.getString(brNode, "password", ConfigurationImpl.DEFAULT_CLUSTER_PASSWORD, Validators.NO_CHECK);
-      
-      String filterString = null;
-
-      Pair<String, String> connectorPair = null;
-
-      String discoveryGroupName = null;
-
-      NodeList children = brNode.getChildNodes();
-
-      for (int j = 0; j < children.getLength(); j++)
-      {
-         Node child = children.item(j);
-
-         if (child.getNodeName().equals("filter"))
-         {
-            filterString = child.getAttributes().getNamedItem("string").getNodeValue();
-         }
-         else if (child.getNodeName().equals("discovery-group-ref"))
-         {
-            discoveryGroupName = child.getAttributes().getNamedItem("discovery-group-name").getNodeValue();
-         }
-         else if (child.getNodeName().equals("connector-ref"))
-         {
-            String connectorName = child.getAttributes().getNamedItem("connector-name").getNodeValue();
-
-            Node backupNode = child.getAttributes().getNamedItem("backup-connector-name");
-
-            String backupConnectorName = null;
-
-            if (backupNode != null)
-            {
-               backupConnectorName = backupNode.getNodeValue();
-            }
-
-            connectorPair = new Pair<String, String>(connectorName, backupConnectorName);
-         }
-      }
-
-      BridgeConfiguration config;
-
-      if (connectorPair != null)
-      {
-         config = new BridgeConfiguration(name,
-                                          queueName,
-                                          forwardingAddress,
-                                          filterString,
-                                          transformerClassName,
-                                          retryInterval,
-                                          retryIntervalMultiplier,
-                                          reconnectAttempts,
-                                          failoverOnServerShutdown,
-                                          useDuplicateDetection,
-                                          confirmationWindowSize,
-                                          HornetQClient.DEFAULT_CLIENT_FAILURE_CHECK_PERIOD,
-                                          connectorPair,
-                                          user,
-                                          password);
-      }
-      else
-      {
-         config = new BridgeConfiguration(name,
-                                          queueName,
-                                          forwardingAddress,
-                                          filterString,
-                                          transformerClassName,
-                                          retryInterval,
-                                          retryIntervalMultiplier,
-                                          reconnectAttempts,
-                                          failoverOnServerShutdown,
-                                          useDuplicateDetection,
-                                          confirmationWindowSize,
-                                          HornetQClient.DEFAULT_CLIENT_FAILURE_CHECK_PERIOD,
-                                          discoveryGroupName,
-                                          user,
-                                          password);
-      }
-
-      bridgeConfigurations.add(config);
-   }
-
-   private void parseDivertConfiguration(final Element e)
-   {
-      String name = e.getAttribute("name");
-
-      String routingName = XMLConfigurationUtil.getString(e, "routing-name", null, Validators.NO_CHECK);
-
-      String address = XMLConfigurationUtil.getString(e, "address", null, Validators.NOT_NULL_OR_EMPTY);
-
-      String forwardingAddress = XMLConfigurationUtil.getString(e,
-                                                                "forwarding-address",
-                                                                null,
-                                                                Validators.NOT_NULL_OR_EMPTY);
-
-      boolean exclusive = XMLConfigurationUtil.getBoolean(e, "exclusive", ConfigurationImpl.DEFAULT_DIVERT_EXCLUSIVE);
-
-      String transformerClassName = XMLConfigurationUtil.getString(e,
-                                                                   "transformer-class-name",
-                                                                   null,
-                                                                   Validators.NO_CHECK);
-
-      String filterString = null;
-
-      NodeList children = e.getChildNodes();
-
-      for (int j = 0; j < children.getLength(); j++)
-      {
-         Node child = children.item(j);
-
-         if (child.getNodeName().equals("filter"))
-         {
-            filterString = child.getAttributes().getNamedItem("string").getNodeValue();
-         }
-      }
-
-      DivertConfiguration config = new DivertConfiguration(name,
-                                                           routingName,
-                                                           address,
-                                                           forwardingAddress,
-                                                           exclusive,
-                                                           filterString,
-                                                           transformerClassName);
-
-      divertConfigurations.add(config);
-   }
 }

Modified: trunk/src/main/org/hornetq/core/deployers/impl/AddressSettingsDeployer.java
===================================================================
--- trunk/src/main/org/hornetq/core/deployers/impl/AddressSettingsDeployer.java	2010-02-08 10:28:19 UTC (rev 8867)
+++ trunk/src/main/org/hornetq/core/deployers/impl/AddressSettingsDeployer.java	2010-02-10 14:15:24 UTC (rev 8868)
@@ -13,15 +13,12 @@
 
 package org.hornetq.core.deployers.impl;
 
-import org.hornetq.api.core.SimpleString;
-import org.hornetq.core.config.impl.Validators;
+import org.hornetq.api.core.Pair;
 import org.hornetq.core.deployers.DeploymentManager;
 import org.hornetq.core.logging.Logger;
 import org.hornetq.core.settings.HierarchicalRepository;
-import org.hornetq.core.settings.impl.AddressFullMessagePolicy;
 import org.hornetq.core.settings.impl.AddressSettings;
 import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
 
 /**
  * A deployer for creating a set of queue settings and adding them to a repository
@@ -31,29 +28,9 @@
 {
    private static final Logger log = Logger.getLogger(AddressSettingsDeployer.class);
 
-   private static final String DEAD_LETTER_ADDRESS_NODE_NAME = "dead-letter-address";
-
-   private static final String EXPIRY_ADDRESS_NODE_NAME = "expiry-address";
-
-   private static final String REDELIVERY_DELAY_NODE_NAME = "redelivery-delay";
-
-   private static final String MAX_DELIVERY_ATTEMPTS = "max-delivery-attempts";
-
-   private static final String MAX_SIZE_BYTES_NODE_NAME = "max-size-bytes";
-
-   private static final String ADDRESS_FULL_MESSAGE_POLICY_NODE_NAME = "address-full-policy";
-
-   private static final String PAGE_SIZE_BYTES_NODE_NAME = "page-size-bytes";
-
-   private static final String MESSAGE_COUNTER_HISTORY_DAY_LIMIT_NODE_NAME = "message-counter-history-day-limit";
-
-   private static final String LVQ_NODE_NAME = "last-value-queue";
-
-   private static final String REDISTRIBUTION_DELAY_NODE_NAME = "redistribution-delay";
-
-   private static final String SEND_TO_DLA_ON_NO_ROUTE = "send-to-dla-on-no-route";
-
    private final HierarchicalRepository<AddressSettings> addressSettingsRepository;
+   
+   private final FileConfigurationParser parser = new FileConfigurationParser();
 
    public AddressSettingsDeployer(final DeploymentManager deploymentManager,
                                   final HierarchicalRepository<AddressSettings> addressSettingsRepository)
@@ -86,81 +63,10 @@
    @Override
    public void deploy(final Node node) throws Exception
    {
-      String match = node.getAttributes().getNamedItem(getKeyAttribute()).getNodeValue();
+      
+      Pair<String, AddressSettings> setting = parser.parseAddressSettings(node);
 
-      NodeList children = node.getChildNodes();
-
-      AddressSettings addressSettings = new AddressSettings();
-
-      for (int i = 0; i < children.getLength(); i++)
-      {
-         Node child = children.item(i);
-
-         if (AddressSettingsDeployer.DEAD_LETTER_ADDRESS_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
-         {
-            SimpleString queueName = new SimpleString(child.getTextContent());
-            addressSettings.setDeadLetterAddress(queueName);
-         }
-         else if (AddressSettingsDeployer.EXPIRY_ADDRESS_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
-         {
-            SimpleString queueName = new SimpleString(child.getTextContent());
-            addressSettings.setExpiryAddress(queueName);
-         }
-         else if (AddressSettingsDeployer.REDELIVERY_DELAY_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
-         {
-            addressSettings.setRedeliveryDelay(Long.valueOf(child.getTextContent()));
-         }
-         else if (AddressSettingsDeployer.MAX_SIZE_BYTES_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
-         {
-            addressSettings.setMaxSizeBytes(Integer.valueOf(child.getTextContent()));
-         }
-         else if (AddressSettingsDeployer.PAGE_SIZE_BYTES_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
-         {
-            addressSettings.setPageSizeBytes(Integer.valueOf(child.getTextContent()));
-         }
-         else if (AddressSettingsDeployer.MESSAGE_COUNTER_HISTORY_DAY_LIMIT_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
-         {
-            addressSettings.setMessageCounterHistoryDayLimit(Integer.valueOf(child.getTextContent()));
-         }
-         else if (AddressSettingsDeployer.ADDRESS_FULL_MESSAGE_POLICY_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
-         {
-            String value = child.getTextContent().trim();
-            Validators.ADDRESS_FULL_MESSAGE_POLICY_TYPE.validate(AddressSettingsDeployer.ADDRESS_FULL_MESSAGE_POLICY_NODE_NAME,
-                                                                 value);
-            AddressFullMessagePolicy policy = null;
-            if (value.equals(AddressFullMessagePolicy.BLOCK.toString()))
-            {
-               policy = AddressFullMessagePolicy.BLOCK;
-            }
-            else if (value.equals(AddressFullMessagePolicy.DROP.toString()))
-            {
-               policy = AddressFullMessagePolicy.DROP;
-            }
-            else if (value.equals(AddressFullMessagePolicy.PAGE.toString()))
-            {
-               policy = AddressFullMessagePolicy.PAGE;
-            }
-            addressSettings.setAddressFullMessagePolicy(policy);
-         }
-         else if (AddressSettingsDeployer.LVQ_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
-         {
-            addressSettings.setLastValueQueue(Boolean.valueOf(child.getTextContent().trim()));
-         }
-         else if (AddressSettingsDeployer.MAX_DELIVERY_ATTEMPTS.equalsIgnoreCase(child.getNodeName()))
-         {
-            addressSettings.setMaxDeliveryAttempts(Integer.valueOf(child.getTextContent().trim()));
-         }
-         else if (AddressSettingsDeployer.REDISTRIBUTION_DELAY_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
-         {
-            addressSettings.setRedistributionDelay(Long.valueOf(child.getTextContent().trim()));
-         }
-         else if (AddressSettingsDeployer.SEND_TO_DLA_ON_NO_ROUTE.equalsIgnoreCase(child.getNodeName()))
-         {
-            addressSettings.setSendToDLAOnNoRoute(Boolean.valueOf(child.getTextContent().trim()));
-         }
-      }
-
-      addressSettingsRepository.addMatch(match, addressSettings);
+      addressSettingsRepository.addMatch(setting.a, setting.b);
    }
 
    @Override

Added: trunk/src/main/org/hornetq/core/deployers/impl/FileConfigurationParser.java
===================================================================
--- trunk/src/main/org/hornetq/core/deployers/impl/FileConfigurationParser.java	                        (rev 0)
+++ trunk/src/main/org/hornetq/core/deployers/impl/FileConfigurationParser.java	2010-02-10 14:15:24 UTC (rev 8868)
@@ -0,0 +1,1198 @@
+/*
+ * Copyright 2010 Red Hat, Inc.
+ * Red Hat 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.hornetq.core.deployers.impl;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.hornetq.api.core.Pair;
+import org.hornetq.api.core.SimpleString;
+import org.hornetq.api.core.TransportConfiguration;
+import org.hornetq.api.core.client.HornetQClient;
+import org.hornetq.core.config.Configuration;
+import org.hornetq.core.config.impl.ConfigurationImpl;
+import org.hornetq.core.config.impl.FileConfiguration;
+import org.hornetq.core.config.impl.Validators;
+import org.hornetq.core.logging.Logger;
+import org.hornetq.core.security.Role;
+import org.hornetq.core.server.JournalType;
+import org.hornetq.core.server.cluster.BridgeConfiguration;
+import org.hornetq.core.server.cluster.BroadcastGroupConfiguration;
+import org.hornetq.core.server.cluster.ClusterConnectionConfiguration;
+import org.hornetq.core.server.cluster.DiscoveryGroupConfiguration;
+import org.hornetq.core.server.cluster.DivertConfiguration;
+import org.hornetq.core.server.cluster.QueueConfiguration;
+import org.hornetq.core.server.group.impl.GroupingHandlerConfiguration;
+import org.hornetq.core.settings.impl.AddressFullMessagePolicy;
+import org.hornetq.core.settings.impl.AddressSettings;
+import org.hornetq.utils.XMLConfigurationUtil;
+import org.hornetq.utils.XMLUtil;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * This class will parse the XML associated with the File Configuration XSD
+ *
+ * @author <mailto:clebert.suconic at jboss.org">Clebert Suconic</a>
+ *
+ *
+ */
+public class FileConfigurationParser
+{
+
+   // Constants -----------------------------------------------------
+
+   private static final Logger log = Logger.getLogger(FileConfigurationParser.class);
+
+   private static final String CONFIGURATION_SCHEMA_URL = "schema/hornetq-configuration.xsd";
+
+   // Security Parsing
+   public static final String SECURITY_ELEMENT_NAME = "security-setting";
+
+   private static final String PERMISSION_ELEMENT_NAME = "permission";
+
+   private static final String TYPE_ATTR_NAME = "type";
+
+   private static final String ROLES_ATTR_NAME = "roles";
+
+   private static final String CREATEDURABLEQUEUE_NAME = "createDurableQueue";
+
+   private static final String DELETEDURABLEQUEUE_NAME = "deleteDurableQueue";
+
+   private static final String CREATETEMPQUEUE_NAME = "createTempQueue";
+
+   private static final String DELETETEMPQUEUE_NAME = "deleteTempQueue";
+
+   private static final String SEND_NAME = "send";
+
+   private static final String CONSUME_NAME = "consume";
+
+   private static final String MANAGE_NAME = "manage";
+
+   // Address parsing
+
+   private static final String DEAD_LETTER_ADDRESS_NODE_NAME = "dead-letter-address";
+
+   private static final String EXPIRY_ADDRESS_NODE_NAME = "expiry-address";
+
+   private static final String REDELIVERY_DELAY_NODE_NAME = "redelivery-delay";
+
+   private static final String MAX_DELIVERY_ATTEMPTS = "max-delivery-attempts";
+
+   private static final String MAX_SIZE_BYTES_NODE_NAME = "max-size-bytes";
+
+   private static final String ADDRESS_FULL_MESSAGE_POLICY_NODE_NAME = "address-full-policy";
+
+   private static final String PAGE_SIZE_BYTES_NODE_NAME = "page-size-bytes";
+
+   private static final String MESSAGE_COUNTER_HISTORY_DAY_LIMIT_NODE_NAME = "message-counter-history-day-limit";
+
+   private static final String LVQ_NODE_NAME = "last-value-queue";
+
+   private static final String REDISTRIBUTION_DELAY_NODE_NAME = "redistribution-delay";
+
+   private static final String SEND_TO_DLA_ON_NO_ROUTE = "send-to-dla-on-no-route";
+
+   // Attributes ----------------------------------------------------
+
+   // Static --------------------------------------------------------
+
+   // Constructors --------------------------------------------------
+
+   // Public --------------------------------------------------------
+   
+   public Configuration parseMainConfig(final InputStream input) throws Exception
+   {
+   
+      Reader reader = new InputStreamReader(input);
+      String xml = org.hornetq.utils.XMLUtil.readerToString(reader);
+      xml = XMLUtil.replaceSystemProps(xml);
+      Element e = org.hornetq.utils.XMLUtil.stringToElement(xml);
+      
+      Configuration config = new ConfigurationImpl();
+      
+      parseMainConfig(e, config);
+      
+      return config;
+   }
+   
+   public void parseMainConfig(final Element e, final Configuration config) throws Exception
+   {
+      XMLUtil.validate(e, FileConfigurationParser.CONFIGURATION_SCHEMA_URL);
+
+      config.setClustered(XMLConfigurationUtil.getBoolean(e, "clustered", config.isClustered()));
+
+      config.setBackup(XMLConfigurationUtil.getBoolean(e, "backup", config.isBackup()));
+
+      config.setSharedStore(XMLConfigurationUtil.getBoolean(e, "shared-store", config.isSharedStore()));
+
+      // Defaults to true when using FileConfiguration
+      config.setFileDeploymentEnabled(XMLConfigurationUtil.getBoolean(e,
+                                                                      "file-deployment-enabled",
+                                                                      config instanceof FileConfiguration));
+
+      config.setPersistenceEnabled(XMLConfigurationUtil.getBoolean(e,
+                                                                   "persistence-enabled",
+                                                                   config.isPersistenceEnabled()));
+
+      config.setPersistDeliveryCountBeforeDelivery(XMLConfigurationUtil.getBoolean(e,
+                                                                                   "persist-delivery-count-before-delivery",
+                                                                                   config.isPersistDeliveryCountBeforeDelivery()));
+
+      config.setScheduledThreadPoolMaxSize(XMLConfigurationUtil.getInteger(e,
+                                                                           "scheduled-thread-pool-max-size",
+                                                                           config.getScheduledThreadPoolMaxSize(),
+                                                                           Validators.GT_ZERO));
+
+      config.setThreadPoolMaxSize(XMLConfigurationUtil.getInteger(e,
+                                                                  "thread-pool-max-size",
+                                                                  config.getThreadPoolMaxSize(),
+                                                                  Validators.MINUS_ONE_OR_GT_ZERO));
+
+      config.setSecurityEnabled(XMLConfigurationUtil.getBoolean(e, "security-enabled", config.isSecurityEnabled()));
+
+      config.setJMXManagementEnabled(XMLConfigurationUtil.getBoolean(e,
+                                                                     "jmx-management-enabled",
+                                                                     config.isJMXManagementEnabled()));
+
+      config.setJMXDomain(XMLConfigurationUtil.getString(e,
+                                                         "jmx-domain",
+                                                         config.getJMXDomain(),
+                                                         Validators.NOT_NULL_OR_EMPTY));
+
+      config.setSecurityInvalidationInterval(XMLConfigurationUtil.getLong(e,
+                                                                          "security-invalidation-interval",
+                                                                          config.getSecurityInvalidationInterval(),
+                                                                          Validators.GT_ZERO));
+
+      config.setConnectionTTLOverride(XMLConfigurationUtil.getLong(e,
+                                                                   "connection-ttl-override",
+                                                                   config.getConnectionTTLOverride(),
+                                                                   Validators.MINUS_ONE_OR_GT_ZERO));
+
+      config.setEnabledAsyncConnectionExecution(XMLConfigurationUtil.getBoolean(e,
+                                                                                "async-connection-execution-enabled",
+                                                                                config.isAsyncConnectionExecutionEnabled()));
+
+      config.setTransactionTimeout(XMLConfigurationUtil.getLong(e,
+                                                                "transaction-timeout",
+                                                                config.getTransactionTimeout(),
+                                                                Validators.GT_ZERO));
+
+      config.setTransactionTimeoutScanPeriod(XMLConfigurationUtil.getLong(e,
+                                                                          "transaction-timeout-scan-period",
+                                                                          config.getTransactionTimeoutScanPeriod(),
+                                                                          Validators.GT_ZERO));
+
+      config.setMessageExpiryScanPeriod(XMLConfigurationUtil.getLong(e,
+                                                                     "message-expiry-scan-period",
+                                                                     config.getMessageExpiryScanPeriod(),
+                                                                     Validators.GT_ZERO));
+
+      config.setMessageExpiryThreadPriority(XMLConfigurationUtil.getInteger(e,
+                                                                            "message-expiry-thread-priority",
+                                                                            config.getMessageExpiryThreadPriority(),
+                                                                            Validators.THREAD_PRIORITY_RANGE));
+
+      config.setIDCacheSize(XMLConfigurationUtil.getInteger(e,
+                                                            "id-cache-size",
+                                                            config.getIDCacheSize(),
+                                                            Validators.GT_ZERO));
+
+      config.setPersistIDCache(XMLConfigurationUtil.getBoolean(e, "persist-id-cache", config.isPersistIDCache()));
+
+      config.setManagementAddress(new SimpleString(XMLConfigurationUtil.getString(e,
+                                                                                  "management-address",
+                                                                                  config.getManagementAddress()
+                                                                                        .toString(),
+                                                                                  Validators.NOT_NULL_OR_EMPTY)));
+
+      config.setManagementNotificationAddress(new SimpleString(XMLConfigurationUtil.getString(e,
+                                                                                              "management-notification-address",
+                                                                                              config.getManagementNotificationAddress()
+                                                                                                    .toString(),
+                                                                                              Validators.NOT_NULL_OR_EMPTY)));
+
+      config.setClusterPassword(XMLConfigurationUtil.getString(e,
+                                                               "cluster-password",
+                                                               config.getClusterPassword(),
+                                                               Validators.NO_CHECK));
+
+      config.setClusterUser(XMLConfigurationUtil.getString(e,
+                                                           "cluster-user",
+                                                           config.getClusterUser(),
+                                                           Validators.NO_CHECK));
+
+      config.setLogDelegateFactoryClassName(XMLConfigurationUtil.getString(e,
+                                                                           "log-delegate-factory-class-name",
+                                                                           config.getLogDelegateFactoryClassName(),
+                                                                           Validators.NOT_NULL_OR_EMPTY));
+
+      NodeList interceptorNodes = e.getElementsByTagName("remoting-interceptors");
+
+      ArrayList<String> interceptorList = new ArrayList<String>();
+
+      if (interceptorNodes.getLength() > 0)
+      {
+         NodeList interceptors = interceptorNodes.item(0).getChildNodes();
+
+         for (int i = 0; i < interceptors.getLength(); i++)
+         {
+            if ("class-name".equalsIgnoreCase(interceptors.item(i).getNodeName()))
+            {
+               String clazz = interceptors.item(i).getTextContent();
+
+               interceptorList.add(clazz);
+            }
+         }
+      }
+
+      config.setInterceptorClassNames(interceptorList);
+
+      NodeList backups = e.getElementsByTagName("backup-connector-ref");
+
+      // There should be only one - this will be enforced by the DTD
+
+      if (backups.getLength() > 0)
+      {
+         Node backupNode = backups.item(0);
+
+         config.setBackupConnectorName(backupNode.getAttributes().getNamedItem("connector-name").getNodeValue());
+      }
+
+      NodeList connectorNodes = e.getElementsByTagName("connector");
+
+      for (int i = 0; i < connectorNodes.getLength(); i++)
+      {
+         Element connectorNode = (Element)connectorNodes.item(i);
+
+         TransportConfiguration connectorConfig = parseTransportConfiguration(connectorNode);
+
+         if (connectorConfig.getName() == null)
+         {
+            FileConfigurationParser.log.warn("Cannot deploy a connector with no name specified.");
+
+            continue;
+         }
+
+         if (config.getConnectorConfigurations().containsKey(connectorConfig.getName()))
+         {
+            FileConfigurationParser.log.warn("There is already a connector with name " + connectorConfig.getName() +
+                                             " deployed. This one will not be deployed.");
+
+            continue;
+         }
+
+         config.getConnectorConfigurations().put(connectorConfig.getName(), connectorConfig);
+      }
+
+      NodeList acceptorNodes = e.getElementsByTagName("acceptor");
+
+      for (int i = 0; i < acceptorNodes.getLength(); i++)
+      {
+         Element acceptorNode = (Element)acceptorNodes.item(i);
+
+         TransportConfiguration acceptorConfig = parseTransportConfiguration(acceptorNode);
+
+         config.getAcceptorConfigurations().add(acceptorConfig);
+      }
+
+      NodeList bgNodes = e.getElementsByTagName("broadcast-group");
+
+      for (int i = 0; i < bgNodes.getLength(); i++)
+      {
+         Element bgNode = (Element)bgNodes.item(i);
+
+         parseBroadcastGroupConfiguration(bgNode, config);
+      }
+
+      NodeList dgNodes = e.getElementsByTagName("discovery-group");
+
+      for (int i = 0; i < dgNodes.getLength(); i++)
+      {
+         Element dgNode = (Element)dgNodes.item(i);
+
+         parseDiscoveryGroupConfiguration(dgNode, config);
+      }
+
+      NodeList brNodes = e.getElementsByTagName("bridge");
+
+      for (int i = 0; i < brNodes.getLength(); i++)
+      {
+         Element mfNode = (Element)brNodes.item(i);
+
+         parseBridgeConfiguration(mfNode, config);
+      }
+
+      NodeList gaNodes = e.getElementsByTagName("grouping-handler");
+
+      for (int i = 0; i < gaNodes.getLength(); i++)
+      {
+         Element gaNode = (Element)gaNodes.item(i);
+
+         parseGroupingHandlerConfiguration(gaNode, config);
+      }
+
+      NodeList ccNodes = e.getElementsByTagName("cluster-connection");
+
+      for (int i = 0; i < ccNodes.getLength(); i++)
+      {
+         Element ccNode = (Element)ccNodes.item(i);
+
+         parseClusterConnectionConfiguration(ccNode, config);
+      }
+
+      NodeList dvNodes = e.getElementsByTagName("divert");
+
+      for (int i = 0; i < dvNodes.getLength(); i++)
+      {
+         Element dvNode = (Element)dvNodes.item(i);
+
+         parseDivertConfiguration(dvNode, config);
+      }
+
+      // Persistence config
+
+      config.setLargeMessagesDirectory(XMLConfigurationUtil.getString(e,
+                                                                      "large-messages-directory",
+                                                                      config.getLargeMessagesDirectory(),
+                                                                      Validators.NOT_NULL_OR_EMPTY));
+
+      config.setBindingsDirectory(XMLConfigurationUtil.getString(e,
+                                                                 "bindings-directory",
+                                                                 config.getBindingsDirectory(),
+                                                                 Validators.NOT_NULL_OR_EMPTY));
+
+      config.setCreateBindingsDir(XMLConfigurationUtil.getBoolean(e,
+                                                                  "create-bindings-dir",
+                                                                  config.isCreateBindingsDir()));
+
+      config.setJournalDirectory(XMLConfigurationUtil.getString(e,
+                                                                "journal-directory",
+                                                                config.getJournalDirectory(),
+                                                                Validators.NOT_NULL_OR_EMPTY));
+
+      config.setPagingDirectory(XMLConfigurationUtil.getString(e,
+                                                               "paging-directory",
+                                                               config.getPagingDirectory(),
+                                                               Validators.NOT_NULL_OR_EMPTY));
+
+      config.setCreateJournalDir(XMLConfigurationUtil.getBoolean(e, "create-journal-dir", config.isCreateJournalDir()));
+
+      String s = XMLConfigurationUtil.getString(e,
+                                                "journal-type",
+                                                config.getJournalType().toString(),
+                                                Validators.JOURNAL_TYPE);
+
+      if (s.equals(JournalType.NIO.toString()))
+      {
+         config.setJournalType(JournalType.NIO);
+      }
+      else if (s.equals(JournalType.ASYNCIO.toString()))
+      {
+         config.setJournalType(JournalType.ASYNCIO);
+      }
+
+      config.setJournalSyncTransactional(XMLConfigurationUtil.getBoolean(e,
+                                                                         "journal-sync-transactional",
+                                                                         config.isJournalSyncTransactional()));
+
+      config.setJournalSyncNonTransactional(XMLConfigurationUtil.getBoolean(e,
+                                                                            "journal-sync-non-transactional",
+                                                                            config.isJournalSyncNonTransactional()));
+
+      config.setJournalFileSize(XMLConfigurationUtil.getInteger(e,
+                                                                "journal-file-size",
+                                                                config.getJournalFileSize(),
+                                                                Validators.GT_ZERO));
+
+      int journalBufferTimeout = XMLConfigurationUtil.getInteger(e,
+                                                                 "journal-buffer-timeout",
+                                                                 config.getJournalType() == JournalType.ASYNCIO ? ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_TIMEOUT_AIO
+                                                                                                               : ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_TIMEOUT_NIO,
+                                                                 Validators.GT_ZERO);
+
+      int journalBufferSize = XMLConfigurationUtil.getInteger(e,
+                                                              "journal-buffer-size",
+                                                              config.getJournalType() == JournalType.ASYNCIO ? ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_SIZE_AIO
+                                                                                                            : ConfigurationImpl.DEFAULT_JOURNAL_BUFFER_SIZE_NIO,
+                                                              Validators.GT_ZERO);
+
+      int journalMaxIO = XMLConfigurationUtil.getInteger(e,
+                                                         "journal-max-io",
+                                                         config.getJournalType() == JournalType.ASYNCIO ? ConfigurationImpl.DEFAULT_JOURNAL_MAX_IO_AIO
+                                                                                                       : ConfigurationImpl.DEFAULT_JOURNAL_MAX_IO_NIO,
+                                                         Validators.GT_ZERO);
+
+      if (config.getJournalType() == JournalType.ASYNCIO)
+      {
+         config.setJournalBufferTimeout_AIO(journalBufferTimeout);
+         config.setJournalBufferSize_AIO(journalBufferSize);
+         config.setJournalMaxIO_AIO(journalMaxIO);
+      }
+      else
+      {
+         config.setJournalBufferTimeout_NIO(journalBufferTimeout);
+         config.setJournalBufferSize_NIO(journalBufferSize);
+         config.setJournalMaxIO_NIO(journalMaxIO);
+      }
+
+      config.setJournalMinFiles(XMLConfigurationUtil.getInteger(e,
+                                                                "journal-min-files",
+                                                                config.getJournalMinFiles(),
+                                                                Validators.GT_ZERO));
+
+      config.setJournalCompactMinFiles(XMLConfigurationUtil.getInteger(e,
+                                                                       "journal-compact-min-files",
+                                                                       config.getJournalCompactMinFiles(),
+                                                                       Validators.GE_ZERO));
+
+      config.setJournalCompactPercentage(XMLConfigurationUtil.getInteger(e,
+                                                                         "journal-compact-percentage",
+                                                                         config.getJournalCompactPercentage(),
+                                                                         Validators.PERCENTAGE));
+
+      config.setLogJournalWriteRate(XMLConfigurationUtil.getBoolean(e,
+                                                                    "log-journal-write-rate",
+                                                                    ConfigurationImpl.DEFAULT_JOURNAL_LOG_WRITE_RATE));
+
+      config.setJournalPerfBlastPages(XMLConfigurationUtil.getInteger(e,
+                                                                      "perf-blast-pages",
+                                                                      ConfigurationImpl.DEFAULT_JOURNAL_PERF_BLAST_PAGES,
+                                                                      Validators.MINUS_ONE_OR_GT_ZERO));
+
+      config.setRunSyncSpeedTest(XMLConfigurationUtil.getBoolean(e, "run-sync-speed-test", config.isRunSyncSpeedTest()));
+
+      config.setWildcardRoutingEnabled(XMLConfigurationUtil.getBoolean(e,
+                                                                       "wild-card-routing-enabled",
+                                                                       config.isWildcardRoutingEnabled()));
+
+      config.setMessageCounterEnabled(XMLConfigurationUtil.getBoolean(e,
+                                                                      "message-counter-enabled",
+                                                                      config.isMessageCounterEnabled()));
+
+      config.setMessageCounterSamplePeriod(XMLConfigurationUtil.getLong(e,
+                                                                        "message-counter-sample-period",
+                                                                        config.getMessageCounterSamplePeriod(),
+                                                                        Validators.GT_ZERO));
+
+      config.setMessageCounterMaxDayHistory(XMLConfigurationUtil.getInteger(e,
+                                                                            "message-counter-max-day-history",
+                                                                            config.getMessageCounterMaxDayHistory(),
+                                                                            Validators.GT_ZERO));
+
+      config.setServerDumpInterval(XMLConfigurationUtil.getLong(e,
+                                                                "server-dump-interval",
+                                                                config.getServerDumpInterval(),
+                                                                Validators.MINUS_ONE_OR_GT_ZERO)); // in
+      // milliseconds
+
+      config.setMemoryWarningThreshold(XMLConfigurationUtil.getInteger(e,
+                                                                       "memory-warning-threshold",
+                                                                       config.getMemoryWarningThreshold(),
+                                                                       Validators.PERCENTAGE));
+
+      config.setMemoryMeasureInterval(XMLConfigurationUtil.getLong(e,
+                                                                   "memory-measure-interval",
+                                                                   config.getMemoryMeasureInterval(),
+                                                                   Validators.MINUS_ONE_OR_GT_ZERO)); // in
+      
+      parseAddressSettings(e, config);
+      
+      parseQueues(e, config);
+      
+      parseSecurity(e, config);
+
+
+
+   }
+
+   /**
+    * @param e
+    * @param config
+    */
+   private void parseSecurity(final Element e, final Configuration config)
+   {
+      NodeList elements = e.getElementsByTagName("security-settings");
+      
+      if (elements.getLength() != 0)
+      {
+         Element node = (Element)elements.item(0);
+         NodeList list = node.getElementsByTagName("security-setting");
+         for (int i = 0 ; i < list.getLength(); i++)
+         {
+            Pair<String, Set<Role>> securityItem = parseSecurityRoles(list.item(i));
+            config.getSecurityRoles().put(securityItem.a, securityItem.b);
+         }
+      }
+   }
+
+   /**
+    * @param e
+    * @param config
+    */
+   private void parseQueues(final Element e, final Configuration config)
+   {
+      NodeList elements = e.getElementsByTagName("queues");
+      
+      if (elements.getLength() != 0)
+      {
+         Element node = (Element)elements.item(0);
+         NodeList list = node.getElementsByTagName("queue");
+         for (int i = 0 ; i < list.getLength(); i++)
+         {
+            QueueConfiguration queueConfig = parseQueueConfiguration(list.item(i));
+            config.getQueueConfigurations().add(queueConfig);
+         }
+      }
+   }
+
+   /**
+    * @param e
+    * @param config
+    */
+   private void parseAddressSettings(final Element e, final Configuration config)
+   {
+      NodeList elements = e.getElementsByTagName("address-settings");
+      
+      if (elements.getLength() != 0)
+      {
+         Element node = (Element)elements.item(0);
+         NodeList list = node.getElementsByTagName("address-setting");
+         for (int i = 0 ; i < list.getLength(); i++)
+         {
+            Pair<String, AddressSettings> addressSettings = parseAddressSettings(list.item(i));
+            config.getAddressesSettings().put(addressSettings.a, addressSettings.b);
+         }
+      }
+   }
+
+   /**
+    * @param node
+    * @return
+    */
+   public Pair<String, Set<Role>> parseSecurityRoles(final Node node)
+   {
+      String match = node.getAttributes().getNamedItem("match").getNodeValue();
+
+      HashSet<Role> securityRoles = new HashSet<Role>();
+
+      Pair<String, Set<Role>> securityMatch = new Pair<String, Set<Role>>(match, securityRoles);
+
+      ArrayList<String> send = new ArrayList<String>();
+      ArrayList<String> consume = new ArrayList<String>();
+      ArrayList<String> createDurableQueue = new ArrayList<String>();
+      ArrayList<String> deleteDurableQueue = new ArrayList<String>();
+      ArrayList<String> createTempQueue = new ArrayList<String>();
+      ArrayList<String> deleteTempQueue = new ArrayList<String>();
+      ArrayList<String> manageRoles = new ArrayList<String>();
+      ArrayList<String> allRoles = new ArrayList<String>();
+      NodeList children = node.getChildNodes();
+      for (int i = 0; i < children.getLength(); i++)
+      {
+         Node child = children.item(i);
+
+         if (FileConfigurationParser.PERMISSION_ELEMENT_NAME.equalsIgnoreCase(child.getNodeName()))
+         {
+            String type = child.getAttributes().getNamedItem(FileConfigurationParser.TYPE_ATTR_NAME).getNodeValue();
+            String roleString = child.getAttributes()
+                                     .getNamedItem(FileConfigurationParser.ROLES_ATTR_NAME)
+                                     .getNodeValue();
+            String[] roles = roleString.split(",");
+            for (String role : roles)
+            {
+               if (FileConfigurationParser.SEND_NAME.equals(type))
+               {
+                  send.add(role.trim());
+               }
+               else if (FileConfigurationParser.CONSUME_NAME.equals(type))
+               {
+                  consume.add(role.trim());
+               }
+               else if (FileConfigurationParser.CREATEDURABLEQUEUE_NAME.equals(type))
+               {
+                  createDurableQueue.add(role);
+               }
+               else if (FileConfigurationParser.DELETEDURABLEQUEUE_NAME.equals(type))
+               {
+                  deleteDurableQueue.add(role);
+               }
+               else if (FileConfigurationParser.CREATETEMPQUEUE_NAME.equals(type))
+               {
+                  createTempQueue.add(role);
+               }
+               else if (FileConfigurationParser.DELETETEMPQUEUE_NAME.equals(type))
+               {
+                  deleteTempQueue.add(role);
+               }
+               else if (FileConfigurationParser.MANAGE_NAME.equals(type))
+               {
+                  manageRoles.add(role);
+               }
+               if (!allRoles.contains(role.trim()))
+               {
+                  allRoles.add(role.trim());
+               }
+            }
+         }
+
+      }
+
+      for (String role : allRoles)
+      {
+         securityRoles.add(new Role(role,
+                                    send.contains(role),
+                                    consume.contains(role),
+                                    createDurableQueue.contains(role),
+                                    deleteDurableQueue.contains(role),
+                                    createTempQueue.contains(role),
+                                    deleteTempQueue.contains(role),
+                                    manageRoles.contains(role)));
+      }
+
+      return securityMatch;
+   }
+
+   /**
+    * @param node
+    * @return
+    */
+   public Pair<String, AddressSettings> parseAddressSettings(final Node node)
+   {
+      String match = node.getAttributes().getNamedItem("match").getNodeValue();
+
+      NodeList children = node.getChildNodes();
+
+      AddressSettings addressSettings = new AddressSettings();
+
+      Pair<String, AddressSettings> setting = new Pair<String, AddressSettings>(match, addressSettings);
+
+      for (int i = 0; i < children.getLength(); i++)
+      {
+         Node child = children.item(i);
+
+         if (FileConfigurationParser.DEAD_LETTER_ADDRESS_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
+         {
+            SimpleString queueName = new SimpleString(child.getTextContent());
+            addressSettings.setDeadLetterAddress(queueName);
+         }
+         else if (FileConfigurationParser.EXPIRY_ADDRESS_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
+         {
+            SimpleString queueName = new SimpleString(child.getTextContent());
+            addressSettings.setExpiryAddress(queueName);
+         }
+         else if (FileConfigurationParser.REDELIVERY_DELAY_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
+         {
+            addressSettings.setRedeliveryDelay(Long.valueOf(child.getTextContent()));
+         }
+         else if (FileConfigurationParser.MAX_SIZE_BYTES_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
+         {
+            addressSettings.setMaxSizeBytes(Integer.valueOf(child.getTextContent()));
+         }
+         else if (FileConfigurationParser.PAGE_SIZE_BYTES_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
+         {
+            addressSettings.setPageSizeBytes(Integer.valueOf(child.getTextContent()));
+         }
+         else if (FileConfigurationParser.MESSAGE_COUNTER_HISTORY_DAY_LIMIT_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
+         {
+            addressSettings.setMessageCounterHistoryDayLimit(Integer.valueOf(child.getTextContent()));
+         }
+         else if (FileConfigurationParser.ADDRESS_FULL_MESSAGE_POLICY_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
+         {
+            String value = child.getTextContent().trim();
+            Validators.ADDRESS_FULL_MESSAGE_POLICY_TYPE.validate(FileConfigurationParser.ADDRESS_FULL_MESSAGE_POLICY_NODE_NAME,
+                                                                 value);
+            AddressFullMessagePolicy policy = null;
+            if (value.equals(AddressFullMessagePolicy.BLOCK.toString()))
+            {
+               policy = AddressFullMessagePolicy.BLOCK;
+            }
+            else if (value.equals(AddressFullMessagePolicy.DROP.toString()))
+            {
+               policy = AddressFullMessagePolicy.DROP;
+            }
+            else if (value.equals(AddressFullMessagePolicy.PAGE.toString()))
+            {
+               policy = AddressFullMessagePolicy.PAGE;
+            }
+            addressSettings.setAddressFullMessagePolicy(policy);
+         }
+         else if (FileConfigurationParser.LVQ_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
+         {
+            addressSettings.setLastValueQueue(Boolean.valueOf(child.getTextContent().trim()));
+         }
+         else if (FileConfigurationParser.MAX_DELIVERY_ATTEMPTS.equalsIgnoreCase(child.getNodeName()))
+         {
+            addressSettings.setMaxDeliveryAttempts(Integer.valueOf(child.getTextContent().trim()));
+         }
+         else if (FileConfigurationParser.REDISTRIBUTION_DELAY_NODE_NAME.equalsIgnoreCase(child.getNodeName()))
+         {
+            addressSettings.setRedistributionDelay(Long.valueOf(child.getTextContent().trim()));
+         }
+         else if (FileConfigurationParser.SEND_TO_DLA_ON_NO_ROUTE.equalsIgnoreCase(child.getNodeName()))
+         {
+            addressSettings.setSendToDLAOnNoRoute(Boolean.valueOf(child.getTextContent().trim()));
+         }
+      }
+      return setting;
+   }
+
+   public QueueConfiguration parseQueueConfiguration(final Node node)
+   {
+      String name = node.getAttributes().getNamedItem("name").getNodeValue();
+      String address = null;
+      String filterString = null;
+      boolean durable = true;
+
+      NodeList children = node.getChildNodes();
+
+      for (int j = 0; j < children.getLength(); j++)
+      {
+         Node child = children.item(j);
+
+         if (child.getNodeName().equals("address"))
+         {
+            address = child.getTextContent().trim();
+         }
+         else if (child.getNodeName().equals("filter"))
+         {
+            filterString = child.getAttributes().getNamedItem("string").getNodeValue();
+         }
+         else if (child.getNodeName().equals("durable"))
+         {
+            durable = Boolean.parseBoolean(child.getTextContent().trim());
+         }
+      }
+
+      return new QueueConfiguration(address, name, filterString, durable);
+   }
+
+   // Package protected ---------------------------------------------
+
+   // Protected -----------------------------------------------------
+
+   // Private -------------------------------------------------------
+
+   private TransportConfiguration parseTransportConfiguration(final Element e)
+   {
+      Node nameNode = e.getAttributes().getNamedItem("name");
+
+      String name = nameNode != null ? nameNode.getNodeValue() : null;
+
+      String clazz = XMLConfigurationUtil.getString(e, "factory-class", null, Validators.NOT_NULL_OR_EMPTY);
+
+      Map<String, Object> params = new HashMap<String, Object>();
+
+      NodeList paramsNodes = e.getElementsByTagName("param");
+
+      for (int i = 0; i < paramsNodes.getLength(); i++)
+      {
+         Node paramNode = paramsNodes.item(i);
+         NamedNodeMap attributes = paramNode.getAttributes();
+
+         Node nkey = attributes.getNamedItem("key");
+
+         String key = nkey.getTextContent();
+
+         Node nValue = attributes.getNamedItem("value");
+
+         params.put(key, nValue.getTextContent());
+      }
+
+      return new TransportConfiguration(clazz, params, name);
+   }
+
+   private void parseBroadcastGroupConfiguration(final Element e, final Configuration mainConfig)
+   {
+      String name = e.getAttribute("name");
+
+      String localAddress = XMLConfigurationUtil.getString(e, "local-bind-address", null, Validators.NO_CHECK);
+
+      int localBindPort = XMLConfigurationUtil.getInteger(e, "local-bind-port", -1, Validators.MINUS_ONE_OR_GT_ZERO);
+
+      String groupAddress = XMLConfigurationUtil.getString(e, "group-address", null, Validators.NOT_NULL_OR_EMPTY);
+
+      int groupPort = XMLConfigurationUtil.getInteger(e, "group-port", -1, Validators.GT_ZERO);
+
+      long broadcastPeriod = XMLConfigurationUtil.getLong(e,
+                                                          "broadcast-period",
+                                                          ConfigurationImpl.DEFAULT_BROADCAST_PERIOD,
+                                                          Validators.GT_ZERO);
+
+      NodeList children = e.getChildNodes();
+
+      List<Pair<String, String>> connectorNames = new ArrayList<Pair<String, String>>();
+
+      for (int j = 0; j < children.getLength(); j++)
+      {
+         Node child = children.item(j);
+
+         if (child.getNodeName().equals("connector-ref"))
+         {
+            String connectorName = child.getAttributes().getNamedItem("connector-name").getNodeValue();
+
+            Node backupConnectorNode = child.getAttributes().getNamedItem("backup-connector-name");
+
+            String backupConnectorName = null;
+
+            if (backupConnectorNode != null)
+            {
+               backupConnectorName = backupConnectorNode.getNodeValue();
+            }
+
+            Pair<String, String> connectorInfo = new Pair<String, String>(connectorName, backupConnectorName);
+
+            connectorNames.add(connectorInfo);
+         }
+      }
+
+      BroadcastGroupConfiguration config = new BroadcastGroupConfiguration(name,
+                                                                           localAddress,
+                                                                           localBindPort,
+                                                                           groupAddress,
+                                                                           groupPort,
+                                                                           broadcastPeriod,
+                                                                           connectorNames);
+
+      mainConfig.getBroadcastGroupConfigurations().add(config);
+   }
+
+   private void parseDiscoveryGroupConfiguration(final Element e, final Configuration mainConfig)
+   {
+      String name = e.getAttribute("name");
+
+      String groupAddress = XMLConfigurationUtil.getString(e, "group-address", null, Validators.NOT_NULL_OR_EMPTY);
+
+      int groupPort = XMLConfigurationUtil.getInteger(e, "group-port", -1, Validators.MINUS_ONE_OR_GT_ZERO);
+
+      long refreshTimeout = XMLConfigurationUtil.getLong(e,
+                                                         "refresh-timeout",
+                                                         ConfigurationImpl.DEFAULT_BROADCAST_REFRESH_TIMEOUT,
+                                                         Validators.GT_ZERO);
+
+      DiscoveryGroupConfiguration config = new DiscoveryGroupConfiguration(name,
+                                                                           groupAddress,
+                                                                           groupPort,
+                                                                           refreshTimeout);
+
+      if (mainConfig.getDiscoveryGroupConfigurations().containsKey(name))
+      {
+         FileConfigurationParser.log.warn("There is already a discovery group with name " + name +
+                                          " deployed. This one will not be deployed.");
+
+         return;
+      }
+      else
+      {
+         mainConfig.getDiscoveryGroupConfigurations().put(name, config);
+      }
+   }
+
+   private void parseClusterConnectionConfiguration(final Element e, final Configuration mainConfig)
+   {
+      String name = e.getAttribute("name");
+
+      String address = XMLConfigurationUtil.getString(e, "address", null, Validators.NOT_NULL_OR_EMPTY);
+
+      boolean duplicateDetection = XMLConfigurationUtil.getBoolean(e,
+                                                                   "use-duplicate-detection",
+                                                                   ConfigurationImpl.DEFAULT_CLUSTER_DUPLICATE_DETECTION);
+
+      boolean forwardWhenNoConsumers = XMLConfigurationUtil.getBoolean(e,
+                                                                       "forward-when-no-consumers",
+                                                                       ConfigurationImpl.DEFAULT_CLUSTER_FORWARD_WHEN_NO_CONSUMERS);
+
+      int maxHops = XMLConfigurationUtil.getInteger(e,
+                                                    "max-hops",
+                                                    ConfigurationImpl.DEFAULT_CLUSTER_MAX_HOPS,
+                                                    Validators.GE_ZERO);
+
+      long retryInterval = XMLConfigurationUtil.getLong(e,
+                                                        "retry-interval",
+                                                        ConfigurationImpl.DEFAULT_CLUSTER_RETRY_INTERVAL,
+                                                        Validators.GT_ZERO);
+
+      int confirmationWindowSize = XMLConfigurationUtil.getInteger(e,
+                                                                   "confirmation-window-size",
+                                                                   FileConfiguration.DEFAULT_CONFIRMATION_WINDOW_SIZE,
+                                                                   Validators.GT_ZERO);
+
+      String discoveryGroupName = null;
+
+      List<Pair<String, String>> connectorPairs = new ArrayList<Pair<String, String>>();
+
+      NodeList children = e.getChildNodes();
+
+      for (int j = 0; j < children.getLength(); j++)
+      {
+         Node child = children.item(j);
+
+         if (child.getNodeName().equals("discovery-group-ref"))
+         {
+            discoveryGroupName = child.getAttributes().getNamedItem("discovery-group-name").getNodeValue();
+         }
+         else if (child.getNodeName().equals("connector-ref"))
+         {
+            String connectorName = child.getAttributes().getNamedItem("connector-name").getNodeValue();
+
+            Node backupNode = child.getAttributes().getNamedItem("backup-connector-name");
+
+            String backupConnectorName = null;
+
+            if (backupNode != null)
+            {
+               backupConnectorName = backupNode.getNodeValue();
+            }
+
+            Pair<String, String> connectorPair = new Pair<String, String>(connectorName, backupConnectorName);
+
+            connectorPairs.add(connectorPair);
+         }
+      }
+
+      ClusterConnectionConfiguration config;
+
+      if (discoveryGroupName == null)
+      {
+         config = new ClusterConnectionConfiguration(name,
+                                                     address,
+                                                     retryInterval,
+                                                     duplicateDetection,
+                                                     forwardWhenNoConsumers,
+                                                     maxHops,
+                                                     confirmationWindowSize,
+                                                     connectorPairs);
+      }
+      else
+      {
+         config = new ClusterConnectionConfiguration(name,
+                                                     address,
+                                                     retryInterval,
+                                                     duplicateDetection,
+                                                     forwardWhenNoConsumers,
+                                                     maxHops,
+                                                     confirmationWindowSize,
+                                                     discoveryGroupName);
+      }
+
+      mainConfig.getClusterConfigurations().add(config);
+   }
+
+   private void parseGroupingHandlerConfiguration(final Element node, final Configuration mainConfiguration)
+   {
+      String name = node.getAttribute("name");
+      String type = XMLConfigurationUtil.getString(node, "type", null, Validators.NOT_NULL_OR_EMPTY);
+      String address = XMLConfigurationUtil.getString(node, "address", null, Validators.NOT_NULL_OR_EMPTY);
+      Integer timeout = XMLConfigurationUtil.getInteger(node,
+                                                        "timeout",
+                                                        GroupingHandlerConfiguration.DEFAULT_TIMEOUT,
+                                                        Validators.GT_ZERO);
+      mainConfiguration.setGroupingHandlerConfiguration(new GroupingHandlerConfiguration(new SimpleString(name),
+                                                                                         type.equals(GroupingHandlerConfiguration.TYPE.LOCAL.getType()) ? GroupingHandlerConfiguration.TYPE.LOCAL
+                                                                                                                                                       : GroupingHandlerConfiguration.TYPE.REMOTE,
+                                                                                         new SimpleString(address),
+                                                                                         timeout));
+   }
+
+   private void parseBridgeConfiguration(final Element brNode, final Configuration mainConfig)
+   {
+      String name = brNode.getAttribute("name");
+
+      String queueName = XMLConfigurationUtil.getString(brNode, "queue-name", null, Validators.NOT_NULL_OR_EMPTY);
+
+      String forwardingAddress = XMLConfigurationUtil.getString(brNode,
+                                                                "forwarding-address",
+                                                                null,
+                                                                Validators.NOT_NULL_OR_EMPTY);
+
+      String transformerClassName = XMLConfigurationUtil.getString(brNode,
+                                                                   "transformer-class-name",
+                                                                   null,
+                                                                   Validators.NO_CHECK);
+
+      long retryInterval = XMLConfigurationUtil.getLong(brNode,
+                                                        "retry-interval",
+                                                        HornetQClient.DEFAULT_RETRY_INTERVAL,
+                                                        Validators.GT_ZERO);
+
+      // Default bridge conf
+      int confirmationWindowSize = XMLConfigurationUtil.getInteger(brNode,
+                                                                   "confirmation-window-size",
+                                                                   FileConfiguration.DEFAULT_CONFIRMATION_WINDOW_SIZE,
+                                                                   Validators.GT_ZERO);
+
+      double retryIntervalMultiplier = XMLConfigurationUtil.getDouble(brNode,
+                                                                      "retry-interval-multiplier",
+                                                                      HornetQClient.DEFAULT_RETRY_INTERVAL_MULTIPLIER,
+                                                                      Validators.GT_ZERO);
+
+      int reconnectAttempts = XMLConfigurationUtil.getInteger(brNode,
+                                                              "reconnect-attempts",
+                                                              ConfigurationImpl.DEFAULT_BRIDGE_RECONNECT_ATTEMPTS,
+                                                              Validators.MINUS_ONE_OR_GE_ZERO);
+
+      boolean failoverOnServerShutdown = XMLConfigurationUtil.getBoolean(brNode,
+                                                                         "failover-on-server-shutdown",
+                                                                         HornetQClient.DEFAULT_FAILOVER_ON_SERVER_SHUTDOWN);
+
+      boolean useDuplicateDetection = XMLConfigurationUtil.getBoolean(brNode,
+                                                                      "use-duplicate-detection",
+                                                                      ConfigurationImpl.DEFAULT_BRIDGE_DUPLICATE_DETECTION);
+
+      String user = XMLConfigurationUtil.getString(brNode,
+                                                   "user",
+                                                   ConfigurationImpl.DEFAULT_CLUSTER_USER,
+                                                   Validators.NO_CHECK);
+
+      String password = XMLConfigurationUtil.getString(brNode,
+                                                       "password",
+                                                       ConfigurationImpl.DEFAULT_CLUSTER_PASSWORD,
+                                                       Validators.NO_CHECK);
+
+      String filterString = null;
+
+      Pair<String, String> connectorPair = null;
+
+      String discoveryGroupName = null;
+
+      NodeList children = brNode.getChildNodes();
+
+      for (int j = 0; j < children.getLength(); j++)
+      {
+         Node child = children.item(j);
+
+         if (child.getNodeName().equals("filter"))
+         {
+            filterString = child.getAttributes().getNamedItem("string").getNodeValue();
+         }
+         else if (child.getNodeName().equals("discovery-group-ref"))
+         {
+            discoveryGroupName = child.getAttributes().getNamedItem("discovery-group-name").getNodeValue();
+         }
+         else if (child.getNodeName().equals("connector-ref"))
+         {
+            String connectorName = child.getAttributes().getNamedItem("connector-name").getNodeValue();
+
+            Node backupNode = child.getAttributes().getNamedItem("backup-connector-name");
+
+            String backupConnectorName = null;
+
+            if (backupNode != null)
+            {
+               backupConnectorName = backupNode.getNodeValue();
+            }
+
+            connectorPair = new Pair<String, String>(connectorName, backupConnectorName);
+         }
+      }
+
+      BridgeConfiguration config;
+
+      if (connectorPair != null)
+      {
+         config = new BridgeConfiguration(name,
+                                          queueName,
+                                          forwardingAddress,
+                                          filterString,
+                                          transformerClassName,
+                                          retryInterval,
+                                          retryIntervalMultiplier,
+                                          reconnectAttempts,
+                                          failoverOnServerShutdown,
+                                          useDuplicateDetection,
+                                          confirmationWindowSize,
+                                          HornetQClient.DEFAULT_CLIENT_FAILURE_CHECK_PERIOD,
+                                          connectorPair,
+                                          user,
+                                          password);
+      }
+      else
+      {
+         config = new BridgeConfiguration(name,
+                                          queueName,
+                                          forwardingAddress,
+                                          filterString,
+                                          transformerClassName,
+                                          retryInterval,
+                                          retryIntervalMultiplier,
+                                          reconnectAttempts,
+                                          failoverOnServerShutdown,
+                                          useDuplicateDetection,
+                                          confirmationWindowSize,
+                                          HornetQClient.DEFAULT_CLIENT_FAILURE_CHECK_PERIOD,
+                                          discoveryGroupName,
+                                          user,
+                                          password);
+      }
+
+      mainConfig.getBridgeConfigurations().add(config);
+   }
+
+   private void parseDivertConfiguration(final Element e, final Configuration mainConfig)
+   {
+      String name = e.getAttribute("name");
+
+      String routingName = XMLConfigurationUtil.getString(e, "routing-name", null, Validators.NO_CHECK);
+
+      String address = XMLConfigurationUtil.getString(e, "address", null, Validators.NOT_NULL_OR_EMPTY);
+
+      String forwardingAddress = XMLConfigurationUtil.getString(e,
+                                                                "forwarding-address",
+                                                                null,
+                                                                Validators.NOT_NULL_OR_EMPTY);
+
+      boolean exclusive = XMLConfigurationUtil.getBoolean(e, "exclusive", ConfigurationImpl.DEFAULT_DIVERT_EXCLUSIVE);
+
+      String transformerClassName = XMLConfigurationUtil.getString(e,
+                                                                   "transformer-class-name",
+                                                                   null,
+                                                                   Validators.NO_CHECK);
+
+      String filterString = null;
+
+      NodeList children = e.getChildNodes();
+
+      for (int j = 0; j < children.getLength(); j++)
+      {
+         Node child = children.item(j);
+
+         if (child.getNodeName().equals("filter"))
+         {
+            filterString = child.getAttributes().getNamedItem("string").getNodeValue();
+         }
+      }
+
+      DivertConfiguration config = new DivertConfiguration(name,
+                                                           routingName,
+                                                           address,
+                                                           forwardingAddress,
+                                                           exclusive,
+                                                           filterString,
+                                                           transformerClassName);
+
+      mainConfig.getDivertConfigurations().add(config);
+   }
+
+   // Inner classes -------------------------------------------------
+
+}

Modified: trunk/src/main/org/hornetq/core/deployers/impl/QueueDeployer.java
===================================================================
--- trunk/src/main/org/hornetq/core/deployers/impl/QueueDeployer.java	2010-02-08 10:28:19 UTC (rev 8867)
+++ trunk/src/main/org/hornetq/core/deployers/impl/QueueDeployer.java	2010-02-10 14:15:24 UTC (rev 8868)
@@ -17,7 +17,6 @@
 import org.hornetq.core.deployers.DeploymentManager;
 import org.hornetq.core.server.cluster.QueueConfiguration;
 import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
 
 /**
  * A QueueDeployer
@@ -30,6 +29,8 @@
 {
    private final HornetQServerControl serverControl;
 
+   private final FileConfigurationParser parser = new FileConfigurationParser();
+
    public QueueDeployer(final DeploymentManager deploymentManager, final HornetQServerControl serverControl)
    {
       super(deploymentManager);
@@ -61,7 +62,7 @@
    @Override
    public void deploy(final Node node) throws Exception
    {
-      QueueConfiguration queueConfig = parseQueueConfiguration(node);
+      QueueConfiguration queueConfig = parser.parseQueueConfiguration(node);
 
       serverControl.deployQueue(queueConfig.getAddress(),
                                 queueConfig.getName(),
@@ -86,34 +87,4 @@
       return new String[] { "hornetq-configuration.xml", "hornetq-queues.xml" };
    }
 
-   private QueueConfiguration parseQueueConfiguration(final Node node)
-   {
-      String name = node.getAttributes().getNamedItem("name").getNodeValue();
-      String address = null;
-      String filterString = null;
-      boolean durable = true;
-
-      NodeList children = node.getChildNodes();
-
-      for (int j = 0; j < children.getLength(); j++)
-      {
-         Node child = children.item(j);
-
-         if (child.getNodeName().equals("address"))
-         {
-            address = child.getTextContent().trim();
-         }
-         else if (child.getNodeName().equals("filter"))
-         {
-            filterString = child.getAttributes().getNamedItem("string").getNodeValue();
-         }
-         else if (child.getNodeName().equals("durable"))
-         {
-            durable = Boolean.parseBoolean(child.getTextContent().trim());
-         }
-      }
-
-      return new QueueConfiguration(address, name, filterString, durable);
-   }
-
 }

Modified: trunk/src/main/org/hornetq/core/deployers/impl/SecurityDeployer.java
===================================================================
--- trunk/src/main/org/hornetq/core/deployers/impl/SecurityDeployer.java	2010-02-08 10:28:19 UTC (rev 8867)
+++ trunk/src/main/org/hornetq/core/deployers/impl/SecurityDeployer.java	2010-02-10 14:15:24 UTC (rev 8868)
@@ -13,16 +13,14 @@
 
 package org.hornetq.core.deployers.impl;
 
-import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.Set;
 
+import org.hornetq.api.core.Pair;
 import org.hornetq.core.deployers.DeploymentManager;
 import org.hornetq.core.logging.Logger;
 import org.hornetq.core.security.Role;
 import org.hornetq.core.settings.HierarchicalRepository;
 import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
 
 /**
  * Deploys the security settings into a security repository and adds them to the security store.
@@ -33,32 +31,12 @@
 {
    private static final Logger log = Logger.getLogger(SecurityDeployer.class);
 
-   private static final String PERMISSION_ELEMENT_NAME = "permission";
-
-   private static final String TYPE_ATTR_NAME = "type";
-
-   private static final String ROLES_ATTR_NAME = "roles";
-
    private static final String QUEUES_XML = "hornetq-queues.xml";
 
    private static final String MATCH = "match";
 
-   private static final String SECURITY_ELEMENT_NAME = "security-setting";
+   private final FileConfigurationParser parser = new FileConfigurationParser(); 
 
-   public static final String SEND_NAME = "send";
-
-   public static final String CONSUME_NAME = "consume";
-
-   public static final String CREATEDURABLEQUEUE_NAME = "createDurableQueue";
-
-   public static final String DELETEDURABLEQUEUE_NAME = "deleteDurableQueue";
-
-   public static final String CREATETEMPQUEUE_NAME = "createTempQueue";
-
-   public static final String DELETETEMPQUEUE_NAME = "deleteTempQueue";
-
-   public static final String MANAGE_NAME = "manage";
-
    /**
     * The repository to add to
     */
@@ -80,7 +58,7 @@
    @Override
    public String[] getElementTagName()
    {
-      return new String[] { SecurityDeployer.SECURITY_ELEMENT_NAME };
+      return new String[] { FileConfigurationParser.SECURITY_ELEMENT_NAME };
    }
 
    @Override
@@ -109,76 +87,8 @@
    @Override
    public void deploy(final Node node) throws Exception
    {
-      HashSet<Role> securityRoles = new HashSet<Role>();
-      ArrayList<String> send = new ArrayList<String>();
-      ArrayList<String> consume = new ArrayList<String>();
-      ArrayList<String> createDurableQueue = new ArrayList<String>();
-      ArrayList<String> deleteDurableQueue = new ArrayList<String>();
-      ArrayList<String> createTempQueue = new ArrayList<String>();
-      ArrayList<String> deleteTempQueue = new ArrayList<String>();
-      ArrayList<String> manageRoles = new ArrayList<String>();
-      ArrayList<String> allRoles = new ArrayList<String>();
-      String match = node.getAttributes().getNamedItem(getKeyAttribute()).getNodeValue();
-      NodeList children = node.getChildNodes();
-      for (int i = 0; i < children.getLength(); i++)
-      {
-         Node child = children.item(i);
-
-         if (SecurityDeployer.PERMISSION_ELEMENT_NAME.equalsIgnoreCase(child.getNodeName()))
-         {
-            String type = child.getAttributes().getNamedItem(SecurityDeployer.TYPE_ATTR_NAME).getNodeValue();
-            String roleString = child.getAttributes().getNamedItem(SecurityDeployer.ROLES_ATTR_NAME).getNodeValue();
-            String[] roles = roleString.split(",");
-            for (String role : roles)
-            {
-               if (SecurityDeployer.SEND_NAME.equals(type))
-               {
-                  send.add(role.trim());
-               }
-               else if (SecurityDeployer.CONSUME_NAME.equals(type))
-               {
-                  consume.add(role.trim());
-               }
-               else if (SecurityDeployer.CREATEDURABLEQUEUE_NAME.equals(type))
-               {
-                  createDurableQueue.add(role);
-               }
-               else if (SecurityDeployer.DELETEDURABLEQUEUE_NAME.equals(type))
-               {
-                  deleteDurableQueue.add(role);
-               }
-               else if (SecurityDeployer.CREATETEMPQUEUE_NAME.equals(type))
-               {
-                  createTempQueue.add(role);
-               }
-               else if (SecurityDeployer.DELETETEMPQUEUE_NAME.equals(type))
-               {
-                  deleteTempQueue.add(role);
-               }
-               else if (SecurityDeployer.MANAGE_NAME.equals(type))
-               {
-                  manageRoles.add(role);
-               }
-               if (!allRoles.contains(role.trim()))
-               {
-                  allRoles.add(role.trim());
-               }
-            }
-         }
-
-      }
-      for (String role : allRoles)
-      {
-         securityRoles.add(new Role(role,
-                                    send.contains(role),
-                                    consume.contains(role),
-                                    createDurableQueue.contains(role),
-                                    deleteDurableQueue.contains(role),
-                                    createTempQueue.contains(role),
-                                    deleteTempQueue.contains(role),
-                                    manageRoles.contains(role)));
-      }
-      securityRepository.addMatch(match, securityRoles);
+      Pair<String, Set<Role>> securityMatch = parser.parseSecurityRoles(node);
+      securityRepository.addMatch(securityMatch.a, securityMatch.b);
    }
 
    /**

Modified: trunk/src/main/org/hornetq/core/server/impl/HornetQServerImpl.java
===================================================================
--- trunk/src/main/org/hornetq/core/server/impl/HornetQServerImpl.java	2010-02-08 10:28:19 UTC (rev 8867)
+++ trunk/src/main/org/hornetq/core/server/impl/HornetQServerImpl.java	2010-02-10 14:15:24 UTC (rev 8868)
@@ -975,6 +975,8 @@
                                                                 configuration.isBackup());
 
       // Address settings need to deployed initially, since they're require on paging manager.start()
+      
+      deployAddressSettingsFromConfiguration();
 
       if (configuration.isFileDeploymentEnabled())
       {
@@ -998,6 +1000,8 @@
 
       resourceManager.start();
 
+      deploySecurityFromConfiguration();
+
       // Deploy all security related config
       if (configuration.isFileDeploymentEnabled())
       {
@@ -1088,6 +1092,14 @@
       }
    }
 
+   private void deploySecurityFromConfiguration()
+   {
+      for (Map.Entry<String, Set<Role>> entry : configuration.getSecurityRoles().entrySet())
+      {
+         securityRepository.addMatch(entry.getKey(), entry.getValue());
+      }
+   }
+
    private void deployQueuesFromConfiguration() throws Exception
    {
       for (QueueConfiguration config : configuration.getQueueConfigurations())
@@ -1099,6 +1111,15 @@
       }
    }
 
+   private void deployAddressSettingsFromConfiguration()
+   {
+      for (Map.Entry<String, AddressSettings> entry : configuration.getAddressesSettings().entrySet())
+      {
+         addressSettingsRepository.addMatch(entry.getKey(), entry.getValue());
+      }
+   }
+
+
    private JournalLoadInformation[] loadJournals() throws Exception
    {
       JournalLoadInformation[] journalInfo = new JournalLoadInformation[2];

Modified: trunk/src/main/org/hornetq/core/settings/impl/AddressSettings.java
===================================================================
--- trunk/src/main/org/hornetq/core/settings/impl/AddressSettings.java	2010-02-08 10:28:19 UTC (rev 8867)
+++ trunk/src/main/org/hornetq/core/settings/impl/AddressSettings.java	2010-02-10 14:15:24 UTC (rev 8868)
@@ -13,6 +13,8 @@
 
 package org.hornetq.core.settings.impl;
 
+import java.io.Serializable;
+
 import org.hornetq.api.core.SimpleString;
 import org.hornetq.core.logging.Logger;
 import org.hornetq.core.settings.Mergeable;
@@ -23,8 +25,10 @@
  * @author <a href="ataylor at redhat.com">Andy Taylor</a>
  * @author <a href="tim.fox at jboss.com">Tim Fox</a>
  */
-public class AddressSettings implements Mergeable<AddressSettings>
+public class AddressSettings implements Mergeable<AddressSettings>, Serializable
 {
+   private static final long serialVersionUID = 1607502280582336366L;
+
    private static Logger log = Logger.getLogger(AddressSettings.class);
 
    /**

Modified: trunk/tests/config/ConfigurationTest-full-config.xml
===================================================================
--- trunk/tests/config/ConfigurationTest-full-config.xml	2010-02-08 10:28:19 UTC (rev 8867)
+++ trunk/tests/config/ConfigurationTest-full-config.xml	2010-02-10 14:15:24 UTC (rev 8868)
@@ -182,4 +182,33 @@
              <discovery-group-ref discovery-group-name="dg1"/>
          </cluster-connection>
       </cluster-connections>
+      
+    <security-settings>
+      <security-setting match="a1">
+         <permission type="createTempQueue" roles="a1.1"/>
+      </security-setting>
+      <security-setting match="a2">
+         <permission type="deleteTempQueue" roles="a2.1"/>
+      </security-setting>
+   </security-settings>
+
+   <address-settings>
+      <address-setting match="a1">
+         <dead-letter-address>a1.1</dead-letter-address>
+         <expiry-address>a1.2</expiry-address>
+         <redelivery-delay>1</redelivery-delay>
+         <max-size-bytes>2</max-size-bytes>
+         <page-size-bytes>3</page-size-bytes>
+         <message-counter-history-day-limit>4</message-counter-history-day-limit>
+      </address-setting>
+      <address-setting match="a2">
+         <dead-letter-address>a2.1</dead-letter-address>
+         <expiry-address>a2.2</expiry-address>
+         <redelivery-delay>5</redelivery-delay>
+         <max-size-bytes>6</max-size-bytes>
+         <page-size-bytes>7</page-size-bytes>
+         <message-counter-history-day-limit>8</message-counter-history-day-limit>
+      </address-setting>
+   </address-settings>
+   
 </configuration>

Modified: trunk/tests/src/org/hornetq/tests/unit/core/config/impl/FileConfigurationTest.java
===================================================================
--- trunk/tests/src/org/hornetq/tests/unit/core/config/impl/FileConfigurationTest.java	2010-02-08 10:28:19 UTC (rev 8867)
+++ trunk/tests/src/org/hornetq/tests/unit/core/config/impl/FileConfigurationTest.java	2010-02-10 14:15:24 UTC (rev 8868)
@@ -19,6 +19,7 @@
 import org.hornetq.api.core.TransportConfiguration;
 import org.hornetq.core.config.Configuration;
 import org.hornetq.core.config.impl.FileConfiguration;
+import org.hornetq.core.security.Role;
 import org.hornetq.core.server.JournalType;
 import org.hornetq.core.server.cluster.BridgeConfiguration;
 import org.hornetq.core.server.cluster.BroadcastGroupConfiguration;
@@ -258,7 +259,67 @@
             Assert.assertEquals("dg1", ccc.getDiscoveryGroupName());
          }
       }
+      
+      
+      assertEquals(2, conf.getAddressesSettings().size());
+      
+      assertTrue(conf.getAddressesSettings().get("a1") != null);
+      assertTrue(conf.getAddressesSettings().get("a2") != null);
+      
+      assertEquals("a1.1", conf.getAddressesSettings().get("a1").getDeadLetterAddress().toString());
+      assertEquals("a1.2", conf.getAddressesSettings().get("a1").getExpiryAddress().toString());
+      assertEquals(1, conf.getAddressesSettings().get("a1").getRedeliveryDelay());
+      assertEquals(2, conf.getAddressesSettings().get("a1").getMaxSizeBytes());
+      assertEquals(3, conf.getAddressesSettings().get("a1").getPageSizeBytes());
+      assertEquals(4, conf.getAddressesSettings().get("a1").getMessageCounterHistoryDayLimit());
 
+      assertEquals("a2.1", conf.getAddressesSettings().get("a2").getDeadLetterAddress().toString());
+      assertEquals("a2.2", conf.getAddressesSettings().get("a2").getExpiryAddress().toString());
+      assertEquals(5, conf.getAddressesSettings().get("a2").getRedeliveryDelay());
+      assertEquals(6, conf.getAddressesSettings().get("a2").getMaxSizeBytes());
+      assertEquals(7, conf.getAddressesSettings().get("a2").getPageSizeBytes());
+      assertEquals(8, conf.getAddressesSettings().get("a2").getMessageCounterHistoryDayLimit());
+      
+      
+      assertEquals(2, conf.getQueueConfigurations().size());
+      
+      assertEquals("queue1", conf.getQueueConfigurations().get(0).getName());
+      assertEquals("address1", conf.getQueueConfigurations().get(0).getAddress());
+      assertEquals("color='red'", conf.getQueueConfigurations().get(0).getFilterString());
+      assertEquals(false, conf.getQueueConfigurations().get(0).isDurable());
+      
+      assertEquals("queue2", conf.getQueueConfigurations().get(1).getName());
+      assertEquals("address2", conf.getQueueConfigurations().get(1).getAddress());
+      assertEquals("color='blue'", conf.getQueueConfigurations().get(1).getFilterString());
+      assertEquals(false, conf.getQueueConfigurations().get(1).isDurable());
+      
+      assertEquals(2, conf.getSecurityRoles().size());
+
+      assertTrue(conf.getSecurityRoles().containsKey("a1"));
+      
+      assertTrue(conf.getSecurityRoles().containsKey("a2"));
+      
+      Role a1Role = conf.getSecurityRoles().get("a1").toArray(new Role[1])[0];
+      
+      assertFalse(a1Role.isSend());
+      assertFalse(a1Role.isConsume());
+      assertFalse(a1Role.isCreateDurableQueue());
+      assertFalse(a1Role.isDeleteDurableQueue());
+      assertTrue(a1Role.isCreateNonDurableQueue());
+      assertFalse(a1Role.isDeleteNonDurableQueue());
+      assertFalse(a1Role.isManage());
+      
+      Role a2Role = conf.getSecurityRoles().get("a2").toArray(new Role[1])[0];
+      
+      assertFalse(a2Role.isSend());
+      assertFalse(a2Role.isConsume());
+      assertFalse(a2Role.isCreateDurableQueue());
+      assertFalse(a2Role.isDeleteDurableQueue());
+      assertFalse(a2Role.isCreateNonDurableQueue());
+      assertTrue(a2Role.isDeleteNonDurableQueue());
+      assertFalse(a2Role.isManage());
+      
+
    }
 
    public void testSetGetConfigurationURL()



More information about the hornetq-commits mailing list