diff --git a/build.gradle b/build.gradle
index 5c997dcbb..4b01e13e4 100644
--- a/build.gradle
+++ b/build.gradle
@@ -24,6 +24,7 @@ apply from: 'version.gradle'
allprojects {
apply plugin: 'java'
+ apply plugin: 'java-library'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'jacoco'
@@ -80,6 +81,8 @@ allprojects {
':smack-omemo',
':smack-omemo-signal',
':smack-openpgp',
+ ':smack-xmlparser',
+ ':smack-xmlparser-xpp3',
].collect{ project(it) }
androidBootClasspathProjects = [
':smack-android',
@@ -97,13 +100,37 @@ allprojects {
':smack-omemo-signal',
':smack-omemo-signal-integration-test',
].collect{ project(it) }
+ // When this list is empty, then move the according javadoc
+ // tool Werror option into the global configure section.
+ nonStrictJavadocProjects = [
+ ':smack-bosh',
+ ':smack-core',
+ ':smack-experimental',
+ ':smack-extensions',
+ ':smack-im',
+ ':smack-integration-test',
+ ':smack-jingle-old',
+ ':smack-legacy',
+ ':smack-omemo',
+ ':smack-tcp',
+ ].collect{ project(it) }
// Lazily evaluate the Android bootClasspath and offline
// Javadoc using a closure, so that targets which do not
// require it are still able to succeed without an Android
// SDK.
androidBootClasspath = { getAndroidRuntimeJar() }
androidJavadocOffline = { getAndroidJavadocOffline() }
- junitVersion = '5.2.0'
+ junit4Projects = [
+ ':smack-core',
+ ':smack-extensions',
+ ':smack-im',
+ ':smack-integration-test',
+ ':smack-omemo',
+ ':smack-omemo-signal',
+ ':smack-openpgp',
+ ].collect { project(it) }
+ junitVersion = '5.4.2'
+ powerMockVersion = '1.7.3'
}
group = 'org.igniterealtime.smack'
sourceCompatibility = JavaVersion.VERSION_1_8
@@ -114,6 +141,12 @@ allprojects {
}
test {
+ useJUnitPlatform()
+
+ // Enable once the tests are fixed that sometimes break if
+ // they are executed in parallel (.e.g Socks5)
+ // maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
+
// Enable full stacktraces of failed tests. Especially handy
// for environments like Travis.
testLogging {
@@ -232,6 +265,10 @@ allprojects {
}
dependencies {
+ testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"
+ testImplementation "org.junit.jupiter:junit-jupiter-params:$junitVersion"
+ testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
+
errorprone 'com.google.errorprone:error_prone_core:2.3.2'
errorproneJavac('com.google.errorprone:javac:9+181-r4173-1')
}
@@ -241,6 +278,15 @@ allprojects {
test { dependsOn javadoc }
}
+configure (junit4Projects) {
+ dependencies {
+ testImplementation "org.junit.vintage:junit-vintage-engine:$junitVersion"
+ testImplementation "org.powermock:powermock-module-junit4:$powerMockVersion"
+ testImplementation "org.powermock:powermock-module-junit4-rule:$powerMockVersion"
+ testImplementation "org.powermock:powermock-api-mockito2:$powerMockVersion"
+ }
+}
+
gradle.taskGraph.whenReady { taskGraph ->
if (signingRequired
&& taskGraph.allTasks.any { it instanceof Sign }) {
@@ -532,6 +578,15 @@ subprojects*.jar {
}
}
+configure(subprojects - nonStrictJavadocProjects) {
+ tasks.withType(Javadoc) {
+ // Abort on javadoc warnings.
+ // See JDK-8200363 (https://bugs.openjdk.java.net/browse/JDK-8200363)
+ // for information about the -Xwerror option.
+ options.addStringOption('Xwerror', '-quiet')
+ }
+}
+
configure(subprojects - gplLicensedProjects) {
checkstyle {
configProperties.checkstyleLicenseHeader = "header"
diff --git a/documentation/developer/provider.md b/documentation/developer/provider.md
index cd5255af5..465caeb32 100644
--- a/documentation/developer/provider.md
+++ b/documentation/developer/provider.md
@@ -27,11 +27,11 @@ public MyExtension parse(XmlPullParser parser, int initialDepth) {
outerloop: while(true) {
// Make sure to have already parse all attributes of the outermost element,
// i.e. 'attrFoo' of 'myExtension' in this example. Then advance the parser
- int event = parser.next();
+ XmlPullParser.Event event = parser.next();
// Use switch/case of int instead of a if/else-if cascade
switch (event) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
// Determine the name of the element which start tag we are seeing
String name = parser.getName();
// We can use switch/case of Strings since Java7, make use of its advantages
@@ -52,12 +52,15 @@ public MyExtension parse(XmlPullParser parser, int initialDepth) {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
// The abort condition with the break labeled loop statement
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
diff --git a/documentation/providers.md b/documentation/providers.md
index 00457d5d9..f5e57e705 100644
--- a/documentation/providers.md
+++ b/documentation/providers.md
@@ -23,7 +23,7 @@ Whenever a packet extension is found in a packet, parsing will be
passed to the correct provider. Each provider must extend the
ExtensionElementProvider abstract class. Each extension provider is
responsible for parsing the raw XML stream, via the
-[XML Pull Parser](http://www.xmlpull.org/), to contruct an object.
+Smack's `XmlPullParser` interface, to construct an object.
You can also create an introspection provider
(`provider.IntrospectionProvider.PacketExtensionIntrospectionProvider`). Here,
@@ -161,9 +161,9 @@ public class MyIQProvider extends IQProvider {
// Start parsing loop
outerloop: while(true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch(eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String elementName = parser.getName();
switch (elementName) {
case "user":
@@ -175,12 +175,15 @@ public class MyIQProvider extends IQProvider {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
// Abort condition: if the are on a end tag (closing element) of the same depth
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
@@ -225,9 +228,9 @@ _Disco Items IQProvider_
String node = "";
discoverItems.setNode(parser.getAttributeValue("", "node"));
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String elementName = parser.getName();
switch (elementName) {
case "item":
@@ -239,7 +242,7 @@ _Disco Items IQProvider_
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
String elementName = parser.getName();
switch (elementName) {
case "item":
@@ -295,17 +298,17 @@ _Subscription PacketExtensionProvider Implementation_
String state = parser.getAttributeValue(null, "subscription");
boolean isRequired = false;
- int tag = parser.next();
+ XmlPullParser.Event tag = parser.next();
- if ((tag == XmlPullParser.START_TAG) && parser.getName().equals("subscribe-options")) {
+ if ((tag == XmlPullParser.START_ELEMENT) && parser.getName().equals("subscribe-options")) {
tag = parser.next();
- if ((tag == XmlPullParser.START_TAG) && parser.getName().equals("required"))
+ if ((tag == XmlPullParser.START_ELEMENT) && parser.getName().equals("required"))
isRequired = true;
- while (parser.next() != XmlPullParser.END_TAG && parser.getName() != "subscribe-options");
+ while (parser.next() != XmlPullParser.END_ELEMENT && parser.getName() != "subscribe-options");
}
- while (parser.getEventType() != XmlPullParser.END_TAG) parser.next();
+ while (parser.getEventType() != XmlPullParser.END_ELEMENT) parser.next();
return new Subscription(jid, nodeId, subId, state == null ? null : Subscription.State.valueOf(state), isRequired);
}
}
diff --git a/resources/releasedocs/README.html b/resources/releasedocs/README.html
index 195858a8f..d25eaf624 100644
--- a/resources/releasedocs/README.html
+++ b/resources/releasedocs/README.html
@@ -169,14 +169,10 @@ recommended when using Smack.
-If you dont' use a
-dependency resolution system, like gradle or maven, then you will need
-to download at least
-the Xml
-Pull Parser 3rd Edition (XPP3) library or any other library that
-implements the XmlPullParser interface
-(like kXML) and the set of
-jXMPP libraries.
+ Smack tries to depend on as few as possible libraries. The only
+ requirement is jXMPP. For DNS
+ resolution we recommend to
+ use MiniDNS.
diff --git a/settings.gradle b/settings.gradle
index 6188d60b6..d3b53d80e 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -28,4 +28,7 @@ include 'smack-core',
'smack-omemo-signal',
'smack-omemo-signal-integration-test',
'smack-repl',
- 'smack-openpgp'
+ 'smack-openpgp',
+ 'smack-xmlparser',
+ 'smack-xmlparser-stax',
+ 'smack-xmlparser-xpp3'
diff --git a/smack-android/build.gradle b/smack-android/build.gradle
index 63fa35d2f..46827c09f 100644
--- a/smack-android/build.gradle
+++ b/smack-android/build.gradle
@@ -7,6 +7,7 @@ smack-extensions and smack-experimental."""
// Note that the test dependencies (junit, …) are inferred from the
// sourceSet.test of the core subproject
dependencies {
+ api project(':smack-xmlparser-xpp3')
// Depend on minidns-android21 as optional dependency, even if may
// not need it. Can't hurt to have it in the programm path with
// the correct MiniDNS version as it won't hurt even if the
diff --git a/smack-bosh/src/main/java/org/jivesoftware/smack/bosh/XMPPBOSHConnection.java b/smack-bosh/src/main/java/org/jivesoftware/smack/bosh/XMPPBOSHConnection.java
index 7e1d97122..592e0633c 100644
--- a/smack-bosh/src/main/java/org/jivesoftware/smack/bosh/XMPPBOSHConnection.java
+++ b/smack-bosh/src/main/java/org/jivesoftware/smack/bosh/XMPPBOSHConnection.java
@@ -20,7 +20,6 @@ package org.jivesoftware.smack.bosh;
import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;
-import java.io.StringReader;
import java.io.Writer;
import java.util.Map;
import java.util.logging.Level;
@@ -44,6 +43,7 @@ import org.jivesoftware.smack.sasl.packet.SaslStreamElements.SASLFailure;
import org.jivesoftware.smack.sasl.packet.SaslStreamElements.Success;
import org.jivesoftware.smack.util.CloseableUtil;
import org.jivesoftware.smack.util.PacketParserUtils;
+import org.jivesoftware.smack.xml.XmlPullParser;
import org.igniterealtime.jbosh.AbstractBody;
import org.igniterealtime.jbosh.BOSHClient;
@@ -56,11 +56,8 @@ import org.igniterealtime.jbosh.BOSHException;
import org.igniterealtime.jbosh.BOSHMessageEvent;
import org.igniterealtime.jbosh.BodyQName;
import org.igniterealtime.jbosh.ComposableBody;
-
import org.jxmpp.jid.DomainBareJid;
import org.jxmpp.jid.parts.Resourcepart;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserFactory;
/**
* Creates a connection to an XMPP server via HTTP binding.
@@ -479,14 +476,13 @@ public class XMPPBOSHConnection extends AbstractXMPPConnection {
if (streamId == null) {
streamId = body.getAttribute(BodyQName.create(XMPPBOSHConnection.BOSH_URI, "authid"));
}
- final XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
- parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
- parser.setInput(new StringReader(body.toXML()));
- int eventType = parser.getEventType();
+ final XmlPullParser parser = PacketParserUtils.getParserFor(body.toXML());
+
+ XmlPullParser.Event eventType = parser.getEventType();
do {
eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String name = parser.getName();
switch (name) {
case Message.ELEMENT:
@@ -528,9 +524,12 @@ public class XMPPBOSHConnection extends AbstractXMPPConnection {
}
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
- while (eventType != XmlPullParser.END_DOCUMENT);
+ while (eventType != XmlPullParser.Event.END_DOCUMENT);
}
catch (Exception e) {
if (isConnected()) {
diff --git a/smack-core/build.gradle b/smack-core/build.gradle
index 69ee5d468..c2ce38504 100644
--- a/smack-core/build.gradle
+++ b/smack-core/build.gradle
@@ -2,23 +2,19 @@ description = """\
Smack core components."""
ext {
- xmlUnitVersion = "2.6.0"
- powerMockVersion = "1.7.3"
+ xmlUnitVersion = '2.6.2'
}
dependencies {
- compile 'xpp3:xpp3:1.1.4c'
+ compile project(':smack-xmlparser')
compile "org.jxmpp:jxmpp-core:$jxmppVersion"
compile "org.jxmpp:jxmpp-jid:$jxmppVersion"
compile "org.minidns:minidns-core:$miniDnsVersion"
+ testCompile project(':smack-xmlparser-stax')
+ testCompile project(':smack-xmlparser-xpp3')
testCompile "org.jxmpp:jxmpp-jid:$jxmppVersion:tests"
- testCompile "org.junit.jupiter:junit-jupiter-api:$junitVersion"
- testCompile "org.junit.vintage:junit-vintage-engine:$junitVersion"
testCompile "org.xmlunit:xmlunit-core:$xmlUnitVersion"
testCompile "org.xmlunit:xmlunit-legacy:$xmlUnitVersion"
- testCompile "org.powermock:powermock-module-junit4:$powerMockVersion"
- testCompile "org.powermock:powermock-module-junit4-rule:$powerMockVersion"
- testCompile "org.powermock:powermock-api-mockito2:$powerMockVersion"
testCompile 'com.jamesmurty.utils:java-xmlbuilder:1.2'
}
diff --git a/smack-core/src/integration-test/java/org/jivesoftware/smack/packet/PrivacyProviderTest.java b/smack-core/src/integration-test/java/org/jivesoftware/smack/packet/PrivacyProviderTest.java
index e9261f516..ef7d5ee85 100644
--- a/smack-core/src/integration-test/java/org/jivesoftware/smack/packet/PrivacyProviderTest.java
+++ b/smack-core/src/integration-test/java/org/jivesoftware/smack/packet/PrivacyProviderTest.java
@@ -16,9 +16,9 @@ package org.jivesoftware.smack.packet;
import org.jivesoftware.smack.provider.PrivacyProvider;
import org.jivesoftware.smack.test.SmackTestCase;
-import org.xmlpull.v1.XmlPullParserFactory;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParserFactory;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
import java.io.StringReader;
diff --git a/smack-core/src/integration-test/java/org/jivesoftware/smack/test/SmackTestCase.java b/smack-core/src/integration-test/java/org/jivesoftware/smack/test/SmackTestCase.java
index e44c6e15a..9bceba3f7 100644
--- a/smack-core/src/integration-test/java/org/jivesoftware/smack/test/SmackTestCase.java
+++ b/smack-core/src/integration-test/java/org/jivesoftware/smack/test/SmackTestCase.java
@@ -32,8 +32,8 @@ import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.TCPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.util.ConnectionUtils;
-import org.xmlpull.v1.XmlPullParserFactory;
-import org.xmlpull.v1.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserFactory;
+import org.jivesoftware.smack.xml.XmlPullParser;
/**
* Base class for all the test cases which provides a pre-configured execution context. This
@@ -414,9 +414,9 @@ public abstract class SmackTestCase extends TestCase {
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
parser.setInput(systemStream, "UTF-8");
- int eventType = parser.getEventType();
+ XmlPullParser.Event eventType = parser.getEventType();
do {
- if (eventType == XmlPullParser.START_TAG) {
+ if (eventType == START_ELEMENT) {
if (parser.getName().equals("host")) {
host = parser.nextText();
}
@@ -459,7 +459,7 @@ public abstract class SmackTestCase extends TestCase {
}
eventType = parser.next();
}
- while (eventType != XmlPullParser.END_DOCUMENT);
+ while (eventType != END_DOCUMENT);
parsedOK = true;
}
catch (Exception e) {
diff --git a/smack-core/src/integration-test/java/org/jivesoftware/smack/util/XMPPErrorTest.java b/smack-core/src/integration-test/java/org/jivesoftware/smack/util/XMPPErrorTest.java
index a375e0d81..8d2a0df4f 100644
--- a/smack-core/src/integration-test/java/org/jivesoftware/smack/util/XMPPErrorTest.java
+++ b/smack-core/src/integration-test/java/org/jivesoftware/smack/util/XMPPErrorTest.java
@@ -20,9 +20,9 @@ import java.io.StringReader;
import org.jivesoftware.smack.packet.XMPPError;
import org.jivesoftware.smack.test.SmackTestCase;
-import org.xmlpull.v1.XmlPullParserFactory;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParserFactory;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
public class XMPPErrorTest extends SmackTestCase {
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java
index e82ad15aa..632855ac2 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java
@@ -121,6 +121,8 @@ import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smack.util.dns.HostAddress;
import org.jivesoftware.smack.util.dns.SmackDaneProvider;
import org.jivesoftware.smack.util.dns.SmackDaneVerifier;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
import org.jxmpp.jid.DomainBareJid;
import org.jxmpp.jid.EntityFullJid;
@@ -130,8 +132,6 @@ import org.jxmpp.jid.parts.Resourcepart;
import org.jxmpp.stringprep.XmppStringprepException;
import org.jxmpp.util.XmppStringUtils;
import org.minidns.dnsname.DnsName;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
/**
@@ -1614,9 +1614,9 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
streamFeatures.clear();
final int initialDepth = parser.getDepth();
while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
- if (eventType == XmlPullParser.START_TAG && parser.getDepth() == initialDepth + 1) {
+ if (eventType == XmlPullParser.Event.START_ELEMENT && parser.getDepth() == initialDepth + 1) {
FullyQualifiedElement streamFeature = null;
String name = parser.getName();
String namespace = parser.getNamespace();
@@ -1647,7 +1647,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
addStreamFeature(streamFeature);
}
}
- else if (eventType == XmlPullParser.END_TAG && parser.getDepth() == initialDepth) {
+ else if (eventType == XmlPullParser.Event.END_ELEMENT && parser.getDepth() == initialDepth) {
break;
}
}
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/SmackConfiguration.java b/smack-core/src/main/java/org/jivesoftware/smack/SmackConfiguration.java
index 10695df47..6f06e4d33 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/SmackConfiguration.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/SmackConfiguration.java
@@ -29,6 +29,7 @@ import javax.net.ssl.HostnameVerifier;
import org.jivesoftware.smack.compression.XMPPInputOutputStream;
import org.jivesoftware.smack.debugger.ReflectionDebuggerFactory;
import org.jivesoftware.smack.debugger.SmackDebuggerFactory;
+import org.jivesoftware.smack.parsing.ExceptionThrowingCallback;
import org.jivesoftware.smack.parsing.ExceptionThrowingCallbackWithHint;
import org.jivesoftware.smack.parsing.ParsingExceptionCallback;
import org.jivesoftware.smack.util.Objects;
@@ -380,4 +381,5 @@ public final class SmackConfiguration {
public static int getDefaultConcurrencyLevelLimit() {
return defaultConcurrencyLevelLimit;
}
+
}
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/SmackInitialization.java b/smack-core/src/main/java/org/jivesoftware/smack/SmackInitialization.java
index 701004696..56ce677ce 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/SmackInitialization.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/SmackInitialization.java
@@ -44,10 +44,10 @@ import org.jivesoftware.smack.sasl.core.SCRAMSHA1Mechanism;
import org.jivesoftware.smack.sasl.core.ScramSha1PlusMechanism;
import org.jivesoftware.smack.util.CloseableUtil;
import org.jivesoftware.smack.util.FileUtils;
+import org.jivesoftware.smack.util.PacketParserUtils;
import org.jivesoftware.smack.util.StringUtils;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserFactory;
+import org.jivesoftware.smack.xml.XmlPullParser;
public final class SmackInitialization {
@@ -141,12 +141,10 @@ public final class SmackInitialization {
public static void processConfigFile(InputStream cfgFileStream,
Collection exceptions, ClassLoader classLoader) throws Exception {
- XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
- parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
- parser.setInput(cfgFileStream, "UTF-8");
- int eventType = parser.getEventType();
+ XmlPullParser parser = PacketParserUtils.getParserFor(cfgFileStream);
+ XmlPullParser.Event eventType = parser.getEventType();
do {
- if (eventType == XmlPullParser.START_TAG) {
+ if (eventType == XmlPullParser.Event.START_ELEMENT) {
if (parser.getName().equals("startupClasses")) {
parseClassesToLoad(parser, false, exceptions, classLoader);
}
@@ -156,7 +154,7 @@ public final class SmackInitialization {
}
eventType = parser.next();
}
- while (eventType != XmlPullParser.END_DOCUMENT);
+ while (eventType != XmlPullParser.Event.END_DOCUMENT);
CloseableUtil.maybeClose(cfgFileStream, LOGGER);
}
@@ -164,12 +162,10 @@ public final class SmackInitialization {
Collection exceptions, ClassLoader classLoader)
throws Exception {
final String startName = parser.getName();
- int eventType;
- String name;
+ XmlPullParser.Event eventType;
outerloop: do {
eventType = parser.next();
- name = parser.getName();
- if (eventType == XmlPullParser.START_TAG && "className".equals(name)) {
+ if (eventType == XmlPullParser.Event.START_ELEMENT && "className".equals(parser.getName())) {
String classToLoad = parser.nextText();
if (SmackConfiguration.isDisabledSmackClass(classToLoad)) {
continue outerloop;
@@ -188,7 +184,7 @@ public final class SmackInitialization {
}
}
}
- while (!(eventType == XmlPullParser.END_TAG && startName.equals(name)));
+ while (!(eventType == XmlPullParser.Event.END_ELEMENT && startName.equals(parser.getName())));
}
private static void loadSmackClass(String className, boolean optional, ClassLoader classLoader) throws Exception {
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/compress/provider/CompressedProvider.java b/smack-core/src/main/java/org/jivesoftware/smack/compress/provider/CompressedProvider.java
index 8b02ef95b..fbed9abd3 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/compress/provider/CompressedProvider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/compress/provider/CompressedProvider.java
@@ -20,7 +20,7 @@ import org.jivesoftware.smack.compress.packet.Compressed;
import org.jivesoftware.smack.packet.XmlEnvironment;
import org.jivesoftware.smack.provider.NonzaProvider;
-import org.xmlpull.v1.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParser;
public final class CompressedProvider extends NonzaProvider {
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/compress/provider/FailureProvider.java b/smack-core/src/main/java/org/jivesoftware/smack/compress/provider/FailureProvider.java
index eaa9a980d..cf90f594b 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/compress/provider/FailureProvider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/compress/provider/FailureProvider.java
@@ -27,8 +27,8 @@ import org.jivesoftware.smack.parsing.SmackParsingException;
import org.jivesoftware.smack.provider.NonzaProvider;
import org.jivesoftware.smack.util.PacketParserUtils;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
public final class FailureProvider extends NonzaProvider {
@@ -46,9 +46,9 @@ public final class FailureProvider extends NonzaProvider {
XmlEnvironment failureXmlEnvironment = XmlEnvironment.from(parser, xmlEnvironment);
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String name = parser.getName();
String namespace = parser.getNamespace();
switch (namespace) {
@@ -72,11 +72,12 @@ public final class FailureProvider extends NonzaProvider {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default: // fall out
}
}
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/fsm/AbstractXmppStateMachineConnection.java b/smack-core/src/main/java/org/jivesoftware/smack/fsm/AbstractXmppStateMachineConnection.java
index 99c8ac6b6..3330202d3 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/fsm/AbstractXmppStateMachineConnection.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/fsm/AbstractXmppStateMachineConnection.java
@@ -57,10 +57,10 @@ import org.jivesoftware.smack.sasl.packet.SaslStreamElements.Challenge;
import org.jivesoftware.smack.sasl.packet.SaslStreamElements.Success;
import org.jivesoftware.smack.util.Objects;
import org.jivesoftware.smack.util.PacketParserUtils;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
import org.jxmpp.jid.parts.Resourcepart;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
public abstract class AbstractXmppStateMachineConnection extends AbstractXMPPConnection {
@@ -310,10 +310,10 @@ public abstract class AbstractXmppStateMachineConnection extends AbstractXMPPCon
// Skip the enclosing stream open what is guaranteed to be there.
parser.next();
- int event = parser.getEventType();
+ XmlPullParser.Event event = parser.getEventType();
outerloop: while (true) {
switch (event) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
final String name = parser.getName();
// Note that we don't handle "stream" here as it's done in the splitter.
switch (name) {
@@ -353,8 +353,9 @@ public abstract class AbstractXmppStateMachineConnection extends AbstractXMPPCon
break;
}
break;
- case XmlPullParser.END_DOCUMENT:
+ case END_DOCUMENT:
break outerloop;
+ default: // fall out
}
event = parser.next();
}
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/XmlEnvironment.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/XmlEnvironment.java
index da69cb240..0e713a04c 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/packet/XmlEnvironment.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/XmlEnvironment.java
@@ -19,7 +19,7 @@ package org.jivesoftware.smack.packet;
import org.jivesoftware.smack.util.ParserUtils;
import org.jivesoftware.smack.util.StringUtils;
-import org.xmlpull.v1.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParser;
public class XmlEnvironment {
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/parsing/StandardExtensionElementProvider.java b/smack-core/src/main/java/org/jivesoftware/smack/parsing/StandardExtensionElementProvider.java
index 4b9f77acf..cceaf4216 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/parsing/StandardExtensionElementProvider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/parsing/StandardExtensionElementProvider.java
@@ -1,6 +1,6 @@
/**
*
- * Copyright 2015 Florian Schmaus.
+ * Copyright 2015-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.
@@ -26,8 +26,8 @@ import org.jivesoftware.smack.provider.ExtensionElementProvider;
import org.jivesoftware.smack.util.ParserUtils;
import org.jivesoftware.smack.util.StringUtils;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
/**
* The parser for {@link StandardExtensionElement}s.
@@ -47,7 +47,7 @@ public class StandardExtensionElementProvider extends ExtensionElementProvider attributes = new LinkedHashMap<>(namespaceCount + attributeCount);
for (int i = 0; i < namespaceCount; i++) {
@@ -77,19 +77,22 @@ public class StandardExtensionElementProvider extends ExtensionElementProvider {
@@ -34,9 +34,9 @@ public class BindIQProvider extends IQProvider {
String name;
Bind bind = null;
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
name = parser.getName();
switch (name) {
case "resource":
@@ -49,11 +49,14 @@ public class BindIQProvider extends IQProvider {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
return bind;
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/provider/BodyElementProvider.java b/smack-core/src/main/java/org/jivesoftware/smack/provider/BodyElementProvider.java
index ad6cefdaf..df85d067c 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/provider/BodyElementProvider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/provider/BodyElementProvider.java
@@ -24,8 +24,8 @@ import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.XmlEnvironment;
import org.jivesoftware.smack.util.ParserUtils;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
public class BodyElementProvider extends ExtensionElementProvider {
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/provider/EmbeddedExtensionProvider.java b/smack-core/src/main/java/org/jivesoftware/smack/provider/EmbeddedExtensionProvider.java
index 6226d5d3d..f572d876d 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/provider/EmbeddedExtensionProvider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/provider/EmbeddedExtensionProvider.java
@@ -27,8 +27,8 @@ import org.jivesoftware.smack.packet.XmlEnvironment;
import org.jivesoftware.smack.parsing.SmackParsingException;
import org.jivesoftware.smack.util.PacketParserUtils;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
/**
*
@@ -97,14 +97,14 @@ public abstract class EmbeddedExtensionProvider ext
}
List extensions = new ArrayList<>();
- int event;
+ XmlPullParser.Event event;
do {
event = parser.next();
- if (event == XmlPullParser.START_TAG)
+ if (event == XmlPullParser.Event.START_ELEMENT)
PacketParserUtils.addExtensionElement(extensions, parser, xmlEnvironment);
}
- while (!(event == XmlPullParser.END_TAG && parser.getDepth() == initialDepth));
+ while (!(event == XmlPullParser.Event.END_ELEMENT && parser.getDepth() == initialDepth));
return createReturnExtension(name, namespace, attMap, extensions);
}
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/provider/IntrospectionProvider.java b/smack-core/src/main/java/org/jivesoftware/smack/provider/IntrospectionProvider.java
index 3c952bbf6..a4c58f406 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/provider/IntrospectionProvider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/provider/IntrospectionProvider.java
@@ -24,8 +24,8 @@ import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.XmlEnvironment;
import org.jivesoftware.smack.util.ParserUtils;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
public class IntrospectionProvider{
@@ -81,9 +81,9 @@ public class IntrospectionProvider{
ParserUtils.assertAtStartTag(parser);
Object object = objectClass.getConstructor().newInstance();
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String name = parser.getName();
String stringValue = parser.nextText();
Class> propertyType = object.getClass().getMethod(
@@ -97,11 +97,14 @@ public class IntrospectionProvider{
propertyType).invoke(object, value);
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
ParserUtils.assertAtEndTag(parser);
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/provider/Provider.java b/smack-core/src/main/java/org/jivesoftware/smack/provider/Provider.java
index 46205fd6a..ef1a225d9 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/provider/Provider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/provider/Provider.java
@@ -26,8 +26,8 @@ import org.jivesoftware.smack.packet.XmlEnvironment;
import org.jivesoftware.smack.parsing.SmackParsingException;
import org.jivesoftware.smack.util.ParserUtils;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
/**
* Smack provider are the parsers used to deserialize raw XMPP into the according Java {@link Element}s.
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/provider/ProviderFileLoader.java b/smack-core/src/main/java/org/jivesoftware/smack/provider/ProviderFileLoader.java
index c8b879306..e39f81d26 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/provider/ProviderFileLoader.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/provider/ProviderFileLoader.java
@@ -26,9 +26,8 @@ import java.util.logging.Logger;
import org.jivesoftware.smack.packet.ExtensionElement;
import org.jivesoftware.smack.packet.IQ;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserFactory;
+import org.jivesoftware.smack.util.PacketParserUtils;
+import org.jivesoftware.smack.xml.XmlPullParser;
/**
* Loads the {@link IQProvider} and {@link ExtensionElementProvider} information from a standard provider file in preparation
@@ -54,12 +53,10 @@ public class ProviderFileLoader implements ProviderLoader {
public ProviderFileLoader(InputStream providerStream, ClassLoader classLoader) {
// Load processing providers.
try (InputStream is = providerStream) {
- XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
- parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
- parser.setInput(is, "UTF-8");
- int eventType = parser.getEventType();
+ XmlPullParser parser = PacketParserUtils.getParserFor(is);
+ XmlPullParser.Event eventType = parser.getEventType();
do {
- if (eventType == XmlPullParser.START_TAG) {
+ if (eventType == XmlPullParser.Event.START_ELEMENT) {
final String typeName = parser.getName();
try {
@@ -134,7 +131,7 @@ public class ProviderFileLoader implements ProviderLoader {
}
eventType = parser.next();
}
- while (eventType != XmlPullParser.END_DOCUMENT);
+ while (eventType != XmlPullParser.Event.END_DOCUMENT);
}
catch (Exception e) {
LOGGER.log(Level.SEVERE, "Unknown error occurred while parsing provider file", e);
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/provider/TlsFailureProvider.java b/smack-core/src/main/java/org/jivesoftware/smack/provider/TlsFailureProvider.java
index 6211e6cc0..2509d89c8 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/provider/TlsFailureProvider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/provider/TlsFailureProvider.java
@@ -19,7 +19,7 @@ package org.jivesoftware.smack.provider;
import org.jivesoftware.smack.packet.TlsProceed;
import org.jivesoftware.smack.packet.XmlEnvironment;
-import org.xmlpull.v1.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParser;
public final class TlsFailureProvider extends NonzaProvider {
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/provider/TlsProceedProvider.java b/smack-core/src/main/java/org/jivesoftware/smack/provider/TlsProceedProvider.java
index 3be9f904f..f8e8b1158 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/provider/TlsProceedProvider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/provider/TlsProceedProvider.java
@@ -19,7 +19,7 @@ package org.jivesoftware.smack.provider;
import org.jivesoftware.smack.packet.TlsFailure;
import org.jivesoftware.smack.packet.XmlEnvironment;
-import org.xmlpull.v1.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParser;
public final class TlsProceedProvider extends NonzaProvider {
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/PacketParserUtils.java b/smack-core/src/main/java/org/jivesoftware/smack/util/PacketParserUtils.java
index dd065fe92..13ce501fb 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/util/PacketParserUtils.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/util/PacketParserUtils.java
@@ -17,18 +17,19 @@
package org.jivesoftware.smack.util;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
-import java.util.logging.Level;
import java.util.logging.Logger;
-import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.compress.packet.Compress;
import org.jivesoftware.smack.packet.EmptyResultIQ;
import org.jivesoftware.smack.packet.ErrorIQ;
@@ -49,11 +50,11 @@ import org.jivesoftware.smack.provider.ExtensionElementProvider;
import org.jivesoftware.smack.provider.IQProvider;
import org.jivesoftware.smack.provider.ProviderManager;
import org.jivesoftware.smack.sasl.packet.SaslStreamElements.SASLFailure;
+import org.jivesoftware.smack.xml.SmackXmlParser;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
import org.jxmpp.jid.Jid;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlPullParserFactory;
/**
* Utility class that helps to parse packets. Any parsing packets method that must be shared
@@ -64,51 +65,27 @@ import org.xmlpull.v1.XmlPullParserFactory;
public class PacketParserUtils {
private static final Logger LOGGER = Logger.getLogger(PacketParserUtils.class.getName());
- public static final String FEATURE_XML_ROUNDTRIP = "http://xmlpull.org/v1/doc/features.html#xml-roundtrip";
-
- private static final XmlPullParserFactory XML_PULL_PARSER_FACTORY;
-
- /**
- * True if the XmlPullParser supports the XML_ROUNDTRIP feature.
- */
- public static final boolean XML_PULL_PARSER_SUPPORTS_ROUNDTRIP;
-
- static {
- // Ensure that Smack is initialized.
- SmackConfiguration.getVersion();
-
- XmlPullParser xmlPullParser;
- boolean roundtrip = false;
- try {
- XML_PULL_PARSER_FACTORY = XmlPullParserFactory.newInstance();
- xmlPullParser = XML_PULL_PARSER_FACTORY.newPullParser();
- try {
- xmlPullParser.setFeature(FEATURE_XML_ROUNDTRIP, true);
- // We could successfully set the feature
- roundtrip = true;
- } catch (XmlPullParserException e) {
- // Doesn't matter if FEATURE_XML_ROUNDTRIP isn't available
- LOGGER.log(Level.FINEST, "XmlPullParser does not support XML_ROUNDTRIP", e);
- }
- }
- catch (XmlPullParserException e) {
- // Something really bad happened
- throw new AssertionError(e);
- }
- XML_PULL_PARSER_SUPPORTS_ROUNDTRIP = roundtrip;
- }
-
// TODO: Rename argument name from 'stanza' to 'element'.
public static XmlPullParser getParserFor(String stanza) throws XmlPullParserException, IOException {
return getParserFor(new StringReader(stanza));
}
+ public static XmlPullParser getParserFor(InputStream inputStream) throws XmlPullParserException {
+ InputStreamReader inputStreamReader;
+ try {
+ inputStreamReader = new InputStreamReader(inputStream, StringUtils.UTF8);
+ } catch (UnsupportedEncodingException e) {
+ throw new AssertionError(e);
+ }
+ return SmackXmlParser.newXmlParser(inputStreamReader);
+ }
+
public static XmlPullParser getParserFor(Reader reader) throws XmlPullParserException, IOException {
- XmlPullParser parser = newXmppParser(reader);
+ XmlPullParser parser = SmackXmlParser.newXmlParser(reader);
// Wind the parser forward to the first start tag
- int event = parser.getEventType();
- while (event != XmlPullParser.START_TAG) {
- if (event == XmlPullParser.END_DOCUMENT) {
+ XmlPullParser.Event event = parser.getEventType();
+ while (event != XmlPullParser.Event.START_ELEMENT) {
+ if (event == XmlPullParser.Event.END_DOCUMENT) {
throw new IllegalArgumentException("Document contains no start tag");
}
event = parser.next();
@@ -116,26 +93,6 @@ public class PacketParserUtils {
return parser;
}
- public static XmlPullParser getParserFor(String stanza, String startTag)
- throws XmlPullParserException, IOException {
- XmlPullParser parser = getParserFor(stanza);
-
- while (true) {
- int event = parser.getEventType();
- String name = parser.getName();
- if (event == XmlPullParser.START_TAG && name.equals(startTag)) {
- break;
- }
- else if (event == XmlPullParser.END_DOCUMENT) {
- throw new IllegalArgumentException("Could not find start tag '" + startTag
- + "' in stanza: " + stanza);
- }
- parser.next();
- }
-
- return parser;
- }
-
@SuppressWarnings("unchecked")
public static S parseStanza(String stanza) throws Exception {
return (S) parseStanza(getParserFor(stanza), null);
@@ -166,53 +123,6 @@ public class PacketParserUtils {
}
}
- /**
- * Creates a new XmlPullParser suitable for parsing XMPP. This means in particular that
- * FEATURE_PROCESS_NAMESPACES is enabled.
- *
- * Note that not all XmlPullParser implementations will return a String on
- * getText()
if the parser is on START_TAG or END_TAG. So you must not rely on this
- * behavior when using the parser.
- *
- *
- * @return A suitable XmlPullParser for XMPP parsing
- * @throws XmlPullParserException
- */
- public static XmlPullParser newXmppParser() throws XmlPullParserException {
- XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
- parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
- if (XML_PULL_PARSER_SUPPORTS_ROUNDTRIP) {
- try {
- parser.setFeature(FEATURE_XML_ROUNDTRIP, true);
- }
- catch (XmlPullParserException e) {
- LOGGER.log(Level.SEVERE,
- "XmlPullParser does not support XML_ROUNDTRIP, although it was first determined to be supported",
- e);
- }
- }
- return parser;
- }
-
- /**
- * Creates a new XmlPullParser suitable for parsing XMPP. This means in particular that
- * FEATURE_PROCESS_NAMESPACES is enabled.
- *
- * Note that not all XmlPullParser implementations will return a String on
- * getText()
if the parser is on START_TAG or END_TAG. So you must not rely on this
- * behavior when using the parser.
- *
- *
- * @param reader
- * @return A suitable XmlPullParser for XMPP parsing
- * @throws XmlPullParserException
- */
- public static XmlPullParser newXmppParser(Reader reader) throws XmlPullParserException {
- XmlPullParser parser = newXmppParser();
- parser.setInput(reader);
- return parser;
- }
-
public static Message parseMessage(XmlPullParser parser) throws XmlPullParserException, IOException, SmackParsingException {
return parseMessage(parser, null);
}
@@ -249,9 +159,9 @@ public class PacketParserUtils {
// in arbitrary sub-elements.
String thread = null;
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String elementName = parser.getName();
String namespace = parser.getNamespace();
switch (elementName) {
@@ -276,11 +186,12 @@ public class PacketParserUtils {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default: // fall out
}
}
@@ -295,9 +206,9 @@ public class PacketParserUtils {
/**
* Returns the textual content of an element as String. After this method returns the parser
- * position will be END_TAG, following the established pull parser calling convention.
+ * position will be END_ELEMENT, following the established pull parser calling convention.
*
- * The parser must be positioned on a START_TAG of an element which MUST NOT contain Mixed
+ * The parser must be positioned on a START_ELEMENT of an element which MUST NOT contain Mixed
* Content (as defined in XML 3.2.2), or else an XmlPullParserException will be thrown.
*
* This method is used for the parts where the XMPP specification requires elements that contain
@@ -309,41 +220,36 @@ public class PacketParserUtils {
* @throws IOException
*/
public static String parseElementText(XmlPullParser parser) throws XmlPullParserException, IOException {
- assert (parser.getEventType() == XmlPullParser.START_TAG);
+ assert (parser.getEventType() == XmlPullParser.Event.START_ELEMENT);
String res;
- if (parser.isEmptyElementTag()) {
- res = "";
- }
- else {
- // Advance to the text of the Element
- int event = parser.next();
- if (event != XmlPullParser.TEXT) {
- if (event == XmlPullParser.END_TAG) {
- // Assume this is the end tag of the start tag at the
- // beginning of this method. Typical examples where this
- // happens are body elements containing the empty string,
- // ie. , which appears to be valid XMPP, or a
- // least it's not explicitly forbidden by RFC 6121 5.2.3
- return "";
- } else {
- throw new XmlPullParserException(
- "Non-empty element tag not followed by text, while Mixed Content (XML 3.2.2) is disallowed");
- }
- }
- res = parser.getText();
- event = parser.next();
- if (event != XmlPullParser.END_TAG) {
+ // Advance to the text of the Element
+ XmlPullParser.Event event = parser.next();
+ if (event != XmlPullParser.Event.TEXT_CHARACTERS) {
+ if (event == XmlPullParser.Event.END_ELEMENT) {
+ // Assume this is the end tag of the start tag at the
+ // beginning of this method. Typical examples where this
+ // happens are body elements containing the empty string,
+ // ie. , which appears to be valid XMPP, or a
+ // least it's not explicitly forbidden by RFC 6121 5.2.3
+ return "";
+ } else {
throw new XmlPullParserException(
- "Non-empty element tag contains child-elements, while Mixed Content (XML 3.2.2) is disallowed");
+ "Non-empty element tag not followed by text, while Mixed Content (XML 3.2.2) is disallowed");
}
}
+ res = parser.getText();
+ event = parser.next();
+ if (event != XmlPullParser.Event.END_ELEMENT) {
+ throw new XmlPullParserException(
+ "Non-empty element tag contains child-elements, while Mixed Content (XML 3.2.2) is disallowed");
+ }
return res;
}
/**
* Returns the current element as string.
*
- * The parser must be positioned on START_TAG.
+ * The parser must be positioned on START_ELEMENT.
*
* Note that only the outermost namespace attributes ("xmlns") will be returned, not nested ones.
*
@@ -359,37 +265,10 @@ public class PacketParserUtils {
public static CharSequence parseElement(XmlPullParser parser,
boolean fullNamespaces) throws XmlPullParserException,
IOException {
- assert (parser.getEventType() == XmlPullParser.START_TAG);
+ assert (parser.getEventType() == XmlPullParser.Event.START_ELEMENT);
return parseContentDepth(parser, parser.getDepth(), fullNamespaces);
}
- /**
- * Returns the content of a element.
- *
- * The parser must be positioned on the START_TAG of the element which content is going to get
- * returned. If the current element is the empty element, then the empty string is returned. If
- * it is a element which contains just text, then just the text is returned. If it contains
- * nested elements (and text), then everything from the current opening tag to the corresponding
- * closing tag of the same depth is returned as String.
- *
- * Note that only the outermost namespace attributes ("xmlns") will be returned, not nested ones.
- *
- * @param parser the XML pull parser
- * @return the content of a tag
- * @throws XmlPullParserException if parser encounters invalid XML
- * @throws IOException if an IO error occurs
- */
- public static CharSequence parseContent(XmlPullParser parser)
- throws XmlPullParserException, IOException {
- assert (parser.getEventType() == XmlPullParser.START_TAG);
- if (parser.isEmptyElementTag()) {
- return "";
- }
- // Advance the parser, since we want to parse the content of the current element
- parser.next();
- return parseContentDepth(parser, parser.getDepth(), false);
- }
-
public static CharSequence parseContentDepth(XmlPullParser parser, int depth)
throws XmlPullParserException, IOException {
return parseContentDepth(parser, depth, false);
@@ -402,7 +281,7 @@ public class PacketParserUtils {
* parent elements will be added to child elements that don't define a different namespace.
*
* This method is able to parse the content with MX- and KXmlParser. KXmlParser does not support
- * xml-roundtrip. i.e. return a String on getText() on START_TAG and END_TAG. We check for the
+ * xml-roundtrip. i.e. return a String on getText() on START_ELEMENT and END_ELEMENT. We check for the
* XML_ROUNDTRIP feature. If it's not found we are required to work around this limitation, which
* results in only partial support for XML namespaces ("xmlns"): Only the outermost namespace of
* elements will be included in the resulting String, if fullNamespaces
is set to false.
@@ -419,7 +298,7 @@ public class PacketParserUtils {
* @throws IOException
*/
public static CharSequence parseContentDepth(XmlPullParser parser, int depth, boolean fullNamespaces) throws XmlPullParserException, IOException {
- if (parser.getFeature(FEATURE_XML_ROUNDTRIP)) {
+ if (parser.supportsRoundtrip()) {
return parseContentDepthWithRoundtrip(parser, depth, fullNamespaces);
} else {
return parseContentDepthWithoutRoundtrip(parser, depth, fullNamespaces);
@@ -429,15 +308,21 @@ public class PacketParserUtils {
private static CharSequence parseContentDepthWithoutRoundtrip(XmlPullParser parser, int depth,
boolean fullNamespaces) throws XmlPullParserException, IOException {
XmlStringBuilder xml = new XmlStringBuilder();
- int event = parser.getEventType();
- boolean isEmptyElement = false;
+ XmlPullParser.Event event = parser.getEventType();
// XmlPullParser reports namespaces in nested elements even if *only* the outer ones defines
// it. This 'flag' ensures that when a namespace is set for an element, it won't be set again
// in a nested element. It's an ugly workaround that has the potential to break things.
String namespaceElement = null;
+ boolean startElementJustSeen = false;
outerloop: while (true) {
switch (event) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
+ if (startElementJustSeen) {
+ xml.rightAngleBracket();
+ }
+ else {
+ startElementJustSeen = true;
+ }
xml.halfOpenElement(parser.getName());
if (namespaceElement == null || fullNamespaces) {
String namespace = parser.getNamespace();
@@ -449,18 +334,11 @@ public class PacketParserUtils {
for (int i = 0; i < parser.getAttributeCount(); i++) {
xml.attribute(parser.getAttributeName(i), parser.getAttributeValue(i));
}
- if (parser.isEmptyElementTag()) {
- xml.closeEmptyElement();
- isEmptyElement = true;
- }
- else {
- xml.rightAngleBracket();
- }
break;
- case XmlPullParser.END_TAG:
- if (isEmptyElement) {
- // Do nothing as the element was already closed, just reset the flag
- isEmptyElement = false;
+ case END_ELEMENT:
+ if (startElementJustSeen) {
+ xml.closeEmptyElement();
+ startElementJustSeen = false;
}
else {
xml.closeElement(parser.getName());
@@ -474,9 +352,16 @@ public class PacketParserUtils {
break outerloop;
}
break;
- case XmlPullParser.TEXT:
+ case TEXT_CHARACTERS:
+ if (startElementJustSeen) {
+ startElementJustSeen = false;
+ xml.rightAngleBracket();
+ }
xml.escape(parser.getText());
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
event = parser.next();
}
@@ -485,20 +370,39 @@ public class PacketParserUtils {
private static CharSequence parseContentDepthWithRoundtrip(XmlPullParser parser, int depth, boolean fullNamespaces)
throws XmlPullParserException, IOException {
- StringBuilder sb = new StringBuilder();
- int event = parser.getEventType();
+ XmlStringBuilder sb = new XmlStringBuilder();
+ XmlPullParser.Event event = parser.getEventType();
+ boolean startElementJustSeen = false;
outerloop: while (true) {
- // Only append the text if the parser is not on on an empty element' start tag. Empty elements are reported
- // twice, so in order to prevent duplication we only add their text when we are on their end tag.
- if (!(event == XmlPullParser.START_TAG && parser.isEmptyElementTag())) {
+ switch (event) {
+ case START_ELEMENT:
+ if (startElementJustSeen) {
+ sb.rightAngleBracket();
+ }
+ startElementJustSeen = true;
+ break;
+ case END_ELEMENT:
+ boolean isEmptyElement = false;
+ if (startElementJustSeen) {
+ isEmptyElement = true;
+ startElementJustSeen = false;
+ }
+ if (!isEmptyElement) {
+ String text = parser.getText();
+ sb.append(text);
+ }
+ if (parser.getDepth() <= depth) {
+ break outerloop;
+ }
+ break;
+ default:
+ startElementJustSeen = false;
CharSequence text = parser.getText();
- if (event == XmlPullParser.TEXT) {
- text = StringUtils.escapeForXmlText(text);
+ if (event == XmlPullParser.Event.TEXT_CHARACTERS) {
+ text = StringUtils.escapeForXml(text);
}
sb.append(text);
- }
- if (event == XmlPullParser.END_TAG && parser.getDepth() <= depth) {
- break outerloop;
+ break;
}
event = parser.next();
}
@@ -543,9 +447,9 @@ public class PacketParserUtils {
// Parse sub-elements
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String elementName = parser.getName();
String namespace = parser.getNamespace();
switch (elementName) {
@@ -587,11 +491,14 @@ public class PacketParserUtils {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
return presence;
@@ -622,10 +529,10 @@ public class PacketParserUtils {
final IQ.Type type = IQ.Type.fromString(parser.getAttributeValue("", "type"));
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String elementName = parser.getName();
String namespace = parser.getNamespace();
switch (elementName) {
@@ -640,7 +547,7 @@ public class PacketParserUtils {
iqPacket = provider.parse(parser, outerXmlEnvironment);
}
// Note that if we reach this code, it is guranteed that the result IQ contained a child element
- // (RFC 6120 § 8.2.3 6) because otherwhise we would have reached the END_TAG first.
+ // (RFC 6120 § 8.2.3 6) because otherwhise we would have reached the END_ELEMENT first.
else {
// No Provider found for the IQ stanza, parse it to an UnparsedIQ instance
// so that the content of the IQ can be examined later on
@@ -649,11 +556,14 @@ public class PacketParserUtils {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
// Decide what to do when an IQ packet was not understood
@@ -694,15 +604,15 @@ public class PacketParserUtils {
List mechanisms = new ArrayList();
boolean done = false;
while (!done) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
- if (eventType == XmlPullParser.START_TAG) {
+ if (eventType == XmlPullParser.Event.START_ELEMENT) {
String elementName = parser.getName();
if (elementName.equals("mechanism")) {
mechanisms.add(parser.nextText());
}
}
- else if (eventType == XmlPullParser.END_TAG) {
+ else if (eventType == XmlPullParser.Event.END_ELEMENT) {
if (parser.getName().equals("mechanisms")) {
done = true;
}
@@ -721,14 +631,14 @@ public class PacketParserUtils {
*/
public static Compress.Feature parseCompressionFeature(XmlPullParser parser)
throws IOException, XmlPullParserException {
- assert (parser.getEventType() == XmlPullParser.START_TAG);
+ assert (parser.getEventType() == XmlPullParser.Event.START_ELEMENT);
String name;
final int initialDepth = parser.getDepth();
List methods = new LinkedList<>();
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
name = parser.getName();
switch (name) {
case "method":
@@ -736,7 +646,7 @@ public class PacketParserUtils {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
name = parser.getName();
switch (name) {
case Compress.Feature.ELEMENT:
@@ -744,9 +654,13 @@ public class PacketParserUtils {
break outerloop;
}
}
+ break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
- assert (parser.getEventType() == XmlPullParser.END_TAG);
+ assert (parser.getEventType() == XmlPullParser.Event.END_ELEMENT);
assert (parser.getDepth() == initialDepth);
return new Compress.Feature(methods);
}
@@ -782,9 +696,9 @@ public class PacketParserUtils {
String condition = null;
Map descriptiveTexts = null;
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String name = parser.getName();
if (name.equals("text")) {
descriptiveTexts = parseDescriptiveTexts(parser, descriptiveTexts);
@@ -794,11 +708,14 @@ public class PacketParserUtils {
condition = parser.getName();
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
return new SASLFailure(condition, descriptiveTexts);
@@ -826,9 +743,9 @@ public class PacketParserUtils {
String conditionText = null;
XmlEnvironment streamErrorXmlEnvironment = XmlEnvironment.from(parser, outerXmlEnvironment);
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String name = parser.getName();
String namespace = parser.getNamespace();
switch (namespace) {
@@ -841,8 +758,9 @@ public class PacketParserUtils {
// If it's not a text element, that is qualified by the StreamError.NAMESPACE,
// then it has to be the stream error code
condition = StreamError.Condition.fromString(name);
- if (!parser.isEmptyElementTag()) {
- conditionText = parser.nextText();
+ conditionText = parser.nextText();
+ if (conditionText.isEmpty()) {
+ conditionText = null;
}
break;
}
@@ -852,11 +770,14 @@ public class PacketParserUtils {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
return new StreamError(condition, conditionText, descriptiveTexts, extensions);
@@ -888,9 +809,9 @@ public class PacketParserUtils {
builder.setErrorGenerator(parser.getAttributeValue("", "by"));
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String name = parser.getName();
String namespace = parser.getNamespace();
switch (namespace) {
@@ -901,8 +822,9 @@ public class PacketParserUtils {
break;
default:
builder.setCondition(StanzaError.Condition.fromString(name));
- if (!parser.isEmptyElementTag()) {
- builder.setConditionText(parser.nextText());
+ String conditionText = parser.nextText();
+ if (!conditionText.isEmpty()) {
+ builder.setConditionText(conditionText);
}
break;
}
@@ -911,10 +833,14 @@ public class PacketParserUtils {
PacketParserUtils.addExtensionElement(extensions, parser, name, namespace, stanzaErrorXmlEnvironment);
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
+ break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
builder.setExtensions(extensions).setDescriptiveTexts(descriptiveTexts);
@@ -949,14 +875,14 @@ public class PacketParserUtils {
public static StartTls parseStartTlsFeature(XmlPullParser parser)
throws XmlPullParserException, IOException {
- assert (parser.getEventType() == XmlPullParser.START_TAG);
+ assert (parser.getEventType() == XmlPullParser.Event.START_ELEMENT);
assert (parser.getNamespace().equals(StartTls.NAMESPACE));
int initalDepth = parser.getDepth();
boolean required = false;
outerloop: while (true) {
- int event = parser.next();
+ XmlPullParser.Event event = parser.next();
switch (event) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String name = parser.getName();
switch (name) {
case "required":
@@ -964,13 +890,17 @@ public class PacketParserUtils {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initalDepth) {
break outerloop;
}
+ break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
- assert (parser.getEventType() == XmlPullParser.END_TAG);
+ assert (parser.getEventType() == XmlPullParser.Event.END_ELEMENT);
return new StartTls(required);
}
@@ -978,14 +908,11 @@ public class PacketParserUtils {
ParserUtils.assertAtStartTag(parser);
final int initialDepth = parser.getDepth();
boolean optional = false;
- if (parser.isEmptyElementTag()) {
- return new Session.Feature(optional);
- }
outerloop: while (true) {
- int event = parser.next();
+ XmlPullParser.Event event = parser.next();
switch (event) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String name = parser.getName();
switch (name) {
case Session.Feature.OPTIONAL_ELEMENT:
@@ -993,10 +920,14 @@ public class PacketParserUtils {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
+ break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/ParserUtils.java b/smack-core/src/main/java/org/jivesoftware/smack/util/ParserUtils.java
index 2a06c9c3c..61a56e0f3 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/util/ParserUtils.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/util/ParserUtils.java
@@ -29,6 +29,8 @@ import javax.xml.namespace.QName;
import org.jivesoftware.smack.parsing.SmackParsingException;
import org.jivesoftware.smack.parsing.SmackParsingException.SmackTextParseException;
import org.jivesoftware.smack.parsing.SmackParsingException.SmackUriSyntaxParsingException;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
import org.jxmpp.jid.EntityBareJid;
import org.jxmpp.jid.EntityFullJid;
@@ -38,8 +40,6 @@ import org.jxmpp.jid.impl.JidCreate;
import org.jxmpp.jid.parts.Resourcepart;
import org.jxmpp.stringprep.XmppStringprepException;
import org.jxmpp.util.XmppDateTime;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
public class ParserUtils {
@@ -49,7 +49,7 @@ public class ParserUtils {
public static final String JID = "jid";
public static void assertAtStartTag(XmlPullParser parser) throws XmlPullParserException {
- assert (parser.getEventType() == XmlPullParser.START_TAG);
+ assert (parser.getEventType() == XmlPullParser.Event.START_ELEMENT);
}
public static void assertAtStartTag(XmlPullParser parser, String name) throws XmlPullParserException {
@@ -58,13 +58,13 @@ public class ParserUtils {
}
public static void assertAtEndTag(XmlPullParser parser) throws XmlPullParserException {
- assert (parser.getEventType() == XmlPullParser.END_TAG);
+ assert (parser.getEventType() == XmlPullParser.Event.END_ELEMENT);
}
public static void forwardToEndTagOfDepth(XmlPullParser parser, int depth)
throws XmlPullParserException, IOException {
- int event = parser.getEventType();
- while (!(event == XmlPullParser.END_TAG && parser.getDepth() == depth)) {
+ XmlPullParser.Event event = parser.getEventType();
+ while (!(event == XmlPullParser.Event.END_ELEMENT && parser.getDepth() == depth)) {
event = parser.next();
}
}
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/compress/provider/FailureProviderTest.java b/smack-core/src/test/java/org/jivesoftware/smack/compress/provider/FailureProviderTest.java
index 6e2c3a781..ee75ac468 100644
--- a/smack-core/src/test/java/org/jivesoftware/smack/compress/provider/FailureProviderTest.java
+++ b/smack-core/src/test/java/org/jivesoftware/smack/compress/provider/FailureProviderTest.java
@@ -1,6 +1,6 @@
/**
*
- * Copyright 2018 Florian Schmaus
+ * Copyright 2018-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.
@@ -22,9 +22,9 @@ import org.jivesoftware.smack.compress.packet.Failure;
import org.jivesoftware.smack.packet.StanzaError;
import org.jivesoftware.smack.packet.StanzaError.Condition;
import org.jivesoftware.smack.util.PacketParserUtils;
+import org.jivesoftware.smack.xml.XmlPullParser;
import org.junit.Test;
-import org.xmlpull.v1.XmlPullParser;
public class FailureProviderTest {
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/packet/StreamErrorTest.java b/smack-core/src/test/java/org/jivesoftware/smack/packet/StreamErrorTest.java
index 515053714..76682f07f 100644
--- a/smack-core/src/test/java/org/jivesoftware/smack/packet/StreamErrorTest.java
+++ b/smack-core/src/test/java/org/jivesoftware/smack/packet/StreamErrorTest.java
@@ -18,19 +18,25 @@ package org.jivesoftware.smack.packet;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
+
+import java.io.IOException;
import org.jivesoftware.smack.packet.StreamError.Condition;
+import org.jivesoftware.smack.parsing.SmackParsingException;
+import org.jivesoftware.smack.test.util.SmackTestUtil;
import org.jivesoftware.smack.util.PacketParserUtils;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
-import org.junit.Test;
-import org.xmlpull.v1.XmlPullParser;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
public class StreamErrorTest {
- @Test
- public void testParsingOfSimpleStreamError() {
- StreamError error = null;
+ @ParameterizedTest
+ @EnumSource(SmackTestUtil.XmlPullParserKind.class)
+ public void testParsingOfSimpleStreamError(SmackTestUtil.XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
final String xml =
// Usually the stream:stream element has more attributes (to, version, ...)
// We omit those, since they are not relevant for testing
@@ -39,19 +45,17 @@ public class StreamErrorTest {
" +" +
"" +
"";
- try {
- XmlPullParser parser = PacketParserUtils.getParserFor(xml, "error");
- error = PacketParserUtils.parseStreamError(parser);
- } catch (Exception e) {
- fail(e.getMessage());
- }
+
+ XmlPullParser parser = SmackTestUtil.getParserFor(xml, "error", parserKind);
+ StreamError error = PacketParserUtils.parseStreamError(parser);
+
assertNotNull(error);
assertEquals(Condition.conflict, error.getCondition());
}
- @Test
- public void testParsingOfStreamErrorWithText() {
- StreamError error = null;
+ @ParameterizedTest
+ @EnumSource(SmackTestUtil.XmlPullParserKind.class)
+ public void testParsingOfStreamErrorWithText(SmackTestUtil.XmlPullParserKind parserKind) throws XmlPullParserException, IOException, SmackParsingException {
final String xml =
// Usually the stream:stream element has more attributes (to, version, ...)
// We omit those, since they are not relevant for testing
@@ -63,20 +67,19 @@ public class StreamErrorTest {
"" +
"" +
"";
- try {
- XmlPullParser parser = PacketParserUtils.getParserFor(xml, "error");
- error = PacketParserUtils.parseStreamError(parser);
- } catch (Exception e) {
- fail(e.getMessage());
- }
+
+ XmlPullParser parser = SmackTestUtil.getParserFor(xml, "error", parserKind);
+ StreamError error = PacketParserUtils.parseStreamError(parser);
+
assertNotNull(error);
assertEquals(Condition.conflict, error.getCondition());
assertEquals("Replaced by new connection", error.getDescriptiveText());
}
- @Test
- public void testParsingOfStreamErrorWithTextAndOptionalElement() {
- StreamError error = null;
+ @ParameterizedTest
+ @EnumSource(SmackTestUtil.XmlPullParserKind.class)
+ public void testParsingOfStreamErrorWithTextAndOptionalElement(SmackTestUtil.XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
final String xml =
// Usually the stream:stream element has more attributes (to, version, ...)
// We omit those, since they are not relevant for testing
@@ -91,12 +94,10 @@ public class StreamErrorTest {
"" +
"" +
"";
- try {
- XmlPullParser parser = PacketParserUtils.getParserFor(xml, "error");
- error = PacketParserUtils.parseStreamError(parser);
- } catch (Exception e) {
- fail(e.getMessage());
- }
+
+ XmlPullParser parser = SmackTestUtil.getParserFor(xml, "error", parserKind);
+ StreamError error = PacketParserUtils.parseStreamError(parser);
+
assertNotNull(error);
assertEquals(Condition.conflict, error.getCondition());
assertEquals("Replaced by new connection", error.getDescriptiveText());
@@ -104,21 +105,20 @@ public class StreamErrorTest {
assertNotNull(appSpecificElement);
}
- @Test
- public void testStreamErrorXmlNotWellFormed() {
- StreamError error = null;
+ @ParameterizedTest
+ @EnumSource(SmackTestUtil.XmlPullParserKind.class)
+ public void testStreamErrorXmlNotWellFormed(SmackTestUtil.XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
final String xml =
// Usually the stream:stream element has more attributes (to, version, ...)
// We omit those, since they are not relevant for testing
"" +
"" +
"";
- try {
- XmlPullParser parser = PacketParserUtils.getParserFor(xml, "error");
- error = PacketParserUtils.parseStreamError(parser);
- } catch (Exception e) {
- fail(e.getMessage());
- }
+
+ XmlPullParser parser = SmackTestUtil.getParserFor(xml, "error", parserKind);
+ StreamError error = PacketParserUtils.parseStreamError(parser);
+
assertNotNull(error);
assertEquals(Condition.not_well_formed, error.getCondition());
}
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/parsing/ParsingExceptionTest.java b/smack-core/src/test/java/org/jivesoftware/smack/parsing/ParsingExceptionTest.java
index db3283c3e..c8673bc0c 100644
--- a/smack-core/src/test/java/org/jivesoftware/smack/parsing/ParsingExceptionTest.java
+++ b/smack-core/src/test/java/org/jivesoftware/smack/parsing/ParsingExceptionTest.java
@@ -27,11 +27,11 @@ import org.jivesoftware.smack.provider.ExtensionElementProvider;
import org.jivesoftware.smack.provider.ProviderManager;
import org.jivesoftware.smack.test.util.TestUtils;
import org.jivesoftware.smack.util.PacketParserUtils;
+import org.jivesoftware.smack.xml.XmlPullParser;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import org.xmlpull.v1.XmlPullParser;
public class ParsingExceptionTest {
@@ -39,6 +39,7 @@ public class ParsingExceptionTest {
"" +
"" +
"" +
+ "text content" +
"" +
"" +
"";
@@ -57,8 +58,7 @@ public class ParsingExceptionTest {
public void consumeUnparsedInput() throws Exception {
final String MESSAGE_EXCEPTION_ELEMENT =
"<" + ThrowException.ELEMENT + " xmlns='" + ThrowException.NAMESPACE + "'>" +
- "" +
- "" +
+ "" +
"" + ThrowException.ELEMENT + ">";
XmlPullParser parser = TestUtils.getMessageParser(
"" +
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderConfigTest.java b/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderConfigTest.java
index 56da18453..b66024509 100644
--- a/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderConfigTest.java
+++ b/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderConfigTest.java
@@ -22,10 +22,10 @@ import java.util.Collection;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.XmlEnvironment;
import org.jivesoftware.smack.util.FileUtils;
+import org.jivesoftware.smack.xml.XmlPullParser;
import org.junit.Assert;
import org.junit.Test;
-import org.xmlpull.v1.XmlPullParser;
public class ProviderConfigTest {
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderManagerTest.java b/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderManagerTest.java
index b3c5ebe9f..5210e6344 100644
--- a/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderManagerTest.java
+++ b/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderManagerTest.java
@@ -21,9 +21,9 @@ import static org.junit.Assert.assertTrue;
import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.XmlEnvironment;
+import org.jivesoftware.smack.xml.XmlPullParser;
import org.junit.Test;
-import org.xmlpull.v1.XmlPullParser;
public class ProviderManagerTest {
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/sasl/DigestMd5SaslTest.java b/smack-core/src/test/java/org/jivesoftware/smack/sasl/DigestMd5SaslTest.java
index 0288a55c4..adf5b2bb5 100644
--- a/smack-core/src/test/java/org/jivesoftware/smack/sasl/DigestMd5SaslTest.java
+++ b/smack-core/src/test/java/org/jivesoftware/smack/sasl/DigestMd5SaslTest.java
@@ -1,6 +1,6 @@
/**
*
- * Copyright © 2014-2017 Florian Schmaus
+ * Copyright © 2014-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.
@@ -16,8 +16,8 @@
*/
package org.jivesoftware.smack.sasl;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/test/util/SmackTestUtil.java b/smack-core/src/test/java/org/jivesoftware/smack/test/util/SmackTestUtil.java
new file mode 100644
index 000000000..cfa0b114e
--- /dev/null
+++ b/smack-core/src/test/java/org/jivesoftware/smack/test/util/SmackTestUtil.java
@@ -0,0 +1,165 @@
+/**
+ *
+ * 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.test.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.lang.reflect.InvocationTargetException;
+import java.nio.charset.StandardCharsets;
+import java.util.function.Predicate;
+
+import javax.xml.namespace.QName;
+
+import org.jivesoftware.smack.packet.Element;
+import org.jivesoftware.smack.parsing.SmackParsingException;
+import org.jivesoftware.smack.provider.Provider;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParserFactory;
+import org.jivesoftware.smack.xml.stax.StaxXmlPullParserFactory;
+import org.jivesoftware.smack.xml.xpp3.Xpp3XmlPullParserFactory;
+
+public class SmackTestUtil {
+
+ @SuppressWarnings("ImmutableEnumChecker")
+ public enum XmlPullParserKind {
+ StAX(StaxXmlPullParserFactory.class),
+ XPP3(Xpp3XmlPullParserFactory.class),
+ ;
+
+ public final XmlPullParserFactory factory;
+
+ XmlPullParserKind(Class extends XmlPullParserFactory> factoryClass) {
+ try {
+ factory = factoryClass.getDeclaredConstructor().newInstance();
+ }
+ catch (InstantiationException | IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException | NoSuchMethodException | SecurityException e) {
+ throw new AssertionError(e);
+ }
+ }
+ }
+
+ public static > E parse(CharSequence xml, Class providerClass, XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
+ P provider = providerClassToProvider(providerClass);
+ return parse(xml, provider, parserKind);
+ }
+
+ public static > E parse(InputStream inputStream, Class providerClass, XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
+ P provider = providerClassToProvider(providerClass);
+ return parse(inputStream, provider, parserKind);
+ }
+
+ public static > E parse(Reader reader, Class providerClass, XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
+ P provider = providerClassToProvider(providerClass);
+ return parse(reader, provider, parserKind);
+ }
+
+ public static E parse(CharSequence xml, Provider provider, XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
+ String xmlString = xml.toString();
+ Reader reader = new StringReader(xmlString);
+ return parse(reader, provider, parserKind);
+ }
+
+ public static E parse(InputStream inputStream, Provider provider, XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
+ InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
+ return parse(inputStreamReader, provider, parserKind);
+ }
+
+ public static E parse(Reader reader, Provider provider, XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
+ XmlPullParser parser = getParserFor(reader, parserKind);
+ E element = provider.parse(parser);
+ return element;
+ }
+
+ public static XmlPullParser getParserFor(String xml, XmlPullParserKind parserKind) throws XmlPullParserException, IOException {
+ Reader reader = new StringReader(xml);
+ return getParserFor(reader, parserKind);
+ }
+
+ public static XmlPullParser getParserFor(InputStream inputStream, XmlPullParserKind parserKind) throws XmlPullParserException, IOException {
+ InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
+ return getParserFor(inputStreamReader, parserKind);
+ }
+
+ public static XmlPullParser getParserFor(Reader reader, XmlPullParserKind parserKind) throws XmlPullParserException, IOException {
+ XmlPullParser parser = parserKind.factory.newXmlPullParser(reader);
+ forwardParserToStartElement(parser);
+ return parser;
+ }
+
+ public static XmlPullParser getParserFor(String xml, QName startTagQName, XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException {
+ XmlPullParser parser = getParserFor(xml, parserKind);
+ forwardParserToStartElement(parser, (p) -> p.getQName().equals(startTagQName));
+ return parser;
+ }
+
+ public static XmlPullParser getParserFor(String xml, String startTagLocalpart, XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException {
+ XmlPullParser parser = getParserFor(xml, parserKind);
+ forwardParserToStartElement(parser, (p) -> p.getName().equals(startTagLocalpart));
+ return parser;
+ }
+
+ private static > P providerClassToProvider(Class providerClass) {
+ P provider;
+ // TODO: Consider adding a shortcut in case there is a static INSTANCE field holding an instance of the
+ // requested provider.
+ try {
+ provider = providerClass.getDeclaredConstructor().newInstance();
+ }
+ catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+ | NoSuchMethodException | SecurityException e) {
+ throw new AssertionError(e);
+ }
+ return provider;
+ }
+
+ private static void forwardParserToStartElement(XmlPullParser parser) throws XmlPullParserException, IOException {
+ forwardParserToStartElement(parser, p -> true);
+ }
+
+ private static void forwardParserToStartElement(XmlPullParser parser,
+ Predicate doneForwarding) throws XmlPullParserException, IOException {
+ outerloop: while (true) {
+ XmlPullParser.Event event = parser.getEventType();
+ switch (event) {
+ case START_ELEMENT:
+ if (doneForwarding.test(parser)) {
+ break outerloop;
+ }
+ break;
+ case END_DOCUMENT:
+ throw new IllegalArgumentException("Not matching START_ELEMENT found");
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
+ }
+ parser.next();
+ }
+ }
+}
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/test/util/TestUtils.java b/smack-core/src/test/java/org/jivesoftware/smack/test/util/TestUtils.java
index b6a94d2a9..a1ebdc9ac 100644
--- a/smack-core/src/test/java/org/jivesoftware/smack/test/util/TestUtils.java
+++ b/smack-core/src/test/java/org/jivesoftware/smack/test/util/TestUtils.java
@@ -20,14 +20,11 @@ import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
-import org.jivesoftware.smack.packet.ExtensionElement;
-import org.jivesoftware.smack.packet.XmlEnvironment;
-import org.jivesoftware.smack.util.PacketParserUtils;
-import org.jivesoftware.smack.util.ParserUtils;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.SmackXmlParser;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
+// TODO: Remove this class and replace it with SmackTestUtil.
public final class TestUtils {
private TestUtils() {
}
@@ -52,12 +49,12 @@ public final class TestUtils {
return getParser(new StringReader(string), startTag);
}
- public static XmlPullParser getParser(Reader reader, String startTag) {
+ private static XmlPullParser getParser(Reader reader, String startTag) {
XmlPullParser parser;
try {
- parser = PacketParserUtils.newXmppParser(reader);
+ parser = SmackXmlParser.newXmlParser(reader);
if (startTag == null) {
- while (parser.getEventType() != XmlPullParser.START_TAG) {
+ while (parser.getEventType() != XmlPullParser.Event.START_ELEMENT) {
parser.next();
}
return parser;
@@ -65,7 +62,7 @@ public final class TestUtils {
boolean found = false;
while (!found) {
- if ((parser.next() == XmlPullParser.START_TAG) && parser.getName().equals(startTag))
+ if ((parser.next() == XmlPullParser.Event.START_ELEMENT) && parser.getName().equals(startTag))
found = true;
}
@@ -79,17 +76,4 @@ public final class TestUtils {
return parser;
}
- public static EE parseExtensionElement(String elementString)
- throws Exception {
- return parseExtensionElement(getParser(elementString), null);
- }
-
- @SuppressWarnings("unchecked")
- public static EE parseExtensionElement(XmlPullParser parser, XmlEnvironment outerXmlEnvironment)
- throws Exception {
- ParserUtils.assertAtStartTag(parser);
- final String elementName = parser.getName();
- final String namespace = parser.getNamespace();
- return (EE) PacketParserUtils.parseExtensionElement(elementName, namespace, parser, outerXmlEnvironment);
- }
}
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/util/PacketParserUtilsTest.java b/smack-core/src/test/java/org/jivesoftware/smack/util/PacketParserUtilsTest.java
index c2ed877f5..1f23eed5a 100644
--- a/smack-core/src/test/java/org/jivesoftware/smack/util/PacketParserUtilsTest.java
+++ b/smack-core/src/test/java/org/jivesoftware/smack/util/PacketParserUtilsTest.java
@@ -29,6 +29,8 @@ import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
+import java.util.function.Supplier;
+import java.util.stream.Stream;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
@@ -42,15 +44,18 @@ import org.jivesoftware.smack.packet.StreamOpen;
import org.jivesoftware.smack.sasl.SASLError;
import org.jivesoftware.smack.sasl.packet.SaslStreamElements;
import org.jivesoftware.smack.sasl.packet.SaslStreamElements.SASLFailure;
+import org.jivesoftware.smack.test.util.SmackTestUtil;
import org.jivesoftware.smack.test.util.TestUtils;
import org.jivesoftware.smack.test.util.XmlUnitUtils;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
import com.jamesmurty.utils.XMLBuilder;
import org.junit.Ignore;
import org.junit.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
import org.xml.sax.SAXException;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
public class PacketParserUtilsTest {
@@ -59,8 +64,9 @@ public class PacketParserUtilsTest {
outputProperties.put(javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, "yes");
}
- @Test
- public void singleMessageBodyTest() throws Exception {
+ @ParameterizedTest
+ @EnumSource(SmackTestUtil.XmlPullParserKind.class)
+ public void singleMessageBodyTest(SmackTestUtil.XmlPullParserKind parserKind) throws Exception {
String defaultLanguage = Stanza.getDefaultLanguage();
String otherLanguage = determineNonDefaultLanguage();
@@ -79,7 +85,7 @@ public class PacketParserUtilsTest {
.asString(outputProperties);
Message message = PacketParserUtils
- .parseMessage(PacketParserUtils.getParserFor(control));
+ .parseMessage(SmackTestUtil.getParserFor(control, parserKind));
assertEquals(defaultLanguage, message.getBody());
assertTrue(message.getBodyLanguages().isEmpty());
@@ -99,7 +105,7 @@ public class PacketParserUtilsTest {
.t(otherLanguage)
.asString(outputProperties);
- message = PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(control));
+ message = PacketParserUtils.parseMessage(SmackTestUtil.getParserFor(control, parserKind));
assertEquals(otherLanguage, message.getBody());
assertTrue(message.getBodyLanguages().isEmpty());
@@ -118,7 +124,7 @@ public class PacketParserUtilsTest {
.t(defaultLanguage)
.asString(outputProperties);
- message = PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(control));
+ message = PacketParserUtils.parseMessage(SmackTestUtil.getParserFor(control, parserKind));
assertEquals(defaultLanguage, message.getBody());
assertTrue(message.getBodyLanguages().isEmpty());
@@ -138,7 +144,7 @@ public class PacketParserUtilsTest {
.t(defaultLanguage)
.asString(outputProperties);
- message = PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(control));
+ message = PacketParserUtils.parseMessage(SmackTestUtil.getParserFor(control, parserKind));
assertNull(message.getBody());
assertFalse(message.getBodyLanguages().isEmpty());
@@ -159,7 +165,7 @@ public class PacketParserUtilsTest {
.t(otherLanguage)
.asString(outputProperties);
- message = PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(control));
+ message = PacketParserUtils.parseMessage(SmackTestUtil.getParserFor(control, parserKind));
assertNull(message.getBody());
assertFalse(message.getBodyLanguages().isEmpty());
@@ -181,7 +187,7 @@ public class PacketParserUtilsTest {
.t(otherLanguage)
.asString(outputProperties);
- message = PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(control));
+ message = PacketParserUtils.parseMessage(SmackTestUtil.getParserFor(control, parserKind));
assertNull(message.getBody());
assertFalse(message.getBodyLanguages().isEmpty());
@@ -203,7 +209,7 @@ public class PacketParserUtilsTest {
.t(defaultLanguage)
.asString(outputProperties);
- message = PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(control));
+ message = PacketParserUtils.parseMessage(SmackTestUtil.getParserFor(control, parserKind));
assertNull(message.getBody());
assertFalse(message.getBodyLanguages().isEmpty());
@@ -708,13 +714,18 @@ public class PacketParserUtilsTest {
.t("Good Message Body")
.asString(outputProperties);
+ // XPP3 writes "end tag", StAX writes "end-tag".
+ Supplier> expectedContentOfExceptionMessage = () -> Stream.of("end tag", "end-tag");
+
String invalidControl = validControl.replace("Good Message Body", "Bad Body");
try {
PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(invalidControl));
fail("Exception should be thrown");
} catch (XmlPullParserException e) {
- assertTrue(e.getMessage().contains("end tag name "));
+ String exceptionMessage = e.getMessage();
+ boolean expectedContentFound = expectedContentOfExceptionMessage.get().anyMatch((expected) -> exceptionMessage.contains(expected));
+ assertTrue(expectedContentFound);
}
invalidControl = validControl.replace("Good Message Body", "Bad