[jbossws-commits] JBossWS SVN: r13014 - stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client.

jbossws-commits at lists.jboss.org jbossws-commits at lists.jboss.org
Thu Sep 23 06:37:47 EDT 2010


Author: richard.opalka at jboss.com
Date: 2010-09-23 06:37:46 -0400 (Thu, 23 Sep 2010)
New Revision: 13014

Modified:
   stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/NativeServiceRefBinderJAXWS.java
   stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ServiceObjectFactoryJAXWS.java
   stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ServiceReferenceable.java
Log:
[JBWS-3133] ServiceRef & PortComponentRef UMDM now respects @Addressing, @MTOM and @RespectBinding MDs

Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/NativeServiceRefBinderJAXWS.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/NativeServiceRefBinderJAXWS.java	2010-09-23 10:37:04 UTC (rev 13013)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/NativeServiceRefBinderJAXWS.java	2010-09-23 10:37:46 UTC (rev 13014)
@@ -106,32 +106,7 @@
             }
          }
       }
-      
-      if (addressingAnnotation != null)
-      {
-         if (addressingAnnotation.enabled())
-            serviceRef.setAddressingEnabled();
-         
-         if (addressingAnnotation.required())
-            serviceRef.setAddressingRequired();
-         
-         if (addressingAnnotation.responses() == AddressingFeature.Responses.ANONYMOUS)
-            serviceRef.setAddressingResponses("ANONYMOUS");
-         else if (addressingAnnotation.responses() == AddressingFeature.Responses.NON_ANONYMOUS)
-            serviceRef.setAddressingResponses("NON_ANONYMOUS");
-         else 
-            serviceRef.setAddressingResponses("ALL");
-      }
-      
-      if ((mtomAnnotation != null) && mtomAnnotation.enabled()) {
-         serviceRef.setMtomEnabled();
-         serviceRef.setMtomThreshold(mtomAnnotation.threshold());
-      }
 
-      if ((respectBindingAnnotation != null) && respectBindingAnnotation.enabled()) {
-         serviceRef.setRespectBindingEnabled();
-      }
-
       // Use the single @WebServiceRef
       if (wsrefList.size() == 1)
       {
@@ -254,6 +229,22 @@
          }
       }
 
+      if (addressingAnnotation != null)
+      {
+         serviceRef.setAddressingEnabled(addressingAnnotation.enabled());
+         serviceRef.setAddressingRequired(addressingAnnotation.required());
+         serviceRef.setAddressingResponses(addressingAnnotation.responses().toString());
+      }
+
+      if (mtomAnnotation != null) {
+         serviceRef.setMtomEnabled(mtomAnnotation.enabled());
+         serviceRef.setMtomThreshold(mtomAnnotation.threshold());
+      }
+
+      if (respectBindingAnnotation != null) {
+         serviceRef.setRespectBindingEnabled(respectBindingAnnotation.enabled());
+      }
+
       // Do not use rebind, the binding should be unique
       // [JBWS-1499] - Revisit WebServiceRefHandler JNDI rebind
       Referenceable serviceReferenceable = buildServiceReferenceable(serviceImplClass, targetClassName, serviceRef);

Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ServiceObjectFactoryJAXWS.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ServiceObjectFactoryJAXWS.java	2010-09-23 10:37:04 UTC (rev 13013)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ServiceObjectFactoryJAXWS.java	2010-09-23 10:37:46 UTC (rev 13014)
@@ -21,20 +21,6 @@
  */
 package org.jboss.ws.core.jaxws.client;
 
-import org.jboss.logging.Logger;
-import org.jboss.ws.WSException;
-import org.jboss.ws.core.ConfigProvider;
-import org.jboss.ws.core.client.ServiceObjectFactory;
-import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedServiceRefMetaData;
-
-import javax.naming.*;
-import javax.xml.namespace.QName;
-import javax.xml.ws.RespectBindingFeature;
-import javax.xml.ws.Service;
-import javax.xml.ws.WebServiceFeature;
-import javax.xml.ws.soap.AddressingFeature;
-import javax.xml.ws.soap.MTOMFeature;
-
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.ObjectInputStream;
@@ -42,15 +28,36 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.net.URL;
+import java.util.Collection;
 import java.util.Hashtable;
 import java.util.LinkedList;
 import java.util.List;
 
