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);
    }
}

Reply via email to