#*
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you 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.
*#
#parse ( "common.vm" )
#
#set ( $package = "${packageToolV4}" )
#set ( $className = "${model.name}StaxReader" )
#
#set ( $root = $model.getClass( $model.getRoot($version), $version ) )
#set ( $rootXml = $Helper.xmlClassMetadata( $root ) )
#set ( $rootTag = $rootXml.tagName )
#set ( $rootUcapName = $Helper.capitalise( $root.name ) )
#set ( $rootLcapName = $Helper.uncapitalise( $root.name ) )
#
#set ( $needXmlContext = false )
#foreach ( $class in $model.allClasses )
  #set ( $allFields = $Helper.xmlFields( $class ) )
  #foreach ( $field in $allFields )
    #if ( $Helper.xmlFieldMetadata( $field ).format )
      #set ( $needXmlContext = true )
    #end
  #end
#end
#
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
// =================== DO NOT EDIT THIS FILE ====================
//  Generated by Modello Velocity from ${template}
//  template, any modifications will be overwritten.
// ==============================================================
package ${package};

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.text.DateFormat;
#if ( $needXmlContext )
import java.util.ArrayDeque;
#end
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
#if ( $needXmlContext )
import java.util.Deque;
#end
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import org.apache.maven.api.annotations.Generated;
#if ( $locationTracking )
import ${packageModelV4}.InputSource;
import ${packageModelV4}.InputLocation;
#end
#foreach ( $class in $model.allClasses )
import ${packageModelV4}.${class.name};
#end
import org.apache.maven.api.xml.XmlNode;
import org.apache.maven.api.xml.XmlService;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.stream.StreamSource;

import static javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI;
import static javax.xml.XMLConstants.XML_NS_URI;
import static javax.xml.XMLConstants.XMLNS_ATTRIBUTE;
import static java.util.Map.entry;

@Generated
public class ${className} {

    public static interface ContentTransformer {
        /**
         * Interpolate the value read from the xpp3 document
         * @param inputSrc The input source value
         * @param fieldName A description of the field being interpolated. The implementation may use this to
         *                           log stuff.
         * @return The interpolated value.
         */
        String transform(String inputSrc, String fieldName);
    }

    static class DefaultEntitiesHolder {
        static final Map<String, String> DEFAULT_ENTITIES;
        static {
            DEFAULT_ENTITIES = doGetDefaultEntities();
        }
    }

    static class InputFactoryHolder {
        static final XMLInputFactory XML_INPUT_FACTORY;
        static {
            XMLInputFactory factory = XMLInputFactory.newFactory();
            factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
            factory.setProperty(XMLInputFactory.SUPPORT_DTD, false);
            factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
            XML_INPUT_FACTORY = factory;
        }
    }

    private boolean addDefaultEntities = true;
#if ( $locationTracking )
    private boolean addLocationInformation = true;
#end

    private final ContentTransformer contentTransformer;

    public ${className}() {
        this((s, f) -> s);
    }

    public ${className}(ContentTransformer contentTransformer) {
        this.contentTransformer = contentTransformer;
    }

    /**
     * Returns the {@link XMLInputFactory} used by this reader.
     *
     * @return the {@link XMLInputFactory} used by this reader.
     */
    public XMLInputFactory getXMLInputFactory() {
        return InputFactoryHolder.XML_INPUT_FACTORY;
    }

    /**
     * Returns the state of the "add default entities" flag.
     *
     * @return boolean
     */
    public boolean getAddDefaultEntities() {
        return addDefaultEntities;
    } //-- boolean getAddDefaultEntities()

    /**
     * Sets the state of the "add default entities" flag.
     *
     * @param addDefaultEntities a addDefaultEntities object.
     */
    public void setAddDefaultEntities(boolean addDefaultEntities) {
        this.addDefaultEntities = addDefaultEntities;
    } //-- void setAddDefaultEntities(boolean)

#if ( $locationTracking )
    /**
     * Returns the state of the "add location information" flag.
     *
     * @return boolean
     */
    public boolean getAddLocationInformation() {
        return addLocationInformation;
    } //-- boolean getAddLocationInformation()

    /**
     * Sets the state of the "add location information" flag.
     *
     * @param addLocationInformation a addLocationInformation object.
     */
    public void setAddLocationInformation(boolean addLocationInformation) {
        this.addLocationInformation = addLocationInformation;
    } //-- void setAddLocationInformation(boolean)
#end

    public ${root.name} read(Reader reader) throws XMLStreamException {
#if ( $locationTracking )
        return read(reader, true, null);
#else
        return read(reader, true);
#end
    }