+import javax.naming.Context;
+import javax.naming.Name;
+import javax.naming.NamingException;
+import javax.naming.RefAddr;
+import javax.naming.Reference;
+import javax.xml.namespace.QName;
+import javax.xml.ws.RespectBindingFeature;
+import javax.xml.ws.Service;
+import javax.xml.ws.WebServiceFeature;
+import javax.xml.ws.soap.AddressingFeature;
+import javax.xml.ws.soap.MTOMFeature;
+
+import org.jboss.logging.Logger;
+import org.jboss.ws.core.ConfigProvider;
+import org.jboss.ws.core.client.ServiceObjectFactory;
+import org.jboss.wsf.spi.WSFException;
+import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedPortComponentRefMetaData;
+import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedServiceRefMetaData;
+
 /**
  * This ServiceObjectFactory reconstructs a javax.xml.ws.Service
- * for a given WSDL when the webservice client does a JNDI lookup
+ * for a given WSDL when the webservice client does a JNDI lookup.
  *
  * @author Thomas.Diesler at jboss.org
+ * @author Richard.Opalka at jboss.org
  * @since 24-Oct-2004
  */
 public class ServiceObjectFactoryJAXWS extends ServiceObjectFactory
@@ -81,201 +88,367 @@
     * @see javax.naming.spi.NamingManager#getObjectInstance
     * @see javax.naming.spi.NamingManager#getURLContext
     */
-   public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws Exception
+   @SuppressWarnings(value = "unchecked")
+   public Object getObjectInstance(final Object obj, final Name name, final Context nameCtx, final Hashtable environment)
+         throws Exception
    {
       try
       {
-         Reference ref = (Reference)obj;
+         // references
+         final Reference ref = (Reference) obj;
+         final UnifiedServiceRefMetaData serviceRef = unmarshallServiceRef(ref);
+         // class names
+         final String serviceImplClass = this.getServiceClassName(ref, serviceRef);
+         final String targetClassName = this.getTargetClassName(ref, serviceRef, serviceImplClass);
+         // class instances
+         final Class<?> serviceClass = this.getClass(serviceImplClass);
+         final Class<?> targetClass = this.getClass(targetClassName);
+         final Service serviceInstance;
+         try
+         {
+            // Associate the ServiceRefMetaData with this thread
+            serviceRefAssociation.set(serviceRef);
+            // construct service
+            serviceInstance = this.instantiateService(serviceRef, serviceClass);
+         }
+         finally
+         {
+            serviceRefAssociation.set(null);
+         }
+         // Configure the service
+         configureService(serviceInstance, serviceRef);
+         // construct port
+         final boolean instantiatePort = targetClassName != null && !targetClassName.equals(serviceImplClass);
+         if (instantiatePort)
+         {
+            final QName portQName = this.getPortQName(targetClassName, serviceImplClass, serviceRef);
+            final WebServiceFeature[] portFeatures = this.getFeatures(targetClassName, serviceImplClass, serviceRef);
 
-         // Get the target class name
-         String targetClassName = (String)ref.get(ServiceReferenceable.TARGET_CLASS_NAME).getContent();
+            return instantiatePort(serviceClass, targetClass, serviceInstance, portQName, portFeatures);
+         }
 
-         // Unmarshall the UnifiedServiceRef
-         UnifiedServiceRefMetaData serviceRef = unmarshallServiceRef(ref);
-         String serviceRefName = serviceRef.getServiceRefName();
-         QName serviceQName = serviceRef.getServiceQName();
+         return serviceInstance;
+      }
+      catch (Exception ex)
+      {
+         WSFException.rethrow("Cannot create service", ex);
+      }
 
-         String serviceImplClass = serviceRef.getServiceImplClass();
-         if (serviceImplClass == null)
-            serviceImplClass = (String)ref.get(ServiceReferenceable.SERVICE_IMPL_CLASS).getContent();
+      return null;
+   }
 
-         // If the target defaults to javax.xml.ws.Service, use the service as the target
-         if (Service.class.getName().equals(targetClassName))
-            targetClassName = serviceImplClass;
-         
-         if (log.isDebugEnabled())
-            log.debug("[name=" + serviceRefName + ",service=" + serviceImplClass + ",target=" + targetClassName + "]");
+   public static UnifiedServiceRefMetaData getServiceRefAssociation()
+   {
+      return serviceRefAssociation.get();
+   }
 
