Xpp3XmlPullParser.java

  1. /**
  2.  *
  3.  * Copyright 2019 Florian Schmaus
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *     http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package org.jivesoftware.smack.xml.xpp3;

  18. import java.io.IOException;

  19. import javax.xml.XMLConstants;
  20. import javax.xml.namespace.QName;

  21. import org.jivesoftware.smack.xml.XmlPullParser;
  22. import org.jivesoftware.smack.xml.XmlPullParserException;

  23. public final class Xpp3XmlPullParser implements XmlPullParser {

  24.     private final org.xmlpull.v1.XmlPullParser xpp3XmlPullParser;

  25.     public Xpp3XmlPullParser(org.xmlpull.v1.XmlPullParser xpp3XmlPullParser) {
  26.         this.xpp3XmlPullParser = xpp3XmlPullParser;
  27.     }

  28.     @Override
  29.     public Object getProperty(String name) {
  30.         return xpp3XmlPullParser.getProperty(name);
  31.     }

  32.     @Override
  33.     public String getInputEncoding() {
  34.         return xpp3XmlPullParser.getInputEncoding();
  35.     }

  36.     @Override
  37.     public int getNamespaceCount() throws XmlPullParserException {
  38.         int depth = xpp3XmlPullParser.getDepth();
  39.         try {
  40.             return xpp3XmlPullParser.getNamespaceCount(depth);
  41.         } catch (org.xmlpull.v1.XmlPullParserException e) {
  42.             throw new XmlPullParserException(e);
  43.         }
  44.     }

  45.     @Override
  46.     public String getNamespacePrefix(int pos) throws XmlPullParserException {
  47.         try {
  48.             return xpp3XmlPullParser.getNamespacePrefix(pos);
  49.         } catch (org.xmlpull.v1.XmlPullParserException e) {
  50.             throw new XmlPullParserException(e);
  51.         }
  52.     }

  53.     @Override
  54.     public String getNamespaceUri(int pos) throws XmlPullParserException {
  55.         try {
  56.             return xpp3XmlPullParser.getNamespaceUri(pos);
  57.         } catch (org.xmlpull.v1.XmlPullParserException e) {
  58.             throw new XmlPullParserException(e);
  59.         }
  60.     }

  61.     @Override
  62.     public String getNamespace(String prefix) {
  63.         return xpp3XmlPullParser.getNamespace(prefix);
  64.     }

  65.     @Override
  66.     public int getDepth() {
  67.         return xpp3XmlPullParser.getDepth();
  68.     }

  69.     @Override
  70.     public String getPositionDescription() {
  71.         return xpp3XmlPullParser.getPositionDescription();
  72.     }

  73.     @Override
  74.     public int getLineNumber() {
  75.         return xpp3XmlPullParser.getLineNumber();
  76.     }

  77.     @Override
  78.     public int getColumnNumber() {
  79.         return xpp3XmlPullParser.getColumnNumber();
  80.     }

  81.     @Override
  82.     public boolean isWhiteSpace() throws XmlPullParserException {
  83.         try {
  84.             return xpp3XmlPullParser.isWhitespace();
  85.         } catch (org.xmlpull.v1.XmlPullParserException e) {
  86.             throw new XmlPullParserException(e);
  87.         }
  88.     }

  89.     @Override
  90.     public String getText() {
  91.         return xpp3XmlPullParser.getText();
  92.     }

  93.     @Override
  94.     public String getNamespace() {
  95.         return xpp3XmlPullParser.getNamespace();
  96.     }

  97.     @Override
  98.     public String getName() {
  99.         return xpp3XmlPullParser.getName();
  100.     }

  101.     @Override
  102.     public QName getQName() {
  103.         String localpart = xpp3XmlPullParser.getName();
  104.         String prefix = xpp3XmlPullParser.getPrefix();
  105.         prefix = nullValueToDefaultPrefix(prefix);
  106.         String namespace = xpp3XmlPullParser.getNamespace();

  107.         return new QName(namespace, localpart, prefix);
  108.     }

  109.     @Override
  110.     public String getPrefix() {
  111.         return xpp3XmlPullParser.getPrefix();
  112.     }

  113.     @Override
  114.     public int getAttributeCount() {
  115.         return xpp3XmlPullParser.getAttributeCount();
  116.     }

  117.     @Override
  118.     public String getAttributeNamespace(int index) {
  119.         String namespace;
  120.         try {
  121.             namespace = xpp3XmlPullParser.getAttributeNamespace(index);
  122.         }
  123.         catch (IndexOutOfBoundsException e) {
  124.             return null;
  125.         }

  126.         if (XMLConstants.NULL_NS_URI.equals(namespace)) {
  127.             namespace = null;
  128.         }
  129.         return namespace;
  130.     }

  131.     @Override
  132.     public String getAttributeName(int index) {
  133.         try {
  134.             return xpp3XmlPullParser.getAttributeName(index);
  135.         }
  136.         catch (IndexOutOfBoundsException e) {
  137.             return null;
  138.         }
  139.     }

  140.     @Override
  141.     public QName getAttributeQName(int index) {
  142.         String localpart = getAttributeName(index);
  143.         if (localpart == null) {
  144.             return null;
  145.         }
  146.         String prefix = getAttributePrefix(index);
  147.         prefix = nullValueToDefaultPrefix(prefix);
  148.         String namespace = getAttributeNamespace(index);
  149.         return new QName(namespace, localpart, prefix);
  150.     }

  151.     @Override
  152.     public String getAttributePrefix(int index) {
  153.         String prefix;
  154.         try {
  155.             prefix = xpp3XmlPullParser.getAttributePrefix(index);
  156.         }
  157.         catch (IndexOutOfBoundsException e) {
  158.             return null;
  159.         }
  160.         prefix = nullValueToDefaultPrefix(prefix);
  161.         return prefix;
  162.     }

  163.     @Override
  164.     public String getAttributeType(int index) {
  165.         try {
  166.             return xpp3XmlPullParser.getAttributeType(index);
  167.         }
  168.         catch (IndexOutOfBoundsException e) {
  169.             return null;
  170.         }
  171.     }

  172.     @Override
  173.     public String getAttributeValue(int index) {
  174.         return xpp3XmlPullParser.getAttributeValue(index);
  175.     }

  176.     @Override
  177.     public String getAttributeValue(String namespace, String name) {
  178.         return xpp3XmlPullParser.getAttributeValue(namespace, name);
  179.     }

  180.     @Override
  181.     public Event getEventType() throws XmlPullParserException {
  182.         int xpp3EventInt;
  183.         try {
  184.             xpp3EventInt = xpp3XmlPullParser.getEventType();
  185.         } catch (org.xmlpull.v1.XmlPullParserException e) {
  186.             throw new XmlPullParserException(e);
  187.         }
  188.         return xpp3EventIntegerToEvent(xpp3EventInt);
  189.     }

  190.     @Override
  191.     public Event next() throws IOException, XmlPullParserException {
  192.         int xpp3EventInt;
  193.         try {
  194.             xpp3EventInt = xpp3XmlPullParser.next();
  195.         } catch (org.xmlpull.v1.XmlPullParserException e) {
  196.             throw new XmlPullParserException(e);
  197.         }
  198.         return xpp3EventIntegerToEvent(xpp3EventInt);
  199.     }

  200.     @Override
  201.     public String nextText() throws IOException, XmlPullParserException {
  202.         try {
  203.             return xpp3XmlPullParser.nextText();
  204.         } catch (org.xmlpull.v1.XmlPullParserException e) {
  205.             throw new XmlPullParserException(e);
  206.         }
  207.     }

  208.     @Override
  209.     public TagEvent nextTag() throws IOException, XmlPullParserException {
  210.         int xpp3EventInt;
  211.         try {
  212.             xpp3EventInt = xpp3XmlPullParser.nextTag();
  213.         } catch (org.xmlpull.v1.XmlPullParserException e) {
  214.             throw new XmlPullParserException(e);
  215.         }
  216.         switch (xpp3EventInt) {
  217.         case org.xmlpull.v1.XmlPullParser.START_TAG:
  218.             return TagEvent.START_ELEMENT;
  219.         case org.xmlpull.v1.XmlPullParser.END_TAG:
  220.             return TagEvent.END_ELEMENT;
  221.         default:
  222.             throw new AssertionError();
  223.         }
  224.     }

  225.     @Override
  226.     public boolean supportsRoundtrip() {
  227.         return xpp3XmlPullParser.getFeature(Xpp3XmlPullParserFactory.FEATURE_XML_ROUNDTRIP);
  228.     }

  229.     private static Event xpp3EventIntegerToEvent(int xpp3EventInt) {
  230.         switch (xpp3EventInt) {
  231.         case org.xmlpull.v1.XmlPullParser.START_DOCUMENT:
  232.             return Event.START_DOCUMENT;
  233.         case org.xmlpull.v1.XmlPullParser.END_DOCUMENT:
  234.             return Event.END_DOCUMENT;
  235.         case org.xmlpull.v1.XmlPullParser.START_TAG:
  236.             return Event.START_ELEMENT;
  237.         case org.xmlpull.v1.XmlPullParser.END_TAG:
  238.             return Event.END_ELEMENT;
  239.         case org.xmlpull.v1.XmlPullParser.TEXT:
  240.             return Event.TEXT_CHARACTERS;
  241.         case org.xmlpull.v1.XmlPullParser.CDSECT:
  242.             return Event.OTHER;
  243.         case org.xmlpull.v1.XmlPullParser.ENTITY_REF:
  244.             return Event.ENTITY_REFERENCE;
  245.         case org.xmlpull.v1.XmlPullParser.IGNORABLE_WHITESPACE:
  246.             return Event.IGNORABLE_WHITESPACE;
  247.         case org.xmlpull.v1.XmlPullParser.PROCESSING_INSTRUCTION:
  248.             return Event.PROCESSING_INSTRUCTION;
  249.         case org.xmlpull.v1.XmlPullParser.COMMENT:
  250.             return Event.COMMENT;
  251.         case org.xmlpull.v1.XmlPullParser.DOCDECL:
  252.             return Event.OTHER;
  253.         default:
  254.             throw new IllegalArgumentException("Unknown XPP3 event integer: " + xpp3EventInt);
  255.         }
  256.     }

  257.     private static String nullValueToDefaultPrefix(String prefix) {
  258.         if (prefix != null) {
  259.             return prefix;
  260.         }
  261.         return XMLConstants.DEFAULT_NS_PREFIX;
  262.     }
  263. }