David, Have you taken a quick look at org.apache.axis.wsdl.symboltable stuff? a very good stand alone example is in samples/client/DynamicInvoker.java
-- dims On Mon, 07 Feb 2005 23:43:01 -0000, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote: > 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()); > } > > -- Davanum Srinivas - http://webservices.apache.org/~dims/