-         // Load the service class
-         ClassLoader ctxLoader = SecurityActions.getContextClassLoader();
-         Class serviceClass = SecurityActions.loadClass(ctxLoader, serviceImplClass);
-         Class targetClass = (targetClassName != null ? ctxLoader.loadClass(targetClassName) : null);
+   private void configureService(final Service service, final UnifiedServiceRefMetaData serviceRef)
+   {
+      final String configFile = serviceRef.getConfigFile();
+      final String configName = serviceRef.getConfigName();
+      if (service instanceof ConfigProvider)
+      {
+         if(log.isDebugEnabled()) log.debug("Configure Service: [configName=" + configName + ",configFile=" + configFile + "]");
 
-         if (Service.class.isAssignableFrom(serviceClass) == false)
-            throw new IllegalArgumentException("WebServiceRef type '" + serviceClass + "' is not assignable to javax.xml.ws.Service");
-         
-         if (log.isDebugEnabled())
-            log.debug("Loaded Service '" + serviceClass.getName() + "' from: " + serviceClass.getProtectionDomain().getCodeSource());
-
-         List<WebServiceFeature> features = new LinkedList<WebServiceFeature>();
-         
-         // configure addressing feature
-         if (serviceRef.isAddressingEnabled()) {
-            final boolean required = serviceRef.isAddressingRequired();
-            final String refResponses = serviceRef.getAddressingResponses();
-            AddressingFeature.Responses responses = AddressingFeature.Responses.ALL;
-            if ("ANONYMOUS".equals(refResponses))
-               responses = AddressingFeature.Responses.ANONYMOUS;
-            if ("NON_ANONYMOUS".equals(refResponses))
-               responses = AddressingFeature.Responses.NON_ANONYMOUS;
-            
-            features.add(new AddressingFeature(true, required, responses));
+         final ConfigProvider cp = (ConfigProvider)service;
+         if (configName != null || configFile != null)
+         {
+            cp.setConfigName(configName, configFile);
          }
+      }
+   }
 
-         // configure MTOM feature
-         if (serviceRef.isMtomEnabled()) {
-            features.add(new MTOMFeature(true, serviceRef.getMtomThreshold()));
-         }
+   private Class<?> getClass(final String className) throws ClassNotFoundException
+   {
+      if (className != null)
+      {
+         return SecurityActions.getContextClassLoader().loadClass(className);
+      }
 
-         // configure respect binding feature
-         if (serviceRef.isRespectBindingEnabled()) {
-            features.add(new RespectBindingFeature(true));
+      return null;
+   }
+
+   private String getServiceClassName(final Reference ref, final UnifiedServiceRefMetaData serviceRefMD)
+   {
+      String serviceClassName = serviceRefMD.getServiceImplClass();
+      if (serviceClassName == null)
+         serviceClassName = (String) ref.get(ServiceReferenceable.SERVICE_IMPL_CLASS).getContent();
+
+      return serviceClassName;
+   }
+
+   private String getTargetClassName(final Reference ref, final UnifiedServiceRefMetaData serviceRefMD,
+         final String serviceImplClass)
+   {
+      String targetClassName = serviceRefMD.getServiceRefType();
+      if (targetClassName == null)
+         targetClassName = (String) ref.get(ServiceReferenceable.TARGET_CLASS_NAME).getContent();
+
+      if (Service.class.getName().equals(targetClassName))
+         targetClassName = serviceImplClass;
+
+      return targetClassName;
+   }
+
+   private Object instantiatePort(final Class<?> serviceClass, final Class<?> targetClass, final Service target,
+         final QName portQName, final WebServiceFeature[] features) throws NoSuchMethodException,
+         InstantiationException, IllegalAccessException, InvocationTargetException
+   {
+      Object retVal = null;
+
+      Object port = null;
+      if (serviceClass != Service.class)
+      {
+         for (Method method : serviceClass.getDeclaredMethods())
+         {
+            String methodName = method.getName();
+            Class<?> retType = method.getReturnType();
+            if (methodName.startsWith("get") && targetClass.isAssignableFrom(retType))
+            {
+               port = method.invoke(target, new Object[0]);
+               retVal = port;
+               break;
+            }
          }
+      }
 
-         // Receives either a javax.xml.ws.Service or a dynamic proxy
-         Object target;
-         URL wsdlURL = serviceRef.getWsdlLocation();
-         WebServiceFeature[] wsFeatures = features.size() == 0 ? null : features.toArray(new WebServiceFeature[] {});
-         try
+      if (port == null)
+      {
+         Method method = getMethodFor(portQName, features, serviceClass);
+         Object[] args = getArgumentsFor(portQName, features, targetClass);
+         port = method.invoke(target, args);
+         retVal = port;
+      }
+
+      return retVal;
+   }
+
+   private Service instantiateService(final UnifiedServiceRefMetaData serviceRefMD, final Class<?> serviceClass)
+         throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException
+   {
+      final WebServiceFeature[] features = getFeatures(serviceRefMD);
+      final URL wsdlURL = serviceRefMD.getWsdlLocation();
+      final QName serviceQName = serviceRefMD.getServiceQName();
+
+      Service target = null;
+      if (serviceClass == Service.class)
+      {
+         // Generic javax.xml.ws.Service
+         if (wsdlURL != null)
          {
-            // Associate the ServiceRefMetaData with this thread
-            serviceRefAssociation.set(serviceRef);
-
-            // Generic javax.xml.ws.Service
-            if (serviceClass == Service.class)
+            if (features != null)
             {
-               if (wsdlURL != null)
-               {
-                  if (wsFeatures != null) {
-                     target = Service.create(wsdlURL, serviceQName, wsFeatures);
-                  } else {
-                     target = Service.create(wsdlURL, serviceQName);
-                  }
-               }
-               else
-               {
-                  throw new IllegalArgumentException("Cannot create generic javax.xml.ws.Service without wsdlLocation: " + serviceRefName);
-               }
+               target = Service.create(wsdlURL, serviceQName, features);
             }
-            // Generated javax.xml.ws.Service subclass
             else
             {
-               if (wsdlURL != null)
-               {
-                  if (wsFeatures != null) {
-                     Constructor ctor = serviceClass.getConstructor(new Class[] { URL.class, QName.class, WebServiceFeature[].class });
-                     target = ctor.newInstance(new Object[] { wsdlURL, serviceQName, wsFeatures });
-                  } else {
-                     Constructor ctor = serviceClass.getConstructor(new Class[] { URL.class, QName.class });
-                     target = ctor.newInstance(new Object[] { wsdlURL, serviceQName });
-                  }
-               }
-               else
-               {
-                  if (wsFeatures != null) {
-                     Constructor ctor = serviceClass.getConstructor(new Class[] { WebServiceFeature[].class });
-                     target = ctor.newInstance(new Object[] { wsFeatures });
-                  } else {
-                     target = (Service)serviceClass.newInstance();
-                  }
-               }
+               target = Service.create(wsdlURL, serviceQName);
             }
          }
-         finally
+         else
          {
-            serviceRefAssociation.set(null);
+            throw new IllegalArgumentException("Cannot create generic javax.xml.ws.Service without wsdlLocation: "
+                  + serviceRefMD);
          }
-
-         // Configure the service
-         configureService((Service)target, serviceRef);
-
-         if (targetClassName != null && targetClassName.equals(serviceImplClass) == false)
+      }
+      else
+      {
+         // Generated javax.xml.ws.Service subclass
+         if (wsdlURL != null)
          {
-            try
+            if (features != null)
             {
-               Object port = null;
-               if (serviceClass != Service.class)
-               {
-                  for (Method method : serviceClass.getDeclaredMethods())
-                  {
-                     String methodName = method.getName();
-                     Class retType = method.getReturnType();
-                     if (methodName.startsWith("get") && targetClass.isAssignableFrom(retType))
-                     {
-                        port = method.invoke(target, new Object[0]);
-                        target = port;
-                        break;
-                     }
-                  }
-               }
-
-               if (port == null)
-               {
-                  Method method = serviceClass.getMethod("getPort", new Class[] { Class.class });
-                  port = method.invoke(target, new Object[] { targetClass });
-                  target = port;
-               }
+               Constructor<?> ctor = serviceClass.getConstructor(new Class[]
+               {URL.class, QName.class, WebServiceFeature[].class});
+               target = (Service) ctor.newInstance(new Object[]
+               {wsdlURL, serviceQName, features});
             }
-            catch (InvocationTargetException ex)
+            else
             {
-               throw ex.getTargetException();
+               Constructor<?> ctor = serviceClass.getConstructor(new Class[]
+               {URL.class, QName.class});
+               target = (Service) ctor.newInstance(new Object[]
+               {wsdlURL, serviceQName});
             }
          }
+         else
+         {
+            if (features != null)
+            {
+               Constructor<?> ctor = serviceClass.getConstructor(new Class[]
+               {WebServiceFeature[].class});
+               target = (Service) ctor.newInstance(new Object[]
+               {features});
+            }
+            else
+            {
+               target = (Service) serviceClass.newInstance();
+            }
+         }
+      }
 
-         return target;
+      return target;
+   }
+
+   private WebServiceFeature[] getFeatures(final String targetClassName, final String serviceClassName,
+         final UnifiedServiceRefMetaData serviceRefMD)
+   {
+      if (targetClassName != null && !targetClassName.equals(serviceClassName))
+      {
+         final Collection<UnifiedPortComponentRefMetaData> portComponentRefs = serviceRefMD.getPortComponentRefs();
+         for (final UnifiedPortComponentRefMetaData portComponentRefMD : portComponentRefs)
+         {
+            if (targetClassName.equals(portComponentRefMD.getServiceEndpointInterface()))
+            {
+               return getFeatures(portComponentRefMD);
+            }
+         }
       }
-      catch (Throwable ex)
+
+      return null;
+   }
+
+   private QName getPortQName(final String targetClassName, final String serviceClassName,
+         final UnifiedServiceRefMetaData serviceRefMD)
+   {
+      if (targetClassName != null && !targetClassName.equals(serviceClassName))
       {
-         WSException.rethrow("Cannot create service", ex);
-         return null;
+         final Collection<UnifiedPortComponentRefMetaData> portComponentRefs = serviceRefMD.getPortComponentRefs();
+         for (final UnifiedPortComponentRefMetaData portComponentRefMD : portComponentRefs)
+         {
+            if (targetClassName.equals(portComponentRefMD.getServiceEndpointInterface()))
+            {
+               return portComponentRefMD.getPortQName();
+            }
+         }
       }
+
+      return null;
    }
 
-   public static UnifiedServiceRefMetaData getServiceRefAssociation()
+   private Method getMethodFor(final QName portQName, final WebServiceFeature[] features, final Class<?> serviceClass)
+         throws NoSuchMethodException
    {
-      // The ServiceDelegateImpl get the usRef at ctor time
-      return (UnifiedServiceRefMetaData)serviceRefAssociation.get();
+      if ((portQName == null) && (features == null))
+         return serviceClass.getMethod("getPort", new Class[]
+         {Class.class});
+      if ((portQName != null) && (features == null))
+         return serviceClass.getMethod("getPort", new Class[]
+         {QName.class, Class.class});
+      if ((portQName == null) && (features != null))
+         return serviceClass.getMethod("getPort", new Class[]
+         {Class.class, WebServiceFeature[].class});
+      if ((portQName != null) && (features != null))
+         return serviceClass.getMethod("getPort", new Class[]
+         {QName.class, Class.class, WebServiceFeature[].class});
+
+      throw new IllegalStateException();
    }
 
-   private void configureService(Service service, UnifiedServiceRefMetaData serviceRef)
+   private Object[] getArgumentsFor(final QName portQName, final WebServiceFeature[] features,
+         final Class<?> targetClass) throws NoSuchMethodException
    {
-      String configFile = serviceRef.getConfigFile();
-      String configName = serviceRef.getConfigName();
-      if (service instanceof ConfigProvider)
+      if ((portQName == null) && (features == null))
+         return new Object[]
+         {targetClass};
+      if ((portQName != null) && (features == null))
+         return new Object[]
+         {portQName, targetClass};
+      if ((portQName == null) && (features != null))
+         return new Object[]
+         {targetClass, features};
+      if ((portQName != null) && (features != null))
+         return new Object[]
+         {portQName, targetClass, features};
+
+      throw new IllegalStateException();
+   }
+
+   private WebServiceFeature[] getFeatures(final UnifiedServiceRefMetaData serviceRef)
+   {
+      List<WebServiceFeature> features = new LinkedList<WebServiceFeature>();
+
+      // configure @Addressing feature
+      if (serviceRef.isAddressingEnabled())
       {
-         if(log.isDebugEnabled()) log.debug("Configure Service: [configName=" + configName + ",configFile=" + configFile + "]");
+         final boolean required = serviceRef.isAddressingRequired();
+         final String refResponses = serviceRef.getAddressingResponses();
+         AddressingFeature.Responses responses = AddressingFeature.Responses.ALL;
+         if ("ANONYMOUS".equals(refResponses))
+            responses = AddressingFeature.Responses.ANONYMOUS;
+         if ("NON_ANONYMOUS".equals(refResponses))
+            responses = AddressingFeature.Responses.NON_ANONYMOUS;
 
-         ConfigProvider cp = (ConfigProvider)service;
-         if (configName != null || configFile != null)
-            cp.setConfigName(configName, configFile);
+         features.add(new AddressingFeature(true, required, responses));
       }
+
+      // configure @MTOM feature
+      if (serviceRef.isMtomEnabled())
+      {
+         features.add(new MTOMFeature(true, serviceRef.getMtomThreshold()));
+      }
+
+      // configure @RespectBinding feature
+      if (serviceRef.isRespectBindingEnabled())
+      {
+         features.add(new RespectBindingFeature(true));
+      }
+
+      WebServiceFeature[] wsFeatures = features.size() == 0 ? null : features.toArray(new WebServiceFeature[]
+      {});
+      return wsFeatures;
    }
 
-   private UnifiedServiceRefMetaData unmarshallServiceRef(Reference ref) throws ClassNotFoundException, NamingException
+   private WebServiceFeature[] getFeatures(final UnifiedPortComponentRefMetaData portComponentRefMD)
    {
-      UnifiedServiceRefMetaData sref;
-      RefAddr refAddr = ref.get(ServiceReferenceable.SERVICE_REF_META_DATA);
-      ByteArrayInputStream bais = new ByteArrayInputStream((byte[])refAddr.getContent());
+      List<WebServiceFeature> features = new LinkedList<WebServiceFeature>();
+      // configure @Addressing feature
+      if (portComponentRefMD.isAddressingEnabled())
+      {
+         final boolean required = portComponentRefMD.isAddressingRequired();
+         final String refResponses = portComponentRefMD.getAddressingResponses();
+         AddressingFeature.Responses responses = AddressingFeature.Responses.ALL;
+         if ("ANONYMOUS".equals(refResponses))
+            responses = AddressingFeature.Responses.ANONYMOUS;
+         if ("NON_ANONYMOUS".equals(refResponses))
+            responses = AddressingFeature.Responses.NON_ANONYMOUS;
+
+         features.add(new AddressingFeature(true, required, responses));
+      }
+
+      // configure @MTOM feature
+      if (portComponentRefMD.isMtomEnabled())
+      {
+         features.add(new MTOMFeature(true, portComponentRefMD.getMtomThreshold()));
+      }
+
+      // configure @RespectBinding feature
+      if (portComponentRefMD.isRespectBindingEnabled())
+      {
+         features.add(new RespectBindingFeature(true));
+      }
+
+      return features.size() == 0 ? null : features.toArray(new WebServiceFeature[]
+      {});
+   }
+
+   private UnifiedServiceRefMetaData unmarshallServiceRef(final Reference ref) throws ClassNotFoundException,
+         NamingException
+   {
+      final UnifiedServiceRefMetaData sref;
+      final RefAddr refAddr = ref.get(ServiceReferenceable.SERVICE_REF_META_DATA);
+      final ByteArrayInputStream bais = new ByteArrayInputStream((byte[]) refAddr.getContent());
       try
       {
          ObjectInputStream ois = new ObjectInputStream(bais);
-         sref = (UnifiedServiceRefMetaData)ois.readObject();
+         sref = (UnifiedServiceRefMetaData) ois.readObject();
          ois.close();
       }
       catch (IOException e)
       {
          throw new NamingException("Cannot unmarshall service ref meta data, cause: " + e.toString());
       }
+
       return sref;
    }
 }

Modified: stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ServiceReferenceable.java
===================================================================
--- stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ServiceReferenceable.java	2010-09-23 10:37:04 UTC (rev 13013)
+++ stack/native/trunk/modules/core/src/main/java/org/jboss/ws/core/jaxws/client/ServiceReferenceable.java	2010-09-23 10:37:46 UTC (rev 13014)
@@ -52,7 +52,7 @@
    private String serviceImplClass;
    private String targetClassName;
    private UnifiedServiceRefMetaData serviceRef;
-   
+
    public ServiceReferenceable(String serviceImplClass, String targetClassName, UnifiedServiceRefMetaData serviceRef)
    {
       this.serviceImplClass = serviceImplClass;
@@ -76,7 +76,7 @@
 
       return myRef;
    }
-   
+
    private byte[] marshall(Object obj) throws NamingException
    {
       ByteArrayOutputStream baos = new ByteArrayOutputStream(512);
@@ -92,4 +92,13 @@
       }
       return baos.toByteArray();
    }
+
+   public String toString() {
+      final StringBuilder sb = new StringBuilder();
+      sb.append("\n").append(getClass().getName());
+      sb.append("\n serviceImplClass=" + serviceImplClass);
+      sb.append("\n targetClassName=" + targetClassName);
+      sb.append("\n serviceRef=" + this.serviceRef);
+      return sb.toString();
+   }
 }



More information about the jbossws-commits mailing list