Author: djencks
Date: Sat Jan 29 21:43:58 2005
New Revision: 149105
URL: http://svn.apache.org/viewcvs?view=rev&rev=149105
Log:
compute the superIndex in the deserialized objects classloader
Modified:
geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisBuilder.java
geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/OperationInfo.java
geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactoryImpl.java
geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java
Modified: geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisBuilder.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisBuilder.java?view=diff&rev=149105&p1=geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisBuilder.java&r1=149104&p2=geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisBuilder.java&r2=149105
==============================================================================
--- geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisBuilder.java
(original)
+++ geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisBuilder.java
Sat Jan 29 21:43:58 2005
@@ -49,16 +49,14 @@
import javax.wsdl.extensions.soap.SOAPBody;
import javax.wsdl.extensions.soap.SOAPOperation;
import javax.wsdl.factory.WSDLFactory;
-import javax.wsdl.xml.WSDLReader;
import javax.wsdl.xml.WSDLLocator;
+import javax.wsdl.xml.WSDLReader;
import javax.xml.namespace.QName;
import net.sf.cglib.core.DefaultGeneratorStrategy;
-import net.sf.cglib.core.Signature;
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
-import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.NoOp;
import net.sf.cglib.reflect.FastClass;
import net.sf.cglib.reflect.FastConstructor;
@@ -87,9 +85,9 @@
import org.apache.geronimo.naming.reference.DeserializingReference;
import org.apache.geronimo.xbeans.j2ee.JavaWsdlMappingDocument;
import org.apache.geronimo.xbeans.j2ee.JavaWsdlMappingType;
+import org.apache.geronimo.xbeans.j2ee.MethodParamPartsMappingType;
import org.apache.geronimo.xbeans.j2ee.ServiceEndpointInterfaceMappingType;
import org.apache.geronimo.xbeans.j2ee.ServiceEndpointMethodMappingType;
-import org.apache.geronimo.xbeans.j2ee.MethodParamPartsMappingType;
import org.apache.xmlbeans.XmlException;
import org.objectweb.asm.Type;
import org.xml.sax.InputSource;
@@ -249,32 +247,32 @@
Style portStyle = Style.getStyle(portStyleString);
PortType portType = binding.getPortType();
SOAPAddress soapAddress = (SOAPAddress) getExtensibilityElement(SOAPAddress.class,
port.getExtensibilityElements());
- String locationURIString = soapAddress.getLocationURI();
- URL location = null;
- try {
- location = new URL(locationURIString);
- } catch (MalformedURLException e) {
- throw new DeploymentException("Could not construct web service location
URL from " + locationURIString);
- }
+ String locationURIString = soapAddress.getLocationURI();
+ URL location = null;
+ try {
+ location = new URL(locationURIString);
+ } catch (MalformedURLException e) {
+ throw new DeploymentException("Could not construct web service location URL
from " + locationURIString);
+ }
- SEIFactory seiFactory;
+ SEIFactory seiFactory;
Class serviceEndpointInterface = null;
ServiceEndpointInterfaceMappingType[] endpointMappings = mapping.getServiceEndpointInterfaceMappingArray();
+ //port type corresponds to SEI
+ List operations = portType.getOperations();
+ OperationInfo[] operationInfos = new OperationInfo[operations.size()];
if (endpointMappings.length == 0) {
serviceEndpointInterface = getServiceEndpointInterfaceLightweight(serviceInterface,
port);
Class enhancedServiceEndpointClass = enhanceServiceEndpointInterface(serviceEndpointInterface,
context, module, classloader);
- //port type corresponds to SEI
- List operations = portType.getOperations();
- OperationInfo[] operationInfos = new OperationInfo[FastClass.create(enhancedServiceEndpointClass).getMaxIndex()
+ 1];
+ int i = 0;
for (Iterator ops = operations.iterator(); ops.hasNext();) {
Operation operation = (Operation) ops.next();
Method method = getMethodForOperation(enhancedServiceEndpointClass, operation);
- BindingOperation bindingOperation = binding.getBindingOperation(operation.getName(),
operation.getInput().getName(), operation.getOutput() == null? null: operation.getOutput().getName());
+ BindingOperation bindingOperation = binding.getBindingOperation(operation.getName(),
operation.getInput().getName(), operation.getOutput() == null ? null : operation.getOutput().getName());
OperationInfo operationInfo = buildOperationInfo(method, bindingOperation,
portStyle, soapVersion);
- int methodIndex = getSuperIndex(enhancedServiceEndpointClass, method);
- operationInfos[methodIndex] = operationInfo;
+ operationInfos[i++] = operationInfo;
}
List typeMappings = new ArrayList();
seiFactory = createSEIFactory(enhancedServiceEndpointClass, serviceImpl,
typeMappings, location, operationInfos, context, classloader);
@@ -289,13 +287,11 @@
}
Class enhancedServiceEndpointClass = enhanceServiceEndpointInterface(serviceEndpointInterface,
context, module, classloader);
- //port type corresponds to SEI
- List operations = portType.getOperations();
ServiceEndpointMethodMappingType[] methodMappings = endpointMapping.getServiceEndpointMethodMappingArray();
- OperationInfo[] operationInfos = new OperationInfo[FastClass.create(enhancedServiceEndpointClass).getMaxIndex()
+ 1];
+ int i = 0;
for (Iterator ops = operations.iterator(); ops.hasNext();) {
Operation operation = (Operation) ops.next();
- BindingOperation bindingOperation = binding.getBindingOperation(operation.getName(),
operation.getInput().getName(), operation.getOutput() == null? null: operation.getOutput().getName());
+ BindingOperation bindingOperation = binding.getBindingOperation(operation.getName(),
operation.getInput().getName(), operation.getOutput() == null ? null : operation.getOutput().getName());
ServiceEndpointMethodMappingType methodMapping = getMethodMappingForOperation(operation,
methodMappings);
String javaMethodName = methodMapping.getJavaMethodName().getStringValue().trim();
Class[] types = getParameterTypes(methodMapping, classloader);
@@ -306,8 +302,7 @@
throw new DeploymentException("Could not find method for operation",
e);
}
OperationInfo operationInfo = buildOperationInfo(method, bindingOperation,
portStyle, soapVersion);
- int methodIndex = getSuperIndex(enhancedServiceEndpointClass, method);
- operationInfos[methodIndex] = operationInfo;
+ operationInfos[i++] = operationInfo;
}
List typeMappings = new ArrayList();
seiFactory = createSEIFactory(enhancedServiceEndpointClass, serviceImpl,
typeMappings, location, operationInfos, context, classloader);
@@ -458,13 +453,13 @@
QName returnQName = null;
Message inputMessage = operation.getInput().getMessage();
- Message outputMessage = operation.getOutput() == null? null: operation.getOutput().getMessage();
+ Message outputMessage = operation.getOutput() == null ? null : operation.getOutput().getMessage();
if (order == null || order.size() == 0) {
if (outputMessage != null && outputMessage.getParts().size() > 1)
{
// throw new DeploymentException("We don't handle multiple out params unless
you supply the parameter order!");
System.out.println("We don't handle multiple out params unless you supply
the parameter order!");
- return null;
+ return new OperationInfo(null, false, null, null, null, method.getName(),
Type.getMethodDescriptor(method));
}
Class[] methodParamTypes = method.getParameterTypes();
Map inputParts = inputMessage.getParts();
@@ -495,7 +490,7 @@
//todo fix this
// throw new DeploymentException("specified parameter order NYI");
System.out.println("specified parameter order NYI");
- return null;
+ return new OperationInfo(null, false, null, null, null, method.getName(), Type.getMethodDescriptor(method));
}
ParameterDesc[] parameterDescs = (ParameterDesc[]) parameterList.toArray(new ParameterDesc[parameterList.size()]);
OperationDesc operationDesc = new OperationDesc(operationName, parameterDescs, returnQName);
@@ -526,18 +521,10 @@
boolean usesSOAPAction = (soapActionURI != null);
QName operationQName = new QName("", operation.getName());
- OperationInfo operationInfo = new OperationInfo(operationDesc, usesSOAPAction, soapActionURI,
soapVersion, operationQName);
+ String methodName = method.getName();
+ String methodDesc = Type.getMethodDescriptor(method);
+ OperationInfo operationInfo = new OperationInfo(operationDesc, usesSOAPAction, soapActionURI,
soapVersion, operationQName, methodName, methodDesc);
return operationInfo;
- }
-
- //from openejb MethodHelper
- public static int getSuperIndex(Class proxyType, Method method) {
- Signature signature = new Signature(method.getName(), Type.getReturnType(method),
Type.getArgumentTypes(method));
- MethodProxy methodProxy = MethodProxy.find(proxyType, signature);
- if (methodProxy != null) {
- return methodProxy.getSuperIndex();
- }
- return -1;
}
Modified: geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/OperationInfo.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/OperationInfo.java?view=diff&rev=149105&p1=geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/OperationInfo.java&r1=149104&p2=geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/OperationInfo.java&r2=149105
==============================================================================
--- geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/OperationInfo.java
(original)
+++ geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/OperationInfo.java
Sat Jan 29 21:43:58 2005
@@ -23,6 +23,7 @@
import org.apache.axis.description.OperationDesc;
import org.apache.axis.client.Call;
import org.apache.axis.soap.SOAPConstants;
+import net.sf.cglib.core.Signature;
/**
* @version $Rev: $ $Date: $
@@ -34,13 +35,21 @@
private final String soapActionURI;
private final SOAPConstants soapVersion;
private final QName operationName;
+ private final String methodName;
+ private final String methodDesc;
- public OperationInfo(OperationDesc operationDesc, boolean useSOAPAction, String soapActionURI,
SOAPConstants soapVersion, QName operationName) {
+ public OperationInfo(OperationDesc operationDesc, boolean useSOAPAction, String soapActionURI,
SOAPConstants soapVersion, QName operationName, String methodName, String methodDesc) {
this.operationDesc = operationDesc;
this.useSOAPAction = useSOAPAction;
this.soapActionURI = soapActionURI;
this.soapVersion = soapVersion;
this.operationName = operationName;
+ this.methodName = methodName;
+ this.methodDesc = methodDesc;
+ }
+
+ public Signature getSignature() {
+ return new Signature(methodName, methodDesc);
}
public OperationDesc getOperationDesc() {
Modified: geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactoryImpl.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactoryImpl.java?view=diff&rev=149105&p1=geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactoryImpl.java&r1=149104&p2=geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactoryImpl.java&r2=149105
==============================================================================
--- geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactoryImpl.java
(original)
+++ geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactoryImpl.java
Sat Jan 29 21:43:58 2005
@@ -27,8 +27,10 @@
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
+import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.reflect.FastConstructor;
import net.sf.cglib.reflect.FastClass;
+import net.sf.cglib.core.Signature;
import org.apache.axis.client.Service;
/**
@@ -43,6 +45,7 @@
private final Object serviceImpl;
private final List typeMappings;
private final URL location;
+ private transient OperationInfo[] sortedOperationInfos;
public SEIFactoryImpl(Class serviceEndpointClass, OperationInfo[] operationInfos, Object
serviceImpl, List typeMappings, URL location, ClassLoader classLoader) throws ClassNotFoundException
{
this.serviceEndpointClass = serviceEndpointClass;
@@ -53,12 +56,20 @@
this.serviceImpl = serviceImpl;
this.typeMappings = typeMappings;
this.location = location;
+ sortedOperationInfos = new OperationInfo[FastClass.create(serviceEndpointClass).getMaxIndex()
+ 1];
+ for (int i = 0; i < operationInfos.length; i++) {
+ OperationInfo operationInfo = operationInfos[i];
+ Signature signature = operationInfo.getSignature();
+ MethodProxy methodProxy = MethodProxy.find(serviceEndpointClass, signature);
+ int index = methodProxy.getSuperIndex();
+ sortedOperationInfos[index] = operationInfo;
+ }
}
public Remote createServiceEndpoint() throws ServiceException {
Service service = ((ServiceImpl)serviceImpl).getService();
GenericServiceEndpoint serviceEndpoint = new GenericServiceEndpoint(service, typeMappings,
location);
- Callback callback = new ServiceEndpointMethodInterceptor(serviceEndpoint, operationInfos);
+ Callback callback = new ServiceEndpointMethodInterceptor(serviceEndpoint, sortedOperationInfos);
Callback[] callbacks = new Callback[]{SerializableNoOp.INSTANCE, callback};
Enhancer.registerCallbacks(serviceEndpointClass, callbacks);
try {
Modified: geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java
Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java?view=diff&rev=149105&p1=geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java&r1=149104&p2=geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java&r2=149105
==============================================================================
--- geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java
(original)
+++ geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceEndpointMethodInterceptor.java
Sat Jan 29 21:43:58 2005
@@ -18,6 +18,7 @@
import java.lang.reflect.Method;
import java.io.Serializable;
+import java.util.Arrays;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
@@ -40,7 +41,7 @@
int index = methodProxy.getSuperIndex();
OperationInfo operationInfo = operations[index];
if (operationInfo == null) {
- throw new RuntimeException("Operation not mapped: " + method.getName());
+ throw new RuntimeException("Operation not mapped: " + method.getName() + " index:
" + index + "\n OperationInfos: " + Arrays.asList(operations));
}
stub.checkCachedEndpoint();
|