You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cxf.apache.org by Alessio Soldano <as...@redhat.com> on 2013/05/10 10:17:09 UTC
Re: svn commit: r1480712 - /cxf/trunk/rt/core/src/main/java/org/apache/cxf/service/factory/ReflectionServiceFactoryBean.java
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>.
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