On Tuesday 14 December 2004 22:37, Frank Maritato wrote: > Is it possible to use my java classes generated from a wsdl and xsd's > to deserialize static xml (i.e. a file)? I have a sample of what the > output is and I want to run it through deserialization to make sure > it will work. I can't just run it against the server because I'm > waiting on other groups to complete their work, but I'd like to get > as much done as possible in the meantime.
I've attached a class that I use as a helper for unit testing deserializers. In the actual test case class, I have a method like the following that I use to get at the deserialized class and test it further. private MyClass deserializeVerzeichnis(String filename) throws Exception { URL xmlFile = getClass().getResource(filename); DeserializationTester tester = new DeserializationTester( xmlFile, new QName("myclass"), MyClass.class, new MyClassDeserializerFactory()); Object result = tester.getResult(); assertNotNull(result); assertTrue(result instanceof MyClass); return Verzeichnis vz = (MyClass)result; } HTH, Michael -- Michael Schuerig Most people would rather die than think. mailto:[EMAIL PROTECTED] In fact, they do. http://www.schuerig.de/michael/ --Bertrand Russell
/* * Copyright 2004 Michael Schuerig <[EMAIL PROTECTED]> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.schuerig.util; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.StringReader; import java.net.URL; import javax.xml.namespace.QName; import org.apache.axis.AxisFault; import org.apache.axis.Constants; import org.apache.axis.Message; import org.apache.axis.MessageContext; import org.apache.axis.encoding.DeserializationContext; import org.apache.axis.encoding.DeserializerFactory; import org.apache.axis.encoding.TypeMapping; import org.apache.axis.encoding.TypeMappingRegistry; import org.apache.axis.message.RPCElement; import org.apache.axis.message.SOAPBodyElement; import org.apache.axis.message.SOAPEnvelope; import org.apache.axis.server.AxisServer; import org.apache.commons.io.FileUtils; import org.xml.sax.InputSource; public class DeserializationTester { private static final String XML_ENCODING = "UTF-8"; private final DeserializationContext _context; private final QName _elementName; private final Class _javaClass; private final DeserializerFactory _factory; public DeserializationTester( String xmlInput, QName elementName, Class javaClass, DeserializerFactory factory) throws Exception { _elementName = elementName; _javaClass = javaClass; _factory = factory; _context = createDeserializationContext(xmlInput, elementName, javaClass, factory); } public DeserializationTester( URL xmlInput, QName elementName, Class javaClass, DeserializerFactory factory) throws Exception { this(getText(xmlInput), elementName, javaClass, factory); } public Object getResult() throws Exception { _context.parse(); return extractResult(_context, _elementName, _javaClass); } private static String getText( URL xmlInput ) throws IOException { return FileUtils.readFileToString(FileUtils.toFile(xmlInput), XML_ENCODING); } public static DeserializationContext createDeserializationContext( String document, QName elementName, Class javaClass, DeserializerFactory factory) throws Exception { DeserializationContext context; SOAPEnvelope env = new SOAPEnvelope(); SOAPBodyElement body = new SOAPBodyElement( new ByteArrayInputStream(document.getBytes())); env.addBodyElement(body); MessageContext mctx = new MessageContext(new AxisServer()); InputSource is = new InputSource(new StringReader(env.toString())); context = new DeserializationContext(is, mctx, Message.RESPONSE); TypeMappingRegistry reg = context.getTypeMappingRegistry(); TypeMapping tm = (TypeMapping)reg.getTypeMapping(""); if (tm == null) { tm = (TypeMapping) reg.createTypeMapping(); reg.register(Constants.URI_DEFAULT_SOAP_ENC, tm); } tm.register(javaClass, elementName, null, factory); return context; } public static Object extractResult(DeserializationContext context, QName elementName, Class javaClass) throws AxisFault, Exception { SOAPEnvelope env = context.getEnvelope(); RPCElement body = (RPCElement)env.getFirstBody(); return body.getValueAsType(elementName, javaClass); } }