You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ga...@apache.org on 2007/06/05 23:57:50 UTC
svn commit: r544651 - in
/geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ejb:
EJBEndpointController.java EJBMessageReceiver.java EJBProviderDispatcher.java
Author: gawor
Date: Tue Jun 5 14:57:49 2007
New Revision: 544651
URL: http://svn.apache.org/viewvc?view=rev&rev=544651
Log:
handle ejb-based web servies annotated with WebServiceProvider
Modified:
geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ejb/EJBEndpointController.java
geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ejb/EJBMessageReceiver.java
geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ejb/EJBProviderDispatcher.java
Modified: geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ejb/EJBEndpointController.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ejb/EJBEndpointController.java?view=diff&rev=544651&r1=544650&r2=544651
==============================================================================
--- geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ejb/EJBEndpointController.java (original)
+++ geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ejb/EJBEndpointController.java Tue Jun 5 14:57:49 2007
@@ -36,7 +36,7 @@
protected EndpointDispatcher getEndpointDispatcher(Class serviceImplClass, Object serviceInstance)
throws Exception {
if (Provider.class.isAssignableFrom(serviceImplClass)) {
- return new EJBProviderDispatcher(this.invContext);
+ return new EJBProviderDispatcher(serviceImplClass, this.invContext);
} else {
return new EJBServiceDispatcher(this.invContext);
}
Modified: geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ejb/EJBMessageReceiver.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ejb/EJBMessageReceiver.java?view=diff&rev=544651&r1=544650&r2=544651
==============================================================================
--- geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ejb/EJBMessageReceiver.java (original)
+++ geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ejb/EJBMessageReceiver.java Tue Jun 5 14:57:49 2007
@@ -18,6 +18,10 @@
package org.apache.geronimo.axis2.ejb;
import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
+import javax.xml.ws.Provider;
import org.apache.axis2.AxisFault;
import org.apache.axis2.description.AxisService;
@@ -53,11 +57,14 @@
// init some bits
requestMsgCtx.setOperationName(requestMsgCtx.getAxisMessageContext().getAxisOperation().getName());
requestMsgCtx.setEndpointDescription(getEndpointDescription(requestMsgCtx));
- requestMsgCtx.setOperationDescription(getOperationDescription(requestMsgCtx));
-
- // TODO: will need to handle Provider.invoke() method here
- Method method = getJavaMethod(requestMsgCtx, this.serviceImplClass);
+ Method method = null;
+ if (Provider.class.isAssignableFrom(this.serviceImplClass)) {
+ method = getProviderMethod();
+ } else {
+ requestMsgCtx.setOperationDescription(getOperationDescription(requestMsgCtx));
+ method = getServiceMethod(requestMsgCtx);
+ }
if (LOG.isDebugEnabled()) {
LOG.debug("Invoking '" + method.getName() + "' method.");
@@ -95,13 +102,13 @@
return method;
}
- private Method getJavaMethod(MessageContext mc, Class serviceImplClass) {
+ private Method getServiceMethod(MessageContext mc) {
OperationDescription opDesc = mc.getOperationDescription();
if (opDesc == null) {
throw ExceptionFactory.makeWebServiceException("Operation Description was not set");
}
- Method returnMethod = opDesc.getMethodFromServiceImpl(serviceImplClass);
+ Method returnMethod = opDesc.getMethodFromServiceImpl(this.serviceImplClass);
if (returnMethod == null) {
throw ExceptionFactory
.makeWebServiceException(Messages.getMessage("JavaBeanDispatcherErr1"));
@@ -135,6 +142,39 @@
EndpointDescription ed = (EndpointDescription) param.getValue();
return ed;
+ }
+
+ private Method getProviderMethod() {
+ try {
+ return this.serviceImplClass.getMethod("invoke", getProviderType());
+ } catch (NoSuchMethodException e) {
+ throw ExceptionFactory.makeWebServiceException("Could not get Provider.invoke() method");
+ }
+ }
+
+ private Class<?> getProviderType() {
+ Class providerType = null;
+
+ Type[] giTypes = this.serviceImplClass.getGenericInterfaces();
+ for (Type giType : giTypes) {
+ ParameterizedType paramType = null;
+ try {
+ paramType = (ParameterizedType)giType;
+ } catch (ClassCastException e) {
+ throw ExceptionFactory.makeWebServiceException(
+ "Provider based SEI Class has to implement javax.xml.ws.Provider as javax.xml.ws.Provider<String>, javax.xml.ws.Provider<SOAPMessage>, javax.xml.ws.Provider<Source> or javax.xml.ws.Provider<JAXBContext>");
+ }
+ Class interfaceName = (Class)paramType.getRawType();
+
+ if (interfaceName == javax.xml.ws.Provider.class) {
+ if (paramType.getActualTypeArguments().length > 1) {
+ throw ExceptionFactory.makeWebServiceException(
+ "Provider cannot have more than one Generic Types defined as Per JAX-WS Specification");
+ }
+ providerType = (Class)paramType.getActualTypeArguments()[0];
+ }
+ }
+ return providerType;
}
}
Modified: geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ejb/EJBProviderDispatcher.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ejb/EJBProviderDispatcher.java?view=diff&rev=544651&r1=544650&r2=544651
==============================================================================
--- geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ejb/EJBProviderDispatcher.java (original)
+++ geronimo/server/trunk/modules/geronimo-axis2/src/main/java/org/apache/geronimo/axis2/ejb/EJBProviderDispatcher.java Tue Jun 5 14:57:49 2007
@@ -21,6 +21,7 @@
import javax.interceptor.InvocationContext;
import javax.xml.ws.Provider;
+import org.apache.axis2.jaxws.ExceptionFactory;
import org.apache.axis2.jaxws.core.MessageContext;
import org.apache.axis2.jaxws.server.dispatcher.ProviderDispatcher;
@@ -28,9 +29,18 @@
private InvocationContext invContext;
- public EJBProviderDispatcher(InvocationContext invContext) {
- super(null, null);
+ public EJBProviderDispatcher(Class serviceImplClass, InvocationContext invContext) {
+ super(serviceImplClass, getDummyInstance(serviceImplClass));
this.invContext = invContext;
+ }
+
+ // TODO: change ProviderDispatcher so that instance is not required
+ private static Object getDummyInstance(Class serviceImplClass) {
+ try {
+ return serviceImplClass.newInstance();
+ } catch (Exception e) {
+ throw ExceptionFactory.makeWebServiceException("Failed to create provider instance");
+ }
}
@Override