/*
 * 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.
 */

package org.apache.ws.commons.om.impl.streamwrapper;

import org.apache.ws.commons.om.AbstractTestCase;
import org.apache.ws.commons.om.OMAbstractFactory;
import org.apache.ws.commons.om.OMXMLParserWrapper;
import org.apache.ws.commons.om.impl.llom.factory.OMXMLBuilderFactory;
import org.apache.ws.commons.soap.SOAPEnvelope;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import java.io.File;
import java.io.FileReader;

public class OMStaxStreamingWrapperTest extends AbstractTestCase {
    private SOAPEnvelope envelope = null;
    private File tempFile;
    private XMLStreamReader parser;

    public OMStaxStreamingWrapperTest(String testName) {
        super(testName);
    }

    protected void setUp() throws Exception {
        XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().
                createXMLStreamReader(
                        new FileReader(
                                getTestResourceFile("soap/soapmessage1.xml")));
        OMXMLParserWrapper builder = OMXMLBuilderFactory.createStAXSOAPModelBuilder(
                OMAbstractFactory.getSOAP11Factory(), xmlStreamReader);
        envelope = (SOAPEnvelope) builder.getDocumentElement();
        tempFile = File.createTempFile("temp", "xml");

    }


    //    public void testWrapperFullOM() throws Exception {
    //        assertNotNull(envelope);
    //        //this serializing will cause the OM to fully build!
    //        XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(new FileOutputStream(tempFile));
    //        envelope.serializeAndConsume(writer,true);
    //        parser = envelope.getXMLStreamReader(false);
    //        while (parser.hasNext()) {
    //            int event = parser.next();
    //            assertTrue(event > 0);
    //        }
    //
    //    }

    public void testWrapperHalfOM() throws Exception {
        assertNotNull(envelope);
        parser = envelope.getXMLStreamReaderWithoutCaching();
        while (parser.hasNext()) {
            int event = parser.next();
            assertTrue(event > 0);
        }
    }

