Author: djencks Date: Mon Feb 7 15:42:56 2005 New Revision: 151790 URL: http://svn.apache.org/viewcvs?view=rev&rev=151790 Log: Handle holders/OUT/INOUT parameters more or less correctly
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/j2ee-schema/src/java/org/apache/geronimo/schema/SchemaConversionUtils.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=151789&r2=151790 ============================================================================== --- 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 Mon Feb 7 15:42:56 2005 @@ -22,15 +22,20 @@ import java.io.ObjectOutputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.math.BigDecimal; +import java.math.BigInteger; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; +import java.util.Calendar; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.jar.JarFile; import javax.wsdl.Binding; import javax.wsdl.BindingInput; @@ -41,8 +46,10 @@ import javax.wsdl.Part; import javax.wsdl.Port; import javax.wsdl.PortType; +import javax.wsdl.Types; import javax.wsdl.WSDLException; import javax.wsdl.extensions.ExtensibilityElement; +import javax.wsdl.extensions.UnknownExtensibilityElement; import javax.wsdl.extensions.soap.SOAPAddress; import javax.wsdl.extensions.soap.SOAPBinding; import javax.wsdl.extensions.soap.SOAPBody; @@ -51,6 +58,27 @@ import javax.wsdl.xml.WSDLLocator; import javax.wsdl.xml.WSDLReader; import javax.xml.namespace.QName; +import javax.xml.rpc.holders.BigDecimalHolder; +import javax.xml.rpc.holders.BigIntegerHolder; +import javax.xml.rpc.holders.BooleanHolder; +import javax.xml.rpc.holders.BooleanWrapperHolder; +import javax.xml.rpc.holders.ByteArrayHolder; +import javax.xml.rpc.holders.ByteHolder; +import javax.xml.rpc.holders.ByteWrapperHolder; +import javax.xml.rpc.holders.CalendarHolder; +import javax.xml.rpc.holders.DoubleHolder; +import javax.xml.rpc.holders.DoubleWrapperHolder; +import javax.xml.rpc.holders.FloatHolder; +import javax.xml.rpc.holders.FloatWrapperHolder; +import javax.xml.rpc.holders.IntHolder; +import javax.xml.rpc.holders.IntegerWrapperHolder; +import javax.xml.rpc.holders.LongHolder; +import javax.xml.rpc.holders.LongWrapperHolder; +import javax.xml.rpc.holders.ObjectHolder; +import javax.xml.rpc.holders.QNameHolder; +import javax.xml.rpc.holders.ShortHolder; +import javax.xml.rpc.holders.ShortWrapperHolder; +import javax.xml.rpc.holders.StringHolder; import net.sf.cglib.core.DefaultGeneratorStrategy; import net.sf.cglib.proxy.Callback; @@ -86,6 +114,7 @@ import org.apache.geronimo.j2ee.deployment.Module; import org.apache.geronimo.j2ee.deployment.ServiceReferenceBuilder; import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory; +import org.apache.geronimo.kernel.ClassLoading; import org.apache.geronimo.naming.reference.DeserializingReference; import org.apache.geronimo.xbeans.j2ee.JavaWsdlMappingDocument; import org.apache.geronimo.xbeans.j2ee.JavaWsdlMappingType; @@ -96,9 +125,14 @@ import org.apache.geronimo.xbeans.j2ee.ServiceEndpointMethodMappingType; import org.apache.geronimo.xbeans.j2ee.WsdlMessageMappingType; import org.apache.geronimo.xbeans.j2ee.WsdlReturnValueMappingType; -import org.apache.geronimo.kernel.ClassLoading; +import org.apache.geronimo.schema.SchemaConversionUtils; import org.apache.xmlbeans.XmlException; +import org.apache.xmlbeans.XmlObject; +import org.apache.xmlbeans.XmlCursor; import org.objectweb.asm.Type; +import org.w3.x2001.xmlSchema.SchemaDocument; +import org.w3.x2001.xmlSchema.ComplexType; +import org.w3c.dom.Element; import org.xml.sax.InputSource; /** @@ -240,6 +274,8 @@ Map wsdlPortMap = service.getPorts(); + Map complexTypeMap = getComplexTypesInWsdl(definition); + for (Iterator iterator = wsdlPortMap.entrySet().iterator(); iterator.hasNext();) { Map.Entry entry = (Map.Entry) iterator.next(); String portName = (String) entry.getKey(); @@ -302,7 +338,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); - OperationInfo operationInfo = buildOperationInfoHeavyweight(methodMapping, bindingOperation, portStyle, soapVersion, mapping, classLoader); + OperationInfo operationInfo = buildOperationInfoHeavyweight(methodMapping, bindingOperation, portStyle, soapVersion, complexTypeMap, mapping, classLoader); operationInfos[i++] = operationInfo; } JavaXmlTypeMappingType[] javaXmlTypeMappings = mapping.getJavaXmlTypeMappingArray(); @@ -382,7 +418,6 @@ } 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); @@ -396,23 +431,6 @@ throw new DeploymentException("Could not load service endpoint interface type", e); } -// 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 { @@ -436,17 +454,6 @@ throw new DeploymentException("No element of class " + clazz.getName() + " found"); } -// private String getNamespaceFromPackage(String packageName, JavaWsdlMappingType mapping) throws DeploymentException { -// PackageMappingType[] packageMappings = mapping.getPackageMappingArray(); -// for (int i = 0; i < packageMappings.length; i++) { -// PackageMappingType packageMapping = packageMappings[i]; -// if (packageName.equals(packageMapping.getPackageType().getStringValue().trim())) { -// return packageMapping.getNamespaceURI().getStringValue().trim(); -// } -// } -// 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++) { @@ -512,6 +519,7 @@ throw new DeploymentException("Lightweight mapping has at most one part in the (optional) output message, not: " + outputMessage.getParts().size()); } Class[] methodParamTypes = method.getParameterTypes(); + //TODO investigate getOrderedParts 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()); @@ -570,7 +578,7 @@ return operationInfo; } - public OperationInfo buildOperationInfoHeavyweight(ServiceEndpointMethodMappingType methodMapping, BindingOperation bindingOperation, Style defaultStyle, SOAPConstants soapVersion, JavaWsdlMappingType mapping, ClassLoader classLoader) throws DeploymentException { + public OperationInfo buildOperationInfoHeavyweight(ServiceEndpointMethodMappingType methodMapping, BindingOperation bindingOperation, Style defaultStyle, SOAPConstants soapVersion, Map complexTypeMap, JavaWsdlMappingType mapping, ClassLoader classLoader) throws DeploymentException { //TODO how can bindingOperation be null? Operation operation = bindingOperation.getOperation(); @@ -578,47 +586,104 @@ Message inputMessage = operation.getInput().getMessage(); + Message outputMessage = operation.getOutput() == null ? null : operation.getOutput().getMessage(); boolean isWrappedElement = methodMapping.isSetWrappedElement(); MethodParamPartsMappingType[] paramMappings = methodMapping.getMethodParamPartsMappingArray(); Type[] parameterASMTypes = new Type[paramMappings.length]; ParameterDesc[] parameterDescriptions = new ParameterDesc[paramMappings.length]; + + Set inParamNames = new HashSet(); + Set outParamNames = new HashSet(); 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 = null; - try { - paramJavaType = ClassLoading.loadClass(paramJavaTypeName, classLoader); - } catch (ClassNotFoundException e) { - throw new DeploymentException("could not load parameter type", e); - } 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(); + String parameterMode = wsdlMessageMappingType.getParameterMode().getStringValue().trim(); + byte mode = ParameterDesc.modeFromString(parameterMode); + boolean isInParam = mode == ParameterDesc.IN || mode == ParameterDesc.INOUT; + boolean isOutParam = mode == ParameterDesc.OUT || mode == ParameterDesc.INOUT; - //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); + if (isOutParam && outputMessage == null) { + throw new DeploymentException("Mapping for output parameter " + wsdlMessagePartName + " found, but no output message for operation " + operationName); } -// Message inputMessage = definition.getMessage(wsdlMessageQName); - Part part = inputMessage.getPart(wsdlMessagePartName); + boolean isSoapHeader = wsdlMessageMappingType.isSetSoapHeader(); + boolean inHeader = isSoapHeader && isInParam; + boolean outHeader = isSoapHeader && isOutParam; + + Part part; + if (isInParam) { + if (!wsdlMessageQName.equals(inputMessage.getQName())) { + throw new DeploymentException("QName of input message: " + inputMessage.getQName() + + " does not match mapping message QName: " + wsdlMessageQName + " for operation " + operationName); + } + part = inputMessage.getPart(wsdlMessagePartName); + if (part == null) { + throw new DeploymentException("No part for wsdlMessagePartName " + wsdlMessagePartName + " in input message for operation " + operationName); + } + inParamNames.add(wsdlMessagePartName); + if (isOutParam) { + //inout, check that part of same name and type is in output message + Part outPart = outputMessage.getPart(wsdlMessagePartName); + if (outPart == null) { + throw new DeploymentException("No part for wsdlMessagePartName " + wsdlMessagePartName + " in output message for INOUT parameter of operation " + operationName); + } + if (!part.getName().equals(outPart.getName())) { + throw new DeploymentException("Mismatched input part name: " + part.getName() + " and output part name: " + outPart.getName() + " for INOUT parameter for wsdlMessagePartName " + wsdlMessagePartName + " for operation " + operationName); + } + if (!(part.getElementName() == null ? outPart.getElementName() == null : part.getElementName().equals(outPart.getElementName()))) { + throw new DeploymentException("Mismatched input part element name: " + part.getElementName() + " and output part element name: " + outPart.getElementName() + " for INOUT parameter for wsdlMessagePartName " + wsdlMessagePartName + " for operation " + operationName); + } + if (!(part.getTypeName() == null ? outPart.getTypeName() == null : part.getTypeName().equals(outPart.getTypeName()))) { + throw new DeploymentException("Mismatched input part type name: " + part.getTypeName() + " and output part type name: " + outPart.getTypeName() + " for INOUT parameter for wsdlMessagePartName " + wsdlMessagePartName + " for operation " + operationName); + } + outParamNames.add(wsdlMessagePartName); + } + } else if (isOutParam) { + if (!wsdlMessageQName.equals(outputMessage.getQName())) { + throw new DeploymentException("QName of output message: " + outputMessage.getQName() + + " does not match mapping message QName: " + wsdlMessageQName + " for operation " + operationName); + } + part = outputMessage.getPart(wsdlMessagePartName); + if (part == null) { + throw new DeploymentException("No part for wsdlMessagePartName " + wsdlMessagePartName + " in output message for operation " + operationName); + } + outParamNames.add(wsdlMessagePartName); + } else { + throw new AssertionError("a param mapping has to be IN or OUT or INOUT"); + } + //TODO this makes little sense but may be correct, see comments in axis Parameter class //the part name qname is really odd. - QName partQName = isWrappedElement? part.getElementName(): new QName("", part.getName()); + QName partQName = isWrappedElement ? part.getElementName() : new QName("", part.getName()); QName partTypeQName = part.getTypeName(); - ParameterDesc parameterDesc = new ParameterDesc(partQName, mode, partTypeQName, paramJavaType, inHeader, outHeader); + //use complexTypeMap + boolean isComplexType = complexTypeMap.containsKey(partTypeQName); + String paramJavaTypeName = paramMapping.getParamType().getStringValue().trim(); + Class actualParamJavaType = getHolderType(paramJavaTypeName, mode, partTypeQName, isComplexType, mapping, classLoader); + + ParameterDesc parameterDesc = new ParameterDesc(partQName, mode, partTypeQName, actualParamJavaType, inHeader, outHeader); parameterDescriptions[position] = parameterDesc; - parameterASMTypes[position] = Type.getType(paramJavaType); + parameterASMTypes[position] = Type.getType(actualParamJavaType); + } + + //check that all the parameters are there + for (int i = 0; i < parameterDescriptions.length; i++) { + ParameterDesc parameterDescription = parameterDescriptions[i]; + if (parameterDescription == null) { + throw new DeploymentException("There is no mapping for parameter number " + i + " for operation " + operationName); + } + } + + //check that all input message parts are mapped + if (!inParamNames.equals(inputMessage.getParts().keySet())) { + throw new DeploymentException("Not all input message parts were mapped for operation name" + operationName); } @@ -627,36 +692,47 @@ Class returnClass = null; Type returnASMType = Type.VOID_TYPE; - Message outputMessage = operation.getOutput() == null ? null : operation.getOutput().getMessage(); if (methodMapping.isSetWsdlReturnValueMapping()) { + if (outputMessage == null) { + throw new DeploymentException("No output message, but a mapping for it for operation " + operationName); + } WsdlReturnValueMappingType wsdlReturnValueMapping = methodMapping.getWsdlReturnValueMapping(); String returnClassName = wsdlReturnValueMapping.getMethodReturnValue().getStringValue().trim(); try { returnClass = ClassLoading.loadClass(returnClassName, classLoader); } catch (ClassNotFoundException e) { - throw new DeploymentException("Could not load return type", e); + throw new DeploymentException("Could not load return type for operation " + operationName, e); } 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); + throw new DeploymentException("OutputMessage has QName: " + outputMessage.getQName() + " but mapping specifies: " + wsdlMessageQName + " for operation " + operationName); } if (wsdlReturnValueMapping.isSetWsdlMessagePartName()) { String wsdlMessagePartName = wsdlReturnValueMapping.getWsdlMessagePartName().getStringValue().trim(); + if (outParamNames.contains(wsdlMessagePartName)) { + throw new DeploymentException("output message part " + wsdlMessagePartName + " has both an INOUT or OUT mapping and a return value mapping for operation " + operationName); + } Part part = outputMessage.getPart(wsdlMessagePartName); returnQName = part.getElementName(); returnType = part.getTypeName(); + + outParamNames.add(wsdlMessagePartName); + + } else { + //what does this mean???? } returnASMType = Type.getType(returnClass); } + if (outputMessage != null && !outParamNames.equals(outputMessage.getParts().keySet())) { + throw new DeploymentException("Not all output message parts were mapped to parameters or a return value for operation " + operationName); + } + OperationDesc operationDesc = new OperationDesc(operationName, parameterDescriptions, returnQName); operationDesc.setReturnType(returnType); operationDesc.setReturnClass(returnClass); @@ -688,6 +764,124 @@ String methodDesc = Type.getMethodDescriptor(returnASMType, parameterASMTypes); OperationInfo operationInfo = new OperationInfo(operationDesc, usesSOAPAction, soapActionURI, soapVersion, operationQName, methodName, methodDesc); return operationInfo; + } + + Map getComplexTypesInWsdl(Definition definition) throws DeploymentException { + Map complexTypeMap = new HashMap(); + Types types = definition.getTypes(); + Map namespaceMap = definition.getNamespaces(); + if (types != null) { + List schemas = types.getExtensibilityElements(); + for (Iterator iterator = schemas.iterator(); iterator.hasNext();) { + Object o = iterator.next(); + if (o instanceof UnknownExtensibilityElement) { + UnknownExtensibilityElement unknownExtensibilityElement = (UnknownExtensibilityElement) o; + QName elementType = unknownExtensibilityElement.getElementType(); + if (new QName("http://www.w3.org/2001/XMLSchema", "schema").equals(elementType)) { + Element element = unknownExtensibilityElement.getElement(); + try { + XmlObject xmlObject = SchemaConversionUtils.parse(element); + XmlCursor cursor = xmlObject.newCursor(); + try { + cursor.toFirstContentToken(); + for (Iterator namespaces = namespaceMap.entrySet().iterator(); namespaces.hasNext();) { + Map.Entry entry = (Map.Entry) namespaces.next(); + cursor.insertNamespace((String)entry.getKey(), (String)entry.getValue()); + } + } finally { + cursor.dispose(); + } + SchemaDocument schemaDoc = (SchemaDocument) xmlObject.changeType(SchemaDocument.type); + SchemaConversionUtils.validateDD(schemaDoc); + SchemaDocument.Schema schema = schemaDoc.getSchema(); + String targetNamespace = schema.getTargetNamespace(); + ComplexType[] complexTypes = schema.getComplexTypeArray(); + for (int j = 0; j < complexTypes.length; j++) { + ComplexType complexType = complexTypes[j]; + String complexTypeName = complexType.getName(); + QName complexTypeQName = new QName(targetNamespace, complexTypeName); + complexTypeMap.put(complexTypeQName, complexType); + } + } catch (XmlException e) { + throw new DeploymentException("Invalid schema in wsdl", e); + } + } else { + //problems?? + } + } + } + } + return complexTypeMap; + } + + private static final Map rpcHolderClasses = new HashMap(); + + static { + rpcHolderClasses.put(BigDecimal.class, BigDecimalHolder.class); + rpcHolderClasses.put(BigInteger.class, BigIntegerHolder.class); + rpcHolderClasses.put(boolean.class, BooleanHolder.class); + rpcHolderClasses.put(Boolean.class, BooleanWrapperHolder.class); + rpcHolderClasses.put(byte[].class, ByteArrayHolder.class); + rpcHolderClasses.put(byte.class, ByteHolder.class); + rpcHolderClasses.put(Byte.class, ByteWrapperHolder.class); + rpcHolderClasses.put(Calendar.class, CalendarHolder.class); + rpcHolderClasses.put(double.class, DoubleHolder.class); + rpcHolderClasses.put(Double.class, DoubleWrapperHolder.class); + rpcHolderClasses.put(float.class, FloatHolder.class); + rpcHolderClasses.put(Float.class, FloatWrapperHolder.class); + rpcHolderClasses.put(int.class, IntHolder.class); + rpcHolderClasses.put(Integer.class, IntegerWrapperHolder.class); + rpcHolderClasses.put(long.class, LongHolder.class); + rpcHolderClasses.put(Long.class, LongWrapperHolder.class); + rpcHolderClasses.put(Object.class, ObjectHolder.class); + rpcHolderClasses.put(QName.class, QNameHolder.class); + rpcHolderClasses.put(short.class, ShortHolder.class); + rpcHolderClasses.put(Short.class, ShortWrapperHolder.class); + rpcHolderClasses.put(String.class, StringHolder.class); + } + + private Class getHolderType(String paramJavaTypeName, byte mode, QName typeQName, boolean isComplexType, JavaWsdlMappingType mapping, ClassLoader classLoader) throws DeploymentException { + Class paramJavaType = null; + if (mode == ParameterDesc.IN) { + try { + paramJavaType = ClassLoading.loadClass(paramJavaTypeName, classLoader); + } catch (ClassNotFoundException e) { + throw new DeploymentException("could not load parameter type", e); + } + return paramJavaType; + } else { + String holderName; + if (isComplexType) { + String namespace = typeQName.getNamespaceURI(); + String packageName = getPackageFromNamespace(namespace, mapping); + StringBuffer buf = new StringBuffer(packageName.length() + typeQName.getLocalPart().length() + 14); + buf.append(packageName).append(".holders.").append(typeQName.getLocalPart()).append("Holder"); + buf.setCharAt(packageName.length() + 9, Character.toUpperCase(typeQName.getLocalPart().charAt(0))); + holderName = buf.toString(); + } else { + try { + paramJavaType = ClassLoading.loadClass(paramJavaTypeName, classLoader); + } catch (ClassNotFoundException e) { + throw new DeploymentException("could not load parameter type", e); + } + Class holder = (Class) rpcHolderClasses.get(paramJavaType); + if (holder != null) { + return holder; + } + String paramTypeName = paramJavaType.getName(); + StringBuffer buf = new StringBuffer(paramTypeName.length() + 14); + int dot = paramTypeName.lastIndexOf("."); + //foo.Bar >>> foo.holders.BarHolder + buf.append(paramTypeName.substring(0, dot)).append(".holders").append(paramTypeName.substring(dot)).append("Holder"); + holderName = buf.toString(); + } + try { + Class holder = ClassLoading.loadClass(holderName, classLoader); + return holder; + } catch (ClassNotFoundException e) { + throw new DeploymentException("Could not load holder class", e); + } + } } 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=151789&r2=151790 ============================================================================== --- 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 Mon Feb 7 15:42:56 2005 @@ -257,6 +257,14 @@ testInteropPort((InteropTestPortType) sei2); } + public void testBuildComplexTypeMap() throws Exception { + WSDLFactory factory = WSDLFactory.newInstance(); + WSDLReader reader = factory.newWSDLReader(); + Definition definition = reader.readWSDL(wsdlFile.toURI().toString()); + AxisBuilder builder = new AxisBuilder(); + Map complexTypeMap = builder.getComplexTypesInWsdl(definition); + assertEquals(7, complexTypeMap.size()); + } private OperationInfo buildOperationInfoForMockOperation(AxisBuilder builder) throws NoSuchMethodException, DeploymentException, WSDLException { 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&r1=151789&r2=151790 ============================================================================== --- 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 Mon Feb 7 15:42:56 2005 @@ -61,6 +61,9 @@ OperationInfo operationInfo = operationInfos[i]; Signature signature = operationInfo.getSignature(); MethodProxy methodProxy = MethodProxy.find(serviceEndpointClass, signature); + if (methodProxy == null) { + throw new RuntimeException("No method proxy for operationInfo " + signature); + } int index = methodProxy.getSuperIndex(); sortedOperationInfos[index] = operationInfo; } Modified: geronimo/trunk/modules/j2ee-schema/src/java/org/apache/geronimo/schema/SchemaConversionUtils.java URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/j2ee-schema/src/java/org/apache/geronimo/schema/SchemaConversionUtils.java?view=diff&r1=151789&r2=151790 ============================================================================== --- geronimo/trunk/modules/j2ee-schema/src/java/org/apache/geronimo/schema/SchemaConversionUtils.java (original) +++ geronimo/trunk/modules/j2ee-schema/src/java/org/apache/geronimo/schema/SchemaConversionUtils.java Mon Feb 7 15:42:56 2005 @@ -35,6 +35,7 @@ import org.apache.xmlbeans.XmlOptions; import org.apache.xmlbeans.SchemaType; import org.apache.xmlbeans.XmlDocumentProperties; +import org.w3c.dom.Element; /** * @version $Rev$ $Date$ @@ -74,6 +75,15 @@ public static XmlObject parse(String xml) throws XmlException { ArrayList errors = new ArrayList(); XmlObject parsed = XmlObject.Factory.parse(xml, createXmlOptions(errors)); + if (errors.size() != 0) { + throw new XmlException(errors.toArray().toString()); + } + return parsed; + } + + public static XmlObject parse(Element element) throws XmlException { + ArrayList errors = new ArrayList(); + XmlObject parsed = XmlObject.Factory.parse(element, createXmlOptions(errors)); if (errors.size() != 0) { throw new XmlException(errors.toArray().toString()); }