    /**
     * @param reader a reader object.
     * @param strict a strict object.
     * @throws XMLStreamException XMLStreamException if
     * any.
     * @return ${root.name}
     */
#if ( $locationTracking )
    public ${root.name} read(Reader reader, boolean strict, InputSource inputSrc) throws XMLStreamException {
#else
    public ${root.name} read(Reader reader, boolean strict) throws XMLStreamException {
#end
#if ( $locationTracking )
        StreamSource streamSource = new StreamSource(reader);
        streamSource.setPublicId(inputSrc != null ? inputSrc.getLocation() : null);
#else
        StreamSource streamSource = new StreamSource(reader);
#end
        XMLInputFactory factory = getXMLInputFactory();
        XMLStreamReader parser = factory.createXMLStreamReader(streamSource);
#if ( $locationTracking )
        return read(parser, strict, inputSrc);
#else
        return read(parser, strict);
#end
    } //-- ${root.name} read(Reader, boolean)

    public ${root.name} read(InputStream in) throws XMLStreamException {
#if ( $locationTracking )
        return read(in, true, null);
#else
        return read(in, true);
#end
    }

    /**
     * Method read.
     *
     * @param in a in object.
     * @param strict a strict object.
     * @throws XMLStreamException XMLStreamException if
     * any.
     * @return ${root.name}
     */
#if ( $locationTracking )
    public ${root.name} read(InputStream in, boolean strict, InputSource inputSrc) throws XMLStreamException {
#else
    public ${root.name} read(InputStream in, boolean strict) throws XMLStreamException {
#end
#if ( $locationTracking )
        StreamSource streamSource = new StreamSource(in);
        streamSource.setPublicId(inputSrc != null ? inputSrc.getLocation() : null);
#else
        StreamSource streamSource = new StreamSource(in);
#end
        XMLInputFactory factory = getXMLInputFactory();
        XMLStreamReader parser = factory.createXMLStreamReader(streamSource);
#if ( $locationTracking )
        return read(parser, strict, inputSrc);
#else
        return read(parser, strict);
#end
    } //-- ${root.name} read(InputStream, boolean)

    /**
     * Method read.
     *
     * @param parser a parser object.
     * @param strict a strict object.
     * @throws XMLStreamException XMLStreamException if
     * any.
     * @return ${root.name}
     */
#if ( $locationTracking )
    public ${root.name} read(XMLStreamReader parser, boolean strict, InputSource inputSrc) throws XMLStreamException {
#else
    public ${root.name} read(XMLStreamReader parser, boolean strict) throws XMLStreamException {
#end
#if ( $needXmlContext )
        Deque<Object> context = new ArrayDeque<>();
#end
        $rootUcapName $rootLcapName = null;
        int eventType = parser.getEventType();
        boolean parsed = false;
        while (eventType != XMLStreamReader.END_DOCUMENT) {
            if (eventType == XMLStreamReader.START_ELEMENT) {
                if (strict && ! "${rootTag}".equals(parser.getLocalName())) {
                    throw new XMLStreamException("Expected root element '${rootTag}' but found '" + parser.getName() + "'", parser.getLocation(), null);
                } else if (parsed) {
                    // fallback, already expected a XMLStreamException due to invalid XML
                    throw new XMLStreamException("Duplicated tag: '${rootTag}'", parser.getLocation(), null);
                }
#if ( $locationTracking )
                $rootLcapName = parse${rootUcapName}(parser, strict, parser.getNamespaceURI(), inputSrc);
#elseif ( $needXmlContext )
                $rootLcapName = parse${rootUcapName}(parser, strict, parser.getNamespaceURI(), context);
#else
                $rootLcapName = parse${rootUcapName}(parser, strict, parser.getNamespaceURI());
#end
                parsed = true;
            }
            eventType = parser.next();
        }
        if (parsed) {
            return $rootLcapName;
        }
            throw new XMLStreamException("Expected root element '${rootTag}' but found no element at all: invalid XML document", parser.getLocation(), null);
    } //-- ${root.name} read(XMLStreamReader, boolean)

#foreach ( $class in $model.allClasses )
 #if ( $class.name != "InputSource" && $class.name != "InputLocation" )
  #set ( $classUcapName = $Helper.capitalise( $class.name ) )
  #set ( $classLcapName = $Helper.uncapitalise( $class.name ) )
  #set ( $ancestors = $Helper.ancestors( $class ) )
  #set ( $allFields = $Helper.xmlFields( $class ) )
  #if ( $locationTracking )
    private ${classUcapName} parse${classUcapName}(XMLStreamReader parser, boolean strict, String namespace, InputSource inputSrc) throws XMLStreamException {
  #elseif ( $needXmlContext )
    private ${classUcapName} parse${classUcapName}(XMLStreamReader parser, boolean strict, String namespace, Deque<Object> context) throws XMLStreamException {
  #else
    private ${classUcapName} parse${classUcapName}(XMLStreamReader parser, boolean strict, String namespace) throws XMLStreamException {
  #end
        String tagName = parser.getLocalName();
        ${classUcapName}.Builder ${classLcapName} = ${classUcapName}.newBuilder(true);
  #if ( $locationTracking )
        if (addLocationInformation) {
            ${classLcapName}.location("", InputLocation.of(parser.getLocation().getLineNumber(), parser.getLocation().getColumnNumber(), inputSrc));
        }
  #end
  #if ( $class == $root )
        ${classLcapName}.namespaceUri(namespace);
        ${classLcapName}.modelEncoding(parser.getEncoding());
  #end
        for (int i = parser.getAttributeCount() - 1; i >= 0; i--) {
            String name = parser.getAttributeLocalName(i);
            String ns = parser.getAttributeNamespace(i);
            String value = parser.getAttributeValue(i);
            if (W3C_XML_SCHEMA_INSTANCE_NS_URI.equals(ns) || XML_NS_URI.equals(ns)) {
                // just ignore attributes with non-default namespace (for example: xsi and xml)
  #if ( $class == $root )
            } else if (XMLNS_ATTRIBUTE.equals(name)) {
                // ignore xmlns attribute in root class, which is a reserved attribute name
  #end
  #foreach ( $field in $allFields )
    #if ( $Helper.xmlFieldMetadata( $field ).attribute )
      #set ( $fieldTagName = $Helper.xmlFieldMetadata( $field ).tagName )
      #if ( ! $fieldTagName )
        #set ( $fieldTagName = $field.name )
      #end
      #set ( $fieldCapName = $Helper.capitalise( $field.name ) )
            } else if ("$fieldTagName".equals(name)) {
      #if ( $locationTracking )
                if (addLocationInformation) {
                    ${classLcapName}.location(name, InputLocation.of(parser.getLocation().getLineNumber(), parser.getLocation().getColumnNumber(), inputSrc));
                }
      #end
      #if ( $field.type == "String" )
                ${classLcapName}.${field.name}(interpolatedTrimmed(value, "$fieldTagName"));
      #elseif ( $field.type == "boolean" || $field.type == "Boolean" )
                ${classLcapName}.${field.name}(getBooleanValue(interpolatedTrimmed(value, "$fieldTagName"), "$fieldTagName", parser, ${field.defaultValue}));
      #elseif ( $field.type == "int" || $field.type == "Integer" )
                ${classLcapName}.${field.name}(getIntegerValue(interpolatedTrimmed(value, "$fieldTagName"), "$fieldTagName", parser, strict, ${field.defaultValue}));
      #else
                // TODO: type=${field.type} to=${field.to} multiplicity=${field.multiplicity}
      #end
    #end
  #end
            } else {
                checkUnknownAttribute(parser, name, tagName, strict);
            }
        }
        Set<String> parsed = new HashSet<>();
  #foreach ( $field in $allFields )
    #if ( $Helper.isFlatItems( $field ) )
        List<$field.to> ${field.name} = new ArrayList<>();
    #end
  #end
  #if ( $needXmlContext )
        context.addLast( ${classLcapName} );
  #end
        while ((strict ? parser.nextTag() : nextTag(parser)) == XMLStreamReader.START_ELEMENT) {
            checkNamespace(parser, strict, namespace);
            String childName = checkDuplicate(parser.getLocalName(), parser, parsed);
  #if ( $locationTracking )
            int line = addLocationInformation ? parser.getLocation().getLineNumber() : -1;
            int column = addLocationInformation ? parser.getLocation().getColumnNumber() : -1;
            Map<Object, InputLocation> locations = null;
  #end
            switch (childName) {
  #set( $ift = "if" )
  #foreach ( $field in $allFields )
    #if ( ! $Helper.xmlFieldMetadata( $field ).attribute && ! $Helper.xmlFieldMetadata( $field ).transient && ! $Helper.xmlFieldMetadata( $field ).format )
      #set ( $fieldTagName = $Helper.xmlFieldMetadata( $field ).tagName )
      #if ( ! $fieldTagName )
        #set ( $fieldTagName = $field.name )
      #end
      #if ( $Helper.isFlatItems( $field ) )
        #set ( $fieldTagName = $Helper.singular( $fieldTagName ) )
      #end
      #set ( $fieldCapName = $Helper.capitalise($field.name))
                case "${fieldTagName}": {
      #if ( $field.type == "String" )
                    ${classLcapName}.${field.name}(interpolatedTrimmed(nextText(parser, strict), "${fieldTagName}"));
                    break;
      #elseif ( $field.type == "boolean" || $field.type == "Boolean" )
                    ${classLcapName}.${field.name}(getBooleanValue(interpolatedTrimmed(nextText(parser, strict), "${fieldTagName}"), "${fieldTagName}", parser, ${field.defaultValue}));
                    break;
      #elseif ( $field.type == "int" )
                    ${classLcapName}.${field.name}(getIntegerValue(interpolatedTrimmed(nextText(parser, strict), "${fieldTagName}"), "${fieldTagName}", parser, strict, ${field.defaultValue}));
                    break;
      #elseif ( $field.type == "DOM" )
        #if ( $locationTracking )
                    ${classLcapName}.${field.name}(buildXmlNode(parser, inputSrc));
        #else
                    ${classLcapName}.${field.name}(buildXmlNode(parser));
        #end
                    break;
      #elseif ( $field.type == "java.util.List" && $field.to == "String" && $field.multiplicity == "*" )
                    List<String> ${field.name} = new ArrayList<>();
        #if ( $locationTracking )
                    locations = new HashMap<>();
        #end
                    while (parser.nextTag() == XMLStreamReader.START_ELEMENT) {
                        if ("${Helper.singular($fieldTagName)}".equals(parser.getLocalName())) {
        #if ( $locationTracking )
                            if (addLocationInformation) {
                                locations.put(Integer.valueOf(locations.size()), InputLocation.of(parser.getLocation().getLineNumber(), parser.getLocation().getColumnNumber(), inputSrc));
                            }
        #end
                            ${field.name}.add(interpolatedTrimmed(nextText(parser, strict), "${fieldTagName}"));
                        } else {
                            checkUnknownElement(parser, strict);
                        }
                    }
                    ${classLcapName}.${field.name}(${field.name});
                    break;
      #elseif ( $field.type == "java.util.Properties" && $field.to == "String" && $field.multiplicity == "*" )
                    Map<String, String> ${field.name} = new LinkedHashMap<>();
        #if ( $locationTracking )
                    locations = new HashMap<>();
        #end
                    while (parser.nextTag() == XMLStreamReader.START_ELEMENT) {
                        String key = parser.getLocalName();
        #if ( $locationTracking )
                        int propLine = parser.getLocation().getLineNumber();
                        int propColumn = parser.getLocation().getColumnNumber();
        #end
                        String value = nextText(parser, strict).trim();
        #if ( $locationTracking )
                        if (addLocationInformation) {
                            locations.put(key, InputLocation.of(propLine, propColumn, inputSrc));
                        }
        #end
                        ${field.name}.put(key, value);
                    }
                    ${classLcapName}.${field.name}(${field.name});
                    break;
      #elseif ( $field.to && $field.multiplicity == "1" )
        #if ( $locationTracking )
                    ${classLcapName}.${field.name}(parse${field.toClass.name}(parser, strict, namespace, inputSrc));
        #elseif ( $needXmlContext )
                    ${classLcapName}.${field.name}(parse${field.toClass.name}(parser, strict, namespace, context));
        #else
                    ${classLcapName}.${field.name}(parse${field.toClass.name}(parser, strict, namespace));
        #end
                    break;
      #elseif ( $field.to && $field.multiplicity == "*" && $Helper.isFlatItems( $field ) )
        #if ( $locationTracking )
                    ${field.name}.add(parse${field.toClass.name}(parser, strict, namespace, inputSrc));
        #elseif ( $needXmlContext )
                    ${field.name}.add(parse${field.toClass.name}(parser, strict, namespace, context));
        #else
                    ${field.name}.add(parse${field.toClass.name}(parser, strict, namespace));
        #end
                    break;
      #elseif ( $field.to && $field.multiplicity == "*" )
                    List<$field.to> ${field.name} = new ArrayList<>();
                    while (parser.nextTag() == XMLStreamReader.START_ELEMENT) {
                        if ("${Helper.singular($fieldTagName)}".equals(parser.getLocalName())) {
        #if ( $locationTracking )
                            ${field.name}.add(parse${field.toClass.name}(parser, strict, namespace, inputSrc));
        #elseif ( $needXmlContext )
                            ${field.name}.add(parse${field.toClass.name}(parser, strict, namespace, context));
        #else
                            ${field.name}.add(parse${field.toClass.name}(parser, strict, namespace));
        #end
                        } else {
                            checkUnknownElement(parser, strict);
                        }
                    }
                    ${classLcapName}.${field.name}(${field.name});
                    break;
      #else
                    // TODO: type=${field.type} to=${field.to} multiplicity=${field.multiplicity}
                    break;
      #end
                }
      #set( $ift = "else if" )
    #end
  #end
                default: {
                    checkUnknownElement(parser, strict);
                    break;
                }
            }
  #if ( $locationTracking )
            if (addLocationInformation) {
                ${classLcapName}.location(childName, InputLocation.of(line, column, inputSrc, locations));
            }
  #end
        }
  #if ( $needXmlContext )
        context.removeLast();
  #end
  #foreach ( $field in $allFields )
    #if ( $Helper.isFlatItems( $field ) )
        ${classLcapName}.${field.name}(${field.name});
    #end
  #end
  #foreach ( $field in $allFields )
    #if ( $Helper.xmlFieldMetadata( $field ).format )
        ${classLcapName}.${field.name}($Helper.xmlFieldMetadata( $field ).format);
    #end
  #end
        return ${classLcapName}.build();
    }

 #end
#end

    private void checkNamespace(XMLStreamReader parser, boolean strict, String namespace) throws XMLStreamException {
        if (strict) {
            String ns = parser.getNamespaceURI();
            if (!Objects.equals(namespace, ns)) {
                throw new XMLStreamException(
                    String.format("Unexpected namespace for element '%s': found '%s' but expected '%s'",
                        parser.getLocalName(),
                        ns != null ? ns : "no namespace",
                        namespace),
                    parser.getLocation(),
                    null
                );
            }
        }
    }

    private String checkDuplicate(String tagName, XMLStreamReader parser, Set<String> parsed) throws XMLStreamException {
#set( $aliases = { } )
#set( $flats = { } )
#foreach( $class in $model.allClasses )
  #foreach ( $field in $class.getFields($version) )
    #set ( $fieldTagName = $Helper.xmlFieldMetadata( $field ).tagName )
    #if ( ! $fieldTagName )
      #set ( $fieldTagName = $field.name )
    #end
    #if ( $field.alias )
      #set ( $dummy = $aliases.put( $field.alias, $fieldTagName ) )
    #end
    #if ( $Helper.isFlatItems( $field ) )
      #set ( $fieldTagName = $Helper.singular($fieldTagName) )
      #set ( $dummy = $flats.put( $fieldTagName, "" ) )
    #end
  #end
#end
#if ( ! ${aliases.isEmpty()} )
        switch (tagName) {
  #foreach( $entry in $aliases.entrySet() )
        case "${entry.key}":
            tagName = "${entry.value}";
            break;
  #end
        }
#end
#if ( ! ${flats.isEmpty()} )
        switch (tagName) {
  #foreach( $entry in $flats.entrySet() )
        case "${entry.key}":
  #end
            break;
        default:
            if (!parsed.add(tagName)) {
                throw new XMLStreamException("Duplicated tag: '" + tagName + "'", parser.getLocation(), null);
            }
        }
#else
        if (!parsed.add(tagName)) {
            throw new XMLStreamException("Duplicated tag: '" + tagName + "'", parser.getLocation(), null);
        }
#end
        return tagName;
    }

    /**
     * Method checkUnknownAttribute.
     *
     * @param parser a parser object.
     * @param strict a strict object.
     * @param tagName a tagName object.
     * @param attribute a attribute object.
     * @throws XMLStreamException XMLStreamException if
     * any.
     * @throws IOException IOException if any.
     */
    private void checkUnknownAttribute(XMLStreamReader parser, String attribute, String tagName, boolean strict) throws XMLStreamException {
        // strictXmlAttributes = true for model: if strict == true, not only elements are checked but attributes too
        if (strict) {
            throw new XMLStreamException("Unknown attribute '" + attribute + "' for tag '" + tagName + "'", parser.getLocation(), null);
        }
    } //-- void checkUnknownAttribute(XMLStreamReader, String, String, boolean)

    /**
     * Method checkUnknownElement.
     *
     * @param parser a parser object.
     * @param strict a strict object.
     * @throws XMLStreamException XMLStreamException if
     * any.
     * @throws IOException IOException if any.
     */
    private void checkUnknownElement(XMLStreamReader parser, boolean strict) throws XMLStreamException {
        if (strict) {
            throw new XMLStreamException("Unrecognised tag: '" + parser.getName() + "'", parser.getLocation(), null);
        }

        for (int unrecognizedTagCount = 1; unrecognizedTagCount > 0;) {
            int eventType = nextTag(parser);
            if (eventType == XMLStreamReader.START_ELEMENT) {
                unrecognizedTagCount++;
            } else if (eventType == XMLStreamReader.END_ELEMENT) {
                unrecognizedTagCount--;
            }
        }
    } //-- void checkUnknownElement(XMLStreamReader, boolean)

    /**
     * Method getTrimmedValue.
     *
     * @param s a s object.
     * @return String
     */
    private String getTrimmedValue(String s) {
        if (s != null) {
            s = s.trim();
        }
        return s;
    } //-- String getTrimmedValue(String)

    /**
     * Method interpolatedTrimmed.
     *
     * @param value a value object.
     * @param context a context object.
     * @return String
     */
    private String interpolatedTrimmed(String value, String context) {
        return getTrimmedValue(contentTransformer.transform(value, context));
    } //-- String interpolatedTrimmed(String, String)

    /**
     * Method nextTag.
     *
     * @param parser a parser object.
     * @throws IOException IOException if any.
     * @throws XMLStreamException XMLStreamException if
     * any.
     * @return int
     */
    private int nextTag(XMLStreamReader parser) throws XMLStreamException {
        while (true) {
            int next = parser.next();
            switch (next) {
                case XMLStreamReader.SPACE:
                case XMLStreamReader.COMMENT:
                case XMLStreamReader.PROCESSING_INSTRUCTION:
                case XMLStreamReader.CDATA:
                case XMLStreamReader.CHARACTERS:
                    continue;
                case XMLStreamReader.START_ELEMENT:
                case XMLStreamReader.END_ELEMENT:
                    return next;
            }
        }
    } //-- int nextTag(XMLStreamReader)

    private String nextText(XMLStreamReader parser, boolean strict) throws XMLStreamException {
        int eventType = parser.getEventType();
        if (eventType != XMLStreamReader.START_ELEMENT) {
            throw new XMLStreamException("parser must be on START_ELEMENT to read next text", parser.getLocation(), null);
        }
        eventType = parser.next();
        StringBuilder result = new StringBuilder();
        while (true) {
            if (eventType == XMLStreamReader.CHARACTERS || eventType == XMLStreamReader.CDATA) {
                result.append(parser.getText());
            } else if (eventType == XMLStreamReader.ENTITY_REFERENCE) {
                String val = null;
                if (strict) {
                    throw new XMLStreamException("Entities are not supported in strict mode", parser.getLocation(), null);
                } else if (addDefaultEntities) {
                    val = DefaultEntitiesHolder.DEFAULT_ENTITIES.get(parser.getLocalName());
                }
                if (val != null) {
                    result.append(val);
                } else {
                    result.append("&").append(parser.getLocalName()).append(";");
                }
            } else if (eventType != XMLStreamReader.COMMENT) {
                break;
            }
            eventType = parser.next();
        }
        if (eventType != XMLStreamReader.END_ELEMENT) {
            throw new XMLStreamException(
                "TEXT must be immediately followed by END_ELEMENT and not " + eventType /*TODO: TYPES[eventType]*/, parser.getLocation(), null);
        }
        return result.toString();
    }

#if ( $locationTracking )
    private XmlNode buildXmlNode(XMLStreamReader parser, InputSource inputSrc) throws XMLStreamException {
        return XmlService.read(parser,
                addLocationInformation
                        ? p -> InputLocation.of(p.getLocation().getLineNumber(), p.getLocation().getColumnNumber(), inputSrc)
                        : null);
    }
#else
    private XmlNode buildXmlNode(XMLStreamReader parser) throws XMLStreamException {
        return XmlService.read(parser);
    }
#end

#foreach ( $class in $model.allClasses )
  #foreach ( $field in $class.getFields($version) )
    #if ( $field.type == "boolean" || $field.type == "Boolean" )
      #set ( $hasBooleanField = true )
    #elseif ( $field.type == "int" || $field.type == "Integer" )
      #set ( $hasIntegerField = true )
    #end
  #end
#end
#if ( $hasBooleanField )
    /**
     * Method getBooleanValue.
     *
     * @param s a s object.
     * @param defaultValue a defaultValue object.
     * @param parser a parser object.
     * @param attribute a attribute object.
     * @throws XMLStreamException XMLStreamException if
     * any.
     * @return boolean
     */
    private boolean getBooleanValue(String s, String attribute, XMLStreamReader parser, boolean defaultValue) throws XMLStreamException {
        if (s != null && s.length() != 0) {
            return Boolean.valueOf(s).booleanValue();
        }
        return defaultValue;
    } //-- boolean getBooleanValue(String, String, XMLStreamReader, String)

#end
#if ( $hasIntegerField )
    /**
     * Method getIntegerValue.
     *
     * @param s a s object.
     * @param strict a strict object.
     * @param parser a parser object.
     * @param attribute a attribute object.
     * @throws XMLStreamException XMLStreamException if
     * any.
     * @return int
     */
    private int getIntegerValue(String s, String attribute, XMLStreamReader parser, boolean strict, int defaultValue) throws XMLStreamException {
        if (s != null) {
            try {
                return Integer.valueOf(s).intValue();
            } catch (NumberFormatException nfe) {
                if (strict) {
                    throw new XMLStreamException("Unable to parse element '" + attribute + "', must be an integer", parser.getLocation(), nfe);
                }
            }
        }
        return defaultValue;
    } //-- int getIntegerValue(String, String, XMLStreamReader, boolean)

#end
    private static Map<String, String> doGetDefaultEntities() {
        return Map.ofEntries(
            entry("nbsp",   "\u00a0"), entry("iexcl",  "\u00a1"), entry("cent",   "\u00a2"), entry("pound",  "\u00a3"),
            entry("curren", "\u00a4"), entry("yen",    "\u00a5"), entry("brvbar", "\u00a6"), entry("sect",   "\u00a7"),
            entry("uml",    "\u00a8"), entry("copy",   "\u00a9"), entry("ordf",   "\u00aa"), entry("laquo",  "\u00ab"),
            entry("not",    "\u00ac"), entry("shy",    "\u00ad"), entry("reg",    "\u00ae"), entry("macr",   "\u00af"),
            entry("deg",    "\u00b0"), entry("plusmn", "\u00b1"), entry("sup2",   "\u00b2"), entry("sup3",   "\u00b3"),
            entry("acute",  "\u00b4"), entry("micro",  "\u00b5"), entry("para",   "\u00b6"), entry("middot", "\u00b7"),
            entry("cedil",  "\u00b8"), entry("sup1",   "\u00b9"), entry("ordm",   "\u00ba"), entry("raquo",  "\u00bb"),
            entry("frac14", "\u00bc"), entry("frac12", "\u00bd"), entry("frac34", "\u00be"), entry("iquest", "\u00bf"),
            entry("Agrave", "\u00c0"), entry("Aacute", "\u00c1"), entry("Acirc",  "\u00c2"), entry("Atilde", "\u00c3"),
            entry("Auml",   "\u00c4"), entry("Aring",  "\u00c5"), entry("AElig",  "\u00c6"), entry("Ccedil", "\u00c7"),
            entry("Egrave", "\u00c8"), entry("Eacute", "\u00c9"), entry("Ecirc",  "\u00ca"), entry("Euml",   "\u00cb"),
            entry("Igrave", "\u00cc"), entry("Iacute", "\u00cd"), entry("Icirc",  "\u00ce"), entry("Iuml",   "\u00cf"),
            entry("ETH",    "\u00d0"), entry("Ntilde", "\u00d1"), entry("Ograve", "\u00d2"), entry("Oacute", "\u00d3"),
            entry("Ocirc",  "\u00d4"), entry("Otilde", "\u00d5"), entry("Ouml",   "\u00d6"), entry("times",  "\u00d7"),
            entry("Oslash", "\u00d8"), entry("Ugrave", "\u00d9"), entry("Uacute", "\u00da"), entry("Ucirc",  "\u00db"),
            entry("Uuml",   "\u00dc"), entry("Yacute", "\u00dd"), entry("THORN",  "\u00de"), entry("szlig",  "\u00df"),
            entry("agrave", "\u00e0"), entry("aacute", "\u00e1"), entry("acirc",  "\u00e2"), entry("atilde", "\u00e3"),
            entry("auml",   "\u00e4"), entry("aring",  "\u00e5"), entry("aelig",  "\u00e6"), entry("ccedil", "\u00e7"),
            entry("egrave", "\u00e8"), entry("eacute", "\u00e9"), entry("ecirc",  "\u00ea"), entry("euml",   "\u00eb"),
            entry("igrave", "\u00ec"), entry("iacute", "\u00ed"), entry("icirc",  "\u00ee"), entry("iuml",   "\u00ef"),
            entry("eth",    "\u00f0"), entry("ntilde", "\u00f1"), entry("ograve", "\u00f2"), entry("oacute", "\u00f3"),
            entry("ocirc",  "\u00f4"), entry("otilde", "\u00f5"), entry("ouml",   "\u00f6"), entry("divide", "\u00f7"),
            entry("oslash", "\u00f8"), entry("ugrave", "\u00f9"), entry("uacute", "\u00fa"), entry("ucirc",  "\u00fb"),
            entry("uuml",   "\u00fc"), entry("yacute", "\u00fd"), entry("thorn",  "\u00fe"), entry("yuml",   "\u00ff"),
            // Special entities
            entry("OElig",  "\u0152"), entry("oelig",  "\u0153"), entry("Scaron", "\u0160"), entry("scaron", "\u0161"),
            entry("Yuml",   "\u0178"), entry("circ",   "\u02c6"), entry("tilde",  "\u02dc"), entry("ensp",   "\u2002"),
            entry("emsp",   "\u2003"), entry("thinsp", "\u2009"), entry("zwnj",   "\u200c"), entry("zwj",    "\u200d"),
            entry("lrm",    "\u200e"), entry("rlm",    "\u200f"), entry("ndash",  "\u2013"), entry("mdash",  "\u2014"),
            entry("lsquo",  "\u2018"), entry("rsquo",  "\u2019"), entry("sbquo",  "\u201a"), entry("ldquo",  "\u201c"),
            entry("rdquo",  "\u201d"), entry("bdquo",  "\u201e"), entry("dagger", "\u2020"), entry("Dagger", "\u2021"),
            entry("permil", "\u2030"), entry("lsaquo", "\u2039"), entry("rsaquo", "\u203a"), entry("euro",   "\u20ac"),
            // Symbol entities
            entry("fnof",   "\u0192"), entry("Alpha",  "\u0391"), entry("Beta",   "\u0392"), entry("Gamma",  "\u0393"),
            entry("Delta",  "\u0394"), entry("Epsilon","\u0395"), entry("Zeta",   "\u0396"), entry("Eta",    "\u0397"),
            entry("Theta",  "\u0398"), entry("Iota",   "\u0399"), entry("Kappa",  "\u039a"), entry("Lambda", "\u039b"),
            entry("Mu",     "\u039c"), entry("Nu",     "\u039d"), entry("Xi",     "\u039e"), entry("Omicron","\u039f"),
            entry("Pi",     "\u03a0"), entry("Rho",    "\u03a1"), entry("Sigma",  "\u03a3"), entry("Tau",    "\u03a4"),
            entry("Upsilon","\u03a5"), entry("Phi",    "\u03a6"), entry("Chi",    "\u03a7"), entry("Psi",    "\u03a8"),
            entry("Omega",  "\u03a9"), entry("alpha",  "\u03b1"), entry("beta",   "\u03b2"), entry("gamma",  "\u03b3"),
            entry("delta",  "\u03b4"), entry("epsilon","\u03b5"), entry("zeta",   "\u03b6"), entry("eta",    "\u03b7"),
            entry("theta",  "\u03b8"), entry("iota",   "\u03b9"), entry("kappa",  "\u03ba"), entry("lambda", "\u03bb"),
            entry("mu",     "\u03bc"), entry("nu",     "\u03bd"), entry("xi",     "\u03be"), entry("omicron","\u03bf"),
            entry("pi",     "\u03c0"), entry("rho",    "\u03c1"), entry("sigmaf", "\u03c2"), entry("sigma",  "\u03c3"),
            entry("tau",    "\u03c4"), entry("upsilon","\u03c5"), entry("phi",    "\u03c6"), entry("chi",    "\u03c7"),
            entry("psi",    "\u03c8"), entry("omega",  "\u03c9"), entry("thetasym","\u03d1"),entry("upsih",  "\u03d2"),
            entry("piv",    "\u03d6"), entry("bull",   "\u2022"), entry("hellip", "\u2026"), entry("prime",  "\u2032"),
            entry("Prime",  "\u2033"), entry("oline",  "\u203e"), entry("frasl",  "\u2044"), entry("weierp", "\u2118"),
            entry("image",  "\u2111"), entry("real",   "\u211c"), entry("trade",  "\u2122"), entry("alefsym","\u2135"),
            entry("larr",   "\u2190"), entry("uarr",   "\u2191"), entry("rarr",   "\u2192"), entry("darr",   "\u2193"),
            entry("harr",   "\u2194"), entry("crarr",  "\u21b5"), entry("lArr",   "\u21d0"), entry("uArr",   "\u21d1"),
            entry("rArr",   "\u21d2"), entry("dArr",   "\u21d3"), entry("hArr",   "\u21d4"), entry("forall", "\u2200"),
            entry("part",   "\u2202"), entry("exist",  "\u2203"), entry("empty",  "\u2205"), entry("nabla",  "\u2207"),
            entry("isin",   "\u2208"), entry("notin",  "\u2209"), entry("ni",     "\u220b"), entry("prod",   "\u220f"),
            entry("sum",    "\u2211"), entry("minus",  "\u2212"), entry("lowast", "\u2217"), entry("radic",  "\u221a"),
            entry("prop",   "\u221d"), entry("infin",  "\u221e"), entry("ang",    "\u2220"), entry("and",    "\u2227"),
            entry("or",     "\u2228"), entry("cap",    "\u2229"), entry("cup",    "\u222a"), entry("int",    "\u222b"),
            entry("there4", "\u2234"), entry("sim",    "\u223c"), entry("cong",   "\u2245"), entry("asymp",  "\u2248"),
            entry("ne",     "\u2260"), entry("equiv",  "\u2261"), entry("le",     "\u2264"), entry("ge",     "\u2265"),
            entry("sub",    "\u2282"), entry("sup",    "\u2283"), entry("nsub",   "\u2284"), entry("sube",   "\u2286"),
            entry("supe",   "\u2287"), entry("oplus",  "\u2295"), entry("otimes", "\u2297"), entry("perp",   "\u22a5"),
            entry("sdot",   "\u22c5"), entry("lceil",  "\u2308"), entry("rceil",  "\u2309"), entry("lfloor", "\u230a"),
            entry("rfloor", "\u230b"), entry("lang",   "\u2329"), entry("rang",   "\u232a"), entry("loz",    "\u25ca"),
            entry("spades", "\u2660"), entry("clubs",  "\u2663"), entry("hearts", "\u2665"), entry("diams",  "\u2666")
        );
    }
}