    //    public void testWrapperHalfOMWithCacheOff() throws Exception {
    //        assertNotNull(envelope);
    //        parser = envelope.getXMLStreamReader(true);
    //        while (parser.hasNext()) {
    //            int event = parser.next();
    //            assertTrue(event > 0);
    //        }
    //    }
    //
    //    public void testWrapperElementEventGenerationWithHalfOMWithCacheOff() throws XMLStreamException {
    //        assertNotNull(envelope);
    //        parser = envelope.getXMLStreamReader(true);
    //        while (parser.hasNext()) {
    //            int event = parser.next();
    //            assertTrue(event > 0);
    //            if (event == XMLStreamConstants.START_ELEMENT) {
    //                checkStartElement(parser);
    //            } else if (event == XMLStreamConstants.CHARACTERS) {
    //                checkCharacters(parser);
    //            }
    //        }
    //
    //
    //    }
    //
    //    public void testWrapperElementEventGenerationWithHalfOM() throws Exception {
    //        assertNotNull(envelope);
    //        parser = envelope.getXMLStreamReader(false);
    //        while (parser.hasNext()) {
    //            int event = parser.next();
    //            assertTrue(event > 0);
    //            if (event == XMLStreamConstants.START_ELEMENT) {
    //                checkStartElement(parser);
    //            } else if (event == XMLStreamConstants.CHARACTERS) {
    //                checkCharacters(parser);
    //            }
    //        }
    //
    //
    //    }
    //
    //    private void checkCharacters(XMLStreamReader wrapper) {
    //        assertFalse(wrapper.isStartElement());
    //        assertFalse(wrapper.isEndElement());
    //        assertFalse(wrapper.isWhiteSpace());
    //        assertFalse(wrapper.hasName());
    //        assertTrue(wrapper.isCharacters());
    //
    //        assertNotNull(wrapper.getText());
    //        assertTrue(wrapper.getTextLength() > 0);
    //    }
    //
    //    private void checkStartElement(XMLStreamReader wrapper) {
    //        assertTrue(wrapper.isStartElement());
    //        assertTrue(wrapper.hasName());
    //        assertFalse(wrapper.isEndElement());
    //        assertFalse(wrapper.isCharacters());
    //        assertFalse(wrapper.isWhiteSpace());
    //
    //        //at the start element event these need to be supplied
    //        assertNotNull(wrapper.getLocalName());
    //        assertNotNull(wrapper.getName());
    //        assertNotNull(wrapper.getNamespaceURI());
    //        //prefix may be null
    //        wrapper.getPrefix();
    //
    //        //todo add the other checks here
    //        int attribCount = wrapper.getAttributeCount();
    //        for (int i = 0; i < attribCount; i++) {
    //            assertNotNull(wrapper.getAttributeLocalName(i));
    //            assertNotNull(wrapper.getAttributeValue(i));
    //            assertNotNull(wrapper.getAttributeName(i));
    //            wrapper.getAttributePrefix(i);
    //            wrapper.getAttributeNamespace(i);
    //            //todo add the other checks here
    //        }
    //
    //
    //    }
    //
    //    public void testWrapperElementEventGenerationWithHalfOMWithCacheOff() throws XMLStreamException {
    //        assertNotNull(envelope);
    //        parser = envelope.getXMLStreamReader(true);
    //        while (parser.hasNext()) {
    //            int event = parser.next();
    //            assertTrue(event > 0);
    //            if (event == XMLStreamConstants.START_ELEMENT) {
    //                checkStartElement(parser);
    //            } else if (event == XMLStreamConstants.CHARACTERS) {
    //                checkCharacters(parser);
    //            }
    //        }
    //
    //
    //    }
    //
    //    public void testWrapperElementEventGenerationWithHalfOM() throws Exception {
    //        assertNotNull(envelope);
    //        parser = envelope.getXMLStreamReader(false);
    //        while (parser.hasNext()) {
    //            int event = parser.next();
    //            assertTrue(event > 0);
    //            if (event == XMLStreamConstants.START_ELEMENT) {
    //                checkStartElement(parser);
    //            } else if (event == XMLStreamConstants.CHARACTERS) {
    //                checkCharacters(parser);
    //            }
    //        }
    //
    //
    //    }
    //
    //    private void checkCharacters(XMLStreamReader wrapper) {
    //        assertFalse(wrapper.isStartElement());
    //        assertFalse(wrapper.isEndElement());
    //        assertFalse(wrapper.isWhiteSpace());
    //        assertFalse(wrapper.hasName());
    //        assertTrue(wrapper.isCharacters());
    //
    //        assertNotNull(wrapper.getText());
    //        assertTrue(wrapper.getTextLength() > 0);
    //    }
    //
    //    private void checkStartElement(XMLStreamReader wrapper) {
    //        assertTrue(wrapper.isStartElement());
    //        assertTrue(wrapper.hasName());
    //        assertFalse(wrapper.isEndElement());
    //        assertFalse(wrapper.isCharacters());
    //        assertFalse(wrapper.isWhiteSpace());
    //
    //        //at the start element event these need to be supplied
    //        assertNotNull(wrapper.getLocalName());
    //        assertNotNull(wrapper.getName());
    //        assertNotNull(wrapper.getNamespaceURI());
    //        //prefix may be null
    //        wrapper.getPrefix();
    //
    //        //todo add the other checks here
    //        int attribCount = wrapper.getAttributeCount();
    //        for (int i = 0; i < attribCount; i++) {
    //            assertNotNull(wrapper.getAttributeLocalName(i));
    //            assertNotNull(wrapper.getAttributeValue(i));
    //            assertNotNull(wrapper.getAttributeName(i));
    //            wrapper.getAttributePrefix(i);
    //            wrapper.getAttributeNamespace(i);
    //            //todo add the other checks here
    //        }
    //
    //
    //    }


    protected void tearDown() throws Exception {
        tempFile.delete();
    }
}
