Scott,
Are you looking for this?
/**
* Deserializes a SOAP Reader (i.e. a XML file) to the appropriate
Java Class
* generated by Axis.
*
* @param reader content for deserializing (_a complete SOAP
envelope_)
* @param clazz Java Type representation of the XML stream is
* @return Object which has to be casted to the specified Java Class
(clazz)
*/
public static Object deserializeFromSOAPReader(Reader reader, Class
clazz)
throws DocumentStructureException, AxisFault {
MessageContext msgContext = new MessageContext(new
AxisServer());
msgContext.setEncodingStyle(null);
TypeMappingRegistry tmr = new TypeMappingRegistryImpl();
msgContext.setTypeMappingRegistry(tmr);
DeserializationContext dser = new DeserializationContext(new
InputSource(reader),
msgContext,
org.apache.axis.Message.REQUEST);
// parse the InputSource
try {
dser.parse();
}
catch(SAXException e) {
throw new DocumentStructureException(e.getMessage(), e);
}
RPCElement rpcElem = (RPCElement)
dser.getEnvelope().getFirstBody();
try {
return rpcElem.getValueAsType(null, clazz);
}
catch(Exception e) {
throw new DocumentStructureException(e.getMessage(), e);
}
}
Yves
On Thu, 2005-03-17 at 12:17 +1100, Scott Wilson wrote:
>
>
> ______________________________________________________________________
>
> I have a bit of an odd problem:
>
> My application is a search adapter for a federated search system; it
> calls a remote search service, which returns some results in its
> native schema format. This is deserialized into my RecordData bean
> that AXIS has helpfully generated, with the results lurking in the
> '_any' value (the other value being Srw_DcType dc).
>
> I use XSL to take the contents of '_any' and transform them into
> Dublin Core, then insert this back into the RecordData bean
> instance.
>
> However, I now need to deserialize the resulting data so I can do some
> further work on it (such as vocab mapping) before I return it for
> output to the federated search engine that called my adapter. I'd like
> to make RecordData.dc actually have the deserialized value of the
> transformation output.
>
> The problem is, automated serialization only happens in Axis at the
> end of a SOAP call; I can't figure out a way of programmatically
> invoking a BeanDeserializer on my transformed XML, even though I have
> everything Axis needs already in place (a generated type, registered,
> and working - when a call is invoked).
>
> Some source code below will, I hope, show you what I'm after:
>
> /*
> * Created on Mar 16, 2005
> *
> */
> package au.edu.mq.melcoe.mams.adapter.search.handler;
>
> import gov.loc.www.zing.srw.RecordsType;
> import javax.xml.transform.stream.StreamSource;
> import javax.xml.transform.dom.DOMResult;
> import org.apache.axis.message.MessageElement;
> import java.io.StringReader;
> import org.w3c.dom.*;
> /**
> * Performs an XSL transformation on a results set, and places the
> results into
> * the RecordsType passed in.
> *
> * @author Scott Wilson
> */
> public class XslMetadataProcessor implements IMetadataProcessor {
>
> private String stylesheet;
>
> public XslMetadataProcessor(String stylesheet){
> this.stylesheet = stylesheet;
> }
>
> public RecordsType processRecords(RecordsType records) throws
> Exception{
> //return records;
> if(stylesheet != null && records != null){
>
> for (int i=0;i<records.getRecord().length;i++){
>
> MessageElement[] msg = records.getRecord(i).getRecordData().get_any();
> DOMResult out = new DOMResult();
> StreamSource src = new StreamSource(new
> StringReader(msg[0].getAsString()));
>
> try{
> javax.xml.transform.TransformerFactory tFactory =
> javax.xml.transform.TransformerFactory.newInstance();
> javax.xml.transform.Transformer transformer = tFactory.newTransformer
> (new StreamSource("META-INF/stylesheets/"+this.stylesheet));
> transformer.transform (src, out);
> Document outDoc = (Document)out.getNode();
> msg[0] = new
> MessageElement((Element)outDoc.getElementsByTagName("*").item(0));
> } catch (Exception ex){
> ex.printStackTrace();
> throw new Exception("Transformation could not be completed");
> }
> // OK, we now have the record transformed, and the output is inside
> // the "_any" part of the record. time to deserialize it - but how?
> // I'd like to write :
> // Srw_dcType dc = new Srw_dcType(SOME MAGIC HERE);
> // records.getRecord(i).getRecordData().setDc(dc);
> }
>
> } else {
> throw new Exception("Stylesheet not defined");
> }
> return records;
> }
> }