/*
* 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.axis2.util;

import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;
import javax.xml.stream.Location;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

public class StreamWrapper implements XMLStreamReader {
    private static final int STATE_SWITCHED = 0;
    private static final int STATE_INIT = 1;
    private static final int STATE_SWITCH_AT_NEXT = 2;
    private static final int STATE_COMPLETE_AT_NEXT = 3;
    private static final int STATE_COMPLETED = 4;
    private XMLStreamReader realReader = null;
    private int state = STATE_INIT;
    private int prevState = state;


    public StreamWrapper(XMLStreamReader realReader) {
        if (realReader == null) {
            throw new UnsupportedOperationException("Reader cannot be null");
        }

        this.realReader = realReader;
    }

    public void close() throws XMLStreamException {
        if (state != STATE_INIT) {
            realReader.close();
        } else {
            throw new XMLStreamException();
        }
    }

    public int next() throws XMLStreamException {
        prevState = state;
        int returnEvent = -1;

        switch (state) {
            case STATE_INIT:
                if (realReader.getEventType() == START_DOCUMENT) {
                    state = STATE_SWITCHED;
                    returnEvent = realReader.next();
                } else {
                    state = STATE_SWITCHED;
                    returnEvent = realReader.getEventType();
                }
                break;
            case STATE_SWITCHED:
                returnEvent = realReader.next();
                if (returnEvent == END_DOCUMENT) {
                    state = STATE_COMPLETED;
                } else if (!realReader.hasNext()) {
                    state = STATE_COMPLETE_AT_NEXT;
                }
                break;
//            case STATE_SWITCH_AT_NEXT:
//                state = STATE_SWITCHED;
//                returnEvent = realReader.getEventType();
//                break;
            case STATE_COMPLETE_AT_NEXT:
                state = STATE_COMPLETED;
                returnEvent = END_DOCUMENT;
                break;
            case STATE_COMPLETED:
                //oops - no way we can go beyond this
                throw new XMLStreamException("end reached!");
            default:
                throw new UnsupportedOperationException();
        }

        return returnEvent;
    }

    public int nextTag() throws XMLStreamException {
        if (prevState != STATE_INIT) {
            return realReader.nextTag();
        } else {
            throw new XMLStreamException();
        }
    }

    public void require(int i, String s, String s1) throws XMLStreamException {
        if (state != STATE_INIT) {
            realReader.require(i, s, s1);
        }
    }

    public boolean standaloneSet() {
        if (state != STATE_INIT) {
            return realReader.standaloneSet();
        } else {
            return false;
        }
    }

    public int getAttributeCount() {
        if (state != STATE_INIT) {
            return realReader.getAttributeCount();
        } else {
            return 0;
        }
    }

    public String getAttributeLocalName(int i) {
        if (state != STATE_INIT) {
            return realReader.getAttributeLocalName(i);
        } else {
            return null;
        }
    }

    public QName getAttributeName(int i) {
        if (state != STATE_INIT) {
            return realReader.getAttributeName(i);
        } else {
            return null;
        }
    }

    public String getAttributeNamespace(int i) {
        if (state != STATE_INIT) {
            return realReader.getAttributeNamespace(i);
        } else {
            return null;
        }
    }

    public String getAttributePrefix(int i) {
        if (state != STATE_INIT) {
            return realReader.getAttributePrefix(i);
        } else {
            return null;
        }
    }

    public String getAttributeType(int i) {
        if (state != STATE_INIT) {
            return realReader.getAttributeType(i);
        } else {
            return null;
        }
    }

    public String getAttributeValue(int i) {
        if (state != STATE_INIT) {
            return realReader.getAttributeValue(i);
        } else {
            return null;
        }
    }

    public String getAttributeValue(String s, String s1) {
        if (state != STATE_INIT) {
            return realReader.getAttributeValue(s, s1);
        } else {
            return null;
        }
    }

    public String getCharacterEncodingScheme() {
        if (state != STATE_INIT) {
            return realReader.getCharacterEncodingScheme();
        } else {
            return null;
        }
    }

    public String getElementText() throws XMLStreamException {
        if (state != STATE_INIT) {
            return realReader.getElementText();
        } else {
            throw new XMLStreamException();
        }
    }

    public String getEncoding() {
        if (state != STATE_INIT) {
            return realReader.getEncoding();
        } else {
            return null;
        }
    }

    public int getEventType() {
        if (state == STATE_INIT) {
            return START_DOCUMENT;
        } else {
            return realReader.getEventType();
        }
    }

    public String getLocalName() {
        if (state != STATE_INIT) {
            return realReader.getLocalName();
        } else {
            return null;
        }
    }

    public Location getLocation() {
        if (state != STATE_INIT) {
            return realReader.getLocation();
        } else {
            return null;
        }
    }

    public QName getName() {
        if (state != STATE_INIT) {
            return realReader.getName();
        } else {
            return null;
        }
    }

    public NamespaceContext getNamespaceContext() {
        if (state != STATE_INIT) {
            return realReader.getNamespaceContext();
        } else {
            return null;
        }
    }

    public int getNamespaceCount() {
        if (state != STATE_INIT) {
            return realReader.getNamespaceCount();
        } else {
            return 0;
        }
    }

    public String getNamespacePrefix(int i) {
        if (state != STATE_INIT) {
            return realReader.getNamespacePrefix(i);
        } else {
            return null;
        }
    }

    public String getNamespaceURI() {
        if (state != STATE_INIT) {
            return realReader.getNamespaceURI();
        } else {
            return null;
        }
    }

    public String getNamespaceURI(int i) {
        if (state != STATE_INIT) {
            return realReader.getNamespaceURI(i);
        } else {
            return null;
        }
    }

    public String getNamespaceURI(String s) {
        if (state != STATE_INIT) {
            return realReader.getNamespaceURI(s);
        } else {
            return null;
        }
    }

    public String getPIData() {
        if (state != STATE_INIT) {
            return realReader.getPIData();
        } else {
            return null;
        }
    }

    public String getPITarget() {
        if (state != STATE_INIT) {
            return realReader.getPITarget();
        } else {
            return null;
        }
    }

    public String getPrefix() {
        if (state != STATE_INIT) {
            return realReader.getPrefix();
        } else {
            return null;
        }
    }

    public Object getProperty(String s) throws IllegalArgumentException {
        if (state != STATE_INIT) {
            return realReader.getProperty(s);
        } else {
            throw new IllegalArgumentException();
        }
    }

    public String getText() {
        if (state != STATE_INIT) {
            return realReader.getText();
        } else {
            return null;
        }
    }

    public char[] getTextCharacters() {
        if (state != STATE_INIT) {
            return realReader.getTextCharacters();
        } else {
            return new char[0];
        }
    }

    public int getTextCharacters(int i, char[] chars, int i1, int i2) throws XMLStreamException {
        if (state != STATE_INIT) {
            return realReader.getTextCharacters(i, chars, i1, i2);
        } else {
            return 0;
        }
    }

    public int getTextLength() {
        if (state != STATE_INIT) {
            return realReader.getTextLength();
        } else {
            return 0;
        }
    }

    public int getTextStart() {
        if (state != STATE_INIT) {
            return realReader.getTextStart();
        } else {
            return 0;
        }
    }

    public String getVersion() {
        if (state != STATE_INIT) {
            return realReader.getVersion();
        } else {
            return null;
        }
    }

    public boolean hasName() {
        if (state != STATE_INIT) {
            return realReader.hasName();
        } else {
            return false;
        }
    }

    public boolean hasNext() throws XMLStreamException {
        if (state == STATE_COMPLETE_AT_NEXT) {
            return true;
        } else if (state == STATE_COMPLETED) {
            return false;
        } else if (state != STATE_INIT) {
            return realReader.hasNext();
        } else {
            return true;
        }
    }

    public boolean hasText() {
        if (state != STATE_INIT) {
            return realReader.hasText();
        } else {
            return false;
        }
    }

    public boolean isAttributeSpecified(int i) {
        if (state != STATE_INIT) {
            return realReader.isAttributeSpecified(i);
        } else {
            return false;
        }
    }

    public boolean isCharacters() {
        if (state != STATE_INIT) {
            return realReader.isCharacters();
        } else {
            return false;
        }
    }

    public boolean isEndElement() {
        if (state != STATE_INIT) {
            return realReader.isEndElement();
        } else {
            return false;
        }
    }

    public boolean isStandalone() {
        if (state != STATE_INIT) {
            return realReader.isStandalone();
        } else {
            return false;
        }
    }

    public boolean isStartElement() {
        if (state != STATE_INIT) {
            return realReader.isStartElement();
        } else {
            return false;
        }
    }

    public boolean isWhiteSpace() {
        if (state != STATE_INIT) {
            return realReader.isWhiteSpace();
        } else {
            return false;
        }
    }
}
