snichol     2002/06/27 20:07:36

  Modified:    java/docs changes.html
               java/src/org/apache/soap Body.java Constants.java
               java/src/org/apache/soap/encoding/soapenc
                        BeanMultiRefSerializer.java SoapEncUtils.java
               java/src/org/apache/soap/rpc SOAPContext.java
  Log:
  Generalize a little so that multi-reference serializers besides
  BeanMultiRefSerializer can exist.
  
  Revision  Changes    Path
  1.31      +1 -1      xml-soap/java/docs/changes.html
  
  Index: changes.html
  ===================================================================
  RCS file: /home/cvs/xml-soap/java/docs/changes.html,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- changes.html      28 Jun 2002 02:33:16 -0000      1.30
  +++ changes.html      28 Jun 2002 03:07:35 -0000      1.31
  @@ -42,7 +42,7 @@
         <li>Enhance multi-reference deserialization by only deserializing
         the object once, regardless of the number of references.  Provide
         initial support for multi-reference serialization.  The new
  -      BeanMultiRefSerializer is the only serializer for which
  +      BeanMultiRefSerializer is an example of a serializer for which
         multi-reference serialization is supported.  Added a sample to
         demonstrate serialization and deserialization of a cyclic graph
         of beans.</li>
  
  
  
  1.8       +4 -5      xml-soap/java/src/org/apache/soap/Body.java
  
  Index: Body.java
  ===================================================================
  RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/Body.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- Body.java 28 Jun 2002 02:33:16 -0000      1.7
  +++ Body.java 28 Jun 2002 03:07:36 -0000      1.8
  @@ -175,17 +175,16 @@
   
       // serialize any multiRefs
       if (ctx.getMultiRefCount() > 0) {
  -      // TODO: support other serializers by having them registered
  -      // with the SOAPContext for each multiRef.
  -      BeanSerializer ser = new BeanSerializer();
  +      // This context tells serialization that this is a multiRef with id=X
         MultiRefContext mrc = new MultiRefContext();
         // Note: it is *essential* that one keep calling the getMultiRefCount method
         // rather than storing the result in a variable, as the act of serialization
         // could generate additional multiRefs.
         for (int id = 0; id < ctx.getMultiRefCount(); id++) {
  -        Object o = ctx.getMultiRef(id);
  +        Object obj = ctx.getMultiRefObject(id);
  +        Serializer ser = ctx.getMultiRefSerializer(id);
           mrc.setId(id);
  -        ser.marshall(actualEncStyle, o.getClass(), o, mrc,
  +        ser.marshall(actualEncStyle, obj.getClass(), obj, mrc,
                        sink, nsStack, xjmr, ctx);
           sink.write(StringUtils.lineSeparator);
         }
  
  
  
  1.26      +2 -0      xml-soap/java/src/org/apache/soap/Constants.java
  
  Index: Constants.java
  ===================================================================
  RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/Constants.java,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- Constants.java    10 Jun 2002 03:49:57 -0000      1.25
  +++ Constants.java    28 Jun 2002 03:07:36 -0000      1.26
  @@ -64,6 +64,7 @@
    *
    * @author Sanjiva Weerawarana ([EMAIL PROTECTED])
    * @author Matthew J. Duftler ([EMAIL PROTECTED])
  + * @author Scott Nichol ([EMAIL PROTECTED])
    */
   public class Constants
   {
  @@ -176,6 +177,7 @@
   
     // Attribute values.
     public static String ATTRVAL_TRUE = "true";
  +  public static String ATTRVAL_MULTIREF_ID_PREFIX = "id";
   
     // SOAP defined fault codes.
     public static String FAULT_CODE_VERSION_MISMATCH =
  
  
  
  1.2       +3 -3      
xml-soap/java/src/org/apache/soap/encoding/soapenc/BeanMultiRefSerializer.java
  
  Index: BeanMultiRefSerializer.java
  ===================================================================
  RCS file: 
/home/cvs/xml-soap/java/src/org/apache/soap/encoding/soapenc/BeanMultiRefSerializer.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- BeanMultiRefSerializer.java       28 Jun 2002 02:33:16 -0000      1.1
  +++ BeanMultiRefSerializer.java       28 Jun 2002 03:07:36 -0000      1.2
  @@ -73,7 +73,6 @@
    * @author Scott Nichol ([EMAIL PROTECTED])
    */
   public class BeanMultiRefSerializer implements Serializer, Deserializer {
  -    // Delegate de-serialization to the BeanSerializer
       private BeanSerializer deser = new BeanSerializer();
   
       public void marshall(String inScopeEncStyle, Class javaType, Object src,
  @@ -82,8 +81,8 @@
                   throws IllegalArgumentException, IOException {
           nsStack.pushScope();
   
  -        int id = ctx.addMultiRef(src);
  -        sink.write("<" + context.toString() + " " + Constants.ATTR_REFERENCE + 
"=\"#id" + id + "\" />");
  +        int id = ctx.addMultiRef(src, deser);
  +        sink.write("<" + context.toString() + " " + Constants.ATTR_REFERENCE + 
"=\"#" + Constants.ATTRVAL_MULTIREF_ID_PREFIX + id + "\" />");
   
           nsStack.popScope();
       }
  @@ -91,6 +90,7 @@
       public Bean unmarshall(String inScopeEncStyle, QName elementType, Node src,
                                XMLJavaMappingRegistry xjmr, SOAPContext ctx)
                   throws IllegalArgumentException {
  +        // Delegate de-serialization to the BeanSerializer
           return deser.unmarshall(inScopeEncStyle, elementType, src, xjmr, ctx);
       }
   }
  
  
  
  1.14      +2 -1      
xml-soap/java/src/org/apache/soap/encoding/soapenc/SoapEncUtils.java
  
  Index: SoapEncUtils.java
  ===================================================================
  RCS file: 
/home/cvs/xml-soap/java/src/org/apache/soap/encoding/soapenc/SoapEncUtils.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- SoapEncUtils.java 28 Jun 2002 02:33:16 -0000      1.13
  +++ SoapEncUtils.java 28 Jun 2002 03:07:36 -0000      1.14
  @@ -160,8 +160,9 @@
   
       sink.write('<' + context.toString() + namespaceDecl);
   
  +    // Write the id for a multiRef element
       if (context instanceof MultiRefContext)
  -      sink.write(' ' + Constants.ATTR_ID + "=\"id" + ((MultiRefContext) 
context).getId() + "\"");
  +      sink.write(' ' + Constants.ATTR_ID + "=\"" + 
Constants.ATTRVAL_MULTIREF_ID_PREFIX + ((MultiRefContext) context).getId() + "\"");
   
       // Get prefixes for the needed namespaces.
       String elementTypeNS = elementType.getNamespaceURI();
  
  
  
  1.9       +30 -10    xml-soap/java/src/org/apache/soap/rpc/SOAPContext.java
  
  Index: SOAPContext.java
  ===================================================================
  RCS file: /home/cvs/xml-soap/java/src/org/apache/soap/rpc/SOAPContext.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- SOAPContext.java  28 Jun 2002 02:33:17 -0000      1.8
  +++ SOAPContext.java  28 Jun 2002 03:07:36 -0000      1.9
  @@ -60,6 +60,7 @@
   import java.io.*;
   import java.util.*;
   import org.apache.soap.util.*;
  +import org.apache.soap.util.xml.Serializer;
   import org.apache.soap.*;
   import org.apache.soap.encoding.*;
   import org.apache.soap.server.*;
  @@ -102,6 +103,16 @@
   
       private static final String DEFAULT_BASEURI = "thismessage:/";
   
  +     // Holds information about a multiRef to be serialized.
  +    private class MultiRefInfo {
  +        public Object obj;
  +        public Serializer ser;
  +        public MultiRefInfo(Object obj, Serializer ser) {
  +            this.obj = obj;
  +            this.ser = ser;
  +        }
  +    }
  +
       /**
        * Constructor.
        */
  @@ -595,31 +606,40 @@
        * The id of the object is always between 0 and the count of multiRefs
        * minus 1.
        *
  -     * @param o The object for which a multiRef is desired.
  +     * @param obj The object for which a multiRef is desired.
  +     * @param ser The serializer with which to serialize the object.
        * @return The id of the element.
        */
  -    public int addMultiRef(Object o) {
  +    public int addMultiRef(Object obj, Serializer ser) {
           // While a Hashtable might seem a better choice than a vector here,
           // a Vector is easier to work with during serialization, since
           // multiRefs may be added during the serialization of other multiRefs.
           for (int i = 0; i < multiRef.size(); i++) {
  -            if (multiRef.elementAt(i) == o)
  +            if (((MultiRefInfo) multiRef.elementAt(i)).obj == obj)
                   return i;
           }
  -        multiRef.addElement(o);
  +        multiRef.addElement(new MultiRefInfo(obj, ser));
           return multiRef.size() - 1;
  -        // TODO: support other serializers by having them registered
  -        // with the SOAPContext for each multiRef object.
       }
   
       /**
  -     * Gets the multiRef for a particular id.
  +     * Gets the multiRef object for a particular id.
  +     *
  +     * @param id The id.
  +     * @return The multiRef object for the id.
  +     */
  +    public Object getMultiRefObject(int id) {
  +        return ((MultiRefInfo) multiRef.elementAt(id)).obj;
  +    }
  +
  +    /**
  +     * Gets the multiRef serializer for a particular id.
        *
        * @param id The id.
  -     * @return The multiRef for the id.
  +     * @return The multiRef serializer for the id.
        */
  -    public Object getMultiRef(int id) {
  -        return multiRef.elementAt(id);
  +    public Serializer getMultiRefSerializer(int id) {
  +        return ((MultiRefInfo) multiRef.elementAt(id)).ser;
       }
   
       /**
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to