You are viewing a plain text version of this content. The canonical link for it is here.
Posted to soap-dev@xml.apache.org by wc...@locus.apache.org on 2000/11/29 00:02:07 UTC

cvs commit: xml-soap/java/src/org/apache/soap/util/xml XMLJavaMappingRegistry.java

wcloeten    00/11/28 15:02:06

  Modified:    java/src/org/apache/soap/encoding SOAPMappingRegistry.java
               java/src/org/apache/soap/encoding/soapenc
                        ParameterSerializer.java
               java/src/org/apache/soap/util/xml
                        XMLJavaMappingRegistry.java
  Log:
  unmarshall hooks for MIME multipart support
  
  Revision  Changes    Path
  1.12      +49 -46    xml-soap/java/src/org/apache/soap/encoding/SOAPMappingRegistry.java
  
  Index: SOAPMappingRegistry.java
  ===================================================================
  RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/encoding/SOAPMappingRegistry.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- SOAPMappingRegistry.java	2000/09/05 03:47:24	1.11
  +++ SOAPMappingRegistry.java	2000/11/28 23:02:03	1.12
  @@ -92,11 +92,14 @@
     private static final QName byteQName = new QName(schemaURI, "byte");
     private static final QName qNameQName = new QName(schemaURI, "QName");
     private static final QName arrayQName = new QName(soapEncURI, "Array");
  +  private static final QName objectQName = new QName(
  +                                 Constants.NS_URI_SCHEMA_XSD, "ur-type");
   
     private final ParameterSerializer paramSer = new ParameterSerializer();
     private final ArraySerializer arraySer = new ArraySerializer();
     private final VectorSerializer vectorSer = new VectorSerializer();
     private final MapSerializer mapSer = new MapSerializer();
  +  public static final MimePartSerializer partSer = new MimePartSerializer();
     private final XMLParameterSerializer xmlParamSer =
       new XMLParameterSerializer();
   
  @@ -109,17 +112,34 @@
       // Register array deserializer for SOAP-ENC encoding style.
       mapTypes(soapEncURI, arrayQName, null, null, arraySer);
   
  +    // Register parameter serializer for literal xml encoding style.
  +    mapTypes(Constants.NS_URI_LITERAL_XML, RPCConstants.Q_ELEM_PARAMETER,
  +             Parameter.class, xmlParamSer, xmlParamSer);
  +
  +    /*
  +     * Register inputstreams, data handlers, data sources as Mime parts.
  +     * The order is important! When deserializing an array of these objects,
  +     * DataHandler must be the target class.
  +     * Note that the QName is set to ur-type, so an array of attachments
  +     * will be serialized as that type. It is crucial that
  +     * java.lang.Object is mapped to ur-type behind this section.
  +     */
  +    mapTypes(soapEncURI, objectQName, javax.mail.internet.MimeBodyPart.class,
  +             partSer, null);
  +    mapTypes(soapEncURI, objectQName, java.io.InputStream.class,
  +             partSer, null);
  +    mapTypes(soapEncURI, objectQName, javax.activation.DataSource.class,
  +             partSer, null);
  +    mapTypes(soapEncURI, objectQName, javax.activation.DataHandler.class,
  +             partSer, null);
  +
       /*
         Map xsd:ur-type to java.lang.Object (no serializer/deserializer,
         just an association).
       */
  -    mapTypes(Constants.NS_URI_SOAP_ENC,
  -             new QName(Constants.NS_URI_SCHEMA_XSD, "ur-type"),
  +    mapTypes(Constants.NS_URI_SOAP_ENC, objectQName,
                Object.class, null, null);
   
  -    // Register parameter serializer for literal xml encoding style.
  -    mapTypes(Constants.NS_URI_LITERAL_XML, RPCConstants.Q_ELEM_PARAMETER,
  -             Parameter.class, xmlParamSer, xmlParamSer);
   
       try {
         Class XMISerializer = 
  @@ -139,6 +159,7 @@
       } catch (IllegalAccessException iae) {
       } catch (InstantiationException ie) {
       } catch (ClassNotFoundException cnfe) {
  +    } catch (NoClassDefFoundError ncdfe) {
   
         // If the class can't be loaded, continue without it...
   
  @@ -149,8 +170,7 @@
         public void marshall(String inScopeEncStyle, Class javaType, Object src,
                              Object context, Writer sink, NSStack nsStack,
                              XMLJavaMappingRegistry xjmr)
  -        throws IllegalArgumentException, IOException
  -      {
  +        throws IllegalArgumentException, IOException {
           nsStack.pushScope();
   
           SoapEncUtils.generateStructureHeader(inScopeEncStyle,
  @@ -166,48 +186,30 @@
         }
       };
   
  -    Deserializer deser = new Deserializer()
  -    {
  +    Deserializer deser = new Deserializer() {
         public Bean unmarshall(String inScopeEncStyle, QName elementType,
                                Node src, XMLJavaMappingRegistry xjmr)
  -        throws IllegalArgumentException
  -      {
  +        throws IllegalArgumentException {
           Element root = (Element)src;
           String value = DOMUtils.getChildCharacterData(root);
   
  -        if (elementType.equals(stringQName))
  -        {
  +        if (elementType.equals(stringQName)) {
             return new Bean(String.class, value);
  -        }
  -        else if (elementType.equals(booleanQName))
  -        {
  +        } else if (elementType.equals(booleanQName)) {
             return new Bean(boolean.class, new Boolean(value));
  -        }
  -        else if (elementType.equals(doubleQName))
  -        {
  +        } else if (elementType.equals(doubleQName)) {
             return new Bean(double.class, new Double(value));
  -        }
  -        else if (elementType.equals(floatQName))
  -        {
  +        } else if (elementType.equals(floatQName)) {
             return new Bean(float.class, new Float(value));
  -        }
  -        else if (elementType.equals(longQName))
  -        {
  +        } else if (elementType.equals(longQName)) {
             return new Bean(long.class, new Long(value));
  -        }
  -        else if (elementType.equals(intQName))
  -        {
  +        } else if (elementType.equals(intQName)) {
             return new Bean(int.class, new Integer(value));
  -        }
  -        else if (elementType.equals(shortQName))
  -        {
  +        } else if (elementType.equals(shortQName)) {
             return new Bean(short.class, new Short(value));
  -        }
  -        else if (elementType.equals(byteQName))
  -        {
  +        } else if (elementType.equals(byteQName)) {
             return new Bean(byte.class, new Byte(value));
           }
  -		
           throw new IllegalArgumentException("I don't know how to " +
                                              "deserialize a '" + elementType +
                                              "' using encoding style '" +
  @@ -241,13 +243,14 @@
       mapTypes(soapEncURI, shortQName, short.class, ser, deser);
       mapTypes(soapEncURI, byteQName, Byte.class, ser, null);
       mapTypes(soapEncURI, byteQName, byte.class, ser, deser);
  -	
  -	QNameSerializer qSer = new QNameSerializer();
  -	mapTypes(soapEncURI, qNameQName, QName.class, qSer, qSer);
  -
  -	/** Basic collection types - these should map fine to Perl, Python, C++...
  -	 * (but an encoding like this needs to be agreed upon)
  -	 */
  +
  +    QNameSerializer qSer = new QNameSerializer();
  +    mapTypes(soapEncURI, qNameQName, QName.class, qSer, qSer);
  +
  +    /**
  +     * Basic collection types - these should map fine to Perl, Python, C++...
  +     * (but an encoding like this needs to be agreed upon)
  +     */
       mapTypes(soapEncURI, new QName(Constants.NS_URI_XML_SOAP, "Vector"),
                   Vector.class, vectorSer, vectorSer);
       mapTypes(soapEncURI, new QName(Constants.NS_URI_XML_SOAP, "Map"),
  @@ -258,8 +261,8 @@
       */
       Base64Serializer base64Ser = new Base64Serializer();
       QName base64QName = new QName(soapEncURI, "base64");
  -    mapTypes(soapEncURI, base64QName, byte[].class, base64Ser, base64Ser);
   
  +    mapTypes(soapEncURI, base64QName, byte[].class, base64Ser, base64Ser);
     }
   
     /**
  @@ -312,9 +315,9 @@
             && encodingStyleURI != null
             && encodingStyleURI.equals(soapEncURI))
         {
  -                  if (javaType.isArray()) {
  -                          return arraySer;
  -                  }
  +		  if (javaType.isArray()) {
  +			  return arraySer;
  +		  }
         }
         throw e;
       }
  
  
  
  1.4       +23 -8     xml-soap/java/src/org/apache/soap/encoding/soapenc/ParameterSerializer.java
  
  Index: ParameterSerializer.java
  ===================================================================
  RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/encoding/soapenc/ParameterSerializer.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ParameterSerializer.java	2000/09/01 03:52:46	1.3
  +++ ParameterSerializer.java	2000/11/28 23:02:05	1.4
  @@ -109,14 +109,29 @@
     {
       Element paramEl = (Element)src;
       String name = paramEl.getTagName();
  -    QName soapType = SoapEncUtils.getAttributeValue(paramEl,
  -      Constants.NS_URI_SCHEMA_XSI, Constants.ATTR_TYPE, "parameter", true);
  -    Bean bean = (SoapEncUtils.isNull(paramEl)
  -                 && !new QName(Constants.NS_URI_SOAP_ENC,
  -                               "Array").equals(soapType)
  -                 ? new Bean(xjmr.queryJavaType(soapType, inScopeEncStyle),
  -                            null)
  -                 : xjmr.unmarshall(inScopeEncStyle, soapType, paramEl));
  +    Bean bean;
  +
  +    // If the element contains an href= parameter, shortcut to
  +    // MimePartSerializer.
  +    String href = paramEl.getAttribute(Constants.ATTR_REFERENCE);
  +    if(href != null && !href.equals(""))
  +    {
  +        bean = (new MimePartSerializer()).unmarshall(inScopeEncStyle,
  +                                                     elementType, src, xjmr);
  +    }
  +    else {
  +        QName soapType = SoapEncUtils.getAttributeValue(paramEl,
  +                                                 Constants.NS_URI_SCHEMA_XSI,
  +                                                 Constants.ATTR_TYPE,
  +                                                 "parameter", true);
  +        bean = (SoapEncUtils.isNull(paramEl)
  +                && !new QName(Constants.NS_URI_SOAP_ENC,
  +                              "Array").equals(soapType)
  +                ? new Bean(xjmr.queryJavaType(soapType, inScopeEncStyle),
  +                           null)
  +                : xjmr.unmarshall(inScopeEncStyle, soapType, paramEl));
  +    }
  +
       Parameter parameter = new Parameter(name, bean.type,
                                           bean.value, null);
   
  
  
  
  1.4       +17 -2     xml-soap/java/src/org/apache/soap/util/xml/XMLJavaMappingRegistry.java
  
  Index: XMLJavaMappingRegistry.java
  ===================================================================
  RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/util/xml/XMLJavaMappingRegistry.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XMLJavaMappingRegistry.java	2000/09/01 03:53:11	1.3
  +++ XMLJavaMappingRegistry.java	2000/11/28 23:02:05	1.4
  @@ -61,6 +61,10 @@
   import java.util.*;
   import org.w3c.dom.*;
   import org.apache.soap.util.*;
  +import org.apache.soap.Constants;
  +import org.apache.soap.rpc.SOAPContext;
  +import org.apache.soap.encoding.soapenc.MimePartSerializer;
  +import org.apache.soap.encoding.SOAPMappingRegistry;
   
   /**
    * An <code>XMLJavaMappingRegistry</code> ...
  @@ -211,8 +215,19 @@
     public Bean unmarshall(String inScopeEncStyle, QName elementType, Node src)
       throws IllegalArgumentException
     {
  -    Deserializer ds = (Deserializer)queryDeserializer(elementType,
  -                                                      inScopeEncStyle);
  +      Deserializer ds = null;
  +      try {
  +          ds = (Deserializer)queryDeserializer(elementType,
  +                                               inScopeEncStyle);
  +      } catch(IllegalArgumentException iae) {
  +          // If the element contains an href= parameter and could not be
  +          // resolved , use MimePartSerializer.
  +          String href = ((Element)src).getAttribute(Constants.ATTR_REFERENCE);
  +          if (href != null && !href.equals(""))
  +              ds = SOAPMappingRegistry.partSer;
  +          else
  +              throw iae;
  +      }
   
       return ds.unmarshall(inScopeEncStyle, elementType, src, this);
     }