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 gd...@apache.org on 2001/05/03 16:34:18 UTC
cvs commit: xml-axis/java/samples/encoding Data.java DataSer.java TestSer.java
gdaniels 01/05/03 07:34:18
Added: java/samples/encoding Data.java DataSer.java TestSer.java
Log:
A little sample illustrating a way to integrate a custom data type (a struct)
with the encoding system.
Revision Changes Path
1.1 xml-axis/java/samples/encoding/Data.java
Index: Data.java
===================================================================
package samples.encoding;
public class Data
{
public String stringMember;
public Float floatMember;
}
1.1 xml-axis/java/samples/encoding/DataSer.java
Index: DataSer.java
===================================================================
package samples.encoding;
import org.apache.axis.encoding.*;
import java.util.*;
import java.io.*;
import org.xml.sax.*;
import org.apache.axis.utils.QName;
public class DataSer extends DeserializerBase implements Serializer
{
public static final String STRINGMEMBER = "stringMember";
public static final String FLOATMEMBER = "floatMember";
public static class DataSerFactory implements DeserializerFactory {
public DeserializerBase getDeserializer() {
return new DataSer();
}
}
public static DeserializerFactory getFactory()
{
return new DataSerFactory();
}
private Hashtable typesByMemberName = new Hashtable();
/** Have I received the startelement event for the top-level element?
*/
private boolean gotMyStart = false;
public DataSer()
{
typesByMemberName.put(STRINGMEMBER, SOAPTypeMappingRegistry.XSD_STRING);
typesByMemberName.put(FLOATMEMBER, SOAPTypeMappingRegistry.XSD_FLOAT);
value = new Data();
}
/** DESERIALIZER STUFF - event handlers
*/
public void startElement(String namespace, String localName,
String qName, Attributes attributes)
throws SAXException
{
if (!gotMyStart) {
gotMyStart = true;
return;
}
QName typeQName = (QName)typesByMemberName.get(localName);
if (typeQName == null)
throw new SAXException("Invalid element in Data struct - " + localName);
// These can come in either order.
DeserializerBase dSer = context.getDeserializer(typeQName);
if (dSer == null)
throw new SAXException("No deserializer for a " + typeQName + "???");
dSer.setParent(this);
context.pushElementHandler(dSer);
}
public void onEndChild(String localName, DeserializerBase deserializer)
throws SAXException
{
if (STRINGMEMBER.equals(localName)) {
((Data)value).stringMember = (String)deserializer.getValue();
} else if (FLOATMEMBER.equals(localName)) {
((Data)value).floatMember = (Float)deserializer.getValue();
} else {
throw new SAXException("No such child - " + localName);
}
}
/** SERIALIZER STUFF
*/
public void serialize(QName name, Attributes attributes,
Object value, SerializationContext context)
throws IOException
{
if (!(value instanceof Data))
throw new IOException("Can't serialize a " + value.getClass().getName() + " with a DataSerializer.");
Data data = (Data)value;
context.startElement(name, attributes);
context.serialize(new QName("", STRINGMEMBER), null, data.stringMember);
context.serialize(new QName("", FLOATMEMBER), null, data.floatMember);
context.endElement();
}
}
1.1 xml-axis/java/samples/encoding/TestSer.java
Index: TestSer.java
===================================================================
package samples.encoding;
import org.apache.axis.message.*;
import org.apache.axis.encoding.*;
import org.apache.axis.utils.QName;
import org.xml.sax.InputSource;
import org.apache.xerces.parsers.SAXParser;
import java.io.*;
import java.util.*;
/** Little serialization test with a struct.
*/
public class TestSer
{
public static final String myNS = "urn:myNS";
public static void main(String args[]) {
SOAPEnvelope msg = new SOAPEnvelope();
RPCParam arg1 = new RPCParam("urn:myNamespace", "testParam", "this is a string");
Data data = new Data();
data.stringMember = "String member";
data.floatMember = new Float("4.54");
RPCParam arg2 = new RPCParam("", "struct", data);
RPCElement body = new RPCElement("urn:myNamespace", "method1", new Object[]{ arg1, arg2 });
msg.addBodyElement(body);
try {
Writer stringWriter = new StringWriter();
SerializationContext context = new SerializationContext(stringWriter);
TypeMappingRegistry reg = context.getTypeMappingRegistry();
QName dataQName = new QName("typeNS", "Data");
reg.addSerializer(Data.class, dataQName, new DataSer());
msg.output(context);
String msgString = stringWriter.toString();
System.out.println("Serialized msg:");
System.out.println(msgString);
System.out.println("-------");
System.out.println("Testing deserialization...");
StringReader reader = new StringReader(msgString);
SAXAdapter adapter = new SAXAdapter(new SAXParser(), new InputSource(reader));
reg = adapter.getContext().getTypeMappingRegistry();
reg.addDeserializerFactory(dataQName, DataSer.getFactory());
SOAPEnvelope env = adapter.getEnvelope();
RPCElement rpcElem = (RPCElement)env.getFirstBody();
RPCParam struct = rpcElem.getParam("struct");
if (struct == null)
throw new Exception("No <struct> param");
Data val = (Data)struct.getValue();
if (val == null)
throw new Exception("No value for struct param");
System.out.println("String member is '" + val.stringMember +"'");
System.out.println("Float member is " + val.floatMember);
} catch (Exception e) {
e.printStackTrace();
}
}
}