You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by sa...@apache.org on 2003/06/19 01:01:53 UTC

cvs commit: xml-axis/java/test/wsdl/extensibility ExtensibilityQueryBindingImpl.java ExtensibilityQueryTestCase.java QueryTypes.wsdl server-deploy.wsdd

sandholm    2003/06/18 16:01:53

  Modified:    java/src/org/apache/axis/encoding
                        DeserializationContext.java
                        DeserializationContextImpl.java
                        DeserializerImpl.java SerializationContextImpl.java
               java/src/org/apache/axis/encoding/ser ArrayDeserializer.java
                        BeanDeserializer.java SimpleDeserializer.java
               java/src/org/apache/axis/message MessageElement.java
                        RPCHandler.java SOAPEnvelope.java SOAPHeader.java
               java/src/org/apache/axis/utils XMLUtils.java
               java/src/org/apache/axis/wsdl/fromJava Emitter.java
               java/src/org/apache/axis/wsdl/symbolTable SchemaUtils.java
                        Utils.java
               java/src/org/apache/axis/wsdl/toJava JavaBeanWriter.java
                        JavaEnumTypeWriter.java
               java/test/wsdl/extensibility
                        ExtensibilityQueryBindingImpl.java
                        ExtensibilityQueryTestCase.java QueryTypes.wsdl
                        server-deploy.wsdd
  Added:       java/src/org/apache/axis/encoding AnyContentType.java
  Log:
  merge of dynamic deserialization branch into trunk
  --------------------------------------------------
  -added support for deserilizing types based on their meta data
  -SOAPBody/Header dirty flag bug fix
  -default Namespace support in XMLUtils
  -fix to WSDL Emitter to handle default namespace in wrapped mode
  -xsd:union memberType support
  -mark any content types with interface
  -added meta data generation for enum types
  -updated extensibility test case to test new dynamic deserialization code
  
  Revision  Changes    Path
  1.54      +24 -0     xml-axis/java/src/org/apache/axis/encoding/DeserializationContext.java
  
  Index: DeserializationContext.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializationContext.java,v
  retrieving revision 1.53
  retrieving revision 1.54
  diff -u -r1.53 -r1.54
  --- DeserializationContext.java	22 Apr 2003 19:34:24 -0000	1.53
  +++ DeserializationContext.java	18 Jun 2003 23:01:49 -0000	1.54
  @@ -168,6 +168,30 @@
        */
       public Deserializer getDeserializerForType(QName xmlType);
   
  +    /**
  +     * Convenience method to get the Deserializer for a specific
  +     * java class from its meta data.
  +     * @param cls is the Class used to find the deserializer 
  +     * @return Deserializer
  +     */
  +    public Deserializer getDeserializerForClass(Class cls);
  +
  +    /**
  +     * Allows the destination class to be set so that downstream
  +     * deserializers like ArrayDeserializer can pick it up when
  +     * deserializing its components using getDeserializerForClass
  +     * @param destClass is the Class of the component to be deserialized 
  +     */
  +    public void setDestinationClass(Class destClass);
  +
  +    /**
  +     * Allows the destination class to be retrieved so that downstream
  +     * deserializers like ArrayDeserializer can pick it up when
  +     * deserializing its components using getDeserializerForClass
  +     * @return the Class of the component to be deserialized 
  +     */
  +    public Class getDestinationClass();
  +
       /** 
        * Get the TypeMapping for this DeserializationContext
        */
  
  
  
  1.76      +68 -0     xml-axis/java/src/org/apache/axis/encoding/DeserializationContextImpl.java
  
  Index: DeserializationContextImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializationContextImpl.java,v
  retrieving revision 1.75
  retrieving revision 1.76
  diff -u -r1.75 -r1.76
  --- DeserializationContextImpl.java	22 Apr 2003 17:39:55 -0000	1.75
  +++ DeserializationContextImpl.java	18 Jun 2003 23:01:49 -0000	1.76
  @@ -74,6 +74,7 @@
   import org.apache.axis.utils.Messages;
   import org.apache.axis.utils.NSStack;
   import org.apache.axis.utils.XMLUtils;
  +import org.apache.axis.description.TypeDesc;
   import org.apache.commons.logging.Log;
   import org.xml.sax.Attributes;
   import org.xml.sax.InputSource;
  @@ -89,6 +90,7 @@
   import java.io.IOException;
   import java.util.ArrayList;
   import java.util.HashMap;
  +import java.lang.reflect.Method;
   
   /**
    * @author Glen Daniels (gdaniels@macromedia.com)
  @@ -111,6 +113,10 @@
   
       private Locator locator;
   
  +    // Class used for deserialization using class metadata from 
  +    // downstream deserializers
  +    private Class destClass;
  +
       // for performance reasons, keep the top of the stack separate from
       // the remainder of the handlers, and therefore readily available.
       private SOAPHandler topHandler = null;
  @@ -136,6 +142,10 @@
       private MessageElement curElement;
   
       protected int startOfMappingsPos = -1;
  +
  +    private static final Class[] DESERIALIZER_CLASSES =
  +            new Class[] {String.class, Class.class, QName.class};
  +    private static final String DESERIALIZER_METHOD = "getDeserializer";
       
       // This is a hack to associate the first schema namespace we see with
       // the correct SchemaVersion.  It assumes people won't often be mixing
  @@ -469,6 +479,64 @@
               }
           }
           return dser;
  +    }
  +    
  +    /**
  +     * Convenience method to get the Deserializer for a specific
  +     * java class from its meta data.
  +     * @param cls is the Class used to find the deserializer 
  +     * @return Deserializer
  +     */
  +    public Deserializer getDeserializerForClass(Class cls) {
  +        if (cls == null) {
  +           cls = destClass;
  +        }
  +        if (cls == null) {
  +            return null;
  +        }
  +        if (cls.isArray()) {
  +            cls = cls.getComponentType();
  +        }
  +        if (javax.xml.rpc.holders.Holder.class.isAssignableFrom(cls)) {
  +            try {
  +                cls = cls.getField("value").getType();
  +            } catch (Exception e) {
  +            }
  +        }
  +        Deserializer dser = null;
  +        try {
  +            Method method = cls.getMethod(DESERIALIZER_METHOD, DESERIALIZER_CLASSES);
  +            if (method != null) {
  +                TypeDesc typedesc = TypeDesc.getTypeDescForClass(cls);
  +                if (typedesc != null) {
  +                    dser = (Deserializer) method.invoke(null,
  +                        new Object[] {msgContext.getEncodingStyle(), cls, typedesc.getXmlType()});
  +                }
  +            }
  +        } catch (Exception e) {
  +            log.error(Messages.getMessage("noDeser00", cls.getName()));
  +        }
  +        return dser;
  +    }
  +
  +     /**
  +     * Allows the destination class to be set so that downstream
  +     * deserializers like ArrayDeserializer can pick it up when
  +     * deserializing its components using getDeserializerForClass
  +     * @param destClass is the Class of the component to be deserialized 
  +     */
  +    public void setDestinationClass(Class destClass) {
  +        this.destClass = destClass;
  +    }
  +
  +    /**
  +     * Allows the destination class to be retrieved so that downstream
  +     * deserializers like ArrayDeserializer can pick it up when
  +     * deserializing its components using getDeserializerForClass
  +     * @return the Class of the component to be deserialized 
  +     */
  +    public Class getDestinationClass() {
  +        return destClass;
       }
   
       /**
  
  
  
  1.36      +3 -0      xml-axis/java/src/org/apache/axis/encoding/DeserializerImpl.java
  
  Index: DeserializerImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializerImpl.java,v
  retrieving revision 1.35
  retrieving revision 1.36
  diff -u -r1.35 -r1.36
  --- DeserializerImpl.java	28 May 2003 14:21:55 -0000	1.35
  +++ DeserializerImpl.java	18 Jun 2003 23:01:49 -0000	1.36
  @@ -471,6 +471,9 @@
               // attribute type qname.
               if (type != null) {
                   Deserializer dser = context.getDeserializerForType(type);
  +                if (dser == null) {
  +                    dser = context.getDeserializerForClass(null);
  +                }
                   if (dser != null) {
                       // Move the value targets to the new deserializer
                       dser.moveValueTargets(this);
  
  
  
  1.93      +32 -19    xml-axis/java/src/org/apache/axis/encoding/SerializationContextImpl.java
  
  Index: SerializationContextImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/SerializationContextImpl.java,v
  retrieving revision 1.92
  retrieving revision 1.93
  diff -u -r1.92 -r1.93
  --- SerializationContextImpl.java	28 May 2003 14:21:55 -0000	1.92
  +++ SerializationContextImpl.java	18 Jun 2003 23:01:49 -0000	1.93
  @@ -132,8 +132,9 @@
   
       private boolean pretty = false;
       private static QName multirefQName = new QName("","multiRef");
  -    private static Class[] getSerializerClasses =
  +    private static Class[] SERIALIZER_CLASSES =
               new Class[] {String.class, Class.class, QName.class};
  +    private static final String SERIALIZER_METHOD = "getSerializer";
   
       /**
        * Should I write out objects as multi-refs?
  @@ -1258,32 +1259,40 @@
   
               // if no serializer was configured try to find one dynamically using WSDLJava
               // generated metadata
  -            try {
  -                Method method = value.getClass().getMethod(
  -                        "getSerializer", getSerializerClasses);
  -                if (method != null) {
  -                    Serializer serializer = (Serializer) method.invoke(value,
  -                            new Object[] {"", value.getClass(), elemQName});
  -                    TypeDesc typedesc = TypeDesc.getTypeDescForClass(value.getClass());
  -                    if (typedesc != null) {
  -                        QName qname = typedesc.getXmlType();
  -                        if (qname != null) {
  -                            attributes = setTypeAttribute(attributes,
  -                                                          qname);
  -                        }
  +            Class cls = value.getClass();
  +            Serializer serializer = getSerializerFromClass(cls, elemQName);
  +            if (serializer != null) {
  +                TypeDesc typedesc = TypeDesc.getTypeDescForClass(value.getClass());
  +                if (typedesc != null) {
  +                    QName qname = typedesc.getXmlType();
  +                    if (qname != null) {
  +                        attributes = setTypeAttribute(attributes,
  +                                                      qname);
                       }
  -                    serializer.serialize(elemQName, attributes, value, this);
  -                    return;
                   }
  -            } catch (Exception e) {
  +                serializer.serialize(elemQName, attributes, value, this);
  +                return;
               }
  -
               throw new IOException(Messages.getMessage("noSerializer00",
                       value.getClass().getName(), "" + tm));
           }
           // !!! Write out a generic null, or get type info from somewhere else?
       }
   
  +    private Serializer getSerializerFromClass(Class javaType, QName qname) {
  +        Serializer serializer = null;
  +        try {
  +            Method method = javaType.getMethod(
  +                    SERIALIZER_METHOD, SERIALIZER_CLASSES);
  +            if (method != null) {
  +                serializer = (Serializer) method.invoke(null,
  +                     new Object[] {msgContext.getEncodingStyle(), javaType, qname});
  +            }
  +       } catch (Exception e) {
  +       }
  +       return serializer;
  +    }
  +
       /**
        * Get the currently prefered xmlType
        * @return QName of xmlType or null
  @@ -1375,7 +1384,11 @@
       }
   
       public String getValueAsString(Object value, QName xmlType) throws IOException {
  -        Serializer ser = getSerializer(value.getClass(), xmlType, null);
  +        Class cls = value.getClass();
  +        Serializer ser = getSerializer(cls, xmlType, null);
  +        if (ser == null) {
  +            ser = getSerializerFromClass(cls, xmlType);
  +        }
           if (!(ser instanceof SimpleValueSerializer)) {
               throw new IOException(
                       Messages.getMessage("needSimpleValueSer",
  
  
  
  1.2       +69 -0     xml-axis/java/src/org/apache/axis/encoding/AnyContentType.java
  
  
  
  
  1.38      +3 -0      xml-axis/java/src/org/apache/axis/encoding/ser/ArrayDeserializer.java
  
  Index: ArrayDeserializer.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/ArrayDeserializer.java,v
  retrieving revision 1.37
  retrieving revision 1.38
  diff -u -r1.37 -r1.38
  --- ArrayDeserializer.java	22 Apr 2003 19:34:27 -0000	1.37
  +++ ArrayDeserializer.java	18 Jun 2003 23:01:50 -0000	1.38
  @@ -299,6 +299,9 @@
               }
           }
           }
  +        if (arrayClass == null) {
  +            arrayClass = context.getDestinationClass();
  +        }
   
           if (arrayClass == null) {
               throw new SAXException(
  
  
  
  1.60      +14 -15    xml-axis/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java
  
  Index: BeanDeserializer.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/BeanDeserializer.java,v
  retrieving revision 1.59
  retrieving revision 1.60
  diff -u -r1.59 -r1.60
  --- BeanDeserializer.java	20 Dec 2002 17:28:20 -0000	1.59
  +++ BeanDeserializer.java	18 Jun 2003 23:01:50 -0000	1.60
  @@ -284,18 +284,11 @@
           // to deserialize something we have no clue about (no good xsi:type,
           // no good metadata).
           if (dSer == null) {
  -            
  -// FIXME : Currently this doesn't throw an error solely to enable the 
  -//     "terra" testcase to pass.  We should, IMO, fix the test (either
  -//     to support <xsd:list> or to throw an error when we find such a thing
  -//     in the WSDL at WSDL2Java time).  Once that's done, this should be
  -//     uncommented and the next two lines deleted.            
  -//            
  -//            throw new SAXException(Messages.getMessage("noDeser00",
  -//                                                       childXMLType.toString()));
  -
  -            dSer = new DeserializerImpl();
  -            return (SOAPHandler)dSer;
  +            dSer = context.getDeserializerForClass(propDesc.getType());
  +        }
  +        if (dSer == null) {
  +            throw new SAXException(Messages.getMessage("noDeser00",
  +                                                       childXMLType.toString()));
           }
   
           // Register value target
  @@ -340,8 +333,8 @@
       public BeanPropertyDescriptor getAnyPropertyDesc() {
           if (typeDesc == null)
               return null;
  -
  -        return typeDesc.getAnyDesc();
  +        
  +       return typeDesc.getAnyDesc();
       }
   
       /**
  @@ -398,7 +391,9 @@
                   // Get the Deserializer for the attribute
                   Deserializer dSer = getDeserializer(null, bpd.getType(), 
                                                       null, context);
  -
  +                if (dSer == null) {
  +                    dSer = context.getDeserializerForClass(bpd.getType());
  +                }
                   if (dSer == null)
                       throw new SAXException(
                               Messages.getMessage("unregistered00",
  @@ -440,6 +435,9 @@
                                              Class javaType, 
                                              String href,
                                              DeserializationContext context) {
  +        if (javaType.isArray()) {
  +            context.setDestinationClass(javaType);
  +        } 
           // See if we have a cached deserializer
           if (cacheStringDSer != null) {
               if (String.class.equals(javaType) &&
  @@ -470,6 +468,7 @@
                   dSer = context.getDeserializer(javaType, defaultXMLType);
               } else {
                   dSer = new DeserializerImpl();
  +                context.setDestinationClass(javaType);
                   dSer.setDefaultType(defaultXMLType);
               }
           }
  
  
  
  1.33      +8 -0      xml-axis/java/src/org/apache/axis/encoding/ser/SimpleDeserializer.java
  
  Index: SimpleDeserializer.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/ser/SimpleDeserializer.java,v
  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- SimpleDeserializer.java	22 Apr 2003 19:34:30 -0000	1.32
  +++ SimpleDeserializer.java	18 Jun 2003 23:01:50 -0000	1.33
  @@ -277,6 +277,14 @@
                   return new Double(Double.NEGATIVE_INFINITY);
               }
           }    
  +        if (constructor == null) {
  +	    try {
  +                constructor = 
  +                    javaType.getDeclaredConstructor(new Class [] {String.class});
  +	    } catch (Exception e) {
  +                return null;
  +	    }
  +        }
           return constructor.newInstance(new Object [] { source });
       }
   
  
  
  
  1.154     +27 -7     xml-axis/java/src/org/apache/axis/message/MessageElement.java
  
  Index: MessageElement.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/MessageElement.java,v
  retrieving revision 1.153
  retrieving revision 1.154
  diff -u -r1.153 -r1.154
  --- MessageElement.java	20 May 2003 15:07:01 -0000	1.153
  +++ MessageElement.java	18 Jun 2003 23:01:50 -0000	1.154
  @@ -519,13 +519,24 @@
        * Returns value of the node as an object of registered type.
        * @return Object of proper type, or null if no mapping could be found.
        */
  -    public Object getObjectValue(){
  +    public Object getObjectValue() {
  +        Object obj = null;
  +        try {
  +            obj = getObjectValue(null);
  +        } catch (Exception e) {
  +            log.debug("getValue()", e);
  +        }
  +        return obj;
  +    }
  +
  +    /**
  +     * Returns value of the node as an object of registered type.
  +     * @param cls Class that contains top level deserializer metadata
  +     * @return Object of proper type, or null if no mapping could be found.
  +     */
  +    public Object getObjectValue(Class cls) throws Exception {
           if (objectValue == null) {
  -            try {
  -                objectValue = getValueAsType(getType());
  -            } catch (Exception e) {
  -                log.debug("getValue()", e);
  -            }
  +            objectValue = getValueAsType(getType(), cls);
           }
           return objectValue;
       }
  @@ -561,10 +572,19 @@
   
       public Object getValueAsType(QName type) throws Exception
       {
  +        return getValueAsType(type, null);
  +    }
  +    public Object getValueAsType(QName type, Class cls) throws Exception
  +    {
           if (context == null)
               throw new Exception(Messages.getMessage("noContext00"));
   
  -        Deserializer dser = context.getDeserializerForType(type);
  +        Deserializer dser = null;
  +        if (cls == null) {
  +            dser = context.getDeserializerForType(type);
  +        } else {
  +            dser = context.getDeserializerForClass(cls);
  +        }
           if (dser == null)
               throw new Exception(Messages.getMessage("noDeser00", "" + type));
   
  
  
  
  1.72      +8 -3      xml-axis/java/src/org/apache/axis/message/RPCHandler.java
  
  Index: RPCHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/RPCHandler.java,v
  retrieving revision 1.71
  retrieving revision 1.72
  diff -u -r1.71 -r1.72
  --- RPCHandler.java	22 Apr 2003 19:35:15 -0000	1.71
  +++ RPCHandler.java	18 Jun 2003 23:01:51 -0000	1.72
  @@ -252,6 +252,9 @@
               }
   
               destClass = paramDesc.getJavaType();
  +            if ((destClass != null) && (destClass.isArray())) {
  +                context.setDestinationClass(destClass);
  +            }
               
               // Keep the association so we can use it later
               // (see RPCProvider.processMessage())
  @@ -299,6 +302,9 @@
   
                 }
                 if (dser == null) {
  +                dser = context.getDeserializerForClass(destClass);
  +              } 
  +              if (dser == null) {
                     throw new SAXException(Messages.getMessage(
                             "noDeser01", localName,"" + type));
                 }
  @@ -313,10 +319,9 @@
                     }
                 }
             } else {
  -              dser = new DeserializerImpl();
  +              dser = context.getDeserializerForClass(destClass);
                 if (dser == null) {
  -                  throw new SAXException(Messages.getMessage(
  -                          "noDeser01", localName,"" + type));
  +                  dser = new DeserializerImpl();
                 }
             }
           }
  
  
  
  1.91      +1 -0      xml-axis/java/src/org/apache/axis/message/SOAPEnvelope.java
  
  Index: SOAPEnvelope.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPEnvelope.java,v
  retrieving revision 1.90
  retrieving revision 1.91
  diff -u -r1.90 -r1.91
  --- SOAPEnvelope.java	20 May 2003 15:07:01 -0000	1.90
  +++ SOAPEnvelope.java	18 Jun 2003 23:01:51 -0000	1.91
  @@ -563,6 +563,7 @@
       public javax.xml.soap.SOAPBody addBody() throws SOAPException {
           if (body == null) {
               body = new SOAPBody(this, soapConstants);
  +            _isDirty = true;
               return body;
           } else {
               throw new SOAPException(Messages.getMessage("bodyPresent"));
  
  
  
  1.74      +3 -1      xml-axis/java/src/org/apache/axis/message/SOAPHeader.java
  
  Index: SOAPHeader.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/message/SOAPHeader.java,v
  retrieving revision 1.73
  retrieving revision 1.74
  diff -u -r1.73 -r1.74
  --- SOAPHeader.java	22 Apr 2003 19:35:17 -0000	1.73
  +++ SOAPHeader.java	18 Jun 2003 23:01:51 -0000	1.74
  @@ -133,8 +133,10 @@
       public javax.xml.soap.SOAPHeaderElement addHeaderElement(Name name)
           throws SOAPException {
           SOAPHeaderElement headerElement = new SOAPHeaderElement(name);
  -        headerElement.setEnvelope(getEnvelope());
  +        SOAPEnvelope envelope = getEnvelope();
  +        headerElement.setEnvelope(envelope);
           addHeader(headerElement);
  +        envelope.setDirty(true);
           return headerElement;
       }
       
  
  
  
  1.81      +25 -2     xml-axis/java/src/org/apache/axis/utils/XMLUtils.java
  
  Index: XMLUtils.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/utils/XMLUtils.java,v
  retrieving revision 1.80
  retrieving revision 1.81
  diff -u -r1.80 -r1.81
  --- XMLUtils.java	14 May 2003 19:25:10 -0000	1.80
  +++ XMLUtils.java	18 Jun 2003 23:01:51 -0000	1.81
  @@ -508,8 +508,13 @@
   
       public static String getNamespace(String prefix, Node e) {
           while (e != null && (e.getNodeType() == Node.ELEMENT_NODE)) {
  -            Attr attr =
  -                ((Element)e).getAttributeNodeNS(Constants.NS_URI_XMLNS, prefix);
  +            Attr attr = null;
  +            if (prefix == null) {
  +                attr = ((Element)e).getAttributeNode("xmlns");
  +            } else {
  +                attr = ((Element)e).getAttributeNodeNS(Constants.NS_URI_XMLNS, 
  +                                                       prefix);
  +            }
               if (attr != null) return attr.getValue();
               e = e.getParentNode();
           }
  @@ -523,6 +528,19 @@
        * @return a QName generated from the given string representation
        */
       public static QName getQNameFromString(String str, Node e) {
  +        return getQNameFromString(str, e, false);
  +    }
  +    /**
  +     * Return a QName when passed a string like "foo:bar" by mapping
  +     * the "foo" prefix to a namespace in the context of the given Node.
  +     * If default namespace is found it is returned as part of the QName.
  +     *
  +     * @return a QName generated from the given string representation
  +     */
  +    public static QName getFullQNameFromString(String str, Node e) {
  +        return getQNameFromString(str, e, true);
  +    }
  +    private static QName getQNameFromString(String str, Node e, boolean defaultNS) {
           if (str == null || e == null)
               return null;
   
  @@ -534,6 +552,11 @@
                   return null;
               return new QName(ns, str.substring(idx + 1));
           } else {
  +            if (defaultNS) {
  +                String ns = getNamespace(null, e);
  +                if (ns != null) 
  +                    return new QName(ns, str);
  +            }
               return new QName("", str);
           }
       }
  
  
  
  1.91      +16 -0     xml-axis/java/src/org/apache/axis/wsdl/fromJava/Emitter.java
  
  Index: Emitter.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/fromJava/Emitter.java,v
  retrieving revision 1.90
  retrieving revision 1.91
  diff -u -r1.90 -r1.91
  --- Emitter.java	28 Apr 2003 01:55:50 -0000	1.90
  +++ Emitter.java	18 Jun 2003 23:01:51 -0000	1.91
  @@ -1132,13 +1132,26 @@
       }
       
       protected QName getRequestQName(OperationDesc oper) {
  +        qualifyOperation(oper);
           QName qname = oper.getElementQName();
           if (qname == null) {
               qname = new QName(oper.getName());
           }
           return qname;
       }
  +    private void qualifyOperation(OperationDesc oper) {
  +        if (style == Style.WRAPPED && use == Use.LITERAL) {
  +            QName qname = oper.getElementQName();
  +            if (qname != null) {
  +                qname = new QName(intfNS, oper.getName()); 
  +            } else if (qname.getNamespaceURI().equals("")) {
  +                qname = new QName(intfNS,qname.getLocalPart());
  +            }
  +            oper.setElementQName(qname);
  +        }
  +    }
       protected QName getResponseQName(OperationDesc oper) {
  +        qualifyOperation(oper);
           QName qname = oper.getElementQName();
           if (qname == null) {
               return new QName(oper.getName() + "Response");
  @@ -1361,6 +1374,9 @@
               // declaration whose name and type may be found in the
               // ParameterDesc.
               QName qname = param.getQName();
  +            if (param.getTypeQName().getNamespaceURI().equals("")) {
  +                param.setTypeQName(new QName(intfNS,param.getTypeQName().getLocalPart()));
  +            }
               Element el = types.createElementDecl(qname.getLocalPart(),
                                                    param.getJavaType(),
                                                    param.getTypeQName(),
  
  
  
  1.24      +37 -14    xml-axis/java/src/org/apache/axis/wsdl/symbolTable/SchemaUtils.java
  
  Index: SchemaUtils.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/symbolTable/SchemaUtils.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- SchemaUtils.java	22 Apr 2003 19:36:15 -0000	1.23
  +++ SchemaUtils.java	18 Jun 2003 23:01:52 -0000	1.24
  @@ -182,17 +182,26 @@
               return v;
           } else {
               // This may be a simpleType, return the type with the name "value"
  -            QName simpleQName = getSimpleTypeBase(node);
  +            QName[] simpleQName = getContainedSimpleTypes(node);
               if (simpleQName != null) {
  -                TypeEntry simpleType = symbolTable.getType(simpleQName);
  -                if (simpleType != null) {
  -                    Vector v = new Vector();
  -                    ElementDecl elem = new ElementDecl();
  -                    elem.setType(simpleType);
  -                    elem.setName(new javax.xml.namespace.QName("", "value"));
  -                    v.add(elem);
  -                    return v;
  -                }
  +                Vector v = null;
  +		for (int i = 0; i < simpleQName.length; i++) {    
  +                    TypeEntry simpleType = symbolTable.getType(simpleQName[i]);
  +                    if (simpleType != null) {
  +			if (v == null) {
  +			    v = new Vector();
  +		        }
  +                        ElementDecl elem = new ElementDecl();
  +                        elem.setType(simpleType);
  +			if (simpleQName.length > 1) {
  +                            elem.setName(new javax.xml.namespace.QName("", simpleQName[i].getLocalPart() + "Value"));
  +			} else {
  +                            elem.setName(new javax.xml.namespace.QName("", "value"));
  +			}
  +                        v.add(elem);
  +                    }
  +		}
  +                return v;
               }
           }
           return null;
  @@ -543,7 +552,14 @@
        * the QName of the simpleType base is returned.
        */
       public static QName getSimpleTypeBase(Node node) {
  -        QName baseQName = null;
  +	QName[] qname = getContainedSimpleTypes(node);
  +	if (qname != null && qname.length > 0) {
  +	    return qname[0];
  +        }
  +	return null;
  +    }
  +    public static QName[] getContainedSimpleTypes(Node node) {
  +        QName[] baseQNames = null;
   
           if (node == null) {
               return null;
  @@ -566,9 +582,12 @@
               // (There may be other #text nodes, which we will ignore).
               NodeList children = node.getChildNodes();
               Node restrictionNode = null;
  +            Node unionNode = null;
               for (int j = 0; j < children.getLength() && restrictionNode == null; j++) {
                   if (isXSDNode(children.item(j), "restriction")) {
                       restrictionNode = children.item(j);
  +                } else if (isXSDNode(children.item(j), "union")) {
  +                    unionNode = children.item(j);
                   }
               }
   
  @@ -576,11 +595,15 @@
               // (the base attribute contains this type).
               
               if (restrictionNode != null) {
  -                baseQName = Utils.getTypeQName(restrictionNode, new BooleanHolder(), false);
  +		baseQNames = new QName[1];
  +                baseQNames[0] = Utils.getTypeQName(restrictionNode, new BooleanHolder(), false);
  +            }
  +            if (unionNode != null) {
  +                baseQNames = Utils.getMemberTypeQNames(unionNode);
               }
               
               // Look for enumeration elements underneath the restriction node
  -            if (baseQName != null && restrictionNode != null) {
  +            if (baseQNames != null && restrictionNode != null && unionNode != null) {
                   NodeList enums = restrictionNode.getChildNodes();
                   for (int i=0; i < enums.getLength(); i++) {
                       if (isXSDNode(enums.item(i), "enumeration")) {
  @@ -591,7 +614,7 @@
                   }
               }
           }
  -        return baseQName;
  +        return baseQNames;
       }
   
       /**
  
  
  
  1.28      +16 -0     xml-axis/java/src/org/apache/axis/wsdl/symbolTable/Utils.java
  
  Index: Utils.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/symbolTable/Utils.java,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- Utils.java	22 Apr 2003 19:36:17 -0000	1.27
  +++ Utils.java	18 Jun 2003 23:01:52 -0000	1.28
  @@ -56,6 +56,7 @@
   
   import org.apache.axis.Constants;
   import org.apache.axis.utils.JavaUtils;
  +import org.apache.axis.utils.XMLUtils;
   import org.w3c.dom.NamedNodeMap;
   import org.w3c.dom.Node;
   
  @@ -66,6 +67,7 @@
   import java.util.Iterator;
   import java.util.Map;
   import java.util.Vector;
  +import java.util.StringTokenizer;
   
   /**
    * This class contains static utility methods for the emitter.
  @@ -360,6 +362,20 @@
               qName = getTypeQNameFromAttr(node, "base");
           }
           return qName;
  +    }
  +
  +    public static QName[] getMemberTypeQNames(Node node) {
  +        String attribute = getAttribute(node, "memberTypes");
  +	if (attribute == null) {
  +	    return null;
  +        }
  +	StringTokenizer tokenizer = new StringTokenizer(attribute, " ");
  +	QName[] memberTypes = new QName[tokenizer.countTokens()];
  +	for (int i = 0; tokenizer.hasMoreElements(); i++) {
  +	    String element = (String) tokenizer.nextElement(); 
  +	    memberTypes[i] = XMLUtils.getFullQNameFromString(element, node);
  +	}
  +	return memberTypes;
       }
   
       /**
  
  
  
  1.40      +116 -44   xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaBeanWriter.java
  
  Index: JavaBeanWriter.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaBeanWriter.java,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- JavaBeanWriter.java	22 Apr 2003 19:36:24 -0000	1.39
  +++ JavaBeanWriter.java	18 Jun 2003 23:01:52 -0000	1.40
  @@ -66,6 +66,8 @@
   import java.io.IOException;
   import java.io.PrintWriter;
   import java.util.Vector;
  +import java.util.ArrayList;
  +import java.util.Iterator;
   
   /**
    * This is Wsdl2java's Complex Type Writer.  It writes the <typeName>.java file.
  @@ -77,7 +79,7 @@
       private TypeEntry extendType;
       protected JavaBeanHelperWriter helper;
       protected Vector names = new Vector(); // even indices: types, odd: vars
  -    protected String simpleValueType = null;  // name of type of simple value
  +    protected ArrayList simpleValueTypes = new ArrayList();  // name of type of simple value
       protected PrintWriter pw;
   
       // The following fields can be set by extended classes
  @@ -91,6 +93,8 @@
       protected boolean enableEquals = true;
       protected boolean enableHashCode = true;
   
  +    protected boolean isAny = false;
  +
       /**
        * Constructor.
        * @param emitter
  @@ -128,8 +132,9 @@
   
           // Populate Names Vector with the names and types of the members.
           // The write methods use the names vector whenever they need to get
  -        // a member name or type.
  -        preprocess();
  +        // a member name or type. Moved to implements callback in order 
  +        // to set any interface
  +        // preprocess();
   
           // Write Member Fields
           writeMemberFields();
  @@ -193,6 +198,7 @@
                   if (elem.getAnyElement()) {
                       typeName = "org.apache.axis.message.MessageElement []";
                       variableName = Constants.ANYCONTENT;
  +                    isAny = true;
                   } else {
                       String elemName = elem.getName().getLocalPart();
                       variableName = Utils.xmlNameToJava(elemName);
  @@ -200,8 +206,8 @@
                   names.add(typeName);
                   names.add(variableName);
                   if (type.isSimpleType() &&
  -                    variableName.equals("value")) {
  -                    simpleValueType = typeName;
  +                    (variableName.endsWith("Value") || variableName.equals("value"))) {
  +                    simpleValueTypes.add(typeName);
                   }
               }
           }
  @@ -215,8 +221,8 @@
                   names.add(typeName);
                   names.add(variableName);
                   if (type.isSimpleType() &&
  -                    variableName.equals("value")) {
  -                    simpleValueType = typeName;
  +                    (variableName.endsWith("Value") || variableName.equals("value"))) {
  +                    simpleValueTypes.add(typeName);
                   }
               }
           }
  @@ -267,6 +273,13 @@
           if (type.isSimpleType()) {
               implementsText += ", org.apache.axis.encoding.SimpleType";
           }
  +        
  +        // need to call this to find out whether the type contains any elements
  +        preprocess();
  +        
  +        if (isAny) {
  +            implementsText += ", org.apache.axis.encoding.AnyContentType";
  +        };
           implementsText += " ";
           return implementsText;
       }
  @@ -276,6 +289,10 @@
        */
       protected void writeMemberFields() {
           // Define the member element of the bean
  +	if (isUnion()) {
  +            pw.println("    private java.lang.String value;");
  +            return;
  +	}
           for (int i = 0; i < names.size(); i += 2) {
               String typeName = (String) names.get(i);
               String variable = (String) names.get(i + 1);
  @@ -310,6 +327,9 @@
        * constructor.
        */
       protected void writeFullConstructor() {
  +	if (type.isSimpleType()) {
  +            return;
  +	}
           // The constructor needs to consider all extended types
           Vector extendList = new Vector();
           extendList.add(type);
  @@ -405,64 +425,78 @@
       protected void writeSimpleConstructors() {
           // If this is a simple type,need to emit a string
           // constructor and a value construtor.
  -        if (type.isSimpleType() && simpleValueType != null) {
  -            if (!simpleValueType.equals("java.lang.String")) {
  -                pw.println("    public " + className + "(" +
  -                           simpleValueType + " value) {");
  -                pw.println("        this.value = value;");
  -                pw.println("    }");
  +        if (simpleValueTypes.size() == 0) {
  +	    return;
  +	}
  +        pw.println("    // " + Messages.getMessage("needStringCtor"));
  +        if (isUnion() || simpleValueTypes.get(0).equals("java.lang.String")) {
  +            pw.println("    public " + className + "(java.lang.String value) {");
  +            pw.println("        this.value = value;");
  +	    pw.println("    }");
  +            for (Iterator iterator = simpleValueTypes.iterator();
  +                 iterator.hasNext();) {
  +                String typeName = (String) iterator.next();
  +                if (typeName.equals("java.lang.String")) {
  +                    continue;
  +                }
  +                pw.println("    public " + className + "(" + typeName + " value) {");
  +                pw.println("        setValue(value);");
  +	        pw.println("    }");
                   pw.println();
               }
  -
  -            pw.println("    // " + Messages.getMessage("needStringCtor"));
  +	} else if (simpleValueTypes.size() == 1) {
  +            pw.println("    public " + className + "(" + simpleValueTypes.get(0) + " value) {");
  +            pw.println("        this.value = value;");
  +	    pw.println("    }");
               pw.println("    public " + className + "(java.lang.String value) {");
  +	    writeSimpleTypeGetter((String)simpleValueTypes.get(0), null, "this.value =");
  +	    pw.println("    }");
  +            pw.println();
  +	}
  +    }
  +    protected void writeSimpleTypeGetter(String simpleValueType, String name, String returnString) {
               // Make sure we wrap base types with its Object type
               String wrapper = JavaUtils.getWrapper(simpleValueType);
   
               if (wrapper != null) {
  -                pw.println("        this.value = new " + wrapper +
  +                pw.println("        " + returnString + " new " + wrapper +
                              "(value)." + simpleValueType + "Value();");
               } else {
                   if (simpleValueType.equals("byte[]")) {
  -                    pw.println("        this.value = org.apache.axis.types.HexBinary.decode(value);");
  +                    pw.println("        " + returnString + " org.apache.axis.types.HexBinary.decode(value);");
                   }
                   else if (simpleValueType.equals("org.apache.axis.types.URI")) {
                       pw.println("        try {");
  -                    pw.println("            this.value = new org.apache.axis.types.URI(value);");
  +                    pw.println("            " + returnString + " new org.apache.axis.types.URI(value);");
                       pw.println("        }");
                       pw.println("        catch (org.apache.axis.types.URI.MalformedURIException mue) {");
  -                    pw.println("            this.value = new org.apache.axis.types.URI();");
  +                    pw.println("            " + returnString + " new org.apache.axis.types.URI();");
                       pw.println("       }");
                   } 
                   else if (simpleValueType.equals("java.util.Date")) {
                     pw.println("        try {");
  -                  pw.println("            this.value = (java.text.DateFormat.getDateTimeInstance()).parse(value);");
  +                  pw.println("            " + returnString + " (java.text.DateFormat.getDateTimeInstance()).parse(value);");
                     pw.println("        }");
                     pw.println("        catch (java.text.ParseException e){");
                     pw.println("            throw new java.lang.RuntimeException(e.toString());");
                     pw.println("        }");
                   }
                   else if (simpleValueType.equals("java.util.Calendar")) {
  -                  pw.println("        java.util.Calendar cal = java.util.Calendar.getInstance();"); 
  -                  pw.println("        try {");
  -                  pw.println("          java.util.Date dt = (java.text.DateFormat.getDateTimeInstance()).parse(value);");
  -                  pw.println("          cal.setTime(dt);");
  -                  pw.println("          this.value = cal;");
  -                  pw.println("        }");
  -                  pw.println("        catch (java.text.ParseException e){");
  -                  pw.println("            throw new java.lang.RuntimeException(e.toString());");
  -                  pw.println("        }");
  +                  pw.println("        java.util.Calendar cal =");
  +                  pw.println("            (java.util.Calendar) new org.apache.axis.encoding.ser.CalendarDeserializer(");
  +		  pw.println("                java.lang.String.class, org.apache.axis.Constants.XSD_STRING).makeValue(value);");
  +                  pw.println("        " + returnString + " cal;");
                   }                
                   else {
  -                    pw.println("        this.value = new " +
  +                    pw.println("        " + returnString + " new " +
                                  simpleValueType + "(value);");
                   }
               }
  -            pw.println("    }");
  -            pw.println();
  -        }
       }
   
  +    private boolean isUnion() {
  +        return this.simpleValueTypes.size() > 1;
  +    }
       /**
        * Writes the toString method
        * Currently the toString method is only written for
  @@ -470,21 +504,41 @@
        */
       protected void writeToStringMethod() {
           // If this is a simple type, emit a toString
  -        if (type.isSimpleType() && simpleValueType != null) {
  -            pw.println("    // " + Messages.getMessage("needToString"));
  -            String wrapper = JavaUtils.getWrapper(simpleValueType);
  -            pw.println("    public java.lang.String toString() {");
  +        if (simpleValueTypes.size() == 0) {
  +	    return;
  +	}
  +        pw.println("    // " + Messages.getMessage("needToString"));
  +        pw.println("    public java.lang.String toString() {");
  +        if (isUnion() || simpleValueTypes.get(0).equals("java.lang.String")) {
  +            pw.println("        return value;");
  +	} else {
  +            String wrapper = JavaUtils.getWrapper((String)simpleValueTypes.get(0));
               if (wrapper != null) {
                   pw.println("        return new " + wrapper + "(value).toString();");
               } else {
  -                if(simpleValueType.equals("byte[]")) {
  +                if(simpleValueTypes.get(0).equals("byte[]")) {
                       pw.println("        return value == null ? null : org.apache.axis.types.HexBinary.encode(value);" );
                   } else {              
                       pw.println("        return value == null ? null : value.toString();");
                   }
               }
  -            pw.println("    }");
  -            pw.println();
  +	}
  +        pw.println("    }");
  +        pw.println();
  +    }
  +
  +    protected void writeSimpleTypeSetter(String simpleValueType) {
  +        String wrapper = JavaUtils.getWrapper(simpleValueType);
  +        if (wrapper != null) {
  +            pw.println("        this.value = new " + wrapper + "(value).toString();");
  +        } else {
  +            if(simpleValueType.equals("byte[]")) {
  +                pw.println("        this.value = value == null ? null : org.apache.axis.types.HexBinary.encode(value);" );
  +	    } else if(simpleValueType.equals("java.util.Calendar")) {
  +                pw.println("        this.value = value == null ? null : new org.apache.axis.encoding.ser.CalendarSerializer().getValueAsString(value, null);");
  +            } else {              
  +                pw.println("        this.value = value == null ? null : value.toString();");
  +            }
           }
       }
   
  @@ -506,14 +560,24 @@
               if (enableGetters) {
                   pw.println("    public " + typeName + " " +
                              get + capName + "() {");
  -                pw.println("        return " + name + ";");
  +                if (isUnion()) {
  +			writeSimpleTypeGetter(typeName, name, "return");
  +		} else {
  +		    pw.println("        return " + name + ";");
  +		}
                   pw.println("    }");
                   pw.println();
               }
               if (enableSetters) {
  -                pw.println("    public void set" + capName + "(" +
  +                if (isUnion()) {
  +                    pw.println("    public void setValue(" +
  +                           typeName + " value) {");
  +		    writeSimpleTypeSetter(typeName);
  +		} else {
  +                    pw.println("    public void set" + capName + "(" +
                              typeName + " " + name + ") {");
  -                pw.println("        this." + name + " = " + name + ";");
  +                    pw.println("        this." + name + " = " + name + ";");
  +		}
                   pw.println("    }");
                   pw.println();
               }
  @@ -600,6 +664,9 @@
           pw.println("        boolean _equals;");
           if (names.size() == 0) {
               pw.println("        _equals = " + truth + ";");
  +        } else if (isUnion()) {
  +            pw.println("        _equals = " + truth + " && " + 
  +                       " this.toString().equals(obj.toString());");
           } else {
               pw.println("        _equals = " + truth + " && ");
               for (int i = 0; i < names.size(); i += 2) {
  @@ -669,7 +736,12 @@
               start = "super.hashCode()";
           }
           pw.println("        int _hashCode = " + start + ";");
  -        for (int i = 0; i < names.size(); i += 2) {
  +        if (isUnion()) {
  +            pw.println("        if (this.value != null) {");
  +            pw.println("            _hashCode += this.value.hashCode();");
  +            pw.println("        }");
  +        }
  +        for (int i = 0; !isUnion() && (i < names.size()); i += 2) {
               String variableType = (String) names.get(i);
               String variable = (String) names.get(i + 1);
               String get = "get";
  
  
  
  1.23      +37 -0     xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaEnumTypeWriter.java
  
  Index: JavaEnumTypeWriter.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaEnumTypeWriter.java,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- JavaEnumTypeWriter.java	22 Apr 2003 19:36:25 -0000	1.22
  +++ JavaEnumTypeWriter.java	18 Jun 2003 23:01:52 -0000	1.23
  @@ -67,6 +67,7 @@
   */
   public class JavaEnumTypeWriter extends JavaClassWriter {
       private Vector elements;
  +    private TypeEntry type;
   
       /**
        * Constructor.
  @@ -76,6 +77,7 @@
               TypeEntry type, Vector elements) {
           super(emitter, type.getName(), "enumType");
           this.elements = elements;
  +        this.type = type;
       } // ctor
   
       /**
  @@ -243,6 +245,41 @@
           }
           
          pw.println("    public java.lang.Object readResolve() throws java.io.ObjectStreamException { return fromValue(_value_);}");
  +
  +       pw.println("    public static org.apache.axis.encoding.Serializer getSerializer(");
  +       pw.println("           java.lang.String mechType, ");
  +       pw.println("           java.lang.Class _javaType,  ");
  +       pw.println("           javax.xml.namespace.QName _xmlType) {");
  +       pw.println("        return ");
  +       pw.println("          new org.apache.axis.encoding.ser.EnumSerializer(");
  +       pw.println("            _javaType, _xmlType);");
  +       pw.println("    }");
  +       pw.println("    public static org.apache.axis.encoding.Deserializer getDeserializer(");
  +       pw.println("           java.lang.String mechType, ");
  +       pw.println("           java.lang.Class _javaType,  ");
  +       pw.println("           javax.xml.namespace.QName _xmlType) {");
  +       pw.println("        return ");
  +       pw.println("          new org.apache.axis.encoding.ser.EnumDeserializer(");
  +       pw.println("            _javaType, _xmlType);");
  +       pw.println("    }");
  +
  +        pw.println("    // " + Messages.getMessage("typeMeta"));
  +        pw.println("    private static org.apache.axis.description.TypeDesc typeDesc =");
  +        pw.println("        new org.apache.axis.description.TypeDesc(" +
  +                   Utils.getJavaLocalName(type.getName()) + ".class);");
  +        pw.println();
  +
  +        pw.println("    static {");
  +        pw.println("        typeDesc.setXmlType(" + Utils.getNewQName(type.getQName()) + ");");
  +        pw.println("    }");
  +        pw.println("    /**");
  +        pw.println("     * " + Messages.getMessage("returnTypeMeta"));
  +        pw.println("     */");
  +        pw.println("    public static org.apache.axis.description.TypeDesc getTypeDesc() {");
  +        pw.println("        return typeDesc;");
  +        pw.println("    }");
  +        pw.println();
  +
       } // writeFileBody
   
       /**
  
  
  
  1.18      +22 -48    xml-axis/java/test/wsdl/extensibility/ExtensibilityQueryBindingImpl.java
  
  Index: ExtensibilityQueryBindingImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/wsdl/extensibility/ExtensibilityQueryBindingImpl.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- ExtensibilityQueryBindingImpl.java	1 Mar 2003 01:31:03 -0000	1.17
  +++ ExtensibilityQueryBindingImpl.java	18 Jun 2003 23:01:52 -0000	1.18
  @@ -29,81 +29,55 @@
   import java.io.Reader;
   import java.io.StringReader;
   import java.io.StringWriter;
  +import java.io.PrintWriter;
   import java.rmi.RemoteException;
   import java.util.Calendar;
   import java.util.Vector;
  -
  +import org.apache.axis.components.logger.LogFactory;
  +import org.apache.commons.logging.Log;
   
   public class ExtensibilityQueryBindingImpl implements ExtensibilityQueryPortType {
       private final static String[] books = new String[] { "The Grid", "The Oxford Dictionary" }; 
       private final static String[] subjects = new String[] { "Computer Science", "English" }; 
  +    protected static Log log =
  +            LogFactory.getLog(ExtensibilityQueryBindingImpl.class.getName());
   
       public ExtensibilityType query(ExtensibilityType query) throws RemoteException {
           ExtensibilityType result = new ExtensibilityType();
  -        Object obj = query.get_any()[0].getObjectValue();
  -        if (obj instanceof _FindBooksQueryExpressionElement) {
  -            BookType bookQuery = ((_FindBooksQueryExpressionElement)obj).getBookQuery();
  +        Object obj = null;
  +        try {
  +            obj = query.get_any()[0].getObjectValue(BookType.class);
  +        } catch (Exception e) {
  +            StringWriter writer = new StringWriter();
  +            PrintWriter out = new PrintWriter(writer);
  +            log.error("Error converting query: " + writer.toString());
  +            throw new RemoteException(e.toString());
  +        }
  +        log.error("Incoming MessageContext " + obj + " : " + query.get_any()[0].toString());
  +        if (obj instanceof BookType) {
  +            BookType bookQuery = (BookType)obj;
               String subject = bookQuery.getSubject();
               if (!"all".equals(subject)) {
                   throw new RemoteException("ExtensibilityQueryBindingImpl: Book subject query should be all, instead was " + subject);
               }
  -            _QueryResultElement resultElement = new _QueryResultElement();
               ResultListType resultList = new ResultListType();
  -            resultElement.setResultList(resultList);
               QueryResultType[] queryResult = new QueryResultType[books.length];
               for (int i = 0; i < books.length; i++) {
                   queryResult[i] = new QueryResultType();
                   queryResult[i].setName(subjects[i]);
  +                queryResult[i].setStatus(StatusType.MORE);
                   queryResult[i].setValue(books[i]);
                   queryResult[i].setTime(Calendar.getInstance());
                   queryResult[i].setQueryType(new QName("urn:QueryType","BookQuery"));
               }
               resultList.setResult(queryResult);
  -            MessageElement me = new MessageElement("foo", "bar", resultElement);
  +            QName elementName = _QueryResultElement.getTypeDesc().getFields()[0].getXmlName();
  +            MessageElement me = new MessageElement(elementName.getNamespaceURI(), elementName.getLocalPart(), resultList);
  +            log.debug("Outgoing message: " + me.toString());
               result.set_any(new MessageElement [] { me });
           } else {
  -            throw new RemoteException("Failed to get FindBooksQueryExpressionElement. Got: " + obj.getClass().getName() + ":" + obj.toString());
  +            throw new RemoteException("Failed to get FindBooksQueryExpressionElement. Got: " + obj);
           }
           return result;
  -    }
  -}
  -
  -class ObjectSerializer {
  -    static Log logger =
  -           LogFactory.getLog(ObjectSerializer.class.getName());
  -
  -    static Object toObject(Element element) throws Exception {
  -       MessageContext currentContext = MessageContext.getCurrentContext();
  -       MessageContext messageContext = new MessageContext(currentContext.getAxisEngine()); 
  -       messageContext.setTypeMappingRegistry(currentContext.getTypeMappingRegistry());
  -       messageContext.setEncodingStyle("");
  -       messageContext.setProperty(Call.SEND_TYPE_ATTR, Boolean.FALSE);
  -       SOAPEnvelope message = new SOAPEnvelope();
  -       Document doc = XMLUtils.newDocument();
  -       Element operationWrapper = doc.createElementNS("urn:operationNS","operation"); 
  -       doc.appendChild(operationWrapper); 
  -       Node node = doc.importNode(element,true);
  -       operationWrapper.appendChild(node);
  -
  -       message.addBodyElement(new SOAPBodyElement(operationWrapper));
  -       
  -       StringWriter stringWriter = new StringWriter(); 
  -       SerializationContext context = new SerializationContextImpl(stringWriter, messageContext);
  -       context.setDoMultiRefs(false);
  -       message.output(context);
  -       stringWriter.close();
  -       String messageString = stringWriter.getBuffer().toString();
  -       logger.debug(messageString);
  -       Reader reader = new StringReader(messageString);
  -       DeserializationContext deserializer = new DeserializationContextImpl(new InputSource(reader),
  -                                                                           messageContext, 
  -                                                                           Message.REQUEST);
  -       deserializer.parse();
  -       SOAPEnvelope env = deserializer.getEnvelope();
  -       
  -       RPCElement rpcElem = (RPCElement)env.getFirstBody();
  -       Vector parameters = rpcElem.getParams();
  -       RPCParam param = (RPCParam) parameters.get(0);
  -       return param.getValue();
       }
   }
  
  
  
  1.16      +12 -31    xml-axis/java/test/wsdl/extensibility/ExtensibilityQueryTestCase.java
  
  Index: ExtensibilityQueryTestCase.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/wsdl/extensibility/ExtensibilityQueryTestCase.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- ExtensibilityQueryTestCase.java	1 Mar 2003 01:31:03 -0000	1.15
  +++ ExtensibilityQueryTestCase.java	18 Jun 2003 23:01:52 -0000	1.16
  @@ -37,7 +37,6 @@
           try {
               ExtensibilityQueryLocator locator = new ExtensibilityQueryLocator();
               binding = locator.getExtensibilityQueryPort();
  -            addDynamicTypeMappings(locator.getEngine());
               deployServer();
           }
           catch (javax.xml.rpc.ServiceException jre) {
  @@ -53,60 +52,42 @@
   
           try {
               ExtensibilityType expression = new ExtensibilityType(); 
  -            _FindBooksQueryExpressionElement bookQuery = new _FindBooksQueryExpressionElement(); 
               BookType book = new BookType();
               book.setSubject("all");
  -            bookQuery.setBookQuery(book);
  -            MessageElement el = new MessageElement("foo", "Bar", bookQuery);
  +            QName elementName = _FindBooksQueryExpressionElement.getTypeDesc().getFields()[0].getXmlName();
  +            MessageElement el = new MessageElement(elementName.getNamespaceURI(), elementName.getLocalPart(), book);
               expression.set_any(new MessageElement [] { el });
               // call the operation
               ExtensibilityType any = binding.query(expression);
               // validate results
               MessageElement [] anyContent = any.get_any();
               assertEquals(1, anyContent.length);
  -            _QueryResultElement resEl = (_QueryResultElement )anyContent[0].getObjectValue();
  -            assertNotNull("QueryResultElement back from anyContent[0].getObjectValue()", resEl);
  -            ResultListType result = resEl.getResultList();
  -            assertNotNull("ResultListType back from getResultList()", result);
  +            ResultListType result = (ResultListType)anyContent[0].getObjectValue(ResultListType.class);
  +            root.debug("Message " + result + ": " + anyContent[0].toString());
  +            assertNotNull("ResultListType back from getResultList() is null", result);
               QueryResultType[] queryResult = result.getResult();
               assertTrue(queryResult.length == 2); 
               isValid(queryResult[0], "Computer Science", "The Grid"); 
               isValid(queryResult[1], "English", "The Oxford Dictionary"); 
           }
  -        catch (java.rmi.RemoteException re) {
  -            throw new junit.framework.AssertionFailedError("Remote Exception caught: " + re);
  +        catch (Exception e) {
  +            e.printStackTrace();
  +            throw new junit.framework.AssertionFailedError("Exception caught: " + e);
           }
       }
   
       private void isValid(QueryResultType result, String name, String value) {
  +        Logger root = Logger.getRootLogger();
  +        root.debug("Name: " + result.getName()); 
  +        root.debug("Value: " + result.getValue()); 
           assertTrue(result.getName().equals(name));
           assertTrue(result.getValue().equals(value));
  +        assertTrue(result.getStatus().equals(StatusType.MORE));
           Calendar now = Calendar.getInstance();
           Calendar then = result.getTime();
           assertTrue("Time check failed.  Result time = " + then + ", current time = " + now, then.before(now));
           assertTrue(result.getQueryType().getNamespaceURI().equals("urn:QueryType"));
           assertTrue(result.getQueryType().getLocalPart().equals("BookQuery"));
  -    }
  -
  -    private void addDynamicTypeMappings(AxisEngine engine) throws Exception {
  -        TypeMappingRegistry registry = engine.getTypeMappingRegistry(); 
  -        TypeMapping mapping = registry.createTypeMapping();
  -        addBeanMapping(mapping, "FindBooksQueryExpressionElement", _FindBooksQueryExpressionElement.class);
  -        addBeanMapping(mapping, "BookType", BookType.class);
  -        addBeanMapping(mapping, "ResultListType", ResultListType.class);
  -        addBeanMapping(mapping, "QueryResultType", QueryResultType.class);
  -        addBeanMapping(mapping, "QueryResultElement", _QueryResultElement.class);
  -        registry.register("",mapping);
  -        EngineConfiguration config = engine.getConfig();
  -        config.writeEngineConfig(engine);
  -    }
  -
  -    private void addBeanMapping(TypeMapping mapping, String localName, Class javaClass) {
  -        QName qname = new QName("urn:QueryTypes", localName);
  -        mapping.register(javaClass,
  -                         qname,
  -                         new BeanSerializerFactory(javaClass, qname),
  -                         new BeanDeserializerFactory(javaClass, qname));
       }
   
       private void deployServer() {
  
  
  
  1.3       +8 -0      xml-axis/java/test/wsdl/extensibility/QueryTypes.wsdl
  
  Index: QueryTypes.wsdl
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/wsdl/extensibility/QueryTypes.wsdl,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- QueryTypes.wsdl	8 May 2002 13:04:46 -0000	1.2
  +++ QueryTypes.wsdl	18 Jun 2003 23:01:52 -0000	1.3
  @@ -38,8 +38,16 @@
           <xsd:attribute name="value" type="xsd:string"/>
           <xsd:attribute name="time" type="xsd:dateTime"/>
           <xsd:attribute name="queryType" type="xsd:QName"/>
  +        <xsd:attribute name="status" type="tns:StatusType"/>
         </xsd:complexType>
   
  +      <xsd:simpleType name="StatusType">
  +        <xsd:restriction base="xsd:string">
  +          <xsd:enumeration value="MORE"/>
  +          <xsd:enumeration value="LESS"/>
  +        </xsd:restriction>
  +      </xsd:simpleType>
  +      
       </xsd:schema>
     </types>
   </definitions>
  
  
  
  1.9       +0 -49     xml-axis/java/test/wsdl/extensibility/server-deploy.wsdd
  
  Index: server-deploy.wsdd
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/test/wsdl/extensibility/server-deploy.wsdd,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- server-deploy.wsdd	2 Mar 2003 16:17:57 -0000	1.8
  +++ server-deploy.wsdd	18 Jun 2003 23:01:52 -0000	1.9
  @@ -16,55 +16,6 @@
         <parameter name="className" value="test.wsdl.extensibility.ExtensibilityQueryBindingSkeleton"/>
         <parameter name="allowedMethods" value="*"/>
         <parameter name="scope" value="Session"/>
  -
  -      <typeMapping
  -        xmlns:ns="urn:ExtensibilityQuery"
  -        qname="ns:ExtensibilityType"
  -        type="java:test.wsdl.extensibility.ExtensibilityType"
  -        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
  -        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
  -        encodingStyle=""
  -      />
  -      
  -      <typeMapping
  -        qname="query:QueryResultElement"
  -        type="java:test.wsdl.extensibility._QueryResultElement"
  -        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
  -        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
  -        encodingStyle=""
  -      />
  -
  -      <typeMapping
  -        qname="query:QueryResultType"
  -        type="java:test.wsdl.extensibility.QueryResultType"
  -        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
  -        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
  -        encodingStyle=""
  -      />
  -
  -      <typeMapping
  -        qname="query:ResultListType"
  -        type="java:test.wsdl.extensibility.ResultListType"
  -        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
  -        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
  -        encodingStyle=""
  -      />
  -
  -        <typeMapping
  -           qname="query:BookType"
  -           type="java:test.wsdl.extensibility.BookType"
  -           serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
  -           deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
  -           encodingStyle=""
  -        />
  -
  -        <typeMapping
  -           qname="query:FindBooksQueryExpressionElement"
  -           type="java:test.wsdl.extensibility._FindBooksQueryExpressionElement"
  -           serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
  -           deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
  -           encodingStyle=""
  -        />
       </service>
   
   
  
  
  

Re: cvs commit: xml-axis/java/test/wsdl/extensibility ExtensibilityQueryBindingImpl.java ExtensibilityQueryTestCase.java QueryTypes.wsdl server-deploy.wsdd

Posted by Davanum Srinivas <di...@yahoo.com>.
:) Finally you got to merge it :) 

-- dims

--- sandholm@apache.org wrote:
> sandholm    2003/06/18 16:01:53
> 
>   Modified:    java/src/org/apache/axis/encoding
>                         DeserializationContext.java
>                         DeserializationContextImpl.java
>                         DeserializerImpl.java SerializationContextImpl.java
>                java/src/org/apache/axis/encoding/ser ArrayDeserializer.java
>                         BeanDeserializer.java SimpleDeserializer.java
>                java/src/org/apache/axis/message MessageElement.java
>                         RPCHandler.java SOAPEnvelope.java SOAPHeader.java
>                java/src/org/apache/axis/utils XMLUtils.java
>                java/src/org/apache/axis/wsdl/fromJava Emitter.java
>                java/src/org/apache/axis/wsdl/symbolTable SchemaUtils.java
>                         Utils.java
>                java/src/org/apache/axis/wsdl/toJava JavaBeanWriter.java
>                         JavaEnumTypeWriter.java
>                java/test/wsdl/extensibility
>                         ExtensibilityQueryBindingImpl.java
>                         ExtensibilityQueryTestCase.java QueryTypes.wsdl
>                         server-deploy.wsdd
>   Added:       java/src/org/apache/axis/encoding AnyContentType.java
>   Log:
>   merge of dynamic deserialization branch into trunk
>   --------------------------------------------------
>   -added support for deserilizing types based on their meta data
>   -SOAPBody/Header dirty flag bug fix
>   -default Namespace support in XMLUtils
>   -fix to WSDL Emitter to handle default namespace in wrapped mode
>   -xsd:union memberType support
>   -mark any content types with interface
>   -added meta data generation for enum types
>   -updated extensibility test case to test new dynamic deserialization code
>   
>   Revision  Changes    Path
>   1.54      +24 -0     xml-axis/java/src/org/apache/axis/encoding/DeserializationContext.java
>   
>   Index: DeserializationContext.java
>   ===================================================================
>   RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializationContext.java,v
>   retrieving revision 1.53
>   retrieving revision 1.54
>   diff -u -r1.53 -r1.54
>   --- DeserializationContext.java	22 Apr 2003 19:34:24 -0000	1.53
>   +++ DeserializationContext.java	18 Jun 2003 23:01:49 -0000	1.54
>   @@ -168,6 +168,30 @@
>         */
>        public Deserializer getDeserializerForType(QName xmlType);
>    
>   +    /**
>   +     * Convenience method to get the Deserializer for a specific
>   +     * java class from its meta data.
>   +     * @param cls is the Class used to find the deserializer 
>   +     * @return Deserializer
>   +     */
>   +    public Deserializer getDeserializerForClass(Class cls);
>   +
>   +    /**
>   +     * Allows the destination class to be set so that downstream
>   +     * deserializers like ArrayDeserializer can pick it up when
>   +     * deserializing its components using getDeserializerForClass
>   +     * @param destClass is the Class of the component to be deserialized 
>   +     */
>   +    public void setDestinationClass(Class destClass);
>   +
>   +    /**
>   +     * Allows the destination class to be retrieved so that downstream
>   +     * deserializers like ArrayDeserializer can pick it up when
>   +     * deserializing its components using getDeserializerForClass
>   +     * @return the Class of the component to be deserialized 
>   +     */
>   +    public Class getDestinationClass();
>   +
>        /** 
>         * Get the TypeMapping for this DeserializationContext
>         */
>   
>   
>   
>   1.76      +68 -0    
> xml-axis/java/src/org/apache/axis/encoding/DeserializationContextImpl.java
>   
>   Index: DeserializationContextImpl.java
>   ===================================================================
>   RCS file:
> /home/cvs/xml-axis/java/src/org/apache/axis/encoding/DeserializationContextImpl.java,v
>   retrieving revision 1.75
>   retrieving revision 1.76
>   diff -u -r1.75 -r1.76
>   --- DeserializationContextImpl.java	22 Apr 2003 17:39:55 -0000	1.75
>   +++ DeserializationContextImpl.java	18 Jun 2003 23:01:49 -0000	1.76
>   @@ -74,6 +74,7 @@
>    import org.apache.axis.utils.Messages;
>    import org.apache.axis.utils.NSStack;
>    import org.apache.axis.utils.XMLUtils;
>   +import org.apache.axis.description.TypeDesc;
>    import org.apache.commons.logging.Log;
>    import org.xml.sax.Attributes;
>    import org.xml.sax.InputSource;
>   @@ -89,6 +90,7 @@
>    import java.io.IOException;
>    import java.util.ArrayList;
>    import java.util.HashMap;
>   +import java.lang.reflect.Method;
>    
>    /**
>     * @author Glen Daniels (gdaniels@macromedia.com)
>   @@ -111,6 +113,10 @@
>    
>        private Locator locator;
>    
>   +    // Class used for deserialization using class metadata from 
>   +    // downstream deserializers
>   +    private Class destClass;
>   +
>        // for performance reasons, keep the top of the stack separate from
>        // the remainder of the handlers, and therefore readily available.
>        private SOAPHandler topHandler = null;
>   @@ -136,6 +142,10 @@
>        private MessageElement curElement;
>    
>        protected int startOfMappingsPos = -1;
>   +
>   +    private static final Class[] DESERIALIZER_CLASSES =
>   +            new Class[] {String.class, Class.class, QName.class};
>   +    private static final String DESERIALIZER_METHOD = "getDeserializer";
>        
>        // This is a hack to associate the first schema namespace we see with
>        // the correct SchemaVersion.  It assumes people won't often be mixing
>   @@ -469,6 +479,64 @@
>                }
>            }
>            return dser;
>   +    }
>   +    
>   +    /**
>   +     * Convenience method to get the Deserializer for a specific
>   +     * java class from its meta data.
>   +     * @param cls is the Class used to find the deserializer 
>   +     * @return Deserializer
>   +     */
>   +    public Deserializer getDeserializerForClass(Class cls) {
>   +        if (cls == null) {
>   +           cls = destClass;
>   +        }
>   +        if (cls == null) {
>   +            return null;
>   +        }
>   +        if (cls.isArray()) {
>   +            cls = cls.getComponentType();
>   +        }
>   +        if (javax.xml.rpc.holders.Holder.class.isAssignableFrom(cls)) {
>   +            try {
>   +                cls = cls.getField("value").getType();
>   +            } catch (Exception e) {
>   +            }
>   +        }
>   +        Deserializer dser = null;
>   +        try {
>   +            Method method = cls.getMethod(DESERIALIZER_METHOD, DESERIALIZER_CLASSES);
>   +            if (method != null) {
>   +                TypeDesc typedesc = TypeDesc.getTypeDescForClass(cls);
>   +                if (typedesc != null) {
>   +                    dser = (Deserializer) method.invoke(null,
>   +                        new Object[] {msgContext.getEncodingStyle(), cls,
> typedesc.getXmlType()});
>   +                }
>   +            }
>   +        } catch (Exception e) {
>   +            log.error(Messages.getMessage("noDeser00", cls.getName()));
>   +        }
>   +        return dser;
>   +    }
>   +
>   +     /**
>   +     * Allows the destination class to be set so that downstream
>   +     * deserializers like ArrayDeserializer can pick it up when
>   +     * deserializing its components using getDeserializerForClass
>   +     * @param destClass is the Class of the component to be deserialized 
>   +     */
>   +    public void setDestinationClass(Class destClass) {
>   +        this.destClass = destClass;
>   +    }
>   +
>   +    /**
>   +     * Allows the destination class to be retrieved so that downstream
>   +     * deserializers like ArrayDeserializer can pick it up when
>   +     * deserializing its components using getDeserializerForClass
>   +     * @return the Class of the component to be deserialized 
>   +     */
>   +    public Class getDestinationClass() {
>   +        return destClass;
>        }
>    
>        /**
>   
>   
>   
>   1.36      +3 -0      xml-axis/java/src/org/apache/axis/encoding/DeserializerImpl.java
>   
>   Index: DeserializerImpl.java
>   ===================================================================
> 
=== message truncated ===


=====
Davanum Srinivas - http://webservices.apache.org/~dims/

__________________________________
Do you Yahoo!?
SBC Yahoo! DSL - Now only $29.95 per month!
http://sbc.yahoo.com