diff options
Diffstat (limited to 'projects/net.wotonomy.web/src/main/java/net/wotonomy/web/xml/XMLRPCEncoder.java')
| -rw-r--r-- | projects/net.wotonomy.web/src/main/java/net/wotonomy/web/xml/XMLRPCEncoder.java | 840 |
1 files changed, 377 insertions, 463 deletions
diff --git a/projects/net.wotonomy.web/src/main/java/net/wotonomy/web/xml/XMLRPCEncoder.java b/projects/net.wotonomy.web/src/main/java/net/wotonomy/web/xml/XMLRPCEncoder.java index 3a63d45..d84f164 100644 --- a/projects/net.wotonomy.web/src/main/java/net/wotonomy/web/xml/XMLRPCEncoder.java +++ b/projects/net.wotonomy.web/src/main/java/net/wotonomy/web/xml/XMLRPCEncoder.java @@ -43,484 +43,398 @@ import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; /** -* An implementation of XMLEncoder that serializes objects -* into XMLRPC format, which is found at http://xmlrpc.com/spec. -* We extend that standard only in that we add a "class" -* attribute to the "value" tag, so that a java-based decoder -* can more closely reconstruct the original java data structure. -* The class attribute can be safely ignored by clients. -* This implementation is not thread-safe, so a new instances -* should be created to accomodate multiple threads. -*/ -public class XMLRPCEncoder implements XMLEncoder -{ - public static final String METHODCALL = "methodCall"; - public static final String METHODNAME = "methodName"; - public static final String METHODRESPONSE = "methodResponse"; - public static final String PARAMS = "params"; - public static final String PARAM = "param"; - public static final String FAULT = "fault"; - public static final String FAULTCODE = "faultCode"; - public static final String FAULTSTRING = "faultString"; - - public static final String VALUE = "value"; - public static final String CLASS = "class"; - - public static final String STRUCT = "struct"; - public static final String MEMBER = "member"; - public static final String NAME = "name"; - - public static final String ARRAY = "array"; - public static final String DATA = "data"; - - public static final String NIL = "nil"; - public static final String INT = "int"; - public static final String I4 = "i4"; - public static final String BOOLEAN = "boolean"; - public static final String STRING = "string"; - public static final String DOUBLE = "double"; - public static final String DATE = "dateTime.iso8601"; - public static final String BASE64 = "base64"; - - public static final String TRUE = "1"; - public static final String FALSE = "0"; - - public static final Format DATEFORMAT8601 = - new SimpleDateFormat( "yyyyMMdd'T'HHmmss" ); - - /** - * Encodes an object to the specified output stream as XML. - * @param anObject The object to be serialized to XML format. - * @param anOutputStream The output stream to which the object - * will be written. - */ - public void encode( Object anObject, OutputStream anOutputStream ) - { - try - { - - //XMLWriter writer = new UTF8XMLWriter( anOutputStream ); - RPCXMLWriter writer = new RPCXMLWriter(anOutputStream,OutputFormat.createCompactFormat()); - writeValueToXMLWriter( anObject, writer ); - writer.flush(); - } - catch ( Exception exc ) - { - throw new WotonomyException( exc ); - } - } - - /** - * Encodes a method request in XML-RPC format in a "methodCall" tag, - * and writes the XML to the specified output stream. - * This method only writes XML: the caller is responsible for - * generating the appropriate header, if any, which should set - * the content type as "text/xml" and the content length as appropriate. - * The caller is also responsible for writing the xml version tag. - * @param aMethodName The method name to appear in the "methodName" tag. - * @param aParameterArray An array of objects, each of which will be - * encoded as values enclosed in a "param" tag, all of which will be - * enclosed in a "params" tag. - * @param anOutputStream The stream to which the XML will be written. - */ - public void encodeRequest( - String aMethodName, Object[] aParameterArray, - OutputStream anOutputStream ) - { - try - { - RPCXMLWriter writer = new RPCXMLWriter( anOutputStream, OutputFormat.createCompactFormat()); - writer.processingInstruction( "xml", "version=\"1.0\" encoding=\"UTF-8\"" ); - writer.startElement( METHODCALL ); - writer.startElement( METHODNAME ); - writer.write( aMethodName ); - writer.endElement( METHODNAME ); - writer.startElement( PARAMS ); - for ( int i = 0; i < aParameterArray.length; i++ ) - { - writer.startElement( PARAM ); - writeValueToXMLWriter( aParameterArray[i], writer ); - writer.endElement( PARAM ); - } - writer.endElement( PARAMS ); - writer.endElement( METHODCALL ); - writer.flush(); - } - catch ( Exception exc ) - { - throw new WotonomyException( exc ); - } - - //TODO: should this return the content-length? - } - - /** - * Encodes a method response in XML-RPC format in a "methodResponse" tag, - * and writes the XML to the specified output stream. - * This method only writes XML: the caller is responsible for - * generating the appropriate header, if any, which should set - * the content type as "text/xml" and the content length as appropriate. - * The caller is also responsible for writing the xml version tag. - * @param aResult A object which will be - * encoded as values enclosed in a "param" tag, all of which will be - * enclosed in a "params" tag. - * @param anOutputStream The stream to which the XML will be written. - */ - public void encodeResponse( - Object aResult, OutputStream anOutputStream ) - { - try - { - RPCXMLWriter writer = new RPCXMLWriter( anOutputStream, OutputFormat.createCompactFormat() ); - writer.processingInstruction( "xml", "version=\"1.0\" encoding=\"UTF-8\"" ); - writer.startElement( METHODRESPONSE ); - writer.startElement( PARAMS ); - writer.startElement( PARAM ); - writeValueToXMLWriter( aResult, writer ); - writer.endElement( PARAM ); - writer.endElement( PARAMS ); - writer.endElement( METHODRESPONSE ); - writer.flush(); - } - catch ( Exception exc ) - { - throw new WotonomyException( exc ); - } - - //TODO: should this return the content-length? - } - - /** - * Encodes a fault response in XML-RPC format in a "methodResponse" tag, - * and writes the XML to the specified output stream. - * This method only writes XML: the caller is responsible for first - * generating the appropriate header, if any, which should set - * the content type as "text/xml" and the content length as appropriate. - * The caller is also responsible for writing the xml version tag. - * @param aFaultCode An application-defined error code. - * @param aFaultString A human-readable error description. - * @param anOutputStream The stream to which the XML will be written. - */ - public void encodeFault( - int aFaultCode, String aFaultString, OutputStream anOutputStream ) - { - try - { - RPCXMLWriter writer = new RPCXMLWriter( anOutputStream, OutputFormat.createCompactFormat() ); - writer.processingInstruction( "xml", "version=\"1.0\"" ); - writer.startElement( METHODRESPONSE ); - writer.startElement( FAULT ); - writer.startElement( VALUE ); - writer.startElement( STRUCT ); - - writer.startElement( MEMBER ); - writer.startElement( NAME ); - writer.write( FAULTCODE ); - writer.endElement( NAME ); - writer.startElement( VALUE ); - writer.startElement( INT ); - writer.write( new Integer( aFaultCode ).toString() ); - writer.endElement( INT ); - writer.endElement( VALUE ); - writer.endElement( MEMBER ); - - writer.startElement( MEMBER ); - writer.startElement( NAME ); - writer.write( FAULTSTRING ); - writer.endElement( NAME ); - writer.startElement( VALUE ); - writer.startElement( STRING ); - writer.write( aFaultString ); - writer.endElement( STRING ); - writer.endElement( VALUE ); - writer.endElement( MEMBER ); - - writer.endElement( STRUCT ); - writer.endElement( VALUE ); - writer.endElement( FAULT ); - writer.endElement( METHODRESPONSE ); - writer.flush(); - } - catch ( Exception exc ) - { - throw new WotonomyException( exc ); - } - - //TODO: should this return the content-length? - } - - /** - * Performs the actual writing of the file to XML. - */ - private void writeValueToXMLWriter( - Object anObject, RPCXMLWriter writer ) - { - try - { - - - if ( anObject == null ) - { - writer.startElement( VALUE ); - // write nil for null - Element nill = new NonLazyElement(NIL); - writer.write(nill); - } - else - if ( anObject instanceof Collection ) - { - // write class so we can restore if possible - AttributesImpl a = new AttributesImpl(); - a.addAttribute(null, CLASS, null, null, anObject.getClass().getName() ); - - writer.startElement( VALUE, a ); - - // write items in the order we get them from the iterator - - writer.startElement( ARRAY ); - writer.startElement( DATA ); - Iterator it = ((Collection)anObject).iterator(); - while ( it.hasNext() ) - { - writeValueToXMLWriter( it.next(), writer ); - } - writer.endElement( DATA ); - writer.endElement( ARRAY ); - - } - else - if ( anObject instanceof Map ) - { - AttributesImpl a = new AttributesImpl(); - a.addAttribute(null, CLASS, null, null, anObject.getClass().getName() ); - - writer.startElement( VALUE, a ); - - // write items in the order we get them from the iterator - //FIXME: The method-based properties are being ignored! - - Map.Entry entry; - writer.startElement( STRUCT ); - writer.startElement( MEMBER ); - Iterator it = ((Map)anObject).entrySet().iterator(); - while ( it.hasNext() ) - { - entry = (Map.Entry) it.next(); - writer.startElement( NAME ); - writeValueToXMLWriter( entry.getKey(), writer ); - writer.endElement( NAME ); - writeValueToXMLWriter( entry.getValue(), writer ); - } - writer.endElement( MEMBER ); - writer.endElement( STRUCT ); - } - else // not a collection - { - // check for primitive types - if ( anObject instanceof String ) - { - writer.startElement( VALUE ); - - writer.startElement( STRING ); - writer.write( anObject.toString() ); - writer.endElement( STRING ); - } - else - if ( anObject instanceof StringBuffer ) - { - // write class so we can restore if possible - AttributesImpl a = new AttributesImpl(); - a.addAttribute(null, CLASS, null, null, anObject.getClass().getName() ); - - writer.startElement( VALUE, a ); - - writer.startElement( STRING ); - writer.write( anObject.toString() ); - writer.endElement( STRING ); - } - else - if ( anObject instanceof Number ) - { - // write class so we can restore if possible - AttributesImpl a = new AttributesImpl(); - a.addAttribute(null, CLASS, null, null, anObject.getClass().getName() ); - - writer.startElement( VALUE, a ); - - if ( ( anObject instanceof Double ) - || ( anObject instanceof Float ) ) - { - writer.startElement( DOUBLE ); - writer.write( anObject.toString() ); - writer.endElement( DOUBLE ); - } - else - { - writer.startElement( INT ); - writer.write( anObject.toString() ); - writer.endElement( INT ); - } - } - else - if ( anObject instanceof Date ) - { - // write class so we can restore if possible - AttributesImpl a = new AttributesImpl(); - a.addAttribute(null, CLASS, null, null, anObject.getClass().getName() ); - - writer.startElement( VALUE, a ); - - writer.startElement( DATE ); - writer.write( DATEFORMAT8601.format( anObject ) ); - writer.endElement( DATE ); - } - else - if ( anObject instanceof Boolean ) - { - writer.startElement( BOOLEAN ); - if ( ((Boolean)anObject).booleanValue() ) - { - writer.write( "1" ); - } - else - { - writer.write( "0" ); - } - writer.endElement( BOOLEAN ); - } - else - if ( anObject.getClass().isArray() ) - { - // write class so we can restore if possible - AttributesImpl a = new AttributesImpl(); - a.addAttribute(null, CLASS, null, null, anObject.getClass().getName() ); - - writer.startElement( VALUE, a ); - - writer.startElement( ARRAY ); - writer.startElement( DATA ); - - int length = Array.getLength( anObject ); - for ( int i = 0; i < length; i++ ) - { - writeValueToXMLWriter( Array.get( anObject, i ), writer ); - } - - writer.endElement( DATA ); - writer.endElement( ARRAY ); - } - else // not primitive or collection, treat as struct - { - // write class so we can restore if possible - AttributesImpl a = new AttributesImpl(); - a.addAttribute(null, CLASS, null, null, anObject.getClass().getName() ); - - writer.startElement( VALUE, a ); - - List readProperties = new ArrayList(); - String[] read = Introspector.getReadPropertiesForObject( anObject ); - for ( int i = 0; i < read.length; i++ ) - { - readProperties.add( read[i] ); - } - - List properties = new ArrayList(); - String[] write = Introspector.getWritePropertiesForObject( anObject ); - for ( int i = 0; i < write.length; i++ ) - { - properties.add( write[i] ); - } - - // only use readable properties - properties.retainAll( readProperties ); - + * An implementation of XMLEncoder that serializes objects into XMLRPC format, + * which is found at http://xmlrpc.com/spec. We extend that standard only in + * that we add a "class" attribute to the "value" tag, so that a java-based + * decoder can more closely reconstruct the original java data structure. The + * class attribute can be safely ignored by clients. This implementation is not + * thread-safe, so a new instances should be created to accomodate multiple + * threads. + */ +public class XMLRPCEncoder implements XMLEncoder { + public static final String METHODCALL = "methodCall"; + public static final String METHODNAME = "methodName"; + public static final String METHODRESPONSE = "methodResponse"; + public static final String PARAMS = "params"; + public static final String PARAM = "param"; + public static final String FAULT = "fault"; + public static final String FAULTCODE = "faultCode"; + public static final String FAULTSTRING = "faultString"; + + public static final String VALUE = "value"; + public static final String CLASS = "class"; + + public static final String STRUCT = "struct"; + public static final String MEMBER = "member"; + public static final String NAME = "name"; + + public static final String ARRAY = "array"; + public static final String DATA = "data"; + + public static final String NIL = "nil"; + public static final String INT = "int"; + public static final String I4 = "i4"; + public static final String BOOLEAN = "boolean"; + public static final String STRING = "string"; + public static final String DOUBLE = "double"; + public static final String DATE = "dateTime.iso8601"; + public static final String BASE64 = "base64"; + + public static final String TRUE = "1"; + public static final String FALSE = "0"; + + public static final Format DATEFORMAT8601 = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); + + /** + * Encodes an object to the specified output stream as XML. + * + * @param anObject The object to be serialized to XML format. + * @param anOutputStream The output stream to which the object will be written. + */ + public void encode(Object anObject, OutputStream anOutputStream) { + try { + + // XMLWriter writer = new UTF8XMLWriter( anOutputStream ); + RPCXMLWriter writer = new RPCXMLWriter(anOutputStream, OutputFormat.createCompactFormat()); + writeValueToXMLWriter(anObject, writer); + writer.flush(); + } catch (Exception exc) { + throw new WotonomyException(exc); + } + } + + /** + * Encodes a method request in XML-RPC format in a "methodCall" tag, and writes + * the XML to the specified output stream. This method only writes XML: the + * caller is responsible for generating the appropriate header, if any, which + * should set the content type as "text/xml" and the content length as + * appropriate. The caller is also responsible for writing the xml version tag. + * + * @param aMethodName The method name to appear in the "methodName" tag. + * @param aParameterArray An array of objects, each of which will be encoded as + * values enclosed in a "param" tag, all of which will be + * enclosed in a "params" tag. + * @param anOutputStream The stream to which the XML will be written. + */ + public void encodeRequest(String aMethodName, Object[] aParameterArray, OutputStream anOutputStream) { + try { + RPCXMLWriter writer = new RPCXMLWriter(anOutputStream, OutputFormat.createCompactFormat()); + writer.processingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\""); + writer.startElement(METHODCALL); + writer.startElement(METHODNAME); + writer.write(aMethodName); + writer.endElement(METHODNAME); + writer.startElement(PARAMS); + for (int i = 0; i < aParameterArray.length; i++) { + writer.startElement(PARAM); + writeValueToXMLWriter(aParameterArray[i], writer); + writer.endElement(PARAM); + } + writer.endElement(PARAMS); + writer.endElement(METHODCALL); + writer.flush(); + } catch (Exception exc) { + throw new WotonomyException(exc); + } + + // TODO: should this return the content-length? + } + + /** + * Encodes a method response in XML-RPC format in a "methodResponse" tag, and + * writes the XML to the specified output stream. This method only writes XML: + * the caller is responsible for generating the appropriate header, if any, + * which should set the content type as "text/xml" and the content length as + * appropriate. The caller is also responsible for writing the xml version tag. + * + * @param aResult A object which will be encoded as values enclosed in a + * "param" tag, all of which will be enclosed in a + * "params" tag. + * @param anOutputStream The stream to which the XML will be written. + */ + public void encodeResponse(Object aResult, OutputStream anOutputStream) { + try { + RPCXMLWriter writer = new RPCXMLWriter(anOutputStream, OutputFormat.createCompactFormat()); + writer.processingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\""); + writer.startElement(METHODRESPONSE); + writer.startElement(PARAMS); + writer.startElement(PARAM); + writeValueToXMLWriter(aResult, writer); + writer.endElement(PARAM); + writer.endElement(PARAMS); + writer.endElement(METHODRESPONSE); + writer.flush(); + } catch (Exception exc) { + throw new WotonomyException(exc); + } + + // TODO: should this return the content-length? + } + + /** + * Encodes a fault response in XML-RPC format in a "methodResponse" tag, and + * writes the XML to the specified output stream. This method only writes XML: + * the caller is responsible for first generating the appropriate header, if + * any, which should set the content type as "text/xml" and the content length + * as appropriate. The caller is also responsible for writing the xml version + * tag. + * + * @param aFaultCode An application-defined error code. + * @param aFaultString A human-readable error description. + * @param anOutputStream The stream to which the XML will be written. + */ + public void encodeFault(int aFaultCode, String aFaultString, OutputStream anOutputStream) { + try { + RPCXMLWriter writer = new RPCXMLWriter(anOutputStream, OutputFormat.createCompactFormat()); + writer.processingInstruction("xml", "version=\"1.0\""); + writer.startElement(METHODRESPONSE); + writer.startElement(FAULT); + writer.startElement(VALUE); + writer.startElement(STRUCT); + + writer.startElement(MEMBER); + writer.startElement(NAME); + writer.write(FAULTCODE); + writer.endElement(NAME); + writer.startElement(VALUE); + writer.startElement(INT); + writer.write(new Integer(aFaultCode).toString()); + writer.endElement(INT); + writer.endElement(VALUE); + writer.endElement(MEMBER); + + writer.startElement(MEMBER); + writer.startElement(NAME); + writer.write(FAULTSTRING); + writer.endElement(NAME); + writer.startElement(VALUE); + writer.startElement(STRING); + writer.write(aFaultString); + writer.endElement(STRING); + writer.endElement(VALUE); + writer.endElement(MEMBER); + + writer.endElement(STRUCT); + writer.endElement(VALUE); + writer.endElement(FAULT); + writer.endElement(METHODRESPONSE); + writer.flush(); + } catch (Exception exc) { + throw new WotonomyException(exc); + } + + // TODO: should this return the content-length? + } + + /** + * Performs the actual writing of the file to XML. + */ + private void writeValueToXMLWriter(Object anObject, RPCXMLWriter writer) { + try { + + if (anObject == null) { + writer.startElement(VALUE); + // write nil for null + Element nill = new NonLazyElement(NIL); + writer.write(nill); + } else if (anObject instanceof Collection) { + // write class so we can restore if possible + AttributesImpl a = new AttributesImpl(); + a.addAttribute(null, CLASS, null, null, anObject.getClass().getName()); + + writer.startElement(VALUE, a); + + // write items in the order we get them from the iterator + + writer.startElement(ARRAY); + writer.startElement(DATA); + Iterator it = ((Collection) anObject).iterator(); + while (it.hasNext()) { + writeValueToXMLWriter(it.next(), writer); + } + writer.endElement(DATA); + writer.endElement(ARRAY); + + } else if (anObject instanceof Map) { + AttributesImpl a = new AttributesImpl(); + a.addAttribute(null, CLASS, null, null, anObject.getClass().getName()); + + writer.startElement(VALUE, a); + + // write items in the order we get them from the iterator + // FIXME: The method-based properties are being ignored! + + Map.Entry entry; + writer.startElement(STRUCT); + writer.startElement(MEMBER); + Iterator it = ((Map) anObject).entrySet().iterator(); + while (it.hasNext()) { + entry = (Map.Entry) it.next(); + writer.startElement(NAME); + writeValueToXMLWriter(entry.getKey(), writer); + writer.endElement(NAME); + writeValueToXMLWriter(entry.getValue(), writer); + } + writer.endElement(MEMBER); + writer.endElement(STRUCT); + } else // not a collection + { + // check for primitive types + if (anObject instanceof String) { + writer.startElement(VALUE); + + writer.startElement(STRING); + writer.write(anObject.toString()); + writer.endElement(STRING); + } else if (anObject instanceof StringBuffer) { + // write class so we can restore if possible + AttributesImpl a = new AttributesImpl(); + a.addAttribute(null, CLASS, null, null, anObject.getClass().getName()); + + writer.startElement(VALUE, a); + + writer.startElement(STRING); + writer.write(anObject.toString()); + writer.endElement(STRING); + } else if (anObject instanceof Number) { + // write class so we can restore if possible + AttributesImpl a = new AttributesImpl(); + a.addAttribute(null, CLASS, null, null, anObject.getClass().getName()); + + writer.startElement(VALUE, a); + + if ((anObject instanceof Double) || (anObject instanceof Float)) { + writer.startElement(DOUBLE); + writer.write(anObject.toString()); + writer.endElement(DOUBLE); + } else { + writer.startElement(INT); + writer.write(anObject.toString()); + writer.endElement(INT); + } + } else if (anObject instanceof Date) { + // write class so we can restore if possible + AttributesImpl a = new AttributesImpl(); + a.addAttribute(null, CLASS, null, null, anObject.getClass().getName()); + + writer.startElement(VALUE, a); + + writer.startElement(DATE); + writer.write(DATEFORMAT8601.format(anObject)); + writer.endElement(DATE); + } else if (anObject instanceof Boolean) { + writer.startElement(BOOLEAN); + if (((Boolean) anObject).booleanValue()) { + writer.write("1"); + } else { + writer.write("0"); + } + writer.endElement(BOOLEAN); + } else if (anObject.getClass().isArray()) { + // write class so we can restore if possible + AttributesImpl a = new AttributesImpl(); + a.addAttribute(null, CLASS, null, null, anObject.getClass().getName()); + + writer.startElement(VALUE, a); + + writer.startElement(ARRAY); + writer.startElement(DATA); + + int length = Array.getLength(anObject); + for (int i = 0; i < length; i++) { + writeValueToXMLWriter(Array.get(anObject, i), writer); + } + + writer.endElement(DATA); + writer.endElement(ARRAY); + } else // not primitive or collection, treat as struct + { + // write class so we can restore if possible + AttributesImpl a = new AttributesImpl(); + a.addAttribute(null, CLASS, null, null, anObject.getClass().getName()); + + writer.startElement(VALUE, a); + + List readProperties = new ArrayList(); + String[] read = Introspector.getReadPropertiesForObject(anObject); + for (int i = 0; i < read.length; i++) { + readProperties.add(read[i]); + } + + List properties = new ArrayList(); + String[] write = Introspector.getWritePropertiesForObject(anObject); + for (int i = 0; i < write.length; i++) { + properties.add(write[i]); + } + + // only use readable properties + properties.retainAll(readProperties); + // if ( properties.size() > 0 ) // { - String key; - Object value; - Iterator it = properties.iterator(); - writer.startElement( STRUCT ); - while ( it.hasNext() ) - { - key = (String) it.next(); - value = Introspector.get( anObject, key ); - - writer.startElement( MEMBER ); - writer.startElement( NAME ); - writer.write( key ); - writer.endElement( NAME ); - writeValueToXMLWriter( value, writer ); - writer.endElement( MEMBER ); - } - writer.endElement( STRUCT ); -/* - } - else // no properties - write a converted string - { - writer.startElement( STRING ); - Object converted = - ValueConverter.convertObjectToClass( anObject, String.class ); - if ( converted != null ) - { - writer.write( converted.toString() ); - } - else - { - writer.write( anObject.toString() ); - } - writer.endElement( STRING ); - } -*/ - } - } - - writer.endElement( VALUE ); - } - catch ( Exception exc ) - { - System.err.println( "XMLFileSoup.writeValueToXMLWriter: " + exc ); - exc.printStackTrace(); - } - - } -/* - public static void main( String[] argv ) - { - System.out.println( "<test>" ); - XMLRPCEncoder encoder = new XMLRPCEncoder(); - encoder.encodeRequest( "systemObject.test", new Object[] { - new net.wotonomy.test.TestObject(), - new net.wotonomy.test.TestObject(), - new net.wotonomy.test.TestObject() }, System.out ); - System.out.println(); - System.out.println(); - encoder.encodeResponse( new net.wotonomy.test.TestObject(), System.out ); - System.out.println(); - System.out.println(); - encoder.encodeFault( -1, "This is a fault.", System.out ); - System.out.println(); - System.out.println(); - System.out.println( "</test>" ); - } -*/ - - private class RPCXMLWriter extends XMLWriter { + String key; + Object value; + Iterator it = properties.iterator(); + writer.startElement(STRUCT); + while (it.hasNext()) { + key = (String) it.next(); + value = Introspector.get(anObject, key); + + writer.startElement(MEMBER); + writer.startElement(NAME); + writer.write(key); + writer.endElement(NAME); + writeValueToXMLWriter(value, writer); + writer.endElement(MEMBER); + } + writer.endElement(STRUCT); + /* + * } else // no properties - write a converted string { writer.startElement( + * STRING ); Object converted = ValueConverter.convertObjectToClass( anObject, + * String.class ); if ( converted != null ) { writer.write( converted.toString() + * ); } else { writer.write( anObject.toString() ); } writer.endElement( STRING + * ); } + */ + } + } + + writer.endElement(VALUE); + } catch (Exception exc) { + System.err.println("XMLFileSoup.writeValueToXMLWriter: " + exc); + exc.printStackTrace(); + } + + } + /* + * public static void main( String[] argv ) { System.out.println( "<test>" ); + * XMLRPCEncoder encoder = new XMLRPCEncoder(); encoder.encodeRequest( + * "systemObject.test", new Object[] { new net.wotonomy.test.TestObject(), new + * net.wotonomy.test.TestObject(), new net.wotonomy.test.TestObject() }, + * System.out ); System.out.println(); System.out.println(); + * encoder.encodeResponse( new net.wotonomy.test.TestObject(), System.out ); + * System.out.println(); System.out.println(); encoder.encodeFault( -1, + * "This is a fault.", System.out ); System.out.println(); System.out.println(); + * System.out.println( "</test>" ); } + */ + + private class RPCXMLWriter extends XMLWriter { public RPCXMLWriter(OutputStream arg0, OutputFormat arg1) throws UnsupportedEncodingException { super(arg0, arg1); } - public void endElement(String localname) throws SAXException { + public void endElement(String localname) throws SAXException { super.endElement(null, localname, null); } public void startElement(String localname) throws SAXException { this.startElement(localname, null); } + public void startElement(String localname, Attributes attributes) throws SAXException { this.startElement(null, localname, null, attributes); } - } - + } + } |
