You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by Davanum Srinivas <da...@gmail.com> on 2005/02/08 00:54:08 UTC

Re: svn commit: r151790 - in geronimo/trunk/modules: axis-builder/src/java/org/apache/geronimo/axis/builder/ axis-builder/src/test/org/apache/geronimo/axis/builder/ axis/src/java/org/apache/geronimo/axis/client/ j2ee-schema/src/java/org/apache/geroni

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, djencks@apache.org
<dj...@apache.org> 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/