Author: djencks Date: Sat Jan 29 11:35:40 2005 New Revision: 149067 URL: http://svn.apache.org/viewcvs?view=rev&rev=149067 Log: Process more of the jaxrpc mapping file when setting up service-refs. Intermediate checkin. Modified: geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisBuilder.java geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/ServiceReferenceTest.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/ServiceImpl.java geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceReference.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=149067&p1=geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisBuilder.java&r1=149066&p2=geronimo/trunk/modules/axis-builder/src/java/org/apache/geronimo/axis/builder/AxisBuilder.java&r2=149067 ============================================================================== --- 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 11:35:40 2005 @@ -50,6 +50,7 @@ import javax.wsdl.extensions.soap.SOAPOperation; import javax.wsdl.factory.WSDLFactory; import javax.wsdl.xml.WSDLReader; +import javax.wsdl.xml.WSDLLocator; import javax.xml.namespace.QName; import net.sf.cglib.core.DefaultGeneratorStrategy; @@ -86,6 +87,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.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; @@ -94,7 +98,7 @@ * @version $Rev: $ $Date: $ */ public class AxisBuilder implements ServiceReferenceBuilder { - private static final Class[] SERVICE_CONSTRUCTOR_TYPES = new Class[]{Map.class}; + private static final Class[] SERVICE_CONSTRUCTOR_TYPES = new Class[]{Map.class, Map.class}; private static final URI ENHANCED_LOCATION = URI.create("cglib/"); private static final SOAPConstants SOAP_VERSION = SOAPConstants.SOAP11_CONSTANTS; @@ -113,21 +117,22 @@ Class enhanced = enhancer.createClass(); saveClass(deploymentContext, enhanced.getName(), strategy.getClassBytes()); - return new ServiceReference(enhanced, null, null); + return new ServiceReference(enhanced, null, null, null); } public Object createService(Class serviceInterface, URI wsdlURI, URI jaxrpcMappingURI, QName serviceQName, Map portComponentRefMap, List handlers, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) throws DeploymentException { JarFile moduleFile = module.getModuleFile(); - InputStream wsdlInputStream = null; - try { - wsdlInputStream = moduleFile.getInputStream(moduleFile.getEntry(wsdlURI.toString())); - } catch (IOException e) { - throw new DeploymentException("Could not open stream to wsdl file", e); - } + JarWSDLLocator wsdlLocator = new JarWSDLLocator(moduleFile, wsdlURI); +// InputStream wsdlInputStream = null; +// try { +// wsdlInputStream = moduleFile.getInputStream(moduleFile.getEntry(wsdlURI.toString())); +// } catch (IOException e) { +// throw new DeploymentException("Could not open stream to wsdl file", e); +// } //TODO trying to read in the doc from the wsdlFile directly doesn't work in running geronimo, but does work in //unit tests. You get a java.net.UnknownServiceException with message "no content-type". Perhaps something //is wrong with the geronimo url handler?? - InputSource inputSource = new InputSource(wsdlInputStream); +// InputSource inputSource = new InputSource(wsdlInputStream); WSDLFactory wsdlFactory = null; try { wsdlFactory = WSDLFactory.newInstance(); @@ -135,10 +140,10 @@ throw new DeploymentException("Could not create WSDLFactory", e); } WSDLReader wsdlReader = wsdlFactory.newWSDLReader(); - wsdlReader.setFeature("javax.wsdl.importDocuments", false); +// wsdlReader.setFeature("javax.wsdl.importDocuments", true); Definition definition = null; try { - definition = wsdlReader.readWSDL(null, inputSource); + definition = wsdlReader.readWSDL(wsdlLocator); } catch (WSDLException e) { throw new DeploymentException("Failed to read wsdl document", e); } @@ -174,18 +179,17 @@ return reference; } - public javax.xml.rpc.Service createService(Class serviceInterface, Definition definition, JavaWsdlMappingType mapping, QName serviceQName, SOAPConstants soapVersion, DeploymentContext context, Module module, ClassLoader classloader) throws DeploymentException { - Map seiFactoryMap = new HashMap(); - ServiceImpl serviceInstance = createService(serviceInterface, seiFactoryMap, context, module, classloader); - if (serviceQName != null) { - buildSEIFactoryMap(serviceInterface, definition, mapping, serviceQName, soapVersion, seiFactoryMap, serviceInstance, context, module, classloader); - } + public Object createService(Class serviceInterface, Definition definition, JavaWsdlMappingType mapping, QName serviceQName, SOAPConstants soapVersion, DeploymentContext context, Module module, ClassLoader classloader) throws DeploymentException { + Map seiPortNameToFactoryMap = new HashMap(); + Map seiClassNameToFactoryMap = new HashMap(); + Object serviceInstance = createService(serviceInterface, seiPortNameToFactoryMap, seiClassNameToFactoryMap, context, module, classloader); + buildSEIFactoryMap(serviceInterface, definition, mapping, serviceQName, soapVersion, seiPortNameToFactoryMap, seiClassNameToFactoryMap, serviceInstance, context, module, classloader); return serviceInstance; } - public ServiceImpl createService(Class serviceInterface, Map seiFactoryMap, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) throws DeploymentException { + public Object createService(Class serviceInterface, Map seiPortNameToFactoryMap, Map seiClassNameToFactoryMap, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) throws DeploymentException { - Callback callback = new ServiceMethodInterceptor(seiFactoryMap); + Callback callback = new ServiceMethodInterceptor(seiPortNameToFactoryMap); Callback[] methodInterceptors = new Callback[]{SerializableNoOp.INSTANCE, callback}; Enhancer enhancer = new Enhancer(); @@ -209,16 +213,25 @@ Enhancer.registerCallbacks(serviceClass, methodInterceptors); FastConstructor constructor = FastClass.create(serviceClass).getConstructor(SERVICE_CONSTRUCTOR_TYPES); try { - return (ServiceImpl) constructor.newInstance(new Object[]{seiFactoryMap}); + return constructor.newInstance(new Object[]{seiPortNameToFactoryMap, seiClassNameToFactoryMap}); } catch (InvocationTargetException e) { throw new DeploymentException("Could not construct service instance", e.getTargetException()); } } - public Map buildSEIFactoryMap(Class serviceInterface, Definition definition, JavaWsdlMappingType mapping, QName serviceQName, SOAPConstants soapVersion, Map seiFactoryMap, ServiceImpl serviceImpl, DeploymentContext context, Module module, ClassLoader classloader) throws DeploymentException { + public void buildSEIFactoryMap(Class serviceInterface, Definition definition, JavaWsdlMappingType mapping, QName serviceQName, SOAPConstants soapVersion, Map seiPortNameToFactoryMap, Map seiClassNameToFactoryMap, Object serviceImpl, DeploymentContext context, Module module, ClassLoader classloader) throws DeploymentException { //find the service we are working with - javax.wsdl.Service service = definition.getService(serviceQName); + javax.wsdl.Service service; + if (serviceQName != null) { + service = definition.getService(serviceQName); + } else { + Map services = definition.getServices(); + if (services.size() != 1) { + throw new DeploymentException("no serviceQName supplied, and there are " + services.size() + " services"); + } + service = (javax.wsdl.Service) services.values().iterator().next(); + } if (service == null) { throw new DeploymentException("No service wsdl for supplied service qname " + serviceQName); } @@ -229,40 +242,105 @@ Map.Entry entry = (Map.Entry) iterator.next(); String portName = (String) entry.getKey(); Port port = (Port) entry.getValue(); - Class serviceEndpointInterface = getServiceEndpointInterface(serviceInterface, port); - Class enhancedServiceEndpointClass = enhanceServiceEndpointInterface(serviceEndpointInterface, context, module, classloader); - - 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); - } - Binding binding = port.getBinding(); SOAPBinding soapBinding = (SOAPBinding) getExtensibilityElement(SOAPBinding.class, binding.getExtensibilityElements()); // String transportURI = soapBinding.getTransportURI(); String portStyleString = soapBinding.getStyle(); Style portStyle = Style.getStyle(portStyleString); PortType portType = binding.getPortType(); - //port type corresponds to SEI - List operations = portType.getOperations(); - OperationInfo[] operationInfos = new OperationInfo[FastClass.create(enhancedServiceEndpointClass).getMaxIndex() + 1]; - 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().getName()); - OperationInfo operationInfo = buildOperationInfo(method, bindingOperation, portStyle, soapVersion); - int methodIndex = getSuperIndex(enhancedServiceEndpointClass, method); - operationInfos[methodIndex] = operationInfo; - } - List typeMappings = new ArrayList(); - SEIFactory seiFactory = createSEIFactory(enhancedServiceEndpointClass, serviceImpl, typeMappings, location, operationInfos, context, classloader); - seiFactoryMap.put(portName, seiFactory); + 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); + } + + SEIFactory seiFactory; + + Class serviceEndpointInterface = null; + ServiceEndpointInterfaceMappingType[] endpointMappings = mapping.getServiceEndpointInterfaceMappingArray(); + 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]; + 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()); + OperationInfo operationInfo = buildOperationInfo(method, bindingOperation, portStyle, soapVersion); + int methodIndex = getSuperIndex(enhancedServiceEndpointClass, method); + operationInfos[methodIndex] = operationInfo; + } + List typeMappings = new ArrayList(); + seiFactory = createSEIFactory(enhancedServiceEndpointClass, serviceImpl, typeMappings, location, operationInfos, context, classloader); + } else { + QName portTypeQName = portType.getQName(); + ServiceEndpointInterfaceMappingType endpointMapping = getServiceEndpointInterfaceMapping(endpointMappings, portTypeQName); + String fqcn = endpointMapping.getServiceEndpointInterface().getStringValue(); + try { + serviceEndpointInterface = classloader.loadClass(fqcn); + } catch (ClassNotFoundException e) { + throw new DeploymentException("Could not load service endpoint interface", e); + } + 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]; + 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()); + ServiceEndpointMethodMappingType methodMapping = getMethodMappingForOperation(operation, methodMappings); + String javaMethodName = methodMapping.getJavaMethodName().getStringValue().trim(); + Class[] types = getParameterTypes(methodMapping, classloader); + Method method = null; + try { + method = serviceEndpointInterface.getMethod(javaMethodName, types); + } catch (NoSuchMethodException e) { + 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; + } + List typeMappings = new ArrayList(); + seiFactory = createSEIFactory(enhancedServiceEndpointClass, serviceImpl, typeMappings, location, operationInfos, context, classloader); + } + seiPortNameToFactoryMap.put(portName, seiFactory); + seiClassNameToFactoryMap.put(serviceEndpointInterface.getName(), seiFactory); } - return seiFactoryMap; + } + + private Class[] getParameterTypes(ServiceEndpointMethodMappingType methodMapping, ClassLoader classloader) throws DeploymentException { + MethodParamPartsMappingType[] paramMappings = methodMapping.getMethodParamPartsMappingArray(); + Class[] types = new Class[paramMappings.length]; + for (int i = 0; i < paramMappings.length; i++) { + MethodParamPartsMappingType paramMapping = paramMappings[i]; + String paramType = paramMapping.getParamType().getStringValue().trim(); + try { + types[i] = classloader.loadClass(paramType); + } catch (ClassNotFoundException e) { + throw new DeploymentException("Could not load param type", e); + } + } + return types; + } + + private ServiceEndpointMethodMappingType getMethodMappingForOperation(Operation operation, ServiceEndpointMethodMappingType[] methodMappings) throws DeploymentException { + String operationName = operation.getName(); + for (int i = 0; i < methodMappings.length; i++) { + ServiceEndpointMethodMappingType methodMapping = methodMappings[i]; + if (operationName.equals(methodMapping.getWsdlOperation())) { + return methodMapping; + } + } + throw new DeploymentException("No method found for operation named " + operationName); } private Method getMethodForOperation(Class enhancedServiceEndpointClass, Operation operation) throws DeploymentException { @@ -284,7 +362,7 @@ return found; } - private Class getServiceEndpointInterface(Class serviceInterface, Port port) throws DeploymentException { + private Class getServiceEndpointInterfaceLightweight(Class serviceInterface, Port port) throws DeploymentException { Method[] methods = serviceInterface.getMethods(); String methodName = "get" + port.getName(); String serviceEndpointInterfaceShortName = port.getBinding().getPortType().getQName().getLocalPart(); @@ -304,6 +382,17 @@ throw new DeploymentException("Could not find service endpoint interface for port named " + port.getName()); } + private ServiceEndpointInterfaceMappingType getServiceEndpointInterfaceMapping(ServiceEndpointInterfaceMappingType[] endpointMappings, QName portTypeQName) throws DeploymentException { + for (int i = 0; i < endpointMappings.length; i++) { + ServiceEndpointInterfaceMappingType endpointMapping = endpointMappings[i]; + QName testPortQName = endpointMapping.getWsdlPortType().getQNameValue(); + if (portTypeQName.equals(testPortQName)) { + return endpointMapping; + } + } + throw new DeploymentException("Could not find service endpoint interface for port named " + portTypeQName); + } + private ExtensibilityElement getExtensibilityElement(Class clazz, List extensibilityElements) throws DeploymentException { for (Iterator iterator = extensibilityElements.iterator(); iterator.hasNext();) { ExtensibilityElement extensibilityElement = (ExtensibilityElement) iterator.next(); @@ -325,10 +414,14 @@ // throw new DeploymentException("Package " + packageName + " was not mapped in jaxrpc mapping file"); // } - public SEIFactory createSEIFactory(Class enhancedServiceEndpointClass, ServiceImpl serviceImpl, List typeMappings, URL location, OperationInfo[] operationInfos, DeploymentContext deploymentContext, ClassLoader classLoader) throws DeploymentException { + public SEIFactory createSEIFactory(Class enhancedServiceEndpointClass, Object serviceImpl, List typeMappings, URL location, OperationInfo[] operationInfos, DeploymentContext deploymentContext, ClassLoader classLoader) throws DeploymentException { - SEIFactory factory = new SEIFactoryImpl(enhancedServiceEndpointClass, operationInfos, serviceImpl, typeMappings, location); - return factory; + try { + SEIFactory factory = new SEIFactoryImpl(enhancedServiceEndpointClass, operationInfos, serviceImpl, typeMappings, location, classLoader); + return factory; + } catch (ClassNotFoundException e) { + throw new DeploymentException("Could not load GenericServiceEndpoint from application classloader", e); + } } public Class enhanceServiceEndpointInterface(Class serviceEndpointInterface, DeploymentContext deploymentContext, Module module, ClassLoader classLoader) throws DeploymentException { @@ -354,6 +447,8 @@ } public OperationInfo buildOperationInfo(Method method, BindingOperation bindingOperation, Style defaultStyle, SOAPConstants soapVersion) throws DeploymentException { + + //TODO how can bindingOperation be null? Operation operation = bindingOperation.getOperation(); String operationName = operation.getName(); List order = operation.getParameterOrdering(); @@ -363,7 +458,7 @@ QName returnQName = null; Message inputMessage = operation.getInput().getMessage(); - Message outputMessage = 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) { @@ -467,6 +562,48 @@ public byte[] getClassBytes() { return classBytes; + } + } + + static class JarWSDLLocator implements WSDLLocator { + + private final JarFile moduleFile; + private final URI wsdlURI; + private URI latestImportURI; + + public JarWSDLLocator(JarFile moduleFile, URI wsdlURI) { + this.moduleFile = moduleFile; + this.wsdlURI = wsdlURI; + } + + public InputSource getBaseInputSource() { + InputStream wsdlInputStream = null; + try { + wsdlInputStream = moduleFile.getInputStream(moduleFile.getEntry(wsdlURI.toString())); + } catch (IOException e) { + throw new RuntimeException("Could not open stream to wsdl file", e); + } + return new InputSource(wsdlInputStream); + } + + public String getBaseURI() { + return wsdlURI.toString(); + } + + public InputSource getImportInputSource(String parentLocation, String relativeLocation) { + URI parentURI = URI.create(parentLocation); + latestImportURI = parentURI.resolve(relativeLocation); + InputStream importInputStream = null; + try { + importInputStream = moduleFile.getInputStream(moduleFile.getEntry(latestImportURI.toString())); + } catch (IOException e) { + throw new RuntimeException("Could not open stream to import file", e); + } + return new InputSource(importInputStream); + } + + public String getLatestImportURI() { + return latestImportURI.toString(); } } Modified: geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/ServiceReferenceTest.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/ServiceReferenceTest.java?view=diff&rev=149067&p1=geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/ServiceReferenceTest.java&r1=149066&p2=geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/ServiceReferenceTest.java&r2=149067 ============================================================================== --- geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/ServiceReferenceTest.java (original) +++ geronimo/trunk/modules/axis-builder/src/test/org/apache/geronimo/axis/builder/ServiceReferenceTest.java Sat Jan 29 11:35:40 2005 @@ -127,9 +127,12 @@ public void testServiceProxy() throws Exception { //construct the SEI proxy Map portMap = new HashMap(); - portMap.put("MockPort", new MockSEIFactory()); + MockSEIFactory factory = new MockSEIFactory(); + portMap.put("MockPort", factory); + Map seiClassNameToFactoryMap = new HashMap(); + seiClassNameToFactoryMap.put(MockPort.class.getName(), factory); AxisBuilder builder = new AxisBuilder(); - Service service = builder.createService(MockService.class, portMap, context, module, isolatedCl); + Object service = builder.createService(MockService.class, portMap, seiClassNameToFactoryMap, context, module, isolatedCl); assertTrue(service instanceof MockService); MockService mockService = (MockService) service; MockPort mockPort = mockService.getMockPort(); @@ -139,7 +142,7 @@ public void testServiceEndpointProxy() throws Exception { AxisBuilder builder = new AxisBuilder(); - ServiceImpl serviceInstance = new ServiceImpl(null); + ServiceImpl serviceInstance = new ServiceImpl(null, null); List typeMappings = new ArrayList(); URL location = new URL("http://geronimo.apache.org/ws"); @@ -204,6 +207,10 @@ assertTrue(proxy instanceof InteropLab); InteropTestPortType interopTestPort = ((InteropLab) proxy).getinteropTestPort(); assertNotNull(interopTestPort); + testInteropPort(interopTestPort); + } + + private void testInteropPort(InteropTestPortType interopTestPort) throws java.rmi.RemoteException { if (runExternalWSTest) { System.out.println("Running external ws test"); int result = interopTestPort.echoInteger(1); @@ -231,16 +238,25 @@ Object proxy = reference.getContent(); assertNotNull(proxy); assertTrue(proxy instanceof InteropLab); - InteropTestPortType interopTestPort = ((InteropLab) proxy).getinteropTestPort(); + + InteropLab interopLab = ((InteropLab) proxy); + InteropTestPortType interopTestPort = interopLab.getinteropTestPort(); assertNotNull(interopTestPort); - if (runExternalWSTest) { - System.out.println("Running external ws test"); - int result = interopTestPort.echoInteger(1); - assertEquals(result, 1); - } else { - System.out.println("Skipping external ws test"); - } + testInteropPort(interopTestPort); + + //test more dynamically + Remote sei = interopLab.getPort(InteropTestPortType.class); + assertNotNull(sei); + assertTrue(sei instanceof InteropTestPortType); + testInteropPort((InteropTestPortType) sei); + + Remote sei2 = interopLab.getPort(new QName("http://tempuri.org/4s4c/1/3/wsdl/def/interopLab", "interopTestPort"), null); + assertNotNull(sei2); + assertTrue(sei2 instanceof InteropTestPortType); + testInteropPort((InteropTestPortType) sei2); } + + private OperationInfo buildOperationInfoForMockOperation(AxisBuilder builder) throws NoSuchMethodException, DeploymentException, WSDLException { Class portClass = MockPort.class; 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=149067&p1=geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactoryImpl.java&r1=149066&p2=geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/SEIFactoryImpl.java&r2=149067 ============================================================================== --- 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 11:35:40 2005 @@ -20,6 +20,7 @@ import java.rmi.Remote; import java.io.Serializable; import java.io.ObjectStreamException; +import java.io.InvalidClassException; import java.util.List; import java.net.URL; import javax.xml.rpc.ServiceException; @@ -39,21 +40,23 @@ private final Class serviceEndpointClass; private final OperationInfo[] operationInfos; private transient final FastConstructor constructor; - private final ServiceImpl serviceImpl; + private final Object serviceImpl; private final List typeMappings; private final URL location; - public SEIFactoryImpl(Class serviceEndpointClass, OperationInfo[] operationInfos, ServiceImpl serviceImpl, List typeMappings, URL location) { + public SEIFactoryImpl(Class serviceEndpointClass, OperationInfo[] operationInfos, Object serviceImpl, List typeMappings, URL location, ClassLoader classLoader) throws ClassNotFoundException { this.serviceEndpointClass = serviceEndpointClass; this.operationInfos = operationInfos; - this.constructor = FastClass.create(serviceEndpointClass).getConstructor(SERVICE_ENDPOINT_CONSTRUCTOR_TYPES); + Class[] constructorTypes = new java.lang.Class[0]; + constructorTypes = classLoader == null? SERVICE_ENDPOINT_CONSTRUCTOR_TYPES: new Class[] {classLoader.loadClass(GenericServiceEndpoint.class.getName())}; + this.constructor = FastClass.create(serviceEndpointClass).getConstructor(constructorTypes); this.serviceImpl = serviceImpl; this.typeMappings = typeMappings; this.location = location; } public Remote createServiceEndpoint() throws ServiceException { - Service service = serviceImpl.getService(); + Service service = ((ServiceImpl)serviceImpl).getService(); GenericServiceEndpoint serviceEndpoint = new GenericServiceEndpoint(service, typeMappings, location); Callback callback = new ServiceEndpointMethodInterceptor(serviceEndpoint, operationInfos); Callback[] callbacks = new Callback[]{SerializableNoOp.INSTANCE, callback}; @@ -67,6 +70,10 @@ } private Object readResolve() throws ObjectStreamException { - return new SEIFactoryImpl(serviceEndpointClass, operationInfos, serviceImpl, typeMappings, location); + try { + return new SEIFactoryImpl(serviceEndpointClass, operationInfos, serviceImpl, typeMappings, location, null); + } catch (ClassNotFoundException e) { + throw new InvalidClassException(GenericServiceEndpoint.class.getName(), "this is impossible"); + } } } Modified: geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceImpl.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceImpl.java?view=diff&rev=149067&p1=geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceImpl.java&r1=149066&p2=geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceImpl.java&r2=149067 ============================================================================== --- geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceImpl.java (original) +++ geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceImpl.java Sat Jan 29 11:35:40 2005 @@ -33,15 +33,17 @@ /** - * @version $Rev$ $Date$ + * @version $Revision:$ $Date:$ */ public class ServiceImpl implements javax.xml.rpc.Service, Serializable { private transient Service delegate; + private Map seiClassNameToFactoryMap; private final Map portToImplementationMap; - public ServiceImpl(Map portToImplementationMap) { + public ServiceImpl(Map portToImplementationMap, Map seiClassNameToFactoryMap) { this.portToImplementationMap = portToImplementationMap; + this.seiClassNameToFactoryMap = seiClassNameToFactoryMap; this.delegate = new Service(); } @@ -49,27 +51,15 @@ if (qName != null) { String portName = qName.getLocalPart(); Remote port = internalGetPort(portName); - if (port != null) { - return port; - } - } - String fqcn = portClass.getName(); - String portName = fqcn.substring(fqcn.lastIndexOf('.')); - Remote port = internalGetPort(portName); - if (port != null) { return port; } - return delegate.getPort(qName, portClass); + return getPort(portClass); } public Remote getPort(Class portClass) throws ServiceException { String fqcn = portClass.getName(); - String portName = fqcn.substring(fqcn.lastIndexOf('.')); - Remote port = internalGetPort(portName); - if (port != null) { - return port; - } - return delegate.getPort(portClass); + Remote port = internalGetPortFromClassName(fqcn); + return port; } public Call[] getCalls(QName qName) throws ServiceException { @@ -81,7 +71,7 @@ } public Call createCall(QName qName, QName qName1) throws ServiceException { - return delegate.createCall(qName, qName1); + return delegate.createCall(qName, qName1); } public Call createCall(QName qName, String s) throws ServiceException { @@ -114,9 +104,20 @@ Remote internalGetPort(String portName) throws ServiceException { if (portToImplementationMap.containsKey(portName)) { - return (Remote) portToImplementationMap.get(portName); + SEIFactory seiFactory = (SEIFactory) portToImplementationMap.get(portName); + Remote port = seiFactory.createServiceEndpoint(); + return port; + } + throw new ServiceException("No port for portname: " + portName); + } + + Remote internalGetPortFromClassName(String className) throws ServiceException { + if (seiClassNameToFactoryMap.containsKey(className)) { + SEIFactory seiFactory = (SEIFactory) seiClassNameToFactoryMap.get(className); + Remote port = seiFactory.createServiceEndpoint(); + return port; } - return null; + throw new ServiceException("no port for class " + className); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { Modified: geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceReference.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceReference.java?view=diff&rev=149067&p1=geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceReference.java&r1=149066&p2=geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceReference.java&r2=149067 ============================================================================== --- geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceReference.java (original) +++ geronimo/trunk/modules/axis/src/java/org/apache/geronimo/axis/client/ServiceReference.java Sat Jan 29 11:35:40 2005 @@ -30,25 +30,27 @@ * @version $Rev: $ $Date: $ */ public class ServiceReference extends SimpleAwareReference { - private final static Class[] CONSTRUCTOR_TYPES = new Class[] {Map.class}; + private final static Class[] CONSTRUCTOR_TYPES = new Class[] {Map.class, Map.class}; private final Class serviceClass; private final Callback[] methodInterceptors; - private final Map ports; + private final Map portNameToFactoryMap; + private final Map seiClassNameToFactoryMap; //THIS IS NOT SERIALIZABLE! private final FastConstructor constructor; - public ServiceReference(Class serviceClass, MethodInterceptor methodInterceptor, Map ports) { + public ServiceReference(Class serviceClass, MethodInterceptor methodInterceptor, Map portNameToFactoryMap, Map seiClassNameToFactoryMap) { this.serviceClass = serviceClass; this.methodInterceptors = new Callback[] {SerializableNoOp.INSTANCE, methodInterceptor}; - this.ports = ports; + this.portNameToFactoryMap = portNameToFactoryMap; + this.seiClassNameToFactoryMap = seiClassNameToFactoryMap; this.constructor = FastClass.create(serviceClass).getConstructor(CONSTRUCTOR_TYPES); } public Object getContent() { try { Enhancer.registerCallbacks(serviceClass, methodInterceptors); - Object serviceInstance = constructor.newInstance(new Object[] {ports}); + Object serviceInstance = constructor.newInstance(new Object[] {portNameToFactoryMap, seiClassNameToFactoryMap}); return serviceInstance; } catch (InvocationTargetException e) { throw new RuntimeException("Could not create instance", e);