Author: alessio.soldano(a)jboss.com
Date: 2008-11-05 12:16:50 -0500 (Wed, 05 Nov 2008)
New Revision: 8653
Added:
stack/metro/trunk/modules/client/src/main/java/org/jboss/wsf/stack/metro/client/ServiceRefServiceInterceptor.java
stack/metro/trunk/modules/client/src/main/java/org/jboss/wsf/stack/metro/client/ServiceRefServiceInterceptorFactory.java
Modified:
stack/metro/trunk/modules/client/src/main/java/org/jboss/wsf/stack/metro/client/ServiceObjectFactory.java
Log:
[JBWS-2307] Using Metro's ServiceInteceptor SPI to set stub properties
Modified:
stack/metro/trunk/modules/client/src/main/java/org/jboss/wsf/stack/metro/client/ServiceObjectFactory.java
===================================================================
---
stack/metro/trunk/modules/client/src/main/java/org/jboss/wsf/stack/metro/client/ServiceObjectFactory.java 2008-11-05
17:12:25 UTC (rev 8652)
+++
stack/metro/trunk/modules/client/src/main/java/org/jboss/wsf/stack/metro/client/ServiceObjectFactory.java 2008-11-05
17:16:50 UTC (rev 8653)
@@ -43,6 +43,8 @@
import org.jboss.wsf.spi.WSFException;
import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedServiceRefMetaData;
+import com.sun.xml.ws.api.client.ServiceInterceptorFactory;
+
/**
* This ServiceObjectFactory reconstructs a javax.xml.ws.Service
* for a given WSDL when the webservice client does a JNDI lookup
@@ -50,6 +52,7 @@
* @see ServiceReferenceable
*
* @author Heiko.Braun(a)jboss.com
+ * @author alessio.soldano(a)jboss.com
* Created: Jul 12, 2007
* */
public class ServiceObjectFactory implements ObjectFactory
@@ -113,65 +116,77 @@
// Get the URL to the wsdl
URL wsdlURL = serviceRef.getWsdlLocation();
-
- // Generic javax.xml.ws.Service
- if (serviceClass == Service.class)
+
+ ServiceRefServiceInterceptorFactory serviceInterceptorFactory = new
ServiceRefServiceInterceptorFactory(serviceRef);
+ try
{
- if (wsdlURL != null)
+ //register the factory that adds a ServiceRefServiceInterceptor to the
created Service;
+ //this is required to correctly set the stub properties upon Port creation.
+ ServiceInterceptorFactory.registerForThread(serviceInterceptorFactory);
+
+ // Generic javax.xml.ws.Service
+ if (serviceClass == Service.class)
{
- target = Service.create(wsdlURL, serviceQName);
+ if (wsdlURL != null)
+ {
+ target = Service.create(wsdlURL, serviceQName);
+ }
+ else
+ {
+ throw new IllegalArgumentException("Cannot create generic
javax.xml.ws.Service without wsdlLocation: " + serviceRefName);
+ }
}
+ // Generated javax.xml.ws.Service subclass
else
{
- throw new IllegalArgumentException("Cannot create generic
javax.xml.ws.Service without wsdlLocation: " + serviceRefName);
+ if (wsdlURL != null)
+ {
+ Constructor ctor = serviceClass.getConstructor(new Class[] { URL.class,
QName.class });
+ target = ctor.newInstance(new Object[] { wsdlURL, serviceQName });
+ }
+ else
+ {
+ target = (Service)serviceClass.newInstance();
+ }
}
- }
- // Generated javax.xml.ws.Service subclass
- else
- {
- if (wsdlURL != null)
+
+ if (targetClassName != null &&
targetClassName.equals(serviceImplClass) == false)
{
- Constructor ctor = serviceClass.getConstructor(new Class[] { URL.class,
QName.class });
- target = ctor.newInstance(new Object[] { wsdlURL, serviceQName });
- }
- else
- {
- target = (Service)serviceClass.newInstance();
- }
- }
-
- if (targetClassName != null && targetClassName.equals(serviceImplClass)
== false)
- {
- try
- {
- Object port = null;
- if (serviceClass != Service.class)
+ try
{
- for (Method method : serviceClass.getDeclaredMethods())
+ Object port = null;
+ if (serviceClass != Service.class)
{
- String methodName = method.getName();
- Class retType = method.getReturnType();
- if (methodName.startsWith("get") &&
targetClass.isAssignableFrom(retType))
+ for (Method method : serviceClass.getDeclaredMethods())
{
- port = method.invoke(target, new Object[0]);
- target = port;
- break;
+ 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;
+ }
}
-
- if (port == null)
+ catch (InvocationTargetException ex)
{
- Method method = serviceClass.getMethod("getPort", new Class[]
{ Class.class });
- port = method.invoke(target, new Object[] { targetClass });
- target = port;
+ throw ex.getTargetException();
}
}
- catch (InvocationTargetException ex)
- {
- throw ex.getTargetException();
- }
}
+ finally
+ {
+ ServiceInterceptorFactory.unregisterForThread(serviceInterceptorFactory);
+ }
return target;
}
Added:
stack/metro/trunk/modules/client/src/main/java/org/jboss/wsf/stack/metro/client/ServiceRefServiceInterceptor.java
===================================================================
---
stack/metro/trunk/modules/client/src/main/java/org/jboss/wsf/stack/metro/client/ServiceRefServiceInterceptor.java
(rev 0)
+++
stack/metro/trunk/modules/client/src/main/java/org/jboss/wsf/stack/metro/client/ServiceRefServiceInterceptor.java 2008-11-05
17:16:50 UTC (rev 8653)
@@ -0,0 +1,73 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, 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.stack.metro.client;
+
+import javax.xml.ws.BindingProvider;
+
+import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedPortComponentRefMetaData;
+import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedServiceRefMetaData;
+import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedStubPropertyMetaData;
+
+import com.sun.istack.NotNull;
+import com.sun.xml.ws.api.client.ServiceInterceptor;
+import com.sun.xml.ws.developer.WSBindingProvider;
+
+/**
+ * A ServiceInterceptor that copies properties from the unified MD
+ * (for instance specified in the service-ref block of a JBoss-specific DD)
+ * to the context in the BindingProvider.
+ *
+ * @author alessio.soldano(a)jboss.com
+ * @since 05-Nov-2008
+ */
+public class ServiceRefServiceInterceptor extends ServiceInterceptor
+{
+ private UnifiedServiceRefMetaData serviceRefMD;
+
+ public ServiceRefServiceInterceptor(UnifiedServiceRefMetaData serviceRefMD)
+ {
+ this.serviceRefMD = serviceRefMD;
+ }
+
+ /**
+ * A callback to notify the event of creation of proxy object for SEI endpoint. The
+ * callback could set some properties on the {@link BindingProvider}.
+ *
+ * @param bp created proxy instance
+ * @param serviceEndpointInterface SEI of the endpoint
+ */
+ @Override
+ public void postCreateProxy(@NotNull WSBindingProvider bp, @NotNull Class<?>
serviceEndpointInterface)
+ {
+ for (UnifiedPortComponentRefMetaData pcRef : serviceRefMD.getPortComponentRefs())
+ {
+ String sei = pcRef.getServiceEndpointInterface();
+ if (sei != null && sei.equals(serviceEndpointInterface.getName()))
+ {
+ for (UnifiedStubPropertyMetaData prop : pcRef.getStubProperties())
+ {
+ bp.getRequestContext().put(prop.getPropName(), prop.getPropValue());
+ }
+ }
+ }
+ }
+}
Property changes on:
stack/metro/trunk/modules/client/src/main/java/org/jboss/wsf/stack/metro/client/ServiceRefServiceInterceptor.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Added:
stack/metro/trunk/modules/client/src/main/java/org/jboss/wsf/stack/metro/client/ServiceRefServiceInterceptorFactory.java
===================================================================
---
stack/metro/trunk/modules/client/src/main/java/org/jboss/wsf/stack/metro/client/ServiceRefServiceInterceptorFactory.java
(rev 0)
+++
stack/metro/trunk/modules/client/src/main/java/org/jboss/wsf/stack/metro/client/ServiceRefServiceInterceptorFactory.java 2008-11-05
17:16:50 UTC (rev 8653)
@@ -0,0 +1,52 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, 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.stack.metro.client;
+
+import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedServiceRefMetaData;
+
+import com.sun.xml.ws.api.WSService;
+import com.sun.xml.ws.api.client.ServiceInterceptor;
+import com.sun.xml.ws.api.client.ServiceInterceptorFactory;
+
+/**
+ * A ServiceInterceptorFactory providing ServiceRefServiceInterceptor instances
+ * using the given UnifiedServiceRefMetaData.
+ *
+ * @author alessio.soldano(a)jboss.com
+ * @since 05-Nov-2008
+ */
+public class ServiceRefServiceInterceptorFactory extends ServiceInterceptorFactory
+{
+ private UnifiedServiceRefMetaData serviceRefMD;
+
+ public ServiceRefServiceInterceptorFactory(UnifiedServiceRefMetaData serviceRefMD)
+ {
+ this.serviceRefMD = serviceRefMD;
+ }
+
+ @Override
+ public ServiceInterceptor create(WSService service)
+ {
+ return new ServiceRefServiceInterceptor(serviceRefMD);
+ }
+
+}
Property changes on:
stack/metro/trunk/modules/client/src/main/java/org/jboss/wsf/stack/metro/client/ServiceRefServiceInterceptorFactory.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF