You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xmlrpc-dev@ws.apache.org by Oded Arbel <od...@m-wise.com> on 2004/10/18 18:22:06 UTC

Implementation of "struct" data type in XmlWriter.writeObject(Object)

Hi list

I have an issue with the way writeObject() does "struct" data type: in 
version 1.2b1 (which is the one one can download from the binary 
distribution servers), writeObject only recognizes java.util.Hashtable 
as a "struct" type, while it would have been much much better to 
recgonize any class implementing java.util.Map as a "struct" type.

Same with "array" - one would expect any java.util.Collection to be 
supported as an "array" type while only java.util.Vector is supported 
(And there are some issues with using Vector to store collection data 
which is why one shouldn't pick use Vector at all unless synchronized 
data access is needed).

Are there any plans to fix that problem ?

-- 
Oded Arbel
m-Wise mobile solutions
oded@m-wise.com

+972-9-9611212 (204)
+972-54-7340014

::..
Class schedules are designed so that every student will waste maximum 
time between classes.
Corollary: When you are occasionally able to schedule two classes in a 
row, they will be held in classrooms at opposite ends of the campus. 
	-- Laws of Class Scheduling n°2

RE: Implementation of "struct" data type in =XmlWriter.writeObject(Object)

Posted by Michael Shillinger <ms...@lucent.com>.
Oded,

I needed more flexibility too.

I just created my own XmlWriter implementation and modified XmlRpc to use a class specified at runtime.

Modify XmlRpc.java - Add the following 3 methods and a static member (xmlWriterClass)


//++++++ START CODE SNIPPET +++++

/** ********************************************************************
 * Set the XML Writer Class used for converting to/from XMLRPC data
 * format.  Use XmlRpc.getWriter(OutputStream os, String enc) to get an instance.
 * (ADDED: MJS 6/30/2004)
 ******************************************************************** */
public static void setXmlWriter(Class writer){
  xmlWriterClass = writer;
}

/** ********************************************************************
 * Set the XML Writer Class using it's fully qualified class name.
 * (used for converting to/from XMLRPC data format)
 *  Use XmlRpc.getWriter(OutputStream os, String enc) to get an instance.
 * (ADDED: MJS 6/30/2004)
 ******************************************************************** */
public static void setXmlWriter(String writerClassName) throws ClassNotFoundException {
  try {
    xmlWriterClass = Class.forName(writerClassName);
  }
  catch (ClassNotFoundException x){
    throw new ClassNotFoundException ("XMLWriter class not found: "
                                      + writerClassName);
  }
}

/** ********************************************************************
 * Get an instance of the XmlWriter. (ADDED: MJS 6/30/2004)
 ******************************************************************** */
public static XmlWriter getWriter(java.io.OutputStream os, String enc)
    throws UnsupportedEncodingException, IOException{

  XmlWriter writer = null;
  if (xmlWriterClass == null){
    return new XmlWriter(os, enc);
  }
  try {
    Class[] classes = new Class[2];
    classes[0] = Class.forName("java.io.OutputStream");
    classes[1] = Class.forName("java.lang.String");

    Constructor c = xmlWriterClass.getConstructor(classes);
    writer = (XmlWriter)c.newInstance(new Object[]{os,enc});
  }
  catch (Exception ex){
    log.error("Cannot get Custom XmlWriter.", ex);
    //Add failure message
    writer = new XmlWriter(os, enc);
  }
  return writer;
}
//-------END CODE SNIPPET --------

Next, Go through the code an replace all instances of

XmlWriter writer = new XmlWriter(buffer, encoding);

with

XmlWriter writer = XmlRpc.getWriter(buffer, encoding);

Finally, you create a class that extends XmlWriter and overrides
"writeObject(Object obj)" to handle any type of objects you want.

All you have to do, is feed XmlRpc a fully qualified class name of your own writer at
startup ( via XmlRcp.setWriter("org.mshillin.xmlrpc.MjsXmlWriter") ).




My XmlWriter class implementation currently supports Maps, Lists,
the Trove Collections, and objects of my own design.

Hope this helps.


Mike Shillinger
mshillinger At lucent Dot com




>Hi list
>
>I have an issue with the way writeObject() does "struct" data type: in
>version 1.2b1 (which is the one one can download from the binary
>distribution servers), writeObject only recognizes java.util.Hashtable
>as a "struct" type, while it would have been much much better to
>recgonize any class implementing java.util.Map as a "struct" type.
>
>Same with "array" - one would expect any java.util.Collection to be
>supported as an "array" type while only java.util.Vector is supported
>(And there are some issues with using Vector to store collection data
>which is why one shouldn't pick use Vector at all unless synchronized
>data access is needed).
>
>Are there any plans to fix that problem ?
>
>--
>Oded Arbel
>m-Wise mobile solutions
>oded@m-wise.com
>
>+972-9-9611212 (204)
>+972-54-7340014
>
>::..
>Class schedules are designed so that every student will waste maximum
>time between classes.
>Corollary: When you are occasionally able to schedule two classes in a
>row, they will be held in classrooms at opposite ends of the campus.
>	-- Laws of Class Scheduling n°2