You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2013/05/09 18:11:59 UTC

svn commit: r1480712 - /cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java

Author: dkulp
Date: Thu May  9 16:11:59 2013
New Revision: 1480712

URL: http://svn.apache.org/r1480712
Log:
Cache the JAXBDataBinding class which make client creation a tiny bit faster (after the first one) and can hopefully fix a potential deadlock issue when using spring-dm to start multiple bundles that have jaxws:client entries.

Modified:
    cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java

Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java?rev=1480712&r1=1480711&r2=1480712&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java Thu May  9 16:11:59 2013
@@ -147,6 +147,7 @@ public class ReflectionServiceFactoryBea
     public static final String METHOD_ANNOTATIONS = "method.return.annotations";
     public static final String PARAM_ANNOTATION = "parameter.annotations";
     private static final Logger LOG = LogUtils.getL7dLogger(ReflectionServiceFactoryBean.class);
+    private static Class<? extends DataBinding> defaultDatabindingClass;
 
     protected String wsdlURL;
 
@@ -193,7 +194,6 @@ public class ReflectionServiceFactoryBea
 
 
     protected DataBinding createDefaultDataBinding() {
-
         Object obj = null;
         Class<? extends DataBinding> cls = null;
 
@@ -216,10 +216,10 @@ public class ReflectionServiceFactoryBea
         if (cls == null && getBus() != null) {
             obj = getBus().getProperty(DataBinding.class.getName());
         }
-        if (obj == null) {
-            obj = "org.apache.cxf.jaxb.JAXBDataBinding";
-        }
         try {
+            if (obj == null && cls == null) {
+                cls = getJAXBClass();            
+            }
             if (obj instanceof String) {
                 cls = ClassLoaderUtils.loadClass(obj.toString(), getClass(), DataBinding.class);
             } else if (obj instanceof Class) {
@@ -236,6 +236,17 @@ public class ReflectionServiceFactoryBea
             throw new ServiceConstructionException(e);
         }
     }
+    private static synchronized Class<? extends DataBinding> getJAXBClass() throws ClassNotFoundException {
+        if (defaultDatabindingClass == null) {
+            defaultDatabindingClass = ClassLoaderUtils.loadClass("org.apache.cxf.jaxb.JAXBDataBinding",
+                                                                 ReflectionServiceFactoryBean.class,
+                                                                 DataBinding.class); 
+        }
+        return defaultDatabindingClass;
+    }
+
+
+
     public void reset() {
         if (!dataBindingSet) {
             setDataBinding(null);
@@ -266,8 +277,7 @@ public class ReflectionServiceFactoryBea
             getService().setDataBinding(getDataBinding());
         }
 
-        MethodDispatcher m = getMethodDispatcher();
-        getService().put(MethodDispatcher.class.getName(), m);
+        getService().put(MethodDispatcher.class.getName(), getMethodDispatcher());
         createEndpoints();
 
         fillInSchemaCrossreferences();
@@ -426,8 +436,8 @@ public class ReflectionServiceFactoryBea
         initializeWSDLOperations();
 
         Set<Class<?>> cls = getExtraClass();
-        for (ServiceInfo si : getService().getServiceInfos()) {
-            if (cls != null && !cls.isEmpty()) {
+        if (cls != null && !cls.isEmpty()) {
+            for (ServiceInfo si : getService().getServiceInfos()) {
                 si.setProperty(EXTRA_CLASS, cls);
             }
         }
@@ -532,14 +542,12 @@ public class ReflectionServiceFactoryBea
     }
 
     protected void initializeServiceModel() {
-        String wsdlurl = getWsdlURL();
-
         if (isFromWsdl()) {
-            buildServiceFromWSDL(wsdlurl);
+            buildServiceFromWSDL(getWsdlURL());
         } else if (getServiceClass() != null) {
             buildServiceFromClass();
         } else {
-            throw new ServiceConstructionException(new Message("NO_WSDL_NO_SERVICE_CLASS_PROVIDED", LOG, wsdlurl));
+            throw new ServiceConstructionException(new Message("NO_WSDL_NO_SERVICE_CLASS_PROVIDED", LOG, getWsdlURL()));
         }
 
         if (isValidate()) {
@@ -613,19 +621,15 @@ public class ReflectionServiceFactoryBea
 
     private void validateSchemas(XmlSchemaValidationManager xsdValidator,
                                  SchemaCollection xmlSchemaCollection) {
-        final boolean[] anyErrors = new boolean[1];
         final StringBuilder errorBuilder = new StringBuilder();
-        anyErrors[0] = false;
         xsdValidator.validateSchemas(xmlSchemaCollection.getXmlSchemaCollection(), new DOMErrorHandler() {
-
             public boolean handleError(DOMError error) {
-                anyErrors[0] = true;
                 errorBuilder.append(error.getMessage());
                 LOG.warning(error.getMessage());
                 return true;
             }
         });
-        if (anyErrors[0]) {
+        if (errorBuilder.length() > 0) {
             throw new ServiceConstructionException(new Message("XSD_VALIDATION_ERROR", LOG,
                                                                errorBuilder.toString()));
         }
@@ -785,11 +789,8 @@ public class ReflectionServiceFactoryBea
         }
         sendEvent(Event.OPERATIONINFO_IN_MESSAGE_SET, origOp, method, origOp.getInput());
         // Initialize return type
-        Class<?> paramType = method.getReturnType();
-        Type genericType = method.getGenericReturnType();
-
         if (o.hasOutput()
-            && !initializeParameter(o, method, -1, paramType, genericType)) {
+            && !initializeParameter(o, method, -1, method.getReturnType(), method.getGenericReturnType())) {
             return false;
         }
         if (origOp.hasOutput()) {



Re: svn commit: r1480712 - /cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java

Posted by Alessio Soldano <as...@redhat.com>.
Nervemind and sorry for the noise, it's the class reference, not the
actual databinding instance, being cached. Sorry.

On 05/10/2013 10:17 AM, Alessio Soldano wrote:
> Hi Dan,
> this would likely break a minor thing in JBossWS (I still need to check,
> might possibly workaround it by being sure to always use a new
> databinding when I need to customize it), but besides that it raises a
> question from me: is a DataBinding (JAXBDataBinding here) really meant
> to be shared within the whole classloader? I would have imagined it to
> be a Bus level thing. Asking as the JAXBDataBinding has multiple
> members, including context properties, that one might want to configure
> differently for each bus.
> Thanks
> Alessio
> 
> On 05/09/2013 06:11 PM, dkulp@apache.org wrote:
>> Author: dkulp
>> Date: Thu May  9 16:11:59 2013
>> New Revision: 1480712
>>
>> URL: http://svn.apache.org/r1480712
>> Log:
>> Cache the JAXBDataBinding class which make client creation a tiny bit faster (after the first one) and can hopefully fix a potential deadlock issue when using spring-dm to start multiple bundles that have jaxws:client entries.
>>
>> Modified:
>>     cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java
>>
>> Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java
>> URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java?rev=1480712&r1=1480711&r2=1480712&view=diff
>> ==============================================================================
>> --- cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java (original)
>> +++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java Thu May  9 16:11:59 2013
>> @@ -147,6 +147,7 @@ public class ReflectionServiceFactoryBea
>>      public static final String METHOD_ANNOTATIONS = "method.return.annotations";
>>      public static final String PARAM_ANNOTATION = "parameter.annotations";
>>      private static final Logger LOG = LogUtils.getL7dLogger(ReflectionServiceFactoryBean.class);
>> +    private static Class<? extends DataBinding> defaultDatabindingClass;
>>  
>>      protected String wsdlURL;
>>  
>> @@ -193,7 +194,6 @@ public class ReflectionServiceFactoryBea
>>  
>>  
>>      protected DataBinding createDefaultDataBinding() {
>> -
>>          Object obj = null;
>>          Class<? extends DataBinding> cls = null;
>>  
>> @@ -216,10 +216,10 @@ public class ReflectionServiceFactoryBea
>>          if (cls == null && getBus() != null) {
>>              obj = getBus().getProperty(DataBinding.class.getName());
>>          }
>> -        if (obj == null) {
>> -            obj = "org.apache.cxf.jaxb.JAXBDataBinding";
>> -        }
>>          try {
>> +            if (obj == null && cls == null) {
>> +                cls = getJAXBClass();            
>> +            }
>>              if (obj instanceof String) {
>>                  cls = ClassLoaderUtils.loadClass(obj.toString(), getClass(), DataBinding.class);
>>              } else if (obj instanceof Class) {
>> @@ -236,6 +236,17 @@ public class ReflectionServiceFactoryBea
>>              throw new ServiceConstructionException(e);
>>          }
>>      }
>> +    private static synchronized Class<? extends DataBinding> getJAXBClass() throws ClassNotFoundException {
>> +        if (defaultDatabindingClass == null) {
>> +            defaultDatabindingClass = ClassLoaderUtils.loadClass("org.apache.cxf.jaxb.JAXBDataBinding",
>> +                                                                 ReflectionServiceFactoryBean.class,
>> +                                                                 DataBinding.class); 
>> +        }
>> +        return defaultDatabindingClass;
>> +    }
>> +
>> +
>> +
>>      public void reset() {
>>          if (!dataBindingSet) {
>>              setDataBinding(null);
>> @@ -266,8 +277,7 @@ public class ReflectionServiceFactoryBea
>>              getService().setDataBinding(getDataBinding());
>>          }
>>  
>> -        MethodDispatcher m = getMethodDispatcher();
>> -        getService().put(MethodDispatcher.class.getName(), m);
>> +        getService().put(MethodDispatcher.class.getName(), getMethodDispatcher());
>>          createEndpoints();
>>  
>>          fillInSchemaCrossreferences();
>> @@ -426,8 +436,8 @@ public class ReflectionServiceFactoryBea
>>          initializeWSDLOperations();
>>  
>>          Set<Class<?>> cls = getExtraClass();
>> -        for (ServiceInfo si : getService().getServiceInfos()) {
>> -            if (cls != null && !cls.isEmpty()) {
>> +        if (cls != null && !cls.isEmpty()) {
>> +            for (ServiceInfo si : getService().getServiceInfos()) {
>>                  si.setProperty(EXTRA_CLASS, cls);
>>              }
>>          }
>> @@ -532,14 +542,12 @@ public class ReflectionServiceFactoryBea
>>      }
>>  
>>      protected void initializeServiceModel() {
>> -        String wsdlurl = getWsdlURL();
>> -
>>          if (isFromWsdl()) {
>> -            buildServiceFromWSDL(wsdlurl);
>> +            buildServiceFromWSDL(getWsdlURL());
>>          } else if (getServiceClass() != null) {
>>              buildServiceFromClass();
>>          } else {
>> -            throw new ServiceConstructionException(new Message("NO_WSDL_NO_SERVICE_CLASS_PROVIDED", LOG, wsdlurl));
>> +            throw new ServiceConstructionException(new Message("NO_WSDL_NO_SERVICE_CLASS_PROVIDED", LOG, getWsdlURL()));
>>          }
>>  
>>          if (isValidate()) {
>> @@ -613,19 +621,15 @@ public class ReflectionServiceFactoryBea
>>  
>>      private void validateSchemas(XmlSchemaValidationManager xsdValidator,
>>                                   SchemaCollection xmlSchemaCollection) {
>> -        final boolean[] anyErrors = new boolean[1];
>>          final StringBuilder errorBuilder = new StringBuilder();
>> -        anyErrors[0] = false;
>>          xsdValidator.validateSchemas(xmlSchemaCollection.getXmlSchemaCollection(), new DOMErrorHandler() {
>> -
>>              public boolean handleError(DOMError error) {
>> -                anyErrors[0] = true;
>>                  errorBuilder.append(error.getMessage());
>>                  LOG.warning(error.getMessage());
>>                  return true;
>>              }
>>          });
>> -        if (anyErrors[0]) {
>> +        if (errorBuilder.length() > 0) {
>>              throw new ServiceConstructionException(new Message("XSD_VALIDATION_ERROR", LOG,
>>                                                                 errorBuilder.toString()));
>>          }
>> @@ -785,11 +789,8 @@ public class ReflectionServiceFactoryBea
>>          }
>>          sendEvent(Event.OPERATIONINFO_IN_MESSAGE_SET, origOp, method, origOp.getInput());
>>          // Initialize return type
>> -        Class<?> paramType = method.getReturnType();
>> -        Type genericType = method.getGenericReturnType();
>> -
>>          if (o.hasOutput()
>> -            && !initializeParameter(o, method, -1, paramType, genericType)) {
>> +            && !initializeParameter(o, method, -1, method.getReturnType(), method.getGenericReturnType())) {
>>              return false;
>>          }
>>          if (origOp.hasOutput()) {
>>
>>
> 
> 


-- 
Alessio Soldano
Web Service Lead, JBoss

Re: svn commit: r1480712 - /cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java

Posted by Alessio Soldano <as...@redhat.com>.
Hi Dan,
this would likely break a minor thing in JBossWS (I still need to check,
might possibly workaround it by being sure to always use a new
databinding when I need to customize it), but besides that it raises a
question from me: is a DataBinding (JAXBDataBinding here) really meant
to be shared within the whole classloader? I would have imagined it to
be a Bus level thing. Asking as the JAXBDataBinding has multiple
members, including context properties, that one might want to configure
differently for each bus.
Thanks
Alessio

On 05/09/2013 06:11 PM, dkulp@apache.org wrote:
> Author: dkulp
> Date: Thu May  9 16:11:59 2013
> New Revision: 1480712
> 
> URL: http://svn.apache.org/r1480712
> Log:
> Cache the JAXBDataBinding class which make client creation a tiny bit faster (after the first one) and can hopefully fix a potential deadlock issue when using spring-dm to start multiple bundles that have jaxws:client entries.
> 
> Modified:
>     cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java
> 
> Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java
> URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java?rev=1480712&r1=1480711&r2=1480712&view=diff
> ==============================================================================
> --- cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java (original)
> +++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java Thu May  9 16:11:59 2013
> @@ -147,6 +147,7 @@ public class ReflectionServiceFactoryBea
>      public static final String METHOD_ANNOTATIONS = "method.return.annotations";
>      public static final String PARAM_ANNOTATION = "parameter.annotations";
>      private static final Logger LOG = LogUtils.getL7dLogger(ReflectionServiceFactoryBean.class);
> +    private static Class<? extends DataBinding> defaultDatabindingClass;
>  
>      protected String wsdlURL;
>  
> @@ -193,7 +194,6 @@ public class ReflectionServiceFactoryBea
>  
>  
>      protected DataBinding createDefaultDataBinding() {
> -
>          Object obj = null;
>          Class<? extends DataBinding> cls = null;
>  
> @@ -216,10 +216,10 @@ public class ReflectionServiceFactoryBea
>          if (cls == null && getBus() != null) {
>              obj = getBus().getProperty(DataBinding.class.getName());
>          }
> -        if (obj == null) {
> -            obj = "org.apache.cxf.jaxb.JAXBDataBinding";
> -        }
>          try {
> +            if (obj == null && cls == null) {
> +                cls = getJAXBClass();            
> +            }
>              if (obj instanceof String) {
>                  cls = ClassLoaderUtils.loadClass(obj.toString(), getClass(), DataBinding.class);
>              } else if (obj instanceof Class) {
> @@ -236,6 +236,17 @@ public class ReflectionServiceFactoryBea
>              throw new ServiceConstructionException(e);
>          }
>      }
> +    private static synchronized Class<? extends DataBinding> getJAXBClass() throws ClassNotFoundException {
> +        if (defaultDatabindingClass == null) {
> +            defaultDatabindingClass = ClassLoaderUtils.loadClass("org.apache.cxf.jaxb.JAXBDataBinding",
> +                                                                 ReflectionServiceFactoryBean.class,
> +                                                                 DataBinding.class); 
> +        }
> +        return defaultDatabindingClass;
> +    }
> +
> +
> +
>      public void reset() {
>          if (!dataBindingSet) {
>              setDataBinding(null);
> @@ -266,8 +277,7 @@ public class ReflectionServiceFactoryBea
>              getService().setDataBinding(getDataBinding());
>          }
>  
> -        MethodDispatcher m = getMethodDispatcher();
> -        getService().put(MethodDispatcher.class.getName(), m);
> +        getService().put(MethodDispatcher.class.getName(), getMethodDispatcher());
>          createEndpoints();
>  
>          fillInSchemaCrossreferences();
> @@ -426,8 +436,8 @@ public class ReflectionServiceFactoryBea
>          initializeWSDLOperations();
>  
>          Set<Class<?>> cls = getExtraClass();
> -        for (ServiceInfo si : getService().getServiceInfos()) {
> -            if (cls != null && !cls.isEmpty()) {
> +        if (cls != null && !cls.isEmpty()) {
> +            for (ServiceInfo si : getService().getServiceInfos()) {
>                  si.setProperty(EXTRA_CLASS, cls);
>              }
>          }
> @@ -532,14 +542,12 @@ public class ReflectionServiceFactoryBea
>      }
>  
>      protected void initializeServiceModel() {
> -        String wsdlurl = getWsdlURL();
> -
>          if (isFromWsdl()) {
> -            buildServiceFromWSDL(wsdlurl);
> +            buildServiceFromWSDL(getWsdlURL());
>          } else if (getServiceClass() != null) {
>              buildServiceFromClass();
>          } else {
> -            throw new ServiceConstructionException(new Message("NO_WSDL_NO_SERVICE_CLASS_PROVIDED", LOG, wsdlurl));
> +            throw new ServiceConstructionException(new Message("NO_WSDL_NO_SERVICE_CLASS_PROVIDED", LOG, getWsdlURL()));
>          }
>  
>          if (isValidate()) {
> @@ -613,19 +621,15 @@ public class ReflectionServiceFactoryBea
>  
>      private void validateSchemas(XmlSchemaValidationManager xsdValidator,
>                                   SchemaCollection xmlSchemaCollection) {
> -        final boolean[] anyErrors = new boolean[1];
>          final StringBuilder errorBuilder = new StringBuilder();
> -        anyErrors[0] = false;
>          xsdValidator.validateSchemas(xmlSchemaCollection.getXmlSchemaCollection(), new DOMErrorHandler() {
> -
>              public boolean handleError(DOMError error) {
> -                anyErrors[0] = true;
>                  errorBuilder.append(error.getMessage());
>                  LOG.warning(error.getMessage());
>                  return true;
>              }
>          });
> -        if (anyErrors[0]) {
> +        if (errorBuilder.length() > 0) {
>              throw new ServiceConstructionException(new Message("XSD_VALIDATION_ERROR", LOG,
>                                                                 errorBuilder.toString()));
>          }
> @@ -785,11 +789,8 @@ public class ReflectionServiceFactoryBea
>          }
>          sendEvent(Event.OPERATIONINFO_IN_MESSAGE_SET, origOp, method, origOp.getInput());
>          // Initialize return type
> -        Class<?> paramType = method.getReturnType();
> -        Type genericType = method.getGenericReturnType();
> -
>          if (o.hasOutput()
> -            && !initializeParameter(o, method, -1, paramType, genericType)) {
> +            && !initializeParameter(o, method, -1, method.getReturnType(), method.getGenericReturnType())) {
>              return false;
>          }
>          if (origOp.hasOutput()) {
> 
> 


-- 
Alessio Soldano
Web Service Lead, JBoss