1
0
Fork 0
mirror of https://codeberg.org/Mercury-IM/Smack synced 2025-09-09 18:29:45 +02:00

Rework exceptions in the parsing / provider subsystem

This commit is contained in:
Florian Schmaus 2019-02-05 10:41:50 +01:00
parent 4c42d0cd32
commit 083dac8b83
130 changed files with 504 additions and 342 deletions

View file

@ -33,6 +33,7 @@ import java.security.SecureRandom;
import java.security.Security;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@ -124,6 +125,7 @@ import org.jxmpp.jid.parts.Resourcepart;
import org.jxmpp.util.XmppStringUtils;
import org.minidns.dnsname.DnsName;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
/**
@ -1161,7 +1163,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
return successNonza;
}
protected final void parseAndProcessNonza(XmlPullParser parser) throws SmackException {
protected final void parseAndProcessNonza(XmlPullParser parser) throws IOException, XmlPullParserException, ParseException {
final String element = parser.getName();
final String namespace = parser.getNamespace();
final String key = XmppStringUtils.generateKey(element, namespace);
@ -1181,18 +1183,13 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
return;
}
Nonza nonza;
try {
nonza = nonzaProvider.parse(parser);
}
catch (Exception e) {
throw new SmackException(e);
}
Nonza nonza = nonzaProvider.parse(parser);
nonzaCallback.onNonzaReceived(nonza);
}
protected void parseAndProcessStanza(XmlPullParser parser) throws Exception {
protected void parseAndProcessStanza(XmlPullParser parser)
throws XmlPullParserException, IOException, InterruptedException {
ParserUtils.assertAtStartTag(parser);
int parserDepth = parser.getDepth();
Stanza stanza = null;
@ -1566,7 +1563,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
return this.fromMode;
}
protected final void parseFeatures(XmlPullParser parser) throws Exception {
protected final void parseFeatures(XmlPullParser parser) throws XmlPullParserException, IOException, ParseException {
streamFeatures.clear();
final int initialDepth = parser.getDepth();
while (true) {

View file

@ -16,6 +16,8 @@
*/
package org.jivesoftware.smack.compress.provider;
import java.io.IOException;
import java.text.ParseException;
import java.util.logging.Logger;
import org.jivesoftware.smack.compress.packet.Failure;
@ -25,6 +27,7 @@ import org.jivesoftware.smack.provider.NonzaProvider;
import org.jivesoftware.smack.util.PacketParserUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
public final class FailureProvider extends NonzaProvider<Failure> {
@ -36,7 +39,7 @@ public final class FailureProvider extends NonzaProvider<Failure> {
}
@Override
public Failure parse(XmlPullParser parser, int initialDepth) throws Exception {
public Failure parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException, ParseException {
Failure.CompressFailureError compressFailureError = null;
StanzaError stanzaError = null;

View file

@ -17,6 +17,7 @@
package org.jivesoftware.smack.fsm;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@ -59,6 +60,7 @@ import org.jivesoftware.smack.util.PacketParserUtils;
import org.jxmpp.jid.parts.Resourcepart;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
public abstract class AbstractXmppStateMachineConnection extends AbstractXMPPConnection {
@ -301,7 +303,8 @@ public abstract class AbstractXmppStateMachineConnection extends AbstractXMPPCon
}
}
protected final void parseAndProcessElement(String element) throws Exception {
protected final void parseAndProcessElement(String element) throws XmlPullParserException, IOException,
InterruptedException, StreamErrorException, SmackException, ParseException {
XmlPullParser parser = PacketParserUtils.getParserFor(element);
// Skip the enclosing stream open what is guaranteed to be there.

View file

@ -1,6 +1,6 @@
/**
*
* Copyright 2013-2015 Florian Schmaus.
* Copyright 2013-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.
@ -32,7 +32,7 @@ public class ExceptionLoggingCallback implements ParsingExceptionCallback {
private static final Logger LOGGER = Logger.getLogger(ExceptionLoggingCallback.class.getName());
@Override
public void handleUnparsableStanza(UnparseableStanza unparsed) throws Exception {
public void handleUnparsableStanza(UnparseableStanza unparsed) {
LOGGER.log(Level.SEVERE, "Smack message parsing exception. Content: '" + unparsed.getContent() + "'", unparsed.getParsingException());
}
}

View file

@ -1,6 +1,6 @@
/**
*
* Copyright 2013-2015 Florian Schmaus.
* Copyright 2013-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.
@ -17,6 +17,8 @@
package org.jivesoftware.smack.parsing;
import java.io.IOException;
import org.jivesoftware.smack.ConnectionListener;
import org.jivesoftware.smack.UnparseableStanza;
@ -30,7 +32,7 @@ import org.jivesoftware.smack.UnparseableStanza;
public class ExceptionThrowingCallback implements ParsingExceptionCallback {
@Override
public void handleUnparsableStanza(UnparseableStanza packetData) throws Exception {
throw packetData.getParsingException();
public void handleUnparsableStanza(UnparseableStanza packetData) throws IOException {
throw new IOException(packetData.getParsingException());
}
}

View file

@ -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.
@ -17,6 +17,7 @@
package org.jivesoftware.smack.parsing;
import java.io.IOException;
import java.util.logging.Logger;
import org.jivesoftware.smack.UnparseableStanza;
@ -32,7 +33,7 @@ public class ExceptionThrowingCallbackWithHint extends ExceptionThrowingCallback
private static final Logger LOGGER = Logger.getLogger(ExceptionThrowingCallbackWithHint.class.getName());
@Override
public void handleUnparsableStanza(UnparseableStanza packetData) throws Exception {
public void handleUnparsableStanza(UnparseableStanza packetData) throws IOException {
LOGGER.warning("Parsing exception encountered."
+ " This exception will be re-thrown, leading to a disconnect."
+ " You can change this behavior by setting a different ParsingExceptionCallback using setParsingExceptionCallback()."

View file

@ -1,6 +1,6 @@
/**
*
* Copyright 2013-2015 Florian Schmaus.
* Copyright 2013-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,6 +16,8 @@
*/
package org.jivesoftware.smack.parsing;
import java.io.IOException;
import org.jivesoftware.smack.UnparseableStanza;
/**
@ -37,8 +39,8 @@ public interface ParsingExceptionCallback {
* Called when parsing a stanza caused an exception.
*
* @param stanzaData the raw stanza data that caused the exception
* @throws Exception
* @throws IOException
*/
void handleUnparsableStanza(UnparseableStanza stanzaData) throws Exception;
void handleUnparsableStanza(UnparseableStanza stanzaData) throws IOException;
}

View file

@ -1,6 +1,6 @@
/**
*
* Copyright © 2003-2007 Jive Software, 2014 Florian Schmaus
* Copyright © 2003-2007 Jive Software, 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.
@ -18,7 +18,6 @@ package org.jivesoftware.smack.provider;
import java.io.IOException;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.packet.Bind;
import org.jxmpp.jid.EntityFullJid;
@ -30,8 +29,7 @@ import org.xmlpull.v1.XmlPullParserException;
public class BindIQProvider extends IQProvider<Bind> {
@Override
public Bind parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException,
SmackException {
public Bind parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException {
String name;
Bind bind = null;
outerloop: while (true) {

View file

@ -18,15 +18,18 @@ package org.jivesoftware.smack.provider;
import static org.jivesoftware.smack.util.PacketParserUtils.parseElementText;
import java.io.IOException;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.util.ParserUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
public class BodyElementProvider extends ExtensionElementProvider<Message.Body> {
@Override
public Message.Body parse(XmlPullParser parser, int initialDepth) throws Exception {
public Message.Body parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException {
String xmlLang = ParserUtils.getXmlLang(parser);
String body = parseElementText(parser);

View file

@ -16,6 +16,8 @@
*/
package org.jivesoftware.smack.provider;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -25,6 +27,7 @@ import org.jivesoftware.smack.packet.ExtensionElement;
import org.jivesoftware.smack.util.PacketParserUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
/**
*
@ -82,7 +85,7 @@ import org.xmlpull.v1.XmlPullParser;
public abstract class EmbeddedExtensionProvider<PE extends ExtensionElement> extends ExtensionElementProvider<PE> {
@Override
public final PE parse(XmlPullParser parser, int initialDepth) throws Exception {
public final PE parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException, ParseException {
final String namespace = parser.getNamespace();
final String name = parser.getName();
final int attributeCount = parser.getAttributeCount();

View file

@ -1,6 +1,6 @@
/**
*
* Copyright © 2014-2018 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.
@ -19,7 +19,6 @@ package org.jivesoftware.smack.provider;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.packet.ExtensionElement;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.util.ParserUtils;
@ -40,14 +39,14 @@ public class IntrospectionProvider{
@SuppressWarnings("unchecked")
@Override
public I parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException,
SmackException {
public I parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException {
try {
return (I) parseWithIntrospection(elementClass, parser, initialDepth);
}
catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException
| IllegalArgumentException | InvocationTargetException | ClassNotFoundException e) {
throw new SmackException(e);
// TODO: Should probably be SmackParsingException (once it exists).
throw new IOException(e);
}
}
}
@ -61,14 +60,14 @@ public class IntrospectionProvider{
@SuppressWarnings("unchecked")
@Override
public PE parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException,
SmackException {
public PE parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException {
try {
return (PE) parseWithIntrospection(elementClass, parser, initialDepth);
}
catch (NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException
| IllegalArgumentException | InvocationTargetException | ClassNotFoundException e) {
throw new SmackException(e);
// TODO: Should probably be SmackParsingException (once it exists).
throw new IOException(e);
}
}
}

View file

@ -17,13 +17,16 @@
package org.jivesoftware.smack.provider;
import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.text.ParseException;
import org.jivesoftware.smack.packet.Element;
import org.jivesoftware.smack.util.ParserUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
/**
* Smack provider are the parsers used to deserialize raw XMPP into the according Java {@link Element}s.
@ -58,7 +61,7 @@ public abstract class Provider<E extends Element> {
return elementClass;
}
public final E parse(XmlPullParser parser) throws Exception {
public final E parse(XmlPullParser parser) throws IOException, XmlPullParserException, ParseException {
// XPP3 calling convention assert: Parser should be at start tag
ParserUtils.assertAtStartTag(parser);
@ -70,5 +73,5 @@ public abstract class Provider<E extends Element> {
return e;
}
public abstract E parse(XmlPullParser parser, int initialDepth) throws Exception;
public abstract E parse(XmlPullParser parser, int initialDepth) throws XmlPullParserException, IOException, ParseException;
}

View file

@ -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.
@ -28,7 +28,7 @@ public final class TlsFailureProvider extends NonzaProvider<TlsProceed> {
}
@Override
public TlsProceed parse(XmlPullParser parser, int initialDepth) throws Exception {
public TlsProceed parse(XmlPullParser parser, int initialDepth) {
return TlsProceed.INSTANCE;
}

View file

@ -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.
@ -28,7 +28,7 @@ public final class TlsProceedProvider extends NonzaProvider<TlsFailure> {
}
@Override
public TlsFailure parse(XmlPullParser parser, int initialDepth) throws Exception {
public TlsFailure parse(XmlPullParser parser, int initialDepth) {
return TlsFailure.INSTANCE;
}

View file

@ -19,6 +19,7 @@ package org.jivesoftware.smack.util;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@ -215,10 +216,11 @@ public class PacketParserUtils {
*
* @param parser the XML parser, positioned at the start of a message packet.
* @return a Message packet.
* @throws Exception
* @throws XmlPullParserException
* @throws IOException
* @throws ParseException
*/
public static Message parseMessage(XmlPullParser parser)
throws Exception {
public static Message parseMessage(XmlPullParser parser) throws XmlPullParserException, IOException, ParseException {
ParserUtils.assertAtStartTag(parser);
assert (parser.getName().equals(Message.ELEMENT));
@ -500,10 +502,11 @@ public class PacketParserUtils {
*
* @param parser the XML parser, positioned at the start of a presence packet.
* @return a Presence packet.
* @throws Exception
* @throws IOException
* @throws XmlPullParserException
* @throws ParseException
*/
public static Presence parsePresence(XmlPullParser parser)
throws Exception {
public static Presence parsePresence(XmlPullParser parser) throws XmlPullParserException, IOException, ParseException {
ParserUtils.assertAtStartTag(parser);
final int initialDepth = parser.getDepth();
@ -786,9 +789,11 @@ public class PacketParserUtils {
*
* @param parser the XML parser.
* @return an stream error packet.
* @throws Exception if an exception occurs while parsing the packet.
* @throws IOException
* @throws XmlPullParserException
* @throws ParseException
*/
public static StreamError parseStreamError(XmlPullParser parser) throws Exception {
public static StreamError parseStreamError(XmlPullParser parser) throws XmlPullParserException, IOException, ParseException {
final int initialDepth = parser.getDepth();
List<ExtensionElement> extensions = new ArrayList<>();
Map<String, String> descriptiveTexts = null;
@ -836,10 +841,11 @@ public class PacketParserUtils {
*
* @param parser the XML parser.
* @return an error sub-packet.
* @throws Exception
* @throws IOException
* @throws XmlPullParserException
* @throws ParseException
*/
public static StanzaError.Builder parseError(XmlPullParser parser)
throws Exception {
public static StanzaError.Builder parseError(XmlPullParser parser) throws XmlPullParserException, IOException, ParseException {
final int initialDepth = parser.getDepth();
Map<String, String> descriptiveTexts = null;
List<ExtensionElement> extensions = new ArrayList<>();
@ -908,10 +914,12 @@ public class PacketParserUtils {
* @param parser the XML parser, positioned at the starting element of the extension.
*
* @return an extension element.
* @throws Exception when an error occurs during parsing.
* @throws XmlPullParserException
* @throws IOException
* @throws ParseException
*/
public static ExtensionElement parseExtensionElement(String elementName, String namespace,
XmlPullParser parser) throws Exception {
XmlPullParser parser) throws XmlPullParserException, IOException, ParseException {
ParserUtils.assertAtStartTag(parser);
// See if a provider is registered to handle the extension.
ExtensionElementProvider<ExtensionElement> provider = ProviderManager.getExtensionProvider(elementName, namespace);
@ -980,25 +988,24 @@ public class PacketParserUtils {
}
public static void addExtensionElement(Stanza packet, XmlPullParser parser)
throws Exception {
throws XmlPullParserException, IOException, ParseException {
ParserUtils.assertAtStartTag(parser);
addExtensionElement(packet, parser, parser.getName(), parser.getNamespace());
}
public static void addExtensionElement(Stanza packet, XmlPullParser parser, String elementName,
String namespace) throws Exception {
String namespace) throws XmlPullParserException, IOException, ParseException {
ExtensionElement packetExtension = parseExtensionElement(elementName, namespace, parser);
packet.addExtension(packetExtension);
}
public static void addExtensionElement(Collection<ExtensionElement> collection,
XmlPullParser parser) throws Exception {
public static void addExtensionElement(Collection<ExtensionElement> collection, XmlPullParser parser)
throws XmlPullParserException, IOException, ParseException {
addExtensionElement(collection, parser, parser.getName(), parser.getNamespace());
}
public static void addExtensionElement(Collection<ExtensionElement> collection,
XmlPullParser parser, String elementName, String namespace)
throws Exception {
public static void addExtensionElement(Collection<ExtensionElement> collection, XmlPullParser parser,
String elementName, String namespace) throws XmlPullParserException, IOException, ParseException {
ExtensionElement packetExtension = parseExtensionElement(elementName, namespace, parser);
collection.add(packetExtension);
}

View file

@ -26,8 +26,6 @@ import java.util.Locale;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import org.jivesoftware.smack.SmackException;
import org.jxmpp.jid.EntityBareJid;
import org.jxmpp.jid.EntityFullJid;
import org.jxmpp.jid.EntityJid;
@ -176,10 +174,12 @@ public class ParserUtils {
}
}
public static int getIntegerAttributeOrThrow(XmlPullParser parser, String name, String throwMessage) throws SmackException {
public static int getIntegerAttributeOrThrow(XmlPullParser parser, String name, String throwMessage)
throws IOException {
Integer res = getIntegerAttribute(parser, name);
if (res == null) {
throw new SmackException(throwMessage);
// TODO Should be SmackParseException.
throw new IOException(throwMessage);
}
return res;
}
@ -266,9 +266,15 @@ public class ParserUtils {
return XmppDateTime.parseDate(dateString);
}
public static URI getUriFromNextText(XmlPullParser parser) throws XmlPullParserException, IOException, URISyntaxException {
public static URI getUriFromNextText(XmlPullParser parser) throws XmlPullParserException, IOException {
String uriString = parser.nextText();
return new URI(uriString);
try {
return new URI(uriString);
}
catch (URISyntaxException e) {
// TODO: Should be SmackParseException (or subclass of).
throw new IOException(e);
}
}
public static String getRequiredAttribute(XmlPullParser parser, String name) throws IOException {

View file

@ -19,7 +19,8 @@ package org.jivesoftware.smack.parsing;
import static org.jivesoftware.smack.test.util.CharSequenceEquals.equalsCharSequence;
import static org.junit.Assert.assertThat;
import org.jivesoftware.smack.SmackException;
import java.io.IOException;
import org.jivesoftware.smack.packet.ExtensionElement;
import org.jivesoftware.smack.provider.ExtensionElementProvider;
import org.jivesoftware.smack.provider.ProviderManager;
@ -78,8 +79,8 @@ public class ParsingExceptionTest {
public static final String NAMESPACE = "http://smack.jivesoftware.org/exception";
@Override
public ExtensionElement parse(XmlPullParser parser, int initialDepth) throws SmackException {
throw new SmackException("Test Exception");
public ExtensionElement parse(XmlPullParser parser, int initialDepth) throws IOException {
throw new IOException("Test Exception");
}
}