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();