Author: thomas.diesler(a)jboss.com
Date: 2006-10-24 12:04:55 -0400 (Tue, 24 Oct 2006)
New Revision: 1300
Modified:
branches/tdiesler/trunk/src/main/java/org/jboss/ws/integration/jboss/WebServiceRefDeployer.java
branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/ServiceObjectFactory.java
branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/ServiceReferenceable.java
branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/jaxws/webserviceref/ApplicationClient.java
branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/jaxws/webserviceref/EJB3Client.java
branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/jaxws/webserviceref/ServletClient.java
Log:
Implement @WebServiceRef(MyPort.class)
Modified:
branches/tdiesler/trunk/src/main/java/org/jboss/ws/integration/jboss/WebServiceRefDeployer.java
===================================================================
---
branches/tdiesler/trunk/src/main/java/org/jboss/ws/integration/jboss/WebServiceRefDeployer.java 2006-10-24
15:19:51 UTC (rev 1299)
+++
branches/tdiesler/trunk/src/main/java/org/jboss/ws/integration/jboss/WebServiceRefDeployer.java 2006-10-24
16:04:55 UTC (rev 1300)
@@ -46,9 +46,15 @@
// Hide ctor
}
- public static void setupWebServiceRef(Context ctx, String jndiName, Class type,
WebServiceRef ref) throws Exception
+ public static void setupWebServiceRef(Context ctx, String jndiName, Class targetType,
WebServiceRef ref) throws Exception
{
- Util.bind(ctx, jndiName, new ServiceReferenceable(type.getName(),
ref.wsdlLocation()));
- log.debug("WebServiceRef bound [jndi=" + jndiName + ",type=" +
type.getName() + "]");
+ Class serviceType = ref.value();
+ if (serviceType == Object.class)
+ {
+ serviceType = targetType;
+ }
+
+ Util.bind(ctx, jndiName, new ServiceReferenceable(serviceType.getName(),
targetType.getName(), ref.wsdlLocation()));
+ log.debug("WebServiceRef bound [jndi=" + jndiName + ",type=" +
targetType.getName() + "]");
}
}
Modified:
branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/ServiceObjectFactory.java
===================================================================
---
branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/ServiceObjectFactory.java 2006-10-24
15:19:51 UTC (rev 1299)
+++
branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/ServiceObjectFactory.java 2006-10-24
16:04:55 UTC (rev 1300)
@@ -26,6 +26,7 @@
import java.io.File;
import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Hashtable;
@@ -36,6 +37,7 @@
import javax.naming.spi.ObjectFactory;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
+import javax.xml.ws.WebServiceException;
import org.jboss.logging.Logger;
@@ -78,28 +80,49 @@
Reference ref = (Reference)obj;
String serviceTypeName =
(String)ref.get(ServiceReferenceable.SERVICE_TYPE).getContent();
+ String targetTypeName =
(String)ref.get(ServiceReferenceable.TARGET_TYPE).getContent();
String wsdlLocation =
(String)ref.get(ServiceReferenceable.WSDL_LOCATION).getContent();
ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader();
Class serviceType = ctxLoader.loadClass(serviceTypeName);
+ Class targetType = ctxLoader.loadClass(targetTypeName);
if (Service.class.isAssignableFrom(serviceType) == false)
throw new IllegalArgumentException("WebServiceRef type '" +
serviceType + "' is not assignable to javax.xml.ws.Service");
- Service service;
+ Object target;
URL wsdlURL = getWsdlLocationURL(serviceType, wsdlLocation);
if (wsdlURL != null)
{
Constructor ctor = serviceType.getConstructor(new Class[] { URL.class,
QName.class });
- service = (Service)ctor.newInstance(new Object[] { wsdlURL, null });
+ target = (Service)ctor.newInstance(new Object[] { wsdlURL, null });
}
else
{
- service = (Service)serviceType.newInstance();
+ target = (Service)serviceType.newInstance();
}
+
+ if (serviceTypeName.equals(targetTypeName) == false)
+ {
+ Object port = null;
+ for (Method method : serviceType.getMethods())
+ {
+ String methodName = method.getName();
+ Class retType = method.getReturnType();
+ if (methodName.startsWith("get") &&
targetType.isAssignableFrom(retType))
+ {
+ port = method.invoke(target, new Object[0]);
+ target = port;
+ break;
+ }
+ }
+
+ if (port == null)
+ throw new WebServiceException("Cannot find getter for port type:
" + targetTypeName);
+ }
- return service;
+ return target;
}
catch (Exception ex)
{
Modified:
branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/ServiceReferenceable.java
===================================================================
---
branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/ServiceReferenceable.java 2006-10-24
15:19:51 UTC (rev 1299)
+++
branches/tdiesler/trunk/src/main/java/org/jboss/ws/jaxws/ServiceReferenceable.java 2006-10-24
16:04:55 UTC (rev 1300)
@@ -42,13 +42,16 @@
{
public static final String WSDL_LOCATION = "WSDL_LOCATION";
public static final String SERVICE_TYPE = "SERVICE_TYPE";
+ public static final String TARGET_TYPE = "TARGET_TYPE";
private String serviceType;
+ private String targetType;
private String wsdlLocation;
- public ServiceReferenceable(String serviceType, String wsdlLocation)
+ public ServiceReferenceable(String serviceType, String targetType, String
wsdlLocation)
{
this.serviceType = serviceType;
+ this.targetType = targetType;
this.wsdlLocation = wsdlLocation;
}
@@ -63,6 +66,7 @@
Reference myRef = new Reference(ServiceReferenceable.class.getName(),
ServiceObjectFactory.class.getName(), null);
myRef.add(new StringRefAddr(SERVICE_TYPE, serviceType));
+ myRef.add(new StringRefAddr(TARGET_TYPE, targetType));
myRef.add(new StringRefAddr(WSDL_LOCATION, wsdlLocation));
return myRef;
Modified:
branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/jaxws/webserviceref/ApplicationClient.java
===================================================================
---
branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/jaxws/webserviceref/ApplicationClient.java 2006-10-24
15:19:51 UTC (rev 1299)
+++
branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/jaxws/webserviceref/ApplicationClient.java 2006-10-24
16:04:55 UTC (rev 1300)
@@ -21,18 +21,42 @@
*/
package org.jboss.test.ws.jaxws.webserviceref;
+import java.util.ArrayList;
+
+import javax.xml.ws.WebServiceException;
import javax.xml.ws.WebServiceRef;
+import org.jboss.logging.Logger;
+
public class ApplicationClient
{
+ // Provide logging
+ private static Logger log = Logger.getLogger(ApplicationClient.class);
+
@WebServiceRef (name ="TestEndpointService", wsdlLocation
="META-INF/wsdl/TestEndpoint.wsdl")
public static TestEndpointService service;
+ @WebServiceRef (value = TestEndpointService.class, wsdlLocation
="META-INF/wsdl/TestEndpoint.wsdl")
+ public static TestEndpoint port;
+
public static String retStr;
public static void main(String[] args)
{
- TestEndpoint port = (TestEndpoint)service.getPort(TestEndpoint.class);
- retStr = port.echo(args[0]);
+ String inStr = args[0];
+ log.info("echo: " + inStr);
+
+ ArrayList<TestEndpoint> ports = new ArrayList<TestEndpoint>();
+ ports.add((TestEndpoint)service.getPort(TestEndpoint.class));
+ ports.add(port);
+
+ for (TestEndpoint port : ports)
+ {
+ String outStr = port.echo(inStr);
+ if (inStr.equals(outStr) == false)
+ throw new WebServiceException("Invalid echo return: " + inStr);
+ }
+
+ retStr = inStr;
}
}
Modified:
branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/jaxws/webserviceref/EJB3Client.java
===================================================================
---
branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/jaxws/webserviceref/EJB3Client.java 2006-10-24
15:19:51 UTC (rev 1299)
+++
branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/jaxws/webserviceref/EJB3Client.java 2006-10-24
16:04:55 UTC (rev 1300)
@@ -21,8 +21,11 @@
*/
package org.jboss.test.ws.jaxws.webserviceref;
+import java.util.ArrayList;
+
import javax.ejb.Remote;
import javax.ejb.Stateless;
+import javax.xml.ws.WebServiceException;
import javax.xml.ws.WebServiceRef;
import org.jboss.annotation.ejb.RemoteBinding;
@@ -40,11 +43,24 @@
@WebServiceRef (name ="TestEndpointService", wsdlLocation
="META-INF/wsdl/TestEndpoint.wsdl")
public TestEndpointService service;
+ @WebServiceRef (value = TestEndpointService.class, wsdlLocation
="META-INF/wsdl/TestEndpoint.wsdl")
+ public TestEndpoint port;
+
public String echo(String inStr)
{
log.info("echo: " + inStr);
- TestEndpoint port = (TestEndpoint)service.getPort(TestEndpoint.class);
- String outStr = port.echo(inStr);
- return outStr;
+
+ ArrayList<TestEndpoint> ports = new ArrayList<TestEndpoint>();
+ ports.add((TestEndpoint)service.getPort(TestEndpoint.class));
+ ports.add(port);
+
+ for (TestEndpoint port : ports)
+ {
+ String outStr = port.echo(inStr);
+ if (inStr.equals(outStr) == false)
+ throw new WebServiceException("Invalid echo return: " + inStr);
+ }
+
+ return inStr;
}
}
Modified:
branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/jaxws/webserviceref/ServletClient.java
===================================================================
---
branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/jaxws/webserviceref/ServletClient.java 2006-10-24
15:19:51 UTC (rev 1299)
+++
branches/tdiesler/trunk/src/test/java/org/jboss/test/ws/jaxws/webserviceref/ServletClient.java 2006-10-24
16:04:55 UTC (rev 1300)
@@ -22,11 +22,13 @@
package org.jboss.test.ws.jaxws.webserviceref;
import java.io.IOException;
+import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import javax.xml.ws.WebServiceException;
import javax.xml.ws.WebServiceRef;
import org.jboss.logging.Logger;
@@ -39,14 +41,26 @@
@WebServiceRef (name ="TestEndpointService", wsdlLocation
="WEB-INF/wsdl/TestEndpoint.wsdl")
public TestEndpointService service;
+ @WebServiceRef (value = TestEndpointService.class, wsdlLocation
="WEB-INF/wsdl/TestEndpoint.wsdl")
+ public TestEndpoint port;
+
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws
ServletException, IOException
{
String inStr = req.getParameter("echo");
log.info("doGet: " + inStr);
- TestEndpoint port = (TestEndpoint)service.getPort(TestEndpoint.class);
- String outStr = port.echo(inStr);
- res.getWriter().print(outStr);
+ ArrayList<TestEndpoint> ports = new ArrayList<TestEndpoint>();
+ ports.add((TestEndpoint)service.getPort(TestEndpoint.class));
+ ports.add(port);
+
+ for (TestEndpoint port : ports)
+ {
+ String outStr = port.echo(inStr);
+ if (inStr.equals(outStr) == false)
+ throw new WebServiceException("Invalid echo return: " + inStr);
+ }
+
+ res.getWriter().print(inStr);
}
}