[jbossws-commits] JBossWS SVN: r18245 - in spi/trunk/src: main/java/org/jboss/wsf/spi/metadata and 5 other directories.

jbossws-commits at lists.jboss.org jbossws-commits at lists.jboss.org
Thu Jan 16 09:45:03 EST 2014


Author: asoldano
Date: 2014-01-16 09:45:03 -0500 (Thu, 16 Jan 2014)
New Revision: 18245

Added:
   spi/trunk/src/main/java/org/jboss/wsf/spi/management/CommonConfigStore.java
Modified:
   spi/trunk/src/main/java/org/jboss/wsf/spi/management/ServerConfig.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/AbstractHandlerChainsMetaDataParser.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/AbstractCommonConfig.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/ClientConfig.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/CommonConfig.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/ConfigMetaDataParser.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/EndpointConfig.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedHandlerChainMetaData.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedHandlerChainsMetaData.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedHandlerMetaData.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedInitParamMetaData.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedStubPropertyMetaData.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/jms/JMSEndpointMetaData.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/jms/JMSEndpointsMetaData.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/JBossPortComponentMetaData.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/JBossWebserviceDescriptionMetaData.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/JBossWebservicesFactory.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/JBossWebservicesMetaData.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/PortComponentMetaData.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/WebserviceDescriptionMetaData.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/WebservicesFactory.java
   spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/WebservicesMetaData.java
   spi/trunk/src/test/java/org/jboss/test/wsf/spi/metadata/config/ConfigMDParserTestCase.java
Log:
[JBWS-3739][JBWS-3708][JBWS-3707][JBWS-3689] svn merge -r 18105:18141 https://svn.jboss.org/repos/jbossws/spi/branches/JBWS-3739 .


Copied: spi/trunk/src/main/java/org/jboss/wsf/spi/management/CommonConfigStore.java (from rev 18141, spi/branches/JBWS-3739/src/main/java/org/jboss/wsf/spi/management/CommonConfigStore.java)
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/management/CommonConfigStore.java	                        (rev 0)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/management/CommonConfigStore.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -0,0 +1,91 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.wsf.spi.management;
+
+import java.util.Collection;
+
+import org.jboss.wsf.spi.metadata.config.AbstractCommonConfig;
+
+
+/**
+ * A store of client/endpoint config
+ *
+ * @author alessio.soldano at jboss.com
+ * @since 04-Dec-2013
+ */
+public interface CommonConfigStore<T extends AbstractCommonConfig>
+{
+   /**
+    * Registers a config in the store; the new config will affect runtime the first time the store is reloaded.
+    * 
+    * @param config
+    */
+   void register(T config);
+   
+   /**
+    * Unregisters a config in the store; the runtime will be affected the first time the store is reloaded.
+    * 
+    * @param config
+    */
+   void unregister(T config);
+
+   /**
+    * Reloads the store, which involves iterating over the registered configs and creating a collection that is
+    * returned when calling getConfig(..) / getConfigs().
+    */
+   void reload();
+   
+   /**
+    * Unloads the store, cleaning up the loaded collection.
+    */
+   void unload();
+   
+   /**
+    * Sets a wrapper config, to be merged with any registered config.
+    * 
+    * @param config
+    * @param reload     Whether to reload the store after having set the wrapper or not
+    */
+   void setWrapperConfig(T config, boolean reload);
+   
+   /**
+    * Returns current wrapper config
+    * 
+    * @return
+    */
+   T getWrapperConfig();
+   
+   /**
+    * Retrieves a config by name from the loaded collection
+    * 
+    * @param name
+    * @return
+    */
+   T getConfig(String name);
+   
+   /**
+    * Returns the loaded config collection
+    * 
+    * @return
+    */
+   Collection<T> getConfigs();
+}

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/management/ServerConfig.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/management/ServerConfig.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/management/ServerConfig.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2012, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -23,7 +23,6 @@
 
 import java.io.File;
 import java.net.UnknownHostException;
-import java.util.List;
 
 import org.jboss.wsf.spi.metadata.config.ClientConfig;
 import org.jboss.wsf.spi.metadata.config.EndpointConfig;
@@ -66,11 +65,59 @@
    
    void setModifySOAPAddress(boolean flag);
    
-   void addEndpointConfig(EndpointConfig config);
+   /**
+    * Register a client config in the server configuration; the new config will apply to runtime when the server config is started
+    * or after a client config store reload.
+    * 
+    * @param config
+    */
+   void registerClientConfig(ClientConfig config);
    
-   List<EndpointConfig> getEndpointConfigs();
+   /**
+    * Unregister a client config from the server configuration; the new config will be removed from
+    * the collection returned to callers after next endpoint store reload.
+    * 
+    * @param config
+    */
+   void unregisterClientConfig(ClientConfig config);
    
-   void addClientConfig(ClientConfig config);
+   /**
+    * Reloads the client config store
+    */
+   void reloadClientConfigs();
    
