Smack/smack-xmlparser-xpp3/src/main/java/org/jivesoftware/smack/xml/xpp3/Xpp3XmlPullParserFactory.java

87 lines
3.3 KiB
Java

/**
*
* Copyright 2019 Florian Schmaus
*
* 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.jivesoftware.smack.xml.xpp3;
import java.io.Reader;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jivesoftware.smack.xml.XmlPullParserException;
import org.jivesoftware.smack.xml.XmlPullParserFactory;
public class Xpp3XmlPullParserFactory implements XmlPullParserFactory {
private static final Logger LOGGER = Logger.getLogger(Xpp3XmlPullParserFactory.class.getName());
private static final org.xmlpull.v1.XmlPullParserFactory XPP3_XML_PULL_PARSER_FACTORY;
public static final String FEATURE_XML_ROUNDTRIP = "http://xmlpull.org/v1/doc/features.html#xml-roundtrip";
/**
* True if the XmlPullParser supports the XML_ROUNDTRIP feature.
*/
public static final boolean XML_PULL_PARSER_SUPPORTS_ROUNDTRIP;
static {
org.xmlpull.v1.XmlPullParser xmlPullParser;
boolean roundtrip = false;
try {
XPP3_XML_PULL_PARSER_FACTORY = org.xmlpull.v1.XmlPullParserFactory.newInstance();
xmlPullParser = XPP3_XML_PULL_PARSER_FACTORY.newPullParser();
try {
xmlPullParser.setFeature(FEATURE_XML_ROUNDTRIP, true);
// We could successfully set the feature
roundtrip = true;
} catch (org.xmlpull.v1.XmlPullParserException e) {
// Doesn't matter if FEATURE_XML_ROUNDTRIP isn't available
LOGGER.log(Level.FINEST, "XmlPullParser does not support XML_ROUNDTRIP", e);
}
}
catch (org.xmlpull.v1.XmlPullParserException e) {
// Something really bad happened
throw new AssertionError(e);
}
XML_PULL_PARSER_SUPPORTS_ROUNDTRIP = roundtrip;
}
@Override
public Xpp3XmlPullParser newXmlPullParser(Reader reader) throws XmlPullParserException {
org.xmlpull.v1.XmlPullParser xpp3XmlPullParser;
try {
xpp3XmlPullParser = XPP3_XML_PULL_PARSER_FACTORY.newPullParser();
xpp3XmlPullParser.setFeature(org.xmlpull.v1.XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
xpp3XmlPullParser.setInput(reader);
} catch (org.xmlpull.v1.XmlPullParserException e) {
throw new XmlPullParserException(e);
}
if (XML_PULL_PARSER_SUPPORTS_ROUNDTRIP) {
try {
xpp3XmlPullParser.setFeature(FEATURE_XML_ROUNDTRIP, true);
}
catch (org.xmlpull.v1.XmlPullParserException e) {
LOGGER.log(Level.SEVERE,
"XmlPullParser does not support XML_ROUNDTRIP, although it was first determined to be supported",
e);
}
}
return new Xpp3XmlPullParser(xpp3XmlPullParser);
}
}