Author: djencks Date: Thu Feb 3 09:45:42 2005 New Revision: 151193 URL: http://svn.apache.org/viewcvs?view=rev&rev=151193 Log: incremental progress in ws client deployment
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/naming/src/java/org/apache/geronimo/naming/reference/DeserializingReference.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&r1=151192&r2=151193 ============================================================================== --- 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 Thu Feb 3 09:45:42 2005 @@ -16,7 +16,6 @@ */ package org.apache.geronimo.axis.builder; -import java.beans.Introspector; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; @@ -63,13 +62,13 @@ import org.apache.axis.client.Service; import org.apache.axis.description.OperationDesc; import org.apache.axis.description.ParameterDesc; +import org.apache.axis.encoding.ser.ArrayDeserializerFactory; +import org.apache.axis.encoding.ser.ArraySerializerFactory; +import org.apache.axis.encoding.ser.BeanDeserializerFactory; +import org.apache.axis.encoding.ser.BeanSerializerFactory; import org.apache.axis.enum.Style; import org.apache.axis.enum.Use; import org.apache.axis.soap.SOAPConstants; -import org.apache.axis.encoding.ser.BeanSerializerFactory; -import org.apache.axis.encoding.ser.BeanDeserializerFactory; -import org.apache.axis.encoding.ser.ArraySerializerFactory; -import org.apache.axis.encoding.ser.ArrayDeserializerFactory; import org.apache.geronimo.axis.client.GenericServiceEndpointWrapper; import org.apache.geronimo.axis.client.NoOverrideCallbackFilter; import org.apache.geronimo.axis.client.OperationInfo; @@ -90,10 +89,13 @@ 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.JavaXmlTypeMappingType; import org.apache.geronimo.xbeans.j2ee.MethodParamPartsMappingType; +import org.apache.geronimo.xbeans.j2ee.PackageMappingType; import org.apache.geronimo.xbeans.j2ee.ServiceEndpointInterfaceMappingType; import org.apache.geronimo.xbeans.j2ee.ServiceEndpointMethodMappingType; -import org.apache.geronimo.xbeans.j2ee.JavaXmlTypeMappingType; +import org.apache.geronimo.xbeans.j2ee.WsdlMessageMappingType; +import org.apache.geronimo.xbeans.j2ee.WsdlReturnValueMappingType; import org.apache.xmlbeans.XmlException; import org.objectweb.asm.Type; import org.xml.sax.InputSource; @@ -127,16 +129,6 @@ 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(); 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); WSDLFactory wsdlFactory = null; try { wsdlFactory = WSDLFactory.newInstance(); @@ -144,7 +136,6 @@ throw new DeploymentException("Could not create WSDLFactory", e); } WSDLReader wsdlReader = wsdlFactory.newWSDLReader(); -// wsdlReader.setFeature("javax.wsdl.importDocuments", true); Definition definition = null; try { definition = wsdlReader.readWSDL(wsdlLocator); @@ -223,7 +214,7 @@ } } - 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 { + 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; @@ -246,12 +237,7 @@ Map.Entry entry = (Map.Entry) iterator.next(); String portName = (String) entry.getKey(); Port port = (Port) entry.getValue(); - 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(); + SOAPAddress soapAddress = (SOAPAddress) getExtensibilityElement(SOAPAddress.class, port.getExtensibilityElements()); String locationURIString = soapAddress.getLocationURI(); URL location = null; @@ -261,6 +247,14 @@ 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(); + SEIFactory seiFactory; Class serviceEndpointInterface = null; @@ -269,29 +263,31 @@ 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); + //lightweight jaxrpc mapping supplied + serviceEndpointInterface = getServiceEndpointInterfaceLightweight(portType, mapping, classLoader); + Class enhancedServiceEndpointClass = enhanceServiceEndpointInterface(serviceEndpointInterface, context, module, classLoader); 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()); - OperationInfo operationInfo = buildOperationInfo(method, bindingOperation, portStyle, soapVersion); + OperationInfo operationInfo = buildOperationInfoLightweight(method, bindingOperation, portStyle, soapVersion); operationInfos[i++] = operationInfo; } List typeMappings = new ArrayList(); - seiFactory = createSEIFactory(enhancedServiceEndpointClass, serviceImpl, typeMappings, location, operationInfos, context, classloader); + seiFactory = createSEIFactory(enhancedServiceEndpointClass, serviceImpl, typeMappings, location, operationInfos, context, classLoader); } else { + //complete jaxrpc mapping file supplied QName portTypeQName = portType.getQName(); ServiceEndpointInterfaceMappingType endpointMapping = getServiceEndpointInterfaceMapping(endpointMappings, portTypeQName); String fqcn = endpointMapping.getServiceEndpointInterface().getStringValue(); try { - serviceEndpointInterface = classloader.loadClass(fqcn); + serviceEndpointInterface = classLoader.loadClass(fqcn); } catch (ClassNotFoundException e) { throw new DeploymentException("Could not load service endpoint interface", e); } - Class enhancedServiceEndpointClass = enhanceServiceEndpointInterface(serviceEndpointInterface, context, module, classloader); + Class enhancedServiceEndpointClass = enhanceServiceEndpointInterface(serviceEndpointInterface, context, module, classLoader); ServiceEndpointMethodMappingType[] methodMappings = endpointMapping.getServiceEndpointMethodMappingArray(); int i = 0; @@ -299,15 +295,7 @@ 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); + OperationInfo operationInfo = buildOperationInfoHeavyweight(methodMapping, bindingOperation, portStyle, soapVersion, mapping, classLoader); operationInfos[i++] = operationInfo; } JavaXmlTypeMappingType[] javaXmlTypeMappings = mapping.getJavaXmlTypeMappingArray(); @@ -320,18 +308,12 @@ String className = javaXmlTypeMapping.getJavaType().getStringValue().trim(); - //TODO plain primitive types -- although these should not show up I think. - if (className.indexOf("[") > -1) { + Class clazz = convertJavaTypeName(className, classLoader); + if (clazz.isArray()) { serializerFactoryClass = ArraySerializerFactory.class; deserializerFactoryClass = ArrayDeserializerFactory.class; - className = getArrayClassName(className); - } - Class clazz = null; - try { - clazz = classloader.loadClass(className); - } catch (ClassNotFoundException e) { - throw new DeploymentException("could not load class for classname: " + className, e); } + TypeMappingInfo typeMappingInfo = null; if (javaXmlTypeMapping.isSetRootTypeQname()) { QName typeName = javaXmlTypeMapping.getRootTypeQname().getQNameValue(); @@ -350,45 +332,86 @@ } - seiFactory = createSEIFactory(enhancedServiceEndpointClass, serviceImpl, typeMappings, location, operationInfos, context, classloader); + seiFactory = createSEIFactory(enhancedServiceEndpointClass, serviceImpl, typeMappings, location, operationInfos, context, classLoader); } seiPortNameToFactoryMap.put(portName, seiFactory); seiClassNameToFactoryMap.put(serviceEndpointInterface.getName(), seiFactory); } } - String getArrayClassName(String className) { + Class convertJavaTypeName(String className, ClassLoader classLoader) throws DeploymentException { int pos = className.indexOf("["); - String baseType = className.substring(0, pos).trim(); - StringBuffer buf = new StringBuffer(className.length()); - buf.append("["); - while ((pos = className.indexOf("[", pos + 1)) > -1) { + if (pos > -1) { + String baseType = className.substring(0, pos).trim(); + StringBuffer buf = new StringBuffer(className.length()); buf.append("["); - } - if (false) { //is primitive type - //TODO arrays of primitive type - } else { - buf.append("L").append(baseType).append(";"); - } - className = buf.toString(); - return className; - } + while ((pos = className.indexOf("[", pos + 1)) > -1) { + buf.append("["); + } - 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); + if (baseType.equals("int")) { + buf.append("I"); + } else if (baseType.equals("boolean")) { + buf.append("Z"); + } else if (baseType.equals("byte")) { + buf.append("B"); + } else if (baseType.equals("char")) { + buf.append("C"); + } else if (baseType.equals("short")) { + buf.append("S"); + } else if (baseType.equals("double")) { + buf.append("D"); + } else if (baseType.equals("float")) { + buf.append("F"); + } else if (baseType.equals("long")) { + buf.append("J"); + } else { + buf.append("L").append(baseType).append(";"); + } + className = buf.toString(); + } else { + if (className.equals("int")) { + return int.class; + } else if (className.equals("boolean")) { + return boolean.class; + } else if (className.equals("byte")) { + return byte.class; + } else if (className.equals("char")) { + return char.class; + } else if (className.equals("short")) { + return short.class; + } else if (className.equals("double")) { + return double.class; + } else if (className.equals("float")) { + return float.class; + } else if (className.equals("long")) { + return long.class; + } else if (className.equals("void")) { + return void.class; } } - return types; + try { + return classLoader.loadClass(className); + } catch (ClassNotFoundException e) { + throw new DeploymentException("Could not load class ", e); + } } +// 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++) { @@ -419,24 +442,38 @@ return found; } - 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(); - for (int i = 0; i < methods.length; i++) { - Method method = methods[i]; - if (method.getName().equals(methodName)) { - Class serviceEndpointInterface = method.getReturnType(); - String longName = serviceEndpointInterface.getName(); - String name = longName.substring(longName.lastIndexOf('.') + 1); - if (!name.equals(serviceEndpointInterfaceShortName) && - !Introspector.decapitalize(name).equals(serviceEndpointInterfaceShortName)) { - throw new DeploymentException("unexpected name for service endpoint interface, expected ending: " + serviceEndpointInterfaceShortName + ", found " + serviceEndpointInterface.getName()); - } - return serviceEndpointInterface; - } + private Class getServiceEndpointInterfaceLightweight(PortType portType, JavaWsdlMappingType mappings, ClassLoader classLoader) throws DeploymentException { +// PortType portType = port.getBinding().getPortType(); + QName portTypeQName = portType.getQName(); + String portTypeNamespace = portTypeQName.getNamespaceURI(); + String portTypePackage = getPackageFromNamespace(portTypeNamespace, mappings); + StringBuffer shortInterfaceName = new StringBuffer(portTypeQName.getLocalPart()); + shortInterfaceName.setCharAt(0, Character.toUpperCase(shortInterfaceName.charAt(0))); + //TODO just use one buffer! + String fqcn = portTypePackage + "." + shortInterfaceName.toString(); + try { + return classLoader.loadClass(fqcn); + } catch (ClassNotFoundException e) { + throw new DeploymentException("Could not load service endpoint interface type", e); } - throw new DeploymentException("Could not find service endpoint interface for port named " + port.getName()); + +// Method[] methods = serviceInterface.getMethods(); +// String methodName = "get" + port.getName(); +// String serviceEndpointInterfaceShortName = port.getBinding().getPortType().getQName().getLocalPart(); +// for (int i = 0; i < methods.length; i++) { +// Method method = methods[i]; +// if (method.getName().equals(methodName)) { +// Class serviceEndpointInterface = method.getReturnType(); +// String longName = serviceEndpointInterface.getName(); +// String name = longName.substring(longName.lastIndexOf('.') + 1); +// if (!name.equals(serviceEndpointInterfaceShortName) && +// !Introspector.decapitalize(name).equals(serviceEndpointInterfaceShortName)) { +// throw new DeploymentException("unexpected name for service endpoint interface, expected ending: " + serviceEndpointInterfaceShortName + ", found " + serviceEndpointInterface.getName()); +// } +// return serviceEndpointInterface; +// } +// } +// throw new DeploymentException("Could not find service endpoint interface for port named " + port.getName()); } private ServiceEndpointInterfaceMappingType getServiceEndpointInterfaceMapping(ServiceEndpointInterfaceMappingType[] endpointMappings, QName portTypeQName) throws DeploymentException { @@ -471,6 +508,17 @@ // throw new DeploymentException("Package " + packageName + " was not mapped in jaxrpc mapping file"); // } + private String getPackageFromNamespace(String namespace, JavaWsdlMappingType mapping) throws DeploymentException { + PackageMappingType[] packageMappings = mapping.getPackageMappingArray(); + for (int i = 0; i < packageMappings.length; i++) { + PackageMappingType packageMapping = packageMappings[i]; + if (namespace.equals(packageMapping.getNamespaceURI().getStringValue().trim())) { + return packageMapping.getPackageType().getStringValue().trim(); + } + } + throw new DeploymentException("Namespace " + namespace + " was not mapped in jaxrpc mapping file"); + } + public SEIFactory createSEIFactory(Class enhancedServiceEndpointClass, Object serviceImpl, List typeMappings, URL location, OperationInfo[] operationInfos, DeploymentContext deploymentContext, ClassLoader classLoader) throws DeploymentException { try { @@ -503,12 +551,16 @@ return serviceEndpointClass; } - public OperationInfo buildOperationInfo(Method method, BindingOperation bindingOperation, Style defaultStyle, SOAPConstants soapVersion) throws DeploymentException { + public OperationInfo buildOperationInfoLightweight(Method method, BindingOperation bindingOperation, Style defaultStyle, SOAPConstants soapVersion) throws DeploymentException { - //TODO how can bindingOperation be null? + if (bindingOperation == null) { + throw new DeploymentException("No BindingOperation supplied for method " + method.getName()); + } Operation operation = bindingOperation.getOperation(); String operationName = operation.getName(); - List order = operation.getParameterOrdering(); + //section 7.3.2, we don't have to look at parameter ordering. + //unless it turns out we have to validate it. +// List order = operation.getParameterOrdering(); List parameterList = new ArrayList(); QName returnType = null; @@ -517,42 +569,32 @@ Message inputMessage = operation.getInput().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 new OperationInfo(null, false, null, null, null, method.getName(), Type.getMethodDescriptor(method)); - } - Class[] methodParamTypes = method.getParameterTypes(); - Map inputParts = inputMessage.getParts(); - if (methodParamTypes.length != inputParts.size()) { - throw new DeploymentException("mismatch in parameter counts: method has " + methodParamTypes.length + " whereas the input message has " + inputParts.size()); - } - int i = 0; - for (Iterator parts = inputParts.entrySet().iterator(); parts.hasNext();) { - //TODO HOW IS THIS SUPPOSED TO WORK????? is the map ordered? - Map.Entry entry = (Map.Entry) parts.next(); - String partName = (String) entry.getKey(); - Part part = (Part) entry.getValue(); - QName name = new QName("", partName); - byte mode = ParameterDesc.IN; - QName typeQName = part.getTypeName() == null ? part.getElementName() : part.getTypeName(); - Class javaClass = methodParamTypes[i++]; - //TODO where do the inHeader and outHeader come from? - ParameterDesc parameter = new ParameterDesc(name, mode, typeQName, javaClass, false, false); - parameterList.add(parameter); - } - if (outputMessage != null && outputMessage.getParts().size() == 1) { - //TODO this might be wrong - returnQName = outputMessage.getQName(); - Part part = (Part) outputMessage.getParts().values().iterator().next(); - returnType = part.getTypeName() == null ? part.getElementName() : part.getTypeName(); - } - } else { - //todo fix this -// throw new DeploymentException("specified parameter order NYI"); - System.out.println("specified parameter order NYI"); - return new OperationInfo(null, false, null, null, null, method.getName(), Type.getMethodDescriptor(method)); + if (outputMessage != null && outputMessage.getParts().size() > 1) { + throw new DeploymentException("Lightweight mapping has at most one part in the (optional) output message, not: " + outputMessage.getParts().size()); + } + Class[] methodParamTypes = method.getParameterTypes(); + Map inputParts = inputMessage.getParts(); + if (methodParamTypes.length != inputParts.size()) { + throw new DeploymentException("mismatch in parameter counts: method has " + methodParamTypes.length + " whereas the input message has " + inputParts.size()); + } + int i = 0; + for (Iterator parts = inputParts.entrySet().iterator(); parts.hasNext();) { + //TODO HOW IS THIS SUPPOSED TO WORK????? is the map ordered? + Map.Entry entry = (Map.Entry) parts.next(); + String partName = (String) entry.getKey(); + Part part = (Part) entry.getValue(); + QName name = new QName("", partName); + byte mode = ParameterDesc.IN; + QName typeQName = part.getTypeName() == null ? part.getElementName() : part.getTypeName(); + Class javaClass = methodParamTypes[i++]; + //lightweight mapping has no parts in headers, so inHeader and outHeader are false + ParameterDesc parameter = new ParameterDesc(name, mode, typeQName, javaClass, false, false); + parameterList.add(parameter); + } + if (outputMessage != null && outputMessage.getParts().size() == 1) { + returnQName = outputMessage.getQName(); + Part part = (Part) outputMessage.getParts().values().iterator().next(); + returnType = part.getTypeName() == null ? part.getElementName() : part.getTypeName(); } ParameterDesc[] parameterDescs = (ParameterDesc[]) parameterList.toArray(new ParameterDesc[parameterList.size()]); OperationDesc operationDesc = new OperationDesc(operationName, parameterDescs, returnQName); @@ -585,6 +627,114 @@ String methodName = method.getName(); String methodDesc = Type.getMethodDescriptor(method); + OperationInfo operationInfo = new OperationInfo(operationDesc, usesSOAPAction, soapActionURI, soapVersion, operationQName, methodName, methodDesc); + return operationInfo; + } + + public OperationInfo buildOperationInfoHeavyweight(ServiceEndpointMethodMappingType methodMapping, BindingOperation bindingOperation, Style defaultStyle, SOAPConstants soapVersion, JavaWsdlMappingType mapping, ClassLoader classLoader) throws DeploymentException { + + //TODO how can bindingOperation be null? + Operation operation = bindingOperation.getOperation(); + String operationName = operation.getName(); + + + Message inputMessage = operation.getInput().getMessage(); + + MethodParamPartsMappingType[] paramMappings = methodMapping.getMethodParamPartsMappingArray(); + Type[] parameterASMTypes = new Type[paramMappings.length]; + ParameterDesc[] parameterDescriptions = new ParameterDesc[paramMappings.length]; + for (int i = 0; i < paramMappings.length; i++) { + MethodParamPartsMappingType paramMapping = paramMappings[i]; + int position = paramMapping.getParamPosition().getBigIntegerValue().intValue(); + String paramJavaTypeName = paramMapping.getParamType().getStringValue().trim(); + Class paramJavaType = convertJavaTypeName(paramJavaTypeName, classLoader); + + WsdlMessageMappingType wsdlMessageMappingType = paramMapping.getWsdlMessageMapping(); + String parameterMode = wsdlMessageMappingType.getParameterMode().getStringValue().trim(); + byte mode = ParameterDesc.modeFromString(parameterMode); + boolean isSoapHeader = wsdlMessageMappingType.isSetSoapHeader(); + boolean inHeader = isSoapHeader && (mode == ParameterDesc.IN || mode == ParameterDesc.INOUT); + boolean outHeader = isSoapHeader && (mode == ParameterDesc.OUT || mode == ParameterDesc.INOUT); + QName wsdlMessageQName = wsdlMessageMappingType.getWsdlMessage().getQNameValue(); + String wsdlMessagePartName = wsdlMessageMappingType.getWsdlMessagePartName().getStringValue().trim(); + + + //TODO Must this be the inputMessage? Then we don't need definition. + if (!wsdlMessageQName.equals(inputMessage.getQName())) { + throw new DeploymentException("QName of input message: " + inputMessage.getQName() + " does not match mapping message QName: " + wsdlMessageQName); + } +// Message inputMessage = definition.getMessage(wsdlMessageQName); + Part part = inputMessage.getPart(wsdlMessagePartName); + //TODO this makes little sense but may be correct, see comments in axis Parameter class + QName partQName = part.getElementName(); + QName partTypeQName = part.getTypeName(); + + ParameterDesc parameterDesc = new ParameterDesc(partQName, mode, partTypeQName, paramJavaType, inHeader, outHeader); + parameterDescriptions[position] = parameterDesc; + parameterASMTypes[position] = Type.getType(paramJavaType); + } + + + QName returnType = null; + QName returnQName = null; + Class returnClass = null; + Type returnASMType = Type.VOID_TYPE; + + Message outputMessage = operation.getOutput() == null ? null : operation.getOutput().getMessage(); + if (methodMapping.isSetWsdlReturnValueMapping()) { + WsdlReturnValueMappingType wsdlReturnValueMapping = methodMapping.getWsdlReturnValueMapping(); + String returnClassName = wsdlReturnValueMapping.getMethodReturnValue().getStringValue().trim(); + returnClass = convertJavaTypeName(returnClassName, classLoader); + + QName wsdlMessageQName = wsdlReturnValueMapping.getWsdlMessage().getQNameValue(); + + if (outputMessage == null) { + throw new DeploymentException("No output message, but a mapping for it!"); + } + if (!wsdlMessageQName.equals(outputMessage.getQName())) { + throw new DeploymentException("OutputMessage has QName: " + outputMessage.getQName() + " but mapping specifies: " + wsdlMessageQName); + } + + if (wsdlReturnValueMapping.isSetWsdlMessagePartName()) { + String wsdlMessagePartName = wsdlReturnValueMapping.getWsdlMessagePartName().getStringValue().trim(); + Part part = outputMessage.getPart(wsdlMessagePartName); + returnQName = part.getElementName(); + returnType = part.getTypeName(); + } + + returnASMType = Type.getType(returnClass); + + } + + OperationDesc operationDesc = new OperationDesc(operationName, parameterDescriptions, returnQName); + operationDesc.setReturnType(returnType); + operationDesc.setReturnClass(returnClass); + + SOAPOperation soapOperation = (SOAPOperation) getExtensibilityElement(SOAPOperation.class, bindingOperation.getExtensibilityElements()); + String soapActionURI = soapOperation.getSoapActionURI(); + String styleString = soapOperation.getStyle(); + Style style = Style.getStyle(styleString, defaultStyle); + BindingInput bindingInput = bindingOperation.getBindingInput(); + SOAPBody soapBody = (SOAPBody) getExtensibilityElement(SOAPBody.class, bindingInput.getExtensibilityElements()); + String useString = soapBody.getUse(); + Use use = Use.getUse(useString); + operationDesc.setStyle(style); + operationDesc.setUse(use); + //TODO add faults +// TFault[] faults = tOperation.getFaultArray(); +// for (int i = 0; i < faults.length; i++) { +// TFault fault = faults[i]; +// QName faultQName = new QName("", fault.getName()); +// String className = ; +// QName faultTypeQName = ; +// boolean isComplex = ; +// FaultDesc faultDesc = new FaultDesc(faultQName, className, faultTypeQName, isComplex) +// } + boolean usesSOAPAction = (soapActionURI != null); + QName operationQName = new QName("", operation.getName()); + + String methodName = methodMapping.getJavaMethodName().getStringValue().trim(); + String methodDesc = Type.getMethodDescriptor(returnASMType, parameterASMTypes); OperationInfo operationInfo = new OperationInfo(operationDesc, usesSOAPAction, soapActionURI, soapVersion, operationQName, methodName, methodDesc); return operationInfo; } 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&r1=151192&r2=151193 ============================================================================== --- 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 Thu Feb 3 09:45:42 2005 @@ -113,9 +113,30 @@ public void testGetArrayClassName() throws Exception { AxisBuilder builder = new AxisBuilder(); - assertEquals("[Ljava.lang.Object;", builder.getArrayClassName("java.lang.Object[]")); - assertEquals("[Ljava.lang.Object;", builder.getArrayClassName("java.lang.Object [ ] ")); - assertEquals("[[Ljava.lang.Object;", builder.getArrayClassName("java.lang.Object [ ] []")); + ClassLoader classLoader = this.getClass().getClassLoader(); + assertEquals(Object[].class, builder.convertJavaTypeName("java.lang.Object[]", classLoader)); + assertEquals(Object[].class, builder.convertJavaTypeName("java.lang.Object [ ] ", classLoader)); + assertEquals(Object[][].class, builder.convertJavaTypeName("java.lang.Object [ ] []", classLoader)); + + assertEquals(boolean[][].class, builder.convertJavaTypeName("boolean [ ] []", classLoader)); + assertEquals(byte[][].class, builder.convertJavaTypeName("byte [ ] []", classLoader)); + assertEquals(char[][].class, builder.convertJavaTypeName("char [ ] []", classLoader)); + assertEquals(double[][].class, builder.convertJavaTypeName("double [ ] []", classLoader)); + assertEquals(float[][].class, builder.convertJavaTypeName("float [ ] []", classLoader)); + assertEquals(int[][].class, builder.convertJavaTypeName("int [ ] []", classLoader)); + assertEquals(long[][].class, builder.convertJavaTypeName("long [ ] []", classLoader)); + assertEquals(short[][].class, builder.convertJavaTypeName("short [ ] []", classLoader)); + + assertEquals(boolean.class, builder.convertJavaTypeName("boolean", classLoader)); + assertEquals(byte.class, builder.convertJavaTypeName("byte", classLoader)); + assertEquals(char.class, builder.convertJavaTypeName("char", classLoader)); + assertEquals(double.class, builder.convertJavaTypeName("double", classLoader)); + assertEquals(float.class, builder.convertJavaTypeName("float", classLoader)); + assertEquals(int.class, builder.convertJavaTypeName("int", classLoader)); + assertEquals(long.class, builder.convertJavaTypeName("long", classLoader)); + assertEquals(short.class, builder.convertJavaTypeName("short", classLoader)); + assertEquals(void.class, builder.convertJavaTypeName("void", classLoader)); + } @@ -201,7 +222,8 @@ assertNotNull(bookQuote); } - public void testBuildInteropProxy() throws Exception { + //needs to have heavyweight mapping + public void xtestBuildInteropProxy() throws Exception { WSDLFactory factory = WSDLFactory.newInstance(); WSDLReader reader = factory.newWSDLReader(); Definition definition = reader.readWSDL(wsdlFile.toURI().toString()); @@ -228,7 +250,7 @@ } } - public void testBuildInteropProxyFromURIs() throws Exception { + public void xtestBuildInteropProxyFromURIs() throws Exception { //ejb is from the EJBModule "ejb" targetPath. context.addFile(new URI("ejb/META-INF/wsdl/interop.wsdl"), wsdlFile); context.addFile(new URI("ejb/META-INF/wsdl/interop-jaxrpcmapping.xml"), new File(wsdlDir, "interop-jaxrpcmapping.xml")); @@ -276,7 +298,7 @@ Style defaultStyle = Style.DOCUMENT; - OperationInfo operationInfo = builder.buildOperationInfo(method, bindingOperation, defaultStyle, SOAPConstants.SOAP11_CONSTANTS); + OperationInfo operationInfo = builder.buildOperationInfoLightweight(method, bindingOperation, defaultStyle, SOAPConstants.SOAP11_CONSTANTS); return operationInfo; } Modified: geronimo/trunk/modules/naming/src/java/org/apache/geronimo/naming/reference/DeserializingReference.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/naming/src/java/org/apache/geronimo/naming/reference/DeserializingReference.java?view=diff&r1=151192&r2=151193 ============================================================================== --- geronimo/trunk/modules/naming/src/java/org/apache/geronimo/naming/reference/DeserializingReference.java (original) +++ geronimo/trunk/modules/naming/src/java/org/apache/geronimo/naming/reference/DeserializingReference.java Thu Feb 3 09:45:42 2005 @@ -22,6 +22,8 @@ import java.io.IOException; import java.io.ObjectStreamClass; +import org.apache.geronimo.kernel.ClassLoading; + /** * @version $Rev: $ $Date: $ */ @@ -56,20 +58,15 @@ } private static class ConfigInputStream extends ObjectInputStream { - private final ClassLoader cl; + private final ClassLoader classLoader; - public ConfigInputStream(InputStream in, ClassLoader cl) throws IOException { + public ConfigInputStream(InputStream in, ClassLoader classLoader) throws IOException { super(in); - this.cl = cl; + this.classLoader = classLoader; } - protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { - try { - return cl.loadClass(desc.getName()); - } catch (ClassNotFoundException e) { - // let the parent try - return super.resolveClass(desc); - } + protected Class resolveClass(ObjectStreamClass classDesc) throws IOException, ClassNotFoundException { + return ClassLoading.loadClass(classDesc.getName(), classLoader); } } }