OpenConcerto

Dépôt officiel du code source de l'ERP OpenConcerto
sonarqube

svn://code.openconcerto.org/openconcerto

Rev

Blame | Last modification | View Log | RSS feed

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 * 
 * Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
 * 
 * The contents of this file are subject to the terms of the GNU General Public License Version 3
 * only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
 * copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
 * language governing permissions and limitations under the License.
 * 
 * When distributing the software, include this License Header Notice in each file.
 */
 
 package org.openconcerto.xml;

import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

/**
 * To decode using {@link XMLStreamReader}.
 * 
 * @author Sylvain CUAZ
 */
public final class XMLDecoderStAX extends AbstractXMLDecoder<XMLStreamReader, XMLStreamException> {

    @Override
    protected String getAttributeValue(XMLStreamReader elem, String attrName) {
        return elem.getAttributeValue(null, attrName);
    }

    @Override
    protected String getLocalName(XMLStreamReader elem) {
        return elem.getLocalName();
    }

    @Override
    protected String getElementText(XMLStreamReader elem) throws XMLStreamException {
        return elem.getElementText();
    }

    @Override
    protected XMLStreamReader getFirstChild(XMLStreamReader reader) {
        try {
            reader.nextTag();
        } catch (XMLStreamException e) {
            throw new IllegalStateException("Couldn't advance to first child", e);
        }
        return reader;
    }

    @Override
    protected void preEval(XMLStreamReader reader) throws XMLStreamException {
        assert reader.isStartElement();
    }

    @Override
    protected void nullDecoded(XMLStreamReader reader) throws XMLStreamException {
        reader.nextTag();
    }

    @Override
    protected void idRefDecoded(XMLStreamReader reader) throws XMLStreamException {
        reader.nextTag();
    }

    @Override
    protected void postEval(XMLStreamReader reader, final Object res) throws XMLStreamException {
        assert reader.isEndElement();
        reader.nextTag();
    }

    @Override
    protected String toString(XMLStreamReader elem) {
        return elem.getLocation().toString();
    }

    @Override
    protected Children<XMLStreamReader> createChildren(final XMLStreamReader reader) throws XMLStreamException {
        if (!reader.isStartElement())
            throw new IllegalStateException("Not at a start of an element : " + reader.getLocation());
        final String localName = reader.getLocalName();
        // move from START parent to either :
        // 1. END parent if no children, or
        // 2. START child
        reader.nextTag();
        return new Children<XMLStreamReader>() {
            @Override
            public XMLStreamReader getNextChild() {
                if (reader.isEndElement() && reader.getLocalName().equals(localName)) {
                    return null;
                }
                return reader;
            }
        };
    }

    protected XMLDecoderStAX() {
    }
}