package org.apache.axis2.schema.populate.other;

import junit.framework.TestCase;

import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLInputFactory;
import java.io.ByteArrayInputStream;
import java.lang.reflect.Method;

import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axiom.soap.SOAPFactory;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * 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.
 */

public class ADBInOutTest extends TestCase {

    private String xmlString = "<tempElt xmlns=\"http://soapinterop.org1/types\">" +
            "hello" +
            "</tempElt>";
    private String xmlString2 = "<header1 xmlns=\"http://soapinterop.org1/types\">" +
            "<varString>Hello</varString>" +
            "<varInt>5</varInt>" +
            "<varFloat>3.3</varFloat>" +
            "</header1>";

    public void testPopulate() throws Exception{

        XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new ByteArrayInputStream(xmlString.getBytes()));
        SOAPEnvelope defaultEnvelope = OMAbstractFactory.getSOAP11Factory().getDefaultEnvelope();
        OMElement documentElement = new StAXOMBuilder(reader).getDocumentElement();
        defaultEnvelope.getBody().addChild(documentElement);
        XMLStreamReader xmlStreamReader = defaultEnvelope.getBody().getFirstElement().getXMLStreamReader();
        while(xmlStreamReader.hasNext()){
            System.out.println("event " + xmlStreamReader.next());
            System.out.println("text " +  (xmlStreamReader.hasText()?xmlStreamReader.getText():""));
            System.out.println("localName " + (xmlStreamReader.hasName()?xmlStreamReader.getLocalName():""));
        }
    }

    public void testPopulate2() throws Exception{

        XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(new ByteArrayInputStream(xmlString.getBytes()));
        XMLStreamReader reader2 = XMLInputFactory.newInstance().createXMLStreamReader(new ByteArrayInputStream(xmlString2.getBytes()));

        SOAPFactory soap11Factory = OMAbstractFactory.getSOAP11Factory();

        SOAPEnvelope defaultEnvelope = soap11Factory.getDefaultEnvelope();
        OMElement documentElement = new StAXOMBuilder(reader).getDocumentElement();
        defaultEnvelope.getBody().addChild(documentElement);

        OMElement documentElement2 = new StAXOMBuilder(reader2).getDocumentElement();
        defaultEnvelope.getHeader().addChild(documentElement2);

        XMLStreamReader xmlStreamReader = defaultEnvelope.getBody().getFirstElement().getXMLStreamReader();
        while(xmlStreamReader.hasNext()){
            System.out.println("event " + xmlStreamReader.next());
            System.out.println("text " +  (xmlStreamReader.hasText()?xmlStreamReader.getText():""));
            System.out.println("localName " + (xmlStreamReader.hasName()?xmlStreamReader.getLocalName():""));
        }
    }
}