-   List<ClientConfig> getClientConfigs();
+   /**
+    * Get a client config by name
+    * 
+    * @return
+    */
+   ClientConfig getClientConfig(String name);
+   
+   /**
+    * Register an endpoint config in the server configuration; the new config will apply to runtime when the server config is started
+    * or after an endpoint config store reload.
+    * 
+    * @param config
+    */
+   void registerEndpointConfig(EndpointConfig config);
+   
+   /**
+    * Unregister an endpoint config from the server configuration; the new config will be removed from
+    * the collection returned to callers after next endpoint store reload.
+    * 
+    * @param config
+    */
+   void unregisterEndpointConfig(EndpointConfig config);
+   
+   /**
+    * Reloads the endpoint config store
+    */
+   void reloadEndpointConfigs();
+   
+   /**
+    * Get an endpoint config by name
+    * 
+    * @return
+    */
+   EndpointConfig getEndpointConfig(String name);
 }

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/AbstractHandlerChainsMetaDataParser.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/AbstractHandlerChainsMetaDataParser.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/AbstractHandlerChainsMetaDataParser.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -39,6 +39,13 @@
 import static org.jboss.wsf.spi.util.StAXUtils.elementAsString;
 import static org.jboss.wsf.spi.util.StAXUtils.match;
 
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
@@ -64,7 +71,7 @@
    protected UnifiedHandlerChainsMetaData parseHandlerChains(XMLStreamReader reader, String nsUri,
          String handlerChainsElementNS, String handlerChainsElementName) throws XMLStreamException
    {
-      UnifiedHandlerChainsMetaData handlerChains = new UnifiedHandlerChainsMetaData();
+      List<UnifiedHandlerChainMetaData> handlerChains = new ArrayList<UnifiedHandlerChainMetaData>(1);
       while (reader.hasNext())
       {
          switch (reader.nextTag())
@@ -72,7 +79,7 @@
             case XMLStreamConstants.END_ELEMENT : {
                if (match(reader, handlerChainsElementNS, handlerChainsElementName))
                {
-                  return handlerChains;
+                  return new UnifiedHandlerChainsMetaData(handlerChains);
                }
                else
                {
@@ -81,7 +88,7 @@
             }
             case XMLStreamConstants.START_ELEMENT : {
                if (match(reader, nsUri, HANDLER_CHAIN)) {
-                  handlerChains.addHandlerChain(parseHandlerChain(reader, nsUri));
+                  handlerChains.add(parseHandlerChain(reader, nsUri));
                }
                else
                {
@@ -95,7 +102,10 @@
    
    private UnifiedHandlerChainMetaData parseHandlerChain(XMLStreamReader reader, String nsUri) throws XMLStreamException
    {
-      UnifiedHandlerChainMetaData handlerChain = new UnifiedHandlerChainMetaData();
+      QName portNamePattern = null;
+      QName serviceNamePattern = null;
+      String protocolBindings = null;
+      List<UnifiedHandlerMetaData> handlers = new ArrayList<UnifiedHandlerMetaData>(4);
       while (reader.hasNext())
       {
          switch (reader.nextTag())
@@ -103,7 +113,7 @@
             case XMLStreamConstants.END_ELEMENT : {
                if (match(reader, nsUri, HANDLER_CHAIN))
                {
-                  return handlerChain;
+                  return new UnifiedHandlerChainMetaData(serviceNamePattern, portNamePattern, protocolBindings, handlers, false, null);
                }
                else
                {
@@ -113,18 +123,18 @@
             case XMLStreamConstants.START_ELEMENT : {
                if (match(reader, nsUri, CHAIN_PORT_PATTERN))
                {
-                  handlerChain.setPortNamePattern(elementAsQName(reader));
+                  portNamePattern = elementAsQName(reader);
                }
                else if (match(reader, nsUri, CHAIN_SERVICE_PATTERN))
                {
-                  handlerChain.setServiceNamePattern(elementAsQName(reader));
+                  serviceNamePattern = elementAsQName(reader);
                }
                else if(match(reader, nsUri, CHAIN_PROTOCOL_BINDING))
                {
-                  handlerChain.setProtocolBindings(elementAsString(reader));
+                  protocolBindings = elementAsString(reader);
                }
                else if (match(reader, nsUri, HANDLER)) {
-                  handlerChain.addHandler(parseHandler(reader, nsUri, handlerChain));
+                  handlers.add(parseHandler(reader, nsUri));
                }
                else
                {
@@ -138,12 +148,12 @@
    
    protected UnifiedHandlerMetaData parseHandler(XMLStreamReader reader, String nsUri) throws XMLStreamException
    {
-      return parseHandler(reader, nsUri, null);
-   }
-   
-   private UnifiedHandlerMetaData parseHandler(XMLStreamReader reader, String nsUri, UnifiedHandlerChainMetaData handlerChain) throws XMLStreamException
-   {
-      UnifiedHandlerMetaData handler = new UnifiedHandlerMetaData(handlerChain);
+      String handlerName = null;
+      String handlerClass = null;
+      List<UnifiedInitParamMetaData> initParams = new LinkedList<UnifiedInitParamMetaData>();
+      Set<QName> soapHeaders = new HashSet<QName>(2);
+      Set<String> soapRoles = new HashSet<String>(2);
+      Set<String> portNames = new HashSet<String>(4);
       while (reader.hasNext())
       {
          switch (reader.nextTag())
@@ -151,7 +161,7 @@
             case XMLStreamConstants.END_ELEMENT : {
                if (match(reader, nsUri, HANDLER))
                {
-                  return handler;
+                  return new UnifiedHandlerMetaData(handlerClass, handlerName, initParams, soapHeaders, soapRoles, portNames);
                }
                else
                {
@@ -161,20 +171,20 @@
             case XMLStreamConstants.START_ELEMENT : {
                if (match(reader, nsUri, HANDLER_NAME))
                {
-                  handler.setHandlerName(elementAsString(reader));
+                  handlerName = elementAsString(reader);
                }
                else if (match(reader, nsUri, HANDLER_CLASS))
                {
-                  handler.setHandlerClass(elementAsString(reader));
+                  handlerClass = elementAsString(reader);
                }
                else if (match(reader, nsUri, HANDLER_PARAM)) {
-                  handler.addInitParam(parseInitParam(reader, nsUri));
+                  initParams.add(parseInitParam(reader, nsUri));
                }
                else if (match(reader, nsUri, HANDLER_SOAP_ROLE)) {
-                  handler.addSoapRole(elementAsString(reader));
+                  soapRoles.add(elementAsString(reader));
                }
                else if (match(reader, nsUri, HANDLER_SOAP_HEADER)) {
-                  handler.addSoapHeader(elementAsQName(reader));
+                  soapHeaders.add(elementAsQName(reader));
                }
                else
                {
@@ -188,7 +198,8 @@
 
    private UnifiedInitParamMetaData parseInitParam(XMLStreamReader reader, String nsUri) throws XMLStreamException
    {
-      UnifiedInitParamMetaData initParam = new UnifiedInitParamMetaData();
+      String paramName = null;
+      String paramValue = null;
       while (reader.hasNext())
       {
          switch (reader.nextTag())
@@ -196,7 +207,7 @@
             case XMLStreamConstants.END_ELEMENT : {
                if (match(reader, nsUri, HANDLER_PARAM))
                {
-                  return initParam;
+                  return new UnifiedInitParamMetaData(paramName, paramValue);
                }
                else
                {
@@ -206,11 +217,11 @@
             case XMLStreamConstants.START_ELEMENT : {
                if (match(reader, nsUri, HANDLER_PARAM_NAME))
                {
-                  initParam.setParamName(elementAsString(reader));
+                  paramName = elementAsString(reader);
                }
                else if (match(reader, nsUri, HANDLER_PARAM_VALUE))
                {
-                  initParam.setParamValue(elementAsString(reader));
+                  paramValue = elementAsString(reader);
                }
                else
                {

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/AbstractCommonConfig.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/AbstractCommonConfig.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/AbstractCommonConfig.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2011, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -21,6 +21,8 @@
  */
 package org.jboss.wsf.spi.metadata.config;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -37,32 +39,130 @@
  */
 public abstract class AbstractCommonConfig implements CommonConfig
 {
-   private String configName;
-   private Map<String, Feature> features = new HashMap<String, Feature>(2);
-   private Map<String, String> properties = new HashMap<String, String>(4);
-   private List<UnifiedHandlerChainMetaData> preHandlerChains;
-   private List<UnifiedHandlerChainMetaData> postHandlerChains;
+   private final String configName;
+   private final Map<String, Feature> features;
+   private final Map<String, String> properties;
+   private final List<UnifiedHandlerChainMetaData> preHandlerChains;
+   private final List<UnifiedHandlerChainMetaData> postHandlerChains;
+   
+   protected AbstractCommonConfig(String configName,
+                                  List<UnifiedHandlerChainMetaData> preHandlerChains,
+                                  List<UnifiedHandlerChainMetaData> postHandlerChains,
+                                  Map<String, String> properties,
+                                  Map<String, Feature> features)
+   {
+      super();
+      this.configName = configName;
+      if (features != null && !features.isEmpty()) {
+         this.features = Collections.unmodifiableMap(features);
+      } else {
+         this.features = Collections.emptyMap();
+      }
+      if (properties != null && !properties.isEmpty()) {
+         this.properties = Collections.unmodifiableMap(properties);
+      } else {
+         this.properties = Collections.emptyMap();
+      }
+      if (preHandlerChains != null && !preHandlerChains.isEmpty()) {
+         this.preHandlerChains = Collections.unmodifiableList(preHandlerChains);
+      } else {
+         this.preHandlerChains = Collections.emptyList();
+      }
+      if (postHandlerChains != null && !postHandlerChains.isEmpty()) {
+         this.postHandlerChains = Collections.unmodifiableList(postHandlerChains);
+      } else {
+         this.postHandlerChains = Collections.emptyList();
+      }
+   }
+   
+   protected AbstractCommonConfig(AbstractCommonConfig base, AbstractCommonConfig addon)
+   {
+      super();
+      this.configName = base.getConfigName();
+      if (addon.features != null && !addon.features.isEmpty())
+      {
+         Map<String, Feature> map;
+         if (base.features.isEmpty())
+         {
+            map = addon.features;
+         }
+         else
+         {
+            map = new HashMap<String, Feature>(base.features);
+            map.putAll(addon.features);
+         }
+         this.features = Collections.unmodifiableMap(map);
+      }
+      else
+      {
+         this.features = Collections.emptyMap();
+      }
+      if (addon.properties != null && !addon.properties.isEmpty())
+      {
+         Map<String, String> map;
+         if (base.properties.isEmpty())
+         {
+            map = addon.properties;
+         }
+         else
+         {
+            map = new HashMap<String, String>(base.properties);
+            map.putAll(addon.properties);
+         }
+         this.properties = Collections.unmodifiableMap(map);
+      }
+      else
+      {
+         this.properties = Collections.emptyMap();
+      }
+      if (addon.preHandlerChains != null && !addon.preHandlerChains.isEmpty())
+      {
+         List<UnifiedHandlerChainMetaData> list;
+         if (base.preHandlerChains.isEmpty())
+         {
+            list = addon.preHandlerChains;
+         }
+         else
+         {
+            list = new ArrayList<UnifiedHandlerChainMetaData>(base.preHandlerChains);
+            list.addAll(addon.preHandlerChains);
+         }
+         this.preHandlerChains = Collections.unmodifiableList(list);
+      }
+      else
+      {
+         this.preHandlerChains = Collections.emptyList();
+      }
+      if (addon.postHandlerChains != null && !addon.postHandlerChains.isEmpty())
+      {
+         List<UnifiedHandlerChainMetaData> list;
+         if (base.postHandlerChains.isEmpty())
+         {
+            list = addon.postHandlerChains;
+         }
+         else
+         {
+            list = new ArrayList<UnifiedHandlerChainMetaData>(base.postHandlerChains);
+            list.addAll(preHandlerChains);
+         }
+         this.postHandlerChains = Collections.unmodifiableList(list);
+      }
+      else
+      {
+         this.postHandlerChains = Collections.emptyList();
+      }
+   }
 
    public List<UnifiedHandlerChainMetaData> getPostHandlerChains()
    {
       return postHandlerChains;
    }
 
-   public void setPostHandlerChains(List<UnifiedHandlerChainMetaData> postHandlerChain)
-   {
-      this.postHandlerChains = postHandlerChain;
-   }
-
    public List<UnifiedHandlerChainMetaData> getPreHandlerChains()
    {
       return preHandlerChains;
    }
 
-   public void setPreHandlerChains(List<UnifiedHandlerChainMetaData> preHandlerChains)
-   {
-      this.preHandlerChains = preHandlerChains;
-   }
-
    public List<UnifiedHandlerChainMetaData> getHandlers(HandlerType type)
    {
       List<UnifiedHandlerChainMetaData> handlerChains;
@@ -79,30 +179,11 @@
       return configName;
    }
 
-   public void setConfigName(String configName)
-   {
-      this.configName = configName;
-   }
-
    public boolean hasFeature(String name)
    {
       return features.containsKey(name);
    }
    
-   public void setFeature(Feature feature, boolean enabled) {
-
-      if(enabled) {
-         features.put(feature.getName(), feature);
-      }
-      else
-         features.remove(feature.getName());
-   }
-
-   public void setProperty(String name, String value)
-   {
-      properties.put(name, value);
-   }
-
    public String getProperty(String name)
    {
       return properties.get(name);

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/ClientConfig.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/ClientConfig.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/ClientConfig.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2012, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -21,6 +21,11 @@
  */
 package org.jboss.wsf.spi.metadata.config;
 
+import java.util.List;
+import java.util.Map;
+
+import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedHandlerChainMetaData;
+
 /** 
  * A JBossWS client configuration 
  *
@@ -30,4 +35,15 @@
 public class ClientConfig extends AbstractCommonConfig
 {
    public static final String STANDARD_CLIENT_CONFIG = "Standard-Client-Config";
+
+   public ClientConfig(String configName, List<UnifiedHandlerChainMetaData> preHandlerChains,
+         List<UnifiedHandlerChainMetaData> postHandlerChains, Map<String, String> properties,
+         Map<String, Feature> features)
+   {
+      super(configName, preHandlerChains, postHandlerChains, properties, features);
+   }
+   
+   public ClientConfig(ClientConfig base, ClientConfig addon) {
+      super(base, addon);
+   }
 }

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/CommonConfig.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/CommonConfig.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/CommonConfig.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2011, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -40,24 +40,14 @@
    
    public List<UnifiedHandlerChainMetaData> getPostHandlerChains();
 
-   public void setPostHandlerChains(List<UnifiedHandlerChainMetaData> postHandlerChain);
-
    public List<UnifiedHandlerChainMetaData> getPreHandlerChains();
 
-   public void setPreHandlerChains(List<UnifiedHandlerChainMetaData> preHandlerChains);
-
    public List<UnifiedHandlerChainMetaData> getHandlers(HandlerType type);
 
    public String getConfigName();
 
-   public void setConfigName(String configName);
-
    public boolean hasFeature(String name);
    
-   public void setFeature(Feature feature, boolean enabled);
-
-   public void setProperty(String name, String value);
-
    public String getProperty(String name);
 
    public Map<String, String> getProperties();

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/ConfigMetaDataParser.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/ConfigMetaDataParser.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/ConfigMetaDataParser.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2011, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -44,6 +44,10 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamConstants;
@@ -52,6 +56,7 @@
 
 import org.jboss.wsf.spi.Loggers;
 import org.jboss.wsf.spi.metadata.AbstractHandlerChainsMetaDataParser;
+import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedHandlerChainMetaData;
 import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedHandlerChainsMetaData;
 import org.jboss.wsf.spi.util.StAXUtils;
 
@@ -153,14 +158,10 @@
             }
             case XMLStreamConstants.START_ELEMENT : {
                if (match(reader, JBOSSWS_JAXWS_CONFIG_NS_4_0, ENDPOINT_CONFIG)) {
-                  EndpointConfig epConfig = new EndpointConfig();
-                  parseConfig(reader, epConfig, ENDPOINT_CONFIG);
-                  configRoot.addEndpointConfig(epConfig);
+                  configRoot.addEndpointConfig(parseEndpointConfig(reader));
                }
                else if (match(reader, JBOSSWS_JAXWS_CONFIG_NS_4_0, CLIENT_CONFIG)) {
-                  ClientConfig clConfig = new ClientConfig();
-                  parseConfig(reader, clConfig, CLIENT_CONFIG);
-                  configRoot.addClientConfig(clConfig);
+                  configRoot.addClientConfig(parseClientConfig(reader));
                }
                else
                {
@@ -172,8 +173,23 @@
       throw MESSAGES.reachedEndOfXMLDocUnexpectedly(getDescriptorForLogs());
    }
    
-   private void parseConfig(XMLStreamReader reader, CommonConfig config, String configElement) throws XMLStreamException
+   private EndpointConfig parseEndpointConfig(final XMLStreamReader reader) throws XMLStreamException
    {
+      return (EndpointConfig)parseConfig(reader, ENDPOINT_CONFIG);
+   }
+   
+   private ClientConfig parseClientConfig(final XMLStreamReader reader) throws XMLStreamException
+   {
+      return (ClientConfig)parseConfig(reader, CLIENT_CONFIG);
+   }
+   
+   private CommonConfig parseConfig(final XMLStreamReader reader, final String configElement) throws XMLStreamException
+   {
+      String configName = null;
+      List<UnifiedHandlerChainMetaData> pre = null;
+      List<UnifiedHandlerChainMetaData> post = null;
+      List<Feature> features = new ArrayList<Feature>(1);
+      List<Prop> properties = new ArrayList<Prop>(1);
       while (reader.hasNext())
       {
          switch (reader.nextTag())
@@ -181,7 +197,24 @@
             case XMLStreamConstants.END_ELEMENT : {
                if (match(reader, JBOSSWS_JAXWS_CONFIG_NS_4_0, configElement))
                {
-                  return;
+                  Map<String, String> props = null;
+                  if (!properties.isEmpty()) {
+                     props = new HashMap<String, String>(properties.size(), 1);
+                     for (Prop ps : properties)
+                     {
+                        props.put(ps.getName(), ps.getValue());
+                     }
+                  }
+                  Map<String, Feature> featuresMap = null;
+                  if (!features.isEmpty()) {
+                     featuresMap = new HashMap<String, Feature>(features.size(), 1);
+                     for (Feature f : features)
+                     {
+                        featuresMap.put(f.getName(), f);
+                     }
+                  }
+                  return CLIENT_CONFIG.equals(configElement) ? new ClientConfig(configName, pre, post, props,
+                        featuresMap) : new EndpointConfig(configName, pre, post, props, featuresMap);
                }
                else
                {
@@ -190,21 +223,21 @@
             }
             case XMLStreamConstants.START_ELEMENT : {
                if (match(reader, JBOSSWS_JAXWS_CONFIG_NS_4_0, CONFIG_NAME)) {
-                  config.setConfigName(elementAsString(reader));
+                  configName = elementAsString(reader);
                }
                else if (match(reader, JBOSSWS_JAXWS_CONFIG_NS_4_0, PRE_HANDLER_CHAINS)) {
                   UnifiedHandlerChainsMetaData uhcmd = parseHandlerChains(reader, JAVAEE_NS, JBOSSWS_JAXWS_CONFIG_NS_4_0, PRE_HANDLER_CHAINS);
-                  config.setPreHandlerChains(uhcmd.getHandlerChains());
+                  pre = uhcmd.getHandlerChains();
                }
                else if (match(reader, JBOSSWS_JAXWS_CONFIG_NS_4_0, POST_HANDLER_CHAINS)) {
                   UnifiedHandlerChainsMetaData uhcmd = parseHandlerChains(reader, JAVAEE_NS, JBOSSWS_JAXWS_CONFIG_NS_4_0, POST_HANDLER_CHAINS);
-                  config.setPostHandlerChains(uhcmd.getHandlerChains());
+                  post = uhcmd.getHandlerChains();
                }
                else if (match(reader, JBOSSWS_JAXWS_CONFIG_NS_4_0, FEATURE)) {
-                  config.setFeature(parseFeature(reader), true);
+                  features.add(parseFeature(reader));
                }
                else if (match(reader, JBOSSWS_JAXWS_CONFIG_NS_4_0, PROPERTY)) {
-                  parseProperty(reader, config);
+                  properties.add(parseProperty(reader));
                }
                else
                {
@@ -216,7 +249,7 @@
       throw MESSAGES.reachedEndOfXMLDocUnexpectedly(getDescriptorForLogs());
    }
    
-   private void parseProperty(XMLStreamReader reader, CommonConfig config) throws XMLStreamException
+   private Prop parseProperty(XMLStreamReader reader) throws XMLStreamException
    {
       String name = null;
       String value = null;
@@ -231,8 +264,7 @@
                   {
                      throw MESSAGES.couldNotGetPropertyName(getDescriptorForLogs());
                   }
-                  config.setProperty(name, value);
-                  return;
+                  return new Prop(name, value);
                }
                else
                {
@@ -256,6 +288,28 @@
       throw MESSAGES.reachedEndOfXMLDocUnexpectedly(getDescriptorForLogs());
    }
    
+   private class Prop {
+      private final String name;
+      private final String value;
+      
+      public Prop(String name, String value)
+      {
+         super();
+         this.name = name;
+         this.value = value;
+      }
+      
+      public String getName()
+      {
+         return name;
+      }
+
+      public String getValue()
+      {
+         return value;
+      }
+   }
+   
    private Feature parseFeature(XMLStreamReader reader) throws XMLStreamException
    {
       Feature feature = null;

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/EndpointConfig.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/EndpointConfig.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/config/EndpointConfig.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2011, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -21,6 +21,11 @@
  */
 package org.jboss.wsf.spi.metadata.config;
 
+import java.util.List;
+import java.util.Map;
+
+import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedHandlerChainMetaData;
+
 /** 
  * A JBossWS endpoint configuration 
  *
@@ -30,4 +35,15 @@
 public class EndpointConfig extends AbstractCommonConfig
 {
    public static final String STANDARD_ENDPOINT_CONFIG = "Standard-Endpoint-Config";
+
+   public EndpointConfig(String configName, List<UnifiedHandlerChainMetaData> preHandlerChains,
+         List<UnifiedHandlerChainMetaData> postHandlerChains, Map<String, String> properties,
+         Map<String, Feature> features)
+   {
+      super(configName, preHandlerChains, postHandlerChains, properties, features);
+   }
+   
+   public EndpointConfig(EndpointConfig base, EndpointConfig conf) {
+      super(base, conf);
+   }
 }

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedHandlerChainMetaData.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedHandlerChainMetaData.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedHandlerChainMetaData.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -22,27 +22,47 @@
 package org.jboss.wsf.spi.metadata.j2ee.serviceref;
 
 import java.io.Serializable;
-import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import javax.xml.namespace.QName;
 
 /** The unified metadata data for a handler chain element
- * 
+ *
  * @author Thomas.Diesler at jboss.org
+ * @author alessio.soldano at jboss.com
  */
 public class UnifiedHandlerChainMetaData implements Serializable
 {
-   private static final long serialVersionUID = 1L;
-   private QName serviceNamePattern;
-   private QName portNamePattern;
-   private String protocolBindings;
-   private List<UnifiedHandlerMetaData> handlers = new ArrayList<UnifiedHandlerMetaData>(4);
-   private boolean excluded;
-   private String id;
+   private static final long serialVersionUID = 4612021639718764949L;
+   
+   private final QName serviceNamePattern;
+   private final QName portNamePattern;
+   private final String protocolBindings;
+   private final List<UnifiedHandlerMetaData> handlers;
+   private final boolean excluded;
+   private final String id;
 
-   public UnifiedHandlerChainMetaData()
+   public UnifiedHandlerChainMetaData(QName serviceNamePattern,
+                                      QName portNamePattern,
+                                      String protocolBindings,
+                                      List<UnifiedHandlerMetaData> handlers,
+                                      boolean excluded,
+                                      String id)
    {
+      this.serviceNamePattern = serviceNamePattern;
+      this.portNamePattern = portNamePattern;
+      this.protocolBindings = protocolBindings;
+      this.excluded = excluded;
+      this.id = id;
+      if (handlers != null && !handlers.isEmpty()) {
+         this.handlers = Collections.unmodifiableList(handlers);
+         for (UnifiedHandlerMetaData uhmd : handlers) {
+            uhmd.setHandlerChain(this);
+         }
+      } else {
+         this.handlers = Collections.emptyList();
+      }
    }
 
    public String getId()
@@ -50,56 +70,27 @@
       return id;
    }
 
-   public void setId(final String id)
-   {
-      this.id = id;
-   }
-
    public QName getPortNamePattern()
    {
       return portNamePattern;
    }
 
-   public void setPortNamePattern(QName portNamePattern)
-   {
-      this.portNamePattern = portNamePattern;
-   }
-
    public QName getServiceNamePattern()
    {
       return serviceNamePattern;
    }
 
-   public void setServiceNamePattern(QName serviceNamePattern)
-   {
-      this.serviceNamePattern = serviceNamePattern;
-   }
-
    public String getProtocolBindings()
    {
       return protocolBindings;
    }
 
-   public void setProtocolBindings(String protocolBindings)
-   {
-      this.protocolBindings = protocolBindings;
-   }
-
    public List<UnifiedHandlerMetaData> getHandlers()
    {
       return handlers;
    }
 
-   public void addHandler(UnifiedHandlerMetaData handler)
-   {
-      handlers.add(handler);
-   }
-   
    public boolean isExcluded() {
       return this.excluded;
    }
-   
-   public void setExcluded(boolean excluded) {
-      this.excluded = excluded;
-   }
 }

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedHandlerChainsMetaData.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedHandlerChainsMetaData.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedHandlerChainsMetaData.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -22,30 +22,37 @@
 package org.jboss.wsf.spi.metadata.j2ee.serviceref;
 
 import java.io.Serializable;
-import java.util.LinkedList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 /** The unified metadata data for a handler chains element
  * 
  * @author Thomas.Diesler at jboss.org
+ * @author alessio.soldano at jboss.com
  */
 public class UnifiedHandlerChainsMetaData implements Serializable
 {
-   private static final long serialVersionUID = 1L;
+   private static final long serialVersionUID = -4983482217732535558L;
+   
+   private final List<UnifiedHandlerChainMetaData> handlerChains;
+   
+   public UnifiedHandlerChainsMetaData(UnifiedHandlerChainMetaData... handlerChains)
+   {
+      this(handlerChains != null ? Arrays.asList(handlerChains) : null);
+   }
 
-   private List<UnifiedHandlerChainMetaData> handlerChains = new LinkedList<UnifiedHandlerChainMetaData>();
-
-   public UnifiedHandlerChainsMetaData()
+   public UnifiedHandlerChainsMetaData(List<UnifiedHandlerChainMetaData> handlerChains)
    {
+      if (handlerChains != null && !handlerChains.isEmpty()) {
+         this.handlerChains = Collections.unmodifiableList(handlerChains);
+      } else {
+         this.handlerChains = Collections.emptyList();
+      }
    }
 
    public List<UnifiedHandlerChainMetaData> getHandlerChains()
    {
       return handlerChains;
    }
-
-   public void addHandlerChain(UnifiedHandlerChainMetaData handlerChain)
-   {
-      handlerChains.add(handlerChain);
-   }
 }

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedHandlerMetaData.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedHandlerMetaData.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedHandlerMetaData.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -22,8 +22,7 @@
 package org.jboss.wsf.spi.metadata.j2ee.serviceref;
 
 import java.io.Serializable;
-import java.util.HashSet;
-import java.util.LinkedList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -33,48 +32,66 @@
  * The unified metadata data for a handler element
  * 
  * @author Thomas.Diesler at jboss.org
+ * @author alessio.soldano at jboss.com
  */
 public class UnifiedHandlerMetaData implements Serializable
 {
-   private static final long serialVersionUID = 1L;
-    
+   private static final long serialVersionUID = 1042008569778083467L;
+
    public enum HandlerType
    {
       PRE, ENDPOINT, POST, ALL
    }
 
-   private UnifiedHandlerChainMetaData handlerChain;
+   private volatile UnifiedHandlerChainMetaData handlerChain;
 
    // The required <handler-name> element
-   private String handlerName;
+   private final String handlerName;
    // The required <handler-class> element
-   private String handlerClass;
+   private final String handlerClass;
    // The optional <init-param> elements
-   private List<UnifiedInitParamMetaData> initParams = new LinkedList<UnifiedInitParamMetaData>();
+   private final List<UnifiedInitParamMetaData> initParams;
    // The optional <soap-header> elements
-   private Set<QName> soapHeaders = new HashSet<QName>(2);
+   private final Set<QName> soapHeaders;
    // The optional <soap-role> elements
-   private Set<String> soapRoles = new HashSet<String>(2);
+   private final Set<String> soapRoles;
    // The optional <port-name> elements, these only apply to webservice clients
-   private Set<String> portNames = new HashSet<String>(4);
+   private final Set<String> portNames;
 
-   public UnifiedHandlerMetaData(UnifiedHandlerChainMetaData handlerChain)
-   {
-      this.handlerChain = handlerChain;
+   public UnifiedHandlerMetaData(String handlerClass,
+                                 String handlerName,
+                                 List<UnifiedInitParamMetaData> initParams,
+                                 Set<QName> soapHeaders,
+                                 Set<String> soapRoles,
+                                 Set<String> portNames) {
+      this.handlerClass = handlerClass;
+      this.handlerName = handlerName;
+      this.initParams = initParams != null ? Collections.unmodifiableList(initParams) : null;
+      if (soapHeaders != null && !soapHeaders.isEmpty()) {
+         this.soapHeaders = Collections.unmodifiableSet(soapHeaders);
+      } else {
+         this.soapHeaders = Collections.emptySet();
+      }
+      if (soapRoles != null && !soapRoles.isEmpty()) {
+         this.soapRoles = Collections.unmodifiableSet(soapRoles);
+      } else {
+         this.soapRoles = Collections.emptySet();
+      }
+      if (portNames != null && !portNames.isEmpty()) {
+         this.portNames = Collections.unmodifiableSet(portNames);
+      } else {
+         this.portNames = Collections.emptySet();
+      }
    }
 
-   public UnifiedHandlerMetaData()
-   {
-   }
-
    public UnifiedHandlerChainMetaData getHandlerChain()
    {
       return handlerChain;
    }
-
-   public void setHandlerName(String value)
+   
+   protected void setHandlerChain(UnifiedHandlerChainMetaData handlerChain)
    {
-      this.handlerName = value;
+      this.handlerChain = handlerChain;
    }
 
    public String getHandlerName()
@@ -82,41 +99,21 @@
       return handlerName;
    }
 
-   public void setHandlerClass(String handlerClass)
-   {
-      this.handlerClass = handlerClass;
-   }
-
    public String getHandlerClass()
    {
       return handlerClass;
    }
 
-   public void addInitParam(UnifiedInitParamMetaData param)
-   {
-      initParams.add(param);
-   }
-
    public List<UnifiedInitParamMetaData> getInitParams()
    {
       return initParams;
    }
 
-   public void addSoapHeader(QName qName)
-   {
-      soapHeaders.add(qName);
-   }
-
    public Set<QName> getSoapHeaders()
    {
       return soapHeaders;
    }
 
-   public void addSoapRole(String value)
-   {
-      soapRoles.add(value);
-   }
-
    public Set<String> getSoapRoles()
    {
       return soapRoles;
@@ -127,11 +124,6 @@
       return portNames;
    }
 
-   public void addPortName(String value)
-   {
-      portNames.add(value);
-   }
-
    public String toString()
    {
       StringBuilder str = new StringBuilder();

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedInitParamMetaData.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedInitParamMetaData.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedInitParamMetaData.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -25,15 +25,18 @@
 
 /**
  * @author Thomas.Diesler at jboss.org
+ * @author alessio.soldano at jboss.com
+ *
  * @since 06-May-2004
  */
 public class UnifiedInitParamMetaData implements Serializable
 {
-   private static final long serialVersionUID = 1L;
+   private static final long serialVersionUID = 2508971618066360091L;
+   
    // The required <param-name> element
-   private String paramName;
+   private final String paramName;
    // The required <param-value> element
-   private String paramValue;
+   private final String paramValue;
 
    public UnifiedInitParamMetaData(String paramName, String paramValue)
    {
@@ -41,30 +44,16 @@
       this.paramValue = paramValue;
    }
    
-   public UnifiedInitParamMetaData()
-   {
-   }
-
    public String getParamName()
    {
       return paramName;
    }
 
-   public void setParamName(String paramName)
-   {
-      this.paramName = paramName;
-   }
-
    public String getParamValue()
    {
       return paramValue;
    }
 
-   public void setParamValue(String paramValue)
-   {
-      this.paramValue = paramValue;
-   }
-
    public String toString()
    {
       return "[name=" + paramName + ",value=" + paramValue + "]";

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedStubPropertyMetaData.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedStubPropertyMetaData.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/j2ee/serviceref/UnifiedStubPropertyMetaData.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -25,36 +25,33 @@
 
 /**
  * @author Thomas.Diesler at jboss.org
+ * @author alessio.soldano at jboss.com
  * @since 06-May-2004
  */
 public class UnifiedStubPropertyMetaData implements Serializable
 {
-   private static final long serialVersionUID = 1L;
+   private static final long serialVersionUID = -4584869798181720949L;
    // The required <prop-name> element
-   private String propName;
+   private final String propName;
    // The required <prop-value> element
-   private String propValue;
+   private final String propValue;
+   
+   public UnifiedStubPropertyMetaData(String propName, String propValue)
+   {
+      this.propName = propName;
+      this.propValue = propValue;
+   }
 
    public String getPropName()
    {
       return propName;
    }
 
-   public void setPropName(String paramName)
-   {
-      this.propName = paramName;
-   }
-
    public String getPropValue()
    {
       return propValue;
    }
 
-   public void setPropValue(String paramValue)
-   {
-      this.propValue = paramValue;
-   }
-
    public String toString()
    {
       return "[name=" + propName + ",value=" + propValue + "]";

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/jms/JMSEndpointMetaData.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/jms/JMSEndpointMetaData.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/jms/JMSEndpointMetaData.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -24,35 +24,43 @@
 /**
  * JMS Meta data class contains the implementor and address information
  * @author <a href="ema at redhat.com">Jim Ma</a>
+ * @author <a href="alessio.soldano at jboss.com">Alessio Soldano</a>
  */
 public class JMSEndpointMetaData
 {
    //Endpoint name
-   private String name;
-   
+   private final String name;
    //port name
-   private String endpointName = "";
-
+   private final String endpointName;
    //implementor class
-   private String implementor = "";
-
+   private final String implementor;
    //wsdl location
-   private String wsdlLocation = "";
-   
-   private String soapAddress = "";
-   
+   private final String wsdlLocation;
+   private final String soapAddress;
    //parent component 
-   private JMSEndpointsMetaData endpointsMetaData = null;
-
-   public JMSEndpointMetaData(JMSEndpointsMetaData endpoints)
+   private volatile JMSEndpointsMetaData endpointsMetaData;
+   
+   public JMSEndpointMetaData(String name, String endpointName, String implementor, String wsdlLocation,
+         String soapAddress)
    {
-      endpointsMetaData = endpoints;
+      this.name = name;
+      this.endpointName = endpointName;
+      this.implementor = implementor;
+      this.wsdlLocation = wsdlLocation;
+      this.soapAddress = soapAddress;
    }
 
    public JMSEndpointsMetaData getParentMetaData()
    {
       return endpointsMetaData;
    }
+   
+   public void setParentMetaData(JMSEndpointsMetaData endpointsMetaData) {
+      if (endpointsMetaData != null) {
+         throw new IllegalStateException();
+      }
+      this.endpointsMetaData = endpointsMetaData;
+   }
 
    public String getImplementor()
    {
@@ -74,34 +82,8 @@
       return wsdlLocation;
    }
 
-   public void setImplementor(String implementor)
-   {
-      this.implementor = implementor;
-   }
-
-   public void setName(String name)
-   {
-      this.name = name;
-   }
-
-   public void setEndpointName(String endpointName)
-   {
-      this.endpointName = endpointName;
-   }
-
-   public void setWsdlLocation(String wsdlLocation)
-   {
-      this.wsdlLocation = wsdlLocation;
-   }
-
    public String getSoapAddress()
    {
       return soapAddress;
    }
-
-   public void setSoapAddress(String soapAddress)
-   {
-      this.soapAddress = soapAddress;
-   }
-
 }

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/jms/JMSEndpointsMetaData.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/jms/JMSEndpointsMetaData.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/jms/JMSEndpointsMetaData.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -21,22 +21,26 @@
  */
 package org.jboss.wsf.spi.metadata.jms;
 
-import java.util.LinkedList;
+import java.util.Collections;
 import java.util.List;
 
 /**
  * @author <a href="ema at redhat.com">Jim Ma</a>
+ * @author <a href="alessio.soldano at jboss.com">Alessio Soldano</a>
  */
 public final class JMSEndpointsMetaData
 {
-
-   private List<JMSEndpointMetaData> jmsEndpointsMD = new LinkedList<JMSEndpointMetaData>();
-
-   public void addEndpointMetaData(JMSEndpointMetaData endpointMetaData)
+   private final List<JMSEndpointMetaData> jmsEndpointsMD;
+   
+   public JMSEndpointsMetaData(List<JMSEndpointMetaData> jmsEndpointsMD)
    {
-       jmsEndpointsMD.add(endpointMetaData);
+      if (jmsEndpointsMD != null && !jmsEndpointsMD.isEmpty()) {
+         this.jmsEndpointsMD = Collections.unmodifiableList(jmsEndpointsMD);
+      } else {
+         this.jmsEndpointsMD = Collections.emptyList();
+      }
    }
-   
+
    public List<JMSEndpointMetaData> getEndpointsMetaData() {
       return jmsEndpointsMD;
    }

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/JBossPortComponentMetaData.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/JBossPortComponentMetaData.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/JBossPortComponentMetaData.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2011, Red Hat, Inc., and individual contributors
+ * Copyright 2013, Red Hat, Inc., and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -24,60 +24,48 @@
 
 /**
  * @author <a href="mailto:ropalka at redhat.com">Richard Opalka</a>
+ * @author <a href="mailto:alessio.soldano at jboss.com">Alessio Soldano</a>
  */
 public final class JBossPortComponentMetaData {
 
-    private String ejbName;
-    private String portComponentName;
-    private String portComponentURI;
-    private String authMethod;
-    private String transportGuarantee;
-    private Boolean secureWSDLAccess;
+   private final String ejbName;
+   private final String portComponentName;
+   private final String portComponentURI;
+   private final String authMethod;
+   private final String transportGuarantee;
+   private final Boolean secureWSDLAccess;
 
-    public void setEjbName(String ejbName) {
-        this.ejbName = ejbName;
-    }
+   public JBossPortComponentMetaData(String ejbName, String portComponentName, String portComponentURI,
+         String authMethod, String transportGuarantee, Boolean secureWSDLAccess)
+   {
+      this.ejbName = ejbName;
+      this.portComponentName = portComponentName;
+      this.portComponentURI = portComponentURI;
+      this.authMethod = authMethod;
+      this.transportGuarantee = transportGuarantee;
+      this.secureWSDLAccess = secureWSDLAccess;
+   }
 
     public String getEjbName() {
         return ejbName;
     }
 
-    public void setPortComponentName(String portComponentName) {
-        this.portComponentName = portComponentName;
-    }
-
     public String getPortComponentName() {
         return portComponentName;
     }
 
-    public void setPortComponentURI(String portComponentURI) {
-        this.portComponentURI = portComponentURI;
-    }
-
     public String getPortComponentURI() {
         return portComponentURI;
     }
 
-    public void setAuthMethod(String authMethod) {
-        this.authMethod = authMethod;
-    }
-
     public String getAuthMethod() {
         return authMethod;
     }
 
-    public void setTransportGuarantee(String transportGuarantee) {
-        this.transportGuarantee = transportGuarantee;
-    }
-
     public String getTransportGuarantee() {
         return transportGuarantee;
     }
 
-    public void setSecureWSDLAccess(Boolean secureWSDLAccess) {
-        this.secureWSDLAccess = secureWSDLAccess;
-    }
-
     public Boolean getSecureWSDLAccess() {
         return secureWSDLAccess;
     }

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/JBossWebserviceDescriptionMetaData.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/JBossWebserviceDescriptionMetaData.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/JBossWebserviceDescriptionMetaData.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -24,26 +24,27 @@
 
 /**
  * @author <a href="mailto:ropalka at redhat.com">Richard Opalka</a>
+ * @author <a href="mailto:alessio.soldano at jboss.com">Alessio Soldano</a>
  */
-public final class JBossWebserviceDescriptionMetaData {
+public final class JBossWebserviceDescriptionMetaData
+{
+   private final String webserviceDescriptionName;
+   private final String wsdlPublishLocation;
 
-    private String webserviceDescriptionName;
-    private String wsdlPublishLocation;
+   public JBossWebserviceDescriptionMetaData(String webserviceDescriptionName, String wsdlPublishLocation)
+   {
+      this.webserviceDescriptionName = webserviceDescriptionName;
+      this.wsdlPublishLocation = wsdlPublishLocation;
+   }
 
-    public void setWsdlPublishLocation(final String wsdlPublishLocation) {
-        this.wsdlPublishLocation = wsdlPublishLocation;
-    }
+   public String getWsdlPublishLocation()
+   {
+      return wsdlPublishLocation;
+   }
 
-    public String getWsdlPublishLocation() {
-        return wsdlPublishLocation;
-    }
+   public String getWebserviceDescriptionName()
+   {
+      return webserviceDescriptionName;
+   }
 
-    public void setWebserviceDescriptionName(final String webserviceDescriptionName) {
-        this.webserviceDescriptionName = webserviceDescriptionName;
-    }
-
-    public String getWebserviceDescriptionName() {
-        return webserviceDescriptionName;
-    }
-
 }

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/JBossWebservicesFactory.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/JBossWebservicesFactory.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/JBossWebservicesFactory.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -50,6 +50,10 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
@@ -165,29 +169,34 @@
 
     private JBossWebservicesMetaData parseWebservices(final XMLStreamReader reader, final String nsUri, final URL descriptorURL)
             throws XMLStreamException {
-        JBossWebservicesMetaData metadata = new JBossWebservicesMetaData(descriptorURL);
+        String contextRoot = null;
+        String configName = null;
+        String configFile = null;
+        List<JBossPortComponentMetaData> jpcmds = new LinkedList<JBossPortComponentMetaData>();
+        List<JBossWebserviceDescriptionMetaData> jwsdmds = new LinkedList<JBossWebserviceDescriptionMetaData>();
+        Map<String, String> props = new HashMap<String, String>();
         while (reader.hasNext()) {
             switch (reader.nextTag()) {
                 case XMLStreamConstants.END_ELEMENT: {
                     if (match(reader, nsUri, WEBSERVICES)) {
-                        return metadata;
+                        return new JBossWebservicesMetaData(contextRoot, configName, configFile, descriptorURL, props, jpcmds, jwsdmds);
                     } else {
                         throw MESSAGES.unexpectedEndTag(getDescriptorForLogs(), reader.getLocalName());
                     }
                 }
                 case XMLStreamConstants.START_ELEMENT: {
                     if (match(reader, nsUri, CONTEXT_ROOT)) {
-                        metadata.setContextRoot(getElementText(reader));
+                        contextRoot = getElementText(reader);
                     } else if (match(reader, nsUri, CONFIG_NAME)) {
-                        metadata.setConfigName(getElementText(reader));
+                        configName = getElementText(reader);
                     } else if (match(reader, nsUri, CONFIG_FILE)) {
-                        metadata.setConfigFile(getElementText(reader));
+                        configFile = getElementText(reader);
                     } else if (match(reader, nsUri, PROPERTY)) {
-                       parseProperty(reader, nsUri, metadata);
+                       parseProperty(reader, nsUri, props);
                     } else if (match(reader, nsUri, PORT_COMPONENT)) {
-                        metadata.addPortComponent(parsePortComponent(reader, nsUri));
+                        jpcmds.add(parsePortComponent(reader, nsUri));
                     } else if (match(reader, nsUri, WEBSERVICE_DESCRIPTION)) {
-                        metadata.addWebserviceDescription(parseWebserviceDescription(reader, nsUri));
+                       jwsdmds.add(parseWebserviceDescription(reader, nsUri));
                     } else {
                         throw MESSAGES.unexpectedElement(getDescriptorForLogs(), reader.getLocalName());
                     }
@@ -198,29 +207,35 @@
     }
 
     private JBossPortComponentMetaData parsePortComponent(XMLStreamReader reader, String nsUri) throws XMLStreamException {
-        JBossPortComponentMetaData pc = new JBossPortComponentMetaData();
+        String ejbName = null;
+        String portComponentName = null;
+        String portComponentURI = null;
+        String authMethod = null;
+        String transportGuarantee = null;
+        Boolean secureWsdlAccess = null;
         while (reader.hasNext()) {
             switch (reader.nextTag()) {
                 case XMLStreamConstants.END_ELEMENT: {
                     if (match(reader, nsUri, PORT_COMPONENT)) {
-                        return pc;
+                        return new JBossPortComponentMetaData(ejbName, portComponentName, portComponentURI,
+                              authMethod, transportGuarantee, secureWsdlAccess);
                     } else {
                         throw MESSAGES.unexpectedEndTag(getDescriptorForLogs(), reader.getLocalName());
                     }
                 }
                 case XMLStreamConstants.START_ELEMENT: {
                     if (match(reader, nsUri, EJB_NAME)) {
-                        pc.setEjbName(getElementText(reader));
+                        ejbName = getElementText(reader);
                     } else if (match(reader, nsUri, PORT_COMPONENT_NAME)) {
-                        pc.setPortComponentName(getElementText(reader));
+                        portComponentName = getElementText(reader);
                     } else if (match(reader, nsUri, PORT_COMPONENT_URI)) {
-                        pc.setPortComponentURI(getElementText(reader));
+                        portComponentURI = getElementText(reader);
                     } else if (match(reader, nsUri, AUTH_METHOD)) {
-                        pc.setAuthMethod(getElementText(reader));
+                        authMethod = getElementText(reader);
                     } else if (match(reader, nsUri, TRANSPORT_GUARANTEE)) {
-                        pc.setTransportGuarantee(getElementText(reader));
+                        transportGuarantee = getElementText(reader);
                     } else if (match(reader, nsUri, SECURE_WSDL_ACCESS)) {
-                        pc.setSecureWSDLAccess(elementAsBoolean(reader));
+                        secureWsdlAccess = elementAsBoolean(reader);
                     } else {
                         throw MESSAGES.unexpectedElement(getDescriptorForLogs(), reader.getLocalName());
                     }
@@ -232,21 +247,22 @@
 
     private JBossWebserviceDescriptionMetaData parseWebserviceDescription(XMLStreamReader reader, String nsUri)
             throws XMLStreamException {
-        JBossWebserviceDescriptionMetaData description = new JBossWebserviceDescriptionMetaData();
+        String webserviceDescriptionName = null;
+        String wsdlPublishLocation = null;
         while (reader.hasNext()) {
             switch (reader.nextTag()) {
                 case XMLStreamConstants.END_ELEMENT: {
                     if (match(reader, nsUri, WEBSERVICE_DESCRIPTION)) {
-                        return description;
+                        return new JBossWebserviceDescriptionMetaData(webserviceDescriptionName, wsdlPublishLocation);
                     } else {
                         throw MESSAGES.unexpectedEndTag(getDescriptorForLogs(), reader.getLocalName());
                     }
                 }
                 case XMLStreamConstants.START_ELEMENT: {
                     if (match(reader, nsUri, WEBSERVICE_DESCRIPTION_NAME)) {
-                        description.setWebserviceDescriptionName(getElementText(reader));
+                        webserviceDescriptionName = getElementText(reader);
                     } else if (match(reader, nsUri, WSDL_PUBLISH_LOCATION)) {
-                        description.setWsdlPublishLocation(getElementText(reader));
+                        wsdlPublishLocation = getElementText(reader);
                     } else {
                         throw MESSAGES.unexpectedElement(getDescriptorForLogs(), reader.getLocalName());
                     }
@@ -256,7 +272,7 @@
         throw MESSAGES.reachedEndOfXMLDocUnexpectedly(getDescriptorForLogs());
     }
     
-    private void parseProperty(XMLStreamReader reader, String nsUri, JBossWebservicesMetaData metadata) throws XMLStreamException
+    private void parseProperty(XMLStreamReader reader, String nsUri, Map<String, String> map) throws XMLStreamException
     {
        String name = null;
        String value = null;
@@ -271,7 +287,7 @@
                    {
                       throw MESSAGES.couldNotGetPropertyName(getDescriptorForLogs());
                    }
-                   metadata.setProperty(name, value);
+                   map.put(name, value);
                    return;
                 }
                 else

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/JBossWebservicesMetaData.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/JBossWebservicesMetaData.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/JBossWebservicesMetaData.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2011, Red Hat, Inc., and individual contributors
+ * Copyright 2013, Red Hat, Inc., and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -23,86 +23,81 @@
 package org.jboss.wsf.spi.metadata.webservices;
 
 import java.net.URL;
-import java.util.HashMap;
-import java.util.LinkedList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
 /**
  * @author <a href="mailto:ropalka at redhat.com">Richard Opalka</a>
+ * @author <a href="mailto:alessio.soldano at jboss.com">Alessio Soldano</a>
  */
 public final class JBossWebservicesMetaData {
 
-    private String contextRoot;
-
-    private String configName;
-
-    private String configFile;
+    private final String contextRoot;
+    private final String configName;
+    private final String configFile;
+    private final Map<String, String> properties;
+    private final List<JBossPortComponentMetaData> portComponents;
+    private final List<JBossWebserviceDescriptionMetaData> webserviceDescriptions;
+    private final URL descriptorURL;
     
-    private Map<String, String> properties = new HashMap<String, String>();
-
-    private List<JBossPortComponentMetaData> portComponents = new LinkedList<JBossPortComponentMetaData>();
-
-    private List<JBossWebserviceDescriptionMetaData> webserviceDescriptions = new LinkedList<JBossWebserviceDescriptionMetaData>();
-
-    private URL descriptorURL;
-
-    public JBossWebservicesMetaData(final URL descriptorURL) {
-        this.descriptorURL = descriptorURL;
+    public JBossWebservicesMetaData(String contextRoot,
+                                    String configName,
+                                    String configFile,
+                                    URL descriptorURL,
+                                    Map<String, String> properties,
+                                    List<JBossPortComponentMetaData> portComponents,
+                                    List<JBossWebserviceDescriptionMetaData> webserviceDescriptions)
+    {
+      this.contextRoot = contextRoot;
+      this.configName = configName;
+      this.configFile = configFile;
+      this.descriptorURL = descriptorURL;
+      if (properties != null && !properties.isEmpty()) {
+         this.properties = Collections.unmodifiableMap(properties);
+      } else {
+         this.properties = Collections.emptyMap();
+      }
+      if (portComponents != null && !portComponents.isEmpty()) {
+         this.portComponents = Collections.unmodifiableList(portComponents);
+      } else {
+         this.portComponents = Collections.emptyList();
+      }
+      if (webserviceDescriptions != null && !webserviceDescriptions.isEmpty()) {
+         this.webserviceDescriptions = Collections.unmodifiableList(webserviceDescriptions);
+      } else {
+         this.webserviceDescriptions = Collections.emptyList();
+      }
     }
 
     public URL getDescriptorURL() {
         return descriptorURL;
     }
 
-    public void setContextRoot(final String contextRoot) {
-        this.contextRoot = contextRoot;
-    }
-
     public String getContextRoot() {
         return contextRoot;
     }
 
-    public void setConfigName(final String configName) {
-        this.configName = configName;
-    }
-
     public String getConfigName() {
         return configName;
     }
 
-    public void setConfigFile(final String configFile) {
-        this.configFile = configFile;
-    }
-
     public String getConfigFile() {
         return configFile;
     }
 
-    public void addPortComponent(final JBossPortComponentMetaData portComponent) {
-        portComponents.add(portComponent);
-    }
-
     public JBossPortComponentMetaData[] getPortComponents() {
         final JBossPortComponentMetaData[] array = new JBossPortComponentMetaData[portComponents.size()];
         portComponents.toArray(array);
         return array;
     }
 
-    public void addWebserviceDescription(final JBossWebserviceDescriptionMetaData webserviceDescriptionMD) {
-        webserviceDescriptions.add(webserviceDescriptionMD);
-    }
-
     public JBossWebserviceDescriptionMetaData[] getWebserviceDescriptions() {
         final JBossWebserviceDescriptionMetaData[] array = new JBossWebserviceDescriptionMetaData[webserviceDescriptions.size()];
         webserviceDescriptions.toArray(array);
         return array;
     }
     
-    public void setProperty(String name, String value) {
-       properties.put(name, value);
-    }
-
     public String getProperty(String name) {
        return properties.get(name);
     }
@@ -110,5 +105,4 @@
     public Map<String, String> getProperties() {
        return properties;
     }
-
 }

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/PortComponentMetaData.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/PortComponentMetaData.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/PortComponentMetaData.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -21,7 +21,7 @@
  */
 package org.jboss.wsf.spi.metadata.webservices;
 
-import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import javax.xml.namespace.QName;
@@ -40,6 +40,7 @@
  * <p/>
  *
  * @author Thomas.Diesler at jboss.org
+ * @author alessio.soldano at jboss.com
  * @since 15-April-2004
  */
 public class PortComponentMetaData
@@ -50,109 +51,129 @@
    public static final String PARAMETER_WEBSERVICE_ID = "webserviceID";
 
    // The parent <webservice-description> element
-   private WebserviceDescriptionMetaData webserviceDescription;
+   private volatile WebserviceDescriptionMetaData webserviceDescription;
 
    /** The required <port-component-name> element
     * This name bears no relationship to the WSDL port name.
     * This name must be unique amongst all port component names in a module.
     */
-   private String portComponentName;
+   private final String portComponentName;
    // The required <wsdl-port> element
-   private QName wsdlPort;
+   private final QName wsdlPort;
    // The required <service-endpoint-interface> element
-   private String serviceEndpointInterface;
+   private final String serviceEndpointInterface;
    // The required <ejb-link> or <servlet-link> in the <service-impl-bean> element
-   private String ejbLink;
-   private String servletLink;
+   private final String ejbLink;
+   private final String servletLink;
    // The optional <handler> elements
-   private List<UnifiedHandlerMetaData> handlers = new ArrayList<UnifiedHandlerMetaData>(2);
+   private final List<UnifiedHandlerMetaData> handlers;
 
    // The HTTP context root
-   private String contextRoot;
+   private final String contextRoot;
 
    // -----------------------------------------
    // JAX-WS additions
 
    // The optional <adressing> element
-   private boolean addressingEnabled;
-   private boolean addressingRequired;
-   private String addressingResponses = "ALL";
+   private final boolean addressingEnabled;
+   private final boolean addressingRequired;
+   private final String addressingResponses;
    // The optional <enable-mtom> element
-   private boolean mtomEnabled;
+   private final boolean mtomEnabled;
    // The optional <mtom-threshold> element
-   private int mtomThreshold;
+   private final int mtomThreshold;
    // @RespectBinding annotation metadata
-   private boolean respectBindingEnabled;
-   private QName wsdlService;
-   private String protocolBinding;
-   private UnifiedHandlerChainsMetaData handlerChains;
+   private final boolean respectBindingEnabled;
+   private final QName wsdlService;
+   private final String protocolBinding;
+   private final UnifiedHandlerChainsMetaData handlerChains;
 
-
-   /** Construct a new PortComponentMetaData for a given WebserviceDescriptionMetaData
-    */
-   public PortComponentMetaData(WebserviceDescriptionMetaData webserviceDescription)
+   public PortComponentMetaData(String portComponentName,
+                                QName wsdlPort,
+                                String serviceEndpointInterface,
+                                String ejbLink,
+                                String servletLink,
+                                List<UnifiedHandlerMetaData> handlers,
+                                String contextRoot,
+                                boolean addressingEnabled,
+                                boolean addressingRequired,
+                                String addressingResponses,
+                                boolean mtomEnabled,
+                                int mtomThreshold,
+                                boolean respectBindingEnabled,
+                                QName wsdlService,
+                                String protocolBinding,
+                                UnifiedHandlerChainsMetaData handlerChains)
    {
-      this.webserviceDescription = webserviceDescription;
+      this.portComponentName = portComponentName;
+      if (wsdlPort.getNamespaceURI().length() == 0)
+         Loggers.METADATA_LOGGER.webservicesXmlElementNotNamespaceQualified(wsdlPort);
+      this.wsdlPort = wsdlPort;
+      this.serviceEndpointInterface = serviceEndpointInterface;
+      this.ejbLink = ejbLink;
+      this.servletLink = servletLink;
+      if (handlers != null && !handlers.isEmpty()) {
+         this.handlers = Collections.unmodifiableList(handlers);
+      } else {
+         this.handlers = Collections.emptyList();
+      }
+      this.contextRoot = contextRoot;
+      this.addressingEnabled = addressingEnabled;
+      this.addressingRequired = addressingRequired;
+      if (!"ANONYMOUS".equals(addressingResponses) && !"NON_ANONYMOUS".equals(addressingResponses) && !"ALL".equals(addressingResponses))
+         throw Messages.MESSAGES.unsupportedAddressingResponseType(addressingResponses);
+      this.addressingResponses = addressingResponses;
+      this.mtomEnabled = mtomEnabled;
+      this.mtomThreshold = mtomThreshold;
+      this.respectBindingEnabled = respectBindingEnabled;
+      this.wsdlService = wsdlService;
+      this.protocolBinding = protocolBinding;
+      this.handlerChains = handlerChains;
    }
 
+   public PortComponentMetaData(String portComponentName, QName wsdlPort, String serviceEndpointInterface,
+         String ejbLink, String servletLink, List<UnifiedHandlerMetaData> handlers, String contextRoot,
+         QName wsdlService, String protocolBinding, UnifiedHandlerChainsMetaData handlerChains)
+   {
+      this(portComponentName, wsdlPort, serviceEndpointInterface, ejbLink, servletLink, handlers, contextRoot,
+            false, false, "ALL", false, 0, false, wsdlService, protocolBinding, handlerChains);
+   }
+   
    public WebserviceDescriptionMetaData getWebserviceDescription()
    {
       return webserviceDescription;
    }
+   
+   protected void setWebserviceDescription(WebserviceDescriptionMetaData webserviceDescription)
+   {
+      this.webserviceDescription = webserviceDescription;
+   }
 
    public String getPortComponentName()
    {
       return portComponentName;
    }
 
-   public void setPortComponentName(String portComponentName)
-   {
-      this.portComponentName = portComponentName;
-   }
-
    public QName getWsdlPort()
    {
       return wsdlPort;
    }
 
-   public void setWsdlPort(QName wsdlPort)
-   {
-      if (wsdlPort.getNamespaceURI().length() == 0)
-         Loggers.METADATA_LOGGER.webservicesXmlElementNotNamespaceQualified(wsdlPort);
-
-      this.wsdlPort = wsdlPort;
-   }
-
    public String getEjbLink()
    {
       return ejbLink;
    }
 
-   public void setEjbLink(String ejbLink)
-   {
-      this.ejbLink = ejbLink;
-   }
-
    public String getServletLink()
    {
       return servletLink;
    }
 
-   public void setServletLink(String servletLink)
-   {
-      this.servletLink = servletLink;
-   }
-
    public String getServiceEndpointInterface()
    {
       return serviceEndpointInterface;
    }
 
-   public void setServiceEndpointInterface(String serviceEndpointInterface)
-   {
-      this.serviceEndpointInterface = serviceEndpointInterface;
-   }
-
    public void addHandler(UnifiedHandlerMetaData handler)
    {
       handlers.add(handler);
@@ -170,60 +191,26 @@
       return contextRoot;
    }
 
-   public void setContextRoot(String contextRoot)
-   {
-      this.contextRoot = contextRoot;
-   }
-
-   public void setAddressingEnabled(final boolean addressingEnabled) {
-      this.addressingEnabled = addressingEnabled;
-   }
-   
    public boolean isAddressingEnabled() {
       return this.addressingEnabled;
    }
 
-   public void setAddressingRequired(final boolean addressingRequired) {
-      this.addressingRequired = addressingRequired;
-   }
-   
    public boolean isAddressingRequired() {
       return this.addressingRequired;
    }
    
-   public void setAddressingResponses(final String responsesTypes)
-   {
-      if (!"ANONYMOUS".equals(responsesTypes) && !"NON_ANONYMOUS".equals(responsesTypes) && !"ALL".equals(responsesTypes))
-         throw Messages.MESSAGES.unsupportedAddressingResponseType(responsesTypes);
-
-      this.addressingResponses = responsesTypes;
-   }
-   
    public String getAddressingResponses() {
       return this.addressingResponses;
    }
 
-   public void setMtomEnabled(final boolean mtomEnabled) {
-      this.mtomEnabled = mtomEnabled;
-   }
-   
    public boolean isMtomEnabled() {
       return this.mtomEnabled;
    }
 
-   public void setMtomThreshold(final int mtomThreshold)
-   {
-      this.mtomThreshold = mtomThreshold;
-   }
-   
    public int getMtomThreshold() {
       return this.mtomThreshold;
    }
 
-   public void setRespectBindingEnabled(final boolean respectBindingEnabled) {
-      this.respectBindingEnabled = respectBindingEnabled;
-   }
-   
    public boolean isRespectBindingEnabled() {
       return this.respectBindingEnabled;
    }
@@ -233,31 +220,16 @@
       return wsdlService;
    }
 
-   public void setWsdlService(QName wsdlService)
-   {
-      this.wsdlService = wsdlService;
-   }
-
    public String getProtocolBinding()
    {
       return protocolBinding;
    }
 
-   public void setProtocolBinding(String protocolBinding)
-   {
-      this.protocolBinding = protocolBinding;
-   }
-
    public UnifiedHandlerChainsMetaData getHandlerChains()
    {
       return handlerChains;
    }
 
-   public void setHandlerChains(UnifiedHandlerChainsMetaData handlerChains)
-   {
-      this.handlerChains = handlerChains;
-   }
-
    public String serialize()
    {
       StringBuilder builder = new StringBuilder("<port-component>");

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/WebserviceDescriptionMetaData.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/WebserviceDescriptionMetaData.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/WebserviceDescriptionMetaData.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -22,8 +22,11 @@
 package org.jboss.wsf.spi.metadata.webservices;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import javax.xml.namespace.QName;
@@ -34,35 +37,54 @@
  * XML Binding element for <code>webservices/webservice-description</code>
  *
  * @author Thomas.Diesler at jboss.org
+ * @author alessio.soldano at jboss.com
  * @since 15-April-2004
  */
 public class WebserviceDescriptionMetaData
 {
    // The parent <webservices> element
-   private WebservicesMetaData webservices;
+   private volatile WebservicesMetaData webservices;
 
    // The required <webservice-description-name> element
-   private String webserviceDescriptionName;
+   private final String webserviceDescriptionName;
    // The required <wsdl-file> element
-   private String wsdlFile;
+   private final String wsdlFile;
    // The required <jaxrpc-mapping-file> element
-   private String jaxrpcMappingFile;
+   private final String jaxrpcMappingFile;
    // The required <port-component> elements
-   private ArrayList<PortComponentMetaData> portComponents = new ArrayList<PortComponentMetaData>();
-
-   public WebserviceDescriptionMetaData(WebservicesMetaData webservices)
+   private final List<PortComponentMetaData> portComponents; // = new ArrayList<PortComponentMetaData>();
+   
+   public WebserviceDescriptionMetaData(String webserviceDescriptionName,
+         String wsdlFile, String jaxrpcMappingFile, PortComponentMetaData... portComponents)
    {
+      this(webserviceDescriptionName, wsdlFile, jaxrpcMappingFile, portComponents != null ? Arrays.asList(portComponents) : null);
+   }
+   
+   public WebserviceDescriptionMetaData(String webserviceDescriptionName,
+         String wsdlFile, String jaxrpcMappingFile, List<PortComponentMetaData> portComponents)
+   {
       this.webservices = webservices;
+      this.webserviceDescriptionName = webserviceDescriptionName;
+      this.wsdlFile = wsdlFile;
+      this.jaxrpcMappingFile = jaxrpcMappingFile;
+      if (portComponents != null && !portComponents.isEmpty()) {
+         this.portComponents = Collections.unmodifiableList(portComponents);
+         for (PortComponentMetaData pcm : portComponents) {
+            pcm.setWebserviceDescription(this);
+         }
+      } else {
+         this.portComponents = Collections.emptyList();
+      }
    }
 
    public WebservicesMetaData getWebservices()
    {
       return webservices;
    }
-
-   public void addPortComponent(PortComponentMetaData portComponent)
+   
+   protected void setWebservices(WebservicesMetaData webservices)
    {
-      portComponents.add(portComponent);
+      this.webservices = webservices;
    }
 
    public PortComponentMetaData[] getPortComponents()
@@ -129,31 +151,16 @@
       return webserviceDescriptionName;
    }
 
-   public void setWebserviceDescriptionName(String webserviceDescriptionName)
-   {
-      this.webserviceDescriptionName = webserviceDescriptionName;
-   }
-
    public String getWsdlFile()
    {
       return wsdlFile;
    }
 
-   public void setWsdlFile(String wsdlFile)
-   {
-      this.wsdlFile = wsdlFile;
-   }
-
    public String getJaxrpcMappingFile()
    {
       return jaxrpcMappingFile;
    }
 
-   public void setJaxrpcMappingFile(String jaxrpcMappingFile)
-   {
-      this.jaxrpcMappingFile = jaxrpcMappingFile;
-   }
-
    /**
     * Serialize as a String
     * 

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/WebservicesFactory.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/WebservicesFactory.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/WebservicesFactory.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -59,7 +59,10 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
 
+import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
@@ -67,6 +70,8 @@
 
 import org.jboss.wsf.spi.deployment.UnifiedVirtualFile;
 import org.jboss.wsf.spi.metadata.AbstractHandlerChainsMetaDataParser;
+import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedHandlerChainsMetaData;
+import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedHandlerMetaData;
 import org.jboss.wsf.spi.util.StAXUtils;
 
 /**
@@ -197,7 +202,7 @@
    
    private WebservicesMetaData parseWebservices(XMLStreamReader reader, String nsUri, URL descriptorURL) throws XMLStreamException
    {
-      WebservicesMetaData metadata = new WebservicesMetaData(descriptorURL);
+      List<WebserviceDescriptionMetaData> wsdmds = new ArrayList<WebserviceDescriptionMetaData>(2);
       while (reader.hasNext())
       {
          switch (reader.nextTag())
@@ -205,7 +210,7 @@
             case XMLStreamConstants.END_ELEMENT : {
                if (match(reader, nsUri, WEBSERVICES))
                {
-                  return metadata;
+                  return new WebservicesMetaData(descriptorURL, wsdmds);
                } 
                else
                {
@@ -214,7 +219,7 @@
             }
             case XMLStreamConstants.START_ELEMENT : {
                if (match(reader, nsUri, WEBSERVICE_DESCRIPTION)) {
-                  metadata.addWebserviceDescription(parseWebserviceDescription(reader, nsUri, metadata));                 
+                  wsdmds.add(parseWebserviceDescription(reader, nsUri));                 
                } else if (match(reader, nsUri, "description") || match(reader, nsUri, "display-name")) {
             	   //skip to parse
                   getElementText(reader);
@@ -235,9 +240,12 @@
       throw MESSAGES.reachedEndOfXMLDocUnexpectedly(getDescriptorForLogs());
    }
    
-   WebserviceDescriptionMetaData parseWebserviceDescription(XMLStreamReader reader, String nsUri, WebservicesMetaData wsMetaData) throws XMLStreamException
+   WebserviceDescriptionMetaData parseWebserviceDescription(XMLStreamReader reader, String nsUri) throws XMLStreamException
    {
-      WebserviceDescriptionMetaData description = new WebserviceDescriptionMetaData(wsMetaData);
+      String wsdlFile = null;
+      String descriptionName = null;
+      String jaxrpcMappingFile = null;
+      List<PortComponentMetaData> pcms = new ArrayList<PortComponentMetaData>();
       while (reader.hasNext())
       {
          switch (reader.nextTag())
@@ -245,7 +253,7 @@
             case XMLStreamConstants.END_ELEMENT : {
                if (match(reader, nsUri, WEBSERVICE_DESCRIPTION))
                {
-                  return description;
+                  return new WebserviceDescriptionMetaData(descriptionName, wsdlFile, jaxrpcMappingFile, pcms);
                }
                else
                {
@@ -254,16 +262,16 @@
             }
             case XMLStreamConstants.START_ELEMENT : {
                if (match(reader, nsUri, WEBSERVICE_DESCRIPTION_NAME)) {
-                  description.setWebserviceDescriptionName(getElementText(reader));
+                  descriptionName = getElementText(reader);
                }
                else if (match(reader, nsUri, WSDL_FILE)) {
-                  description.setWsdlFile(getElementText(reader));
+                  wsdlFile = getElementText(reader);
                }
                else if (match(reader, nsUri, JAXRPC_MAPPING_FILE)) {
-                   description.setJaxrpcMappingFile(getElementText(reader));
+                   jaxrpcMappingFile = getElementText(reader);
                }
                else if (match(reader, nsUri, PORT_COMPONENT)) {
-                  description.addPortComponent(parsePortComponent(reader, nsUri, description));
+                  pcms.add(parsePortComponent(reader, nsUri));
                }
                else
                {
@@ -275,9 +283,20 @@
       throw MESSAGES.reachedEndOfXMLDocUnexpectedly(getDescriptorForLogs());
    }
    
-   private PortComponentMetaData parsePortComponent(XMLStreamReader reader, String nsUri, WebserviceDescriptionMetaData desc) throws XMLStreamException
+   private PortComponentMetaData parsePortComponent(XMLStreamReader reader, String nsUri) throws XMLStreamException
    {
-      PortComponentMetaData pc = new PortComponentMetaData(desc);
+      boolean respectBindingEnabled = false;
+      PortComponentAddressing addressing = new PortComponentAddressing();
+      PortComponentLinks links = new PortComponentLinks();
+      String name = null;
+      QName wsdlService = null;
+      QName wsdlPort = null;
+      boolean mtomEnabled = false;
+      int mtomThreshold = 0;
+      String protocolBinding = null;
+      String serviceEndpointInterface = null;
+      UnifiedHandlerChainsMetaData uhcs = null;
+      List<UnifiedHandlerMetaData> handlers = new ArrayList<UnifiedHandlerMetaData>(2);
       while (reader.hasNext())
       {
          switch (reader.nextTag())
@@ -285,7 +304,8 @@
             case XMLStreamConstants.END_ELEMENT : {
                if (match(reader, nsUri, PORT_COMPONENT))
                {
-                  return pc;
+                  return new PortComponentMetaData(name, wsdlPort, serviceEndpointInterface, links.ejb, links.servlet, handlers, null, addressing.enabled,
+                        addressing.required, addressing.responses, mtomEnabled, mtomThreshold, respectBindingEnabled, wsdlService, protocolBinding, uhcs);
                }
                else
                {
@@ -294,7 +314,7 @@
             }
             case XMLStreamConstants.START_ELEMENT : {           	
                if (match(reader, nsUri, PORT_COMPONENT_NAME)) {
-                  pc.setPortComponentName(getElementText(reader));
+                  name = getElementText(reader);
                }
                else if (match(reader, nsUri, "description") || match(reader, nsUri, "display-name")) {
             	   //skip to parse
@@ -306,37 +326,37 @@
             	   }
                }
                else if (match(reader, nsUri, WSDL_SERVICE)) {
-                  pc.setWsdlService(elementAsQName(reader));
+                  wsdlService = elementAsQName(reader);
                }
                else if (match(reader, nsUri, WSDL_PORT)) {
-                  pc.setWsdlPort(elementAsQName(reader));
+                  wsdlPort = elementAsQName(reader);
                }
                else if (match(reader, nsUri, ENABLE_MTOM)) {
-                  pc.setMtomEnabled(elementAsBoolean(reader));
+                  mtomEnabled = elementAsBoolean(reader);
                }
                else if (match(reader, nsUri, MTOM_THRESHOLD)) {
-                  pc.setMtomThreshold(elementAsInt(reader));
+                  mtomThreshold = elementAsInt(reader);
                }
                else if (match(reader, nsUri, ADDRESSING)) {
-                  parseAddressing(reader, nsUri, pc);
+                  parseAddressing(reader, nsUri, addressing);
                }
                else if (match(reader, nsUri, RESPECT_BINDING)) {
-                  parseRespectBinding(reader, nsUri, pc);
+                  respectBindingEnabled = parseRespectBinding(reader, nsUri);
                }
                else if (match(reader, nsUri, PROTOCOL_BINDING)) {
-                  pc.setProtocolBinding(getElementText(reader));
+                  protocolBinding = getElementText(reader);
                }
                else if (match(reader, nsUri, SERVICE_ENDPOINT_INTERFACE)) {
-                  pc.setServiceEndpointInterface(getElementText(reader));
+                  serviceEndpointInterface = getElementText(reader);
                }
                else if (match(reader, nsUri, SERVICE_IMPL_BEAN)) {
-                  parseServiceImplBean(reader, nsUri, pc);
+                  parseServiceImplBean(reader, nsUri, links);
                }
                else if (match(reader, nsUri, HANDLER_CHAINS)) {
-                  pc.setHandlerChains(parseHandlerChains(reader, nsUri));
+                  uhcs = parseHandlerChains(reader, nsUri);
                }
                else if (match(reader, nsUri, HANDLER)) {
-                  pc.addHandler(parseHandler(reader, nsUri));
+                  handlers.add(parseHandler(reader, nsUri));
                }
                else
                {
@@ -352,7 +372,7 @@
       return elementAsString(reader);
    }
    
-   private void parseAddressing(XMLStreamReader reader, String nsUri, PortComponentMetaData pc) throws XMLStreamException
+   private void parseAddressing(XMLStreamReader reader, String nsUri, PortComponentAddressing pca) throws XMLStreamException
    {
       while (reader.hasNext())
       {
@@ -370,13 +390,13 @@
             }
             case XMLStreamConstants.START_ELEMENT : {
                if (match(reader, nsUri, ENABLED)) {
-                  pc.setAddressingEnabled(elementAsBoolean(reader));
+                  pca.enabled = elementAsBoolean(reader);
                }
                else if (match(reader, nsUri, REQUIRED)) {
-                  pc.setAddressingRequired(elementAsBoolean(reader));
+                  pca.required = elementAsBoolean(reader);
                }
                else if (match(reader, nsUri, ADDRESSING_RESPONSES)) {
-                  pc.setAddressingResponses(getElementText(reader));
+                  pca.responses = getElementText(reader);
                }
                else
                {
@@ -388,8 +408,15 @@
       throw MESSAGES.reachedEndOfXMLDocUnexpectedly(getDescriptorForLogs());
    }
    
-   private void parseRespectBinding(XMLStreamReader reader, String nsUri, PortComponentMetaData pc) throws XMLStreamException
+   private class PortComponentAddressing {
+      public boolean enabled = false;
+      public boolean required = false;
+      public String responses = "ALL";
+   }
+   
+   private boolean parseRespectBinding(XMLStreamReader reader, String nsUri) throws XMLStreamException
    {
+      boolean respectBindingEnabled = false;
       while (reader.hasNext())
       {
          switch (reader.nextTag())
@@ -397,7 +424,7 @@
             case XMLStreamConstants.END_ELEMENT : {
                if (match(reader, nsUri, RESPECT_BINDING))
                {
-                  return;
+                  return respectBindingEnabled;
                }
                else
                {
@@ -406,7 +433,7 @@
             }
             case XMLStreamConstants.START_ELEMENT : {
                if (match(reader, nsUri, ENABLED)) {
-                  pc.setRespectBindingEnabled(elementAsBoolean(reader));
+                  respectBindingEnabled = elementAsBoolean(reader);
                }
                else
                {
@@ -418,7 +445,7 @@
       throw MESSAGES.reachedEndOfXMLDocUnexpectedly(getDescriptorForLogs());
    }
    
-   private void parseServiceImplBean(XMLStreamReader reader, String nsUri, PortComponentMetaData pc) throws XMLStreamException
+   private void parseServiceImplBean(XMLStreamReader reader, String nsUri, PortComponentLinks pcl) throws XMLStreamException
    {
       while (reader.hasNext())
       {
@@ -436,10 +463,10 @@
             }
             case XMLStreamConstants.START_ELEMENT : {
                if (match(reader, nsUri, SERVLET_LINK)) {
-                  pc.setServletLink(getElementText(reader));
+                  pcl.servlet = getElementText(reader);
                }
                else if (match(reader, nsUri, EJB_LINK)) {
-                  pc.setEjbLink(getElementText(reader));
+                  pcl.ejb = getElementText(reader);
                }
                else
                {
@@ -451,6 +478,11 @@
       throw MESSAGES.reachedEndOfXMLDocUnexpectedly(getDescriptorForLogs());
    }
    
+   private class PortComponentLinks {
+      public String servlet;
+      public String ejb;
+   }
+   
    @Override
    protected String getDescriptorForLogs() {
       return descriptorURL != null ? descriptorURL.toString() : "webservices.xml";

Modified: spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/WebservicesMetaData.java
===================================================================
--- spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/WebservicesMetaData.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/main/java/org/jboss/wsf/spi/metadata/webservices/WebservicesMetaData.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -1,6 +1,6 @@
 /*
  * JBoss, Home of Professional Open Source.
- * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * Copyright 2013, Red Hat Middleware LLC, and individual contributors
  * as indicated by the @author tags. See the copyright.txt file in the
  * distribution for a full listing of individual contributors.
  *
@@ -22,28 +22,40 @@
 package org.jboss.wsf.spi.metadata.webservices;
 
 import java.net.URL;
-import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 
 /**
  * XML Binding root element for <code>webservices.xml</code>
  *
  * @author Thomas.Diesler at jboss.org
+ * @autor alessio.soldano at jboss.com
  * @since 15-April-2004
  */
 public class WebservicesMetaData
 {
    // The required <webservice-description> elements
-   private ArrayList<WebserviceDescriptionMetaData> webserviceDescriptions = new ArrayList<WebserviceDescriptionMetaData>(2);
+   private final List<WebserviceDescriptionMetaData> webserviceDescriptions;
 
    // The URL to the webservices.xml descriptor
-   private URL descriptorURL;
-
-   public WebservicesMetaData()
+   private final URL descriptorURL;
+   
+   public WebservicesMetaData(URL descriptorURL, WebserviceDescriptionMetaData... webserviceDescriptions)
    {
+      this(descriptorURL, webserviceDescriptions != null ? Arrays.asList(webserviceDescriptions) : null);
    }
-
-   public WebservicesMetaData(URL descriptorURL)
+   
+   public WebservicesMetaData(URL descriptorURL, List<WebserviceDescriptionMetaData> webserviceDescriptions)
    {
+      if (webserviceDescriptions != null && !webserviceDescriptions.isEmpty()) {
+         this.webserviceDescriptions = Collections.unmodifiableList(webserviceDescriptions);
+         for (WebserviceDescriptionMetaData wsdmd : webserviceDescriptions) {
+            wsdmd.setWebservices(this);
+         }
+      } else {
+         this.webserviceDescriptions = Collections.emptyList();
+      }
       this.descriptorURL = descriptorURL;
    }
 
@@ -52,11 +64,6 @@
       return descriptorURL;
    }
 
-   public void addWebserviceDescription(WebserviceDescriptionMetaData webserviceDescription)
-   {
-      webserviceDescriptions.add(webserviceDescription);
-   }
-
    public WebserviceDescriptionMetaData[] getWebserviceDescriptions()
    {
       WebserviceDescriptionMetaData[] array = new WebserviceDescriptionMetaData[webserviceDescriptions.size()];

Modified: spi/trunk/src/test/java/org/jboss/test/wsf/spi/metadata/config/ConfigMDParserTestCase.java
===================================================================
--- spi/trunk/src/test/java/org/jboss/test/wsf/spi/metadata/config/ConfigMDParserTestCase.java	2014-01-16 02:38:52 UTC (rev 18244)
+++ spi/trunk/src/test/java/org/jboss/test/wsf/spi/metadata/config/ConfigMDParserTestCase.java	2014-01-16 14:45:03 UTC (rev 18245)
@@ -51,8 +51,8 @@
       ClientConfig cc = clientConfigs.get(0);
       assertEquals("Standard Client", cc.getConfigName());
       assertTrue(cc.getProperties().isEmpty());
-      assertNull(cc.getPreHandlerChains());
-      assertNull(cc.getPostHandlerChains());
+      assertTrue(cc.getPreHandlerChains() == null || cc.getPreHandlerChains().isEmpty());
+      assertTrue(cc.getPostHandlerChains() == null || cc.getPostHandlerChains().isEmpty());
 
       List<EndpointConfig> endpointConfigs = metadata.getEndpointConfig();
       assertEquals(2, endpointConfigs.size());
@@ -67,8 +67,8 @@
       assertEquals("value2", ec.getProperty("name2"));
 
       ec = metadata.getEndpointConfigByName(".NET friendly Endpoint");
-      assertNull(ec.getPreHandlerChains());
-      assertNull(ec.getPostHandlerChains());
+      assertTrue(ec.getPreHandlerChains() == null || ec.getPreHandlerChains().isEmpty());
+      assertTrue(ec.getPostHandlerChains() == null || ec.getPostHandlerChains().isEmpty());
       assertTrue(ec.getProperties().isEmpty());
       assertTrue(ec.hasFeature("http://org.jboss.ws/binding/wsdl/dotnet"));
    }



More information about the jbossws-commits mailing list