Print

Print


Yes, I am trying to do object serialization/deserialization outside the
SOAP environment, but find the objects created by the Apache Axis
toolkit too convenient to give up.  So, I was looking for ways to switch
between the XML request/responses and the appropriate objects.  I think
I've pretty well mastered that.

Ralph


import gov.loc.www.zing.srw.ScanRequestType;
import gov.loc.www.zing.srw.ScanResponseType;
import gov.loc.www.zing.srw.SearchRetrieveRequestType;
import gov.loc.www.zing.srw.SearchRetrieveResponseType;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.namespace.QName;
import org.apache.axis.MessageContext;
import org.apache.axis.encoding.DeserializationContext;
import org.apache.axis.encoding.SerializationContext;
import org.apache.axis.encoding.Serializer;
import org.apache.axis.message.RPCElement;
import org.apache.axis.message.SOAPEnvelope;
import org.apache.axis.server.AxisServer;
import org.xml.sax.InputSource;

    public static String objToXml(Object obj)
      throws IllegalArgumentException, IOException {
        QName qn;
        Serializer s;
        if(obj instanceof  SearchRetrieveRequestType) {
            qn=new QName("http://www.loc.gov/zing/srw/",
"searchRetrieveRequest"); 
            s=((SearchRetrieveRequestType)obj).getSerializer(
                null, obj.getClass(), qn);
        }
        else if(obj instanceof  SearchRetrieveResponseType) {
            qn=new QName("http://www.loc.gov/zing/srw/",
"searchRetrieveResponse"); 
            s=((SearchRetrieveResponseType)obj).getSerializer(
                null, obj.getClass(), qn);
        }
        else if(obj instanceof  ScanRequestType) {
            qn=new QName("http://www.loc.gov/zing/srw/", "scanRequest");

            s=((ScanRequestType)obj).getSerializer(
                null, obj.getClass(), qn);
        }
        else if(obj instanceof  ScanResponseType) {
            qn=new QName("http://www.loc.gov/zing/srw/",
"scanResponse"); 
            s=((ScanResponseType)obj).getSerializer(
                null, obj.getClass(), qn);
        }
        else throw new IllegalArgumentException(
            "Unrecognized object: "+obj.getClass().getName());

        StringWriter xmlWriter=new StringWriter(); 
        s.serialize(qn, null, obj, new SerializationContext(xmlWriter));
        return xmlWriter.toString();
    }

    static String EnvelopeStart="<soapenv:Envelope
xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><soapenv:Body>";
    static String EnvelopeEnd="</soapenv:Body></soapenv:Envelope>";
    public static Object xmlToObj(String xml) throws Exception {
        Object obj;
        String leader, soapMessage;
        leader=xml.substring(0, 20);
        if(leader.toLowerCase().startsWith("<?")) {
            // contains processing instruction.  Strip that off
            int i=xml.indexOf("Envelope");
            if(i<0)
                throw new IllegalArgumentException("XML starts with
processing instruction but contains no SOAP Envelope");
            while(i>0 && xml.charAt(i)!='<')
                i--;
            if(i==0)
                throw new IllegalArgumentException("XML starts with
processing instruction but contains no SOAP Envelope element");
            soapMessage=xml.substring(i);
        }
        else if(leader.contains("Envelope")) // use it as it is
            soapMessage=xml;
        else // add the soap envelope wrapper
            soapMessage=EnvelopeStart+xml+EnvelopeEnd;
        DeserializationContext dser = new DeserializationContext(
            new InputSource(new StringReader(soapMessage)),
            new MessageContext(new AxisServer()),
            org.apache.axis.Message.RESPONSE);
        dser.parse();

        SOAPEnvelope env = dser.getEnvelope();
        RPCElement rpcElem = (RPCElement)env.getFirstBody();
        String objectType=rpcElem.getLocalName();
        if(objectType.equals("searchRetrieveRequest"))
            obj=rpcElem.getObjectValue(SearchRetrieveRequestType.class);
        else if(objectType.equals("searchRetrieveResponse"))
 
obj=rpcElem.getObjectValue(SearchRetrieveResponseType.class);
        else if(objectType.equals("scanRequest"))
            obj=rpcElem.getObjectValue(ScanRequestType.class);
        else if(objectType.equals("scanResponse"))
            obj=rpcElem.getObjectValue(ScanResponseType.class);
        else
            throw new IllegalArgumentException("Unrecognized XML object:
"+objectType);
        return obj;
    }