Improve parsing exception callback.

Fixes SMACK-631.
This commit is contained in:
Florian Schmaus 2015-05-18 12:35:13 +02:00
parent 21c7007212
commit 0c8199650b
5 changed files with 31 additions and 33 deletions

View File

@ -71,7 +71,6 @@ import org.jivesoftware.smack.packet.PlainStreamElement;
import org.jivesoftware.smack.packet.StreamError; import org.jivesoftware.smack.packet.StreamError;
import org.jivesoftware.smack.packet.XMPPError; import org.jivesoftware.smack.packet.XMPPError;
import org.jivesoftware.smack.parsing.ParsingExceptionCallback; import org.jivesoftware.smack.parsing.ParsingExceptionCallback;
import org.jivesoftware.smack.parsing.UnparsablePacket;
import org.jivesoftware.smack.provider.ExtensionElementProvider; import org.jivesoftware.smack.provider.ExtensionElementProvider;
import org.jivesoftware.smack.provider.ProviderManager; import org.jivesoftware.smack.provider.ProviderManager;
import org.jivesoftware.smack.util.DNSUtil; import org.jivesoftware.smack.util.DNSUtil;
@ -956,10 +955,10 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
catch (Exception e) { catch (Exception e) {
CharSequence content = PacketParserUtils.parseContentDepth(parser, CharSequence content = PacketParserUtils.parseContentDepth(parser,
parserDepth); parserDepth);
UnparsablePacket message = new UnparsablePacket(content, e); UnparseableStanza message = new UnparseableStanza(content, e);
ParsingExceptionCallback callback = getParsingExceptionCallback(); ParsingExceptionCallback callback = getParsingExceptionCallback();
if (callback != null) { if (callback != null) {
callback.handleUnparsablePacket(message); callback.handleUnparsableStanza(message);
} }
} }
ParserUtils.assertAtEndTag(parser); ParserUtils.assertAtEndTag(parser);

View File

@ -1,6 +1,6 @@
/** /**
* *
* Copyright 2013 Florian Schmaus. * Copyright 2013-2015 Florian Schmaus.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -15,20 +15,19 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jivesoftware.smack.parsing; package org.jivesoftware.smack;
/** /**
* Representation of an unparsable packet. * Representation of an unparsable stanza.
* *
* @author Florian Schmaus * @author Florian Schmaus
* *
*/ */
public class UnparsablePacket { public class UnparseableStanza {
private final CharSequence content; private final CharSequence content;
private final Exception e; private final Exception e;
public UnparsablePacket(final CharSequence content, final Exception e) { UnparseableStanza(CharSequence content, Exception e) {
this.content = content; this.content = content;
this.e = e; this.e = e;
} }

View File

@ -1,6 +1,6 @@
/** /**
* *
* Copyright 2013 Florian Schmaus. * Copyright 2013-2015 Florian Schmaus.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -20,18 +20,19 @@ package org.jivesoftware.smack.parsing;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.jivesoftware.smack.UnparseableStanza;
/** /**
* Simple parsing exception callback that only logs the encountered parsing exception to java util logging. * Simple parsing exception callback that only logs the encountered parsing exception to java util logging.
* *
* @author Florian Schmaus * @author Florian Schmaus
* *
*/ */
public class ExceptionLoggingCallback extends ParsingExceptionCallback { public class ExceptionLoggingCallback implements ParsingExceptionCallback {
private static final Logger LOGGER = Logger.getLogger(ExceptionLoggingCallback.class.getName()); private static final Logger LOGGER = Logger.getLogger(ExceptionLoggingCallback.class.getName());
@Override @Override
public void handleUnparsablePacket(UnparsablePacket unparsed) throws Exception { public void handleUnparsableStanza(UnparseableStanza unparsed) throws Exception {
LOGGER.log(Level.SEVERE, "Smack message parsing exception: ", unparsed.getParsingException()); LOGGER.log(Level.SEVERE, "Smack message parsing exception. Content: '" + unparsed.getContent() + "'", unparsed.getParsingException());
LOGGER.severe("Unparsed content: " + unparsed.getContent());
} }
} }

View File

@ -1,6 +1,6 @@
/** /**
* *
* Copyright 2013 Florian Schmaus. * Copyright 2013-2015 Florian Schmaus.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -18,18 +18,19 @@
package org.jivesoftware.smack.parsing; package org.jivesoftware.smack.parsing;
import org.jivesoftware.smack.ConnectionListener; import org.jivesoftware.smack.ConnectionListener;
import org.jivesoftware.smack.UnparseableStanza;
/** /**
* Parsing exception callback class that simply throws the encountered parsing exception. This usually leads to an * Parsing exception callback class that simply throws the encountered parsing exception. This usually leads to an
* {@link ConnectionListener#connectionClosedOnError(Exception)} disconnect of the connection. * {@link ConnectionListener#connectionClosedOnError(Exception)} and disconnect of the connection.
* *
* @author Florian Schmaus * @author Florian Schmaus
* *
*/ */
public class ExceptionThrowingCallback extends ParsingExceptionCallback { public class ExceptionThrowingCallback implements ParsingExceptionCallback {
@Override @Override
public void handleUnparsablePacket(UnparsablePacket packetData) throws Exception { public void handleUnparsableStanza(UnparseableStanza packetData) throws Exception {
throw packetData.getParsingException(); throw packetData.getParsingException();
} }
} }

View File

@ -1,6 +1,6 @@
/** /**
* *
* Copyright 2013 Florian Schmaus. * Copyright 2013-2015 Florian Schmaus.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,31 +16,29 @@
*/ */
package org.jivesoftware.smack.parsing; package org.jivesoftware.smack.parsing;
import org.jivesoftware.smack.UnparseableStanza;
/** /**
* Base class to receive parsing exceptions. * Interface to receive parsing exceptions.
* * <p>
* If this class is used as callback, then Smack will silently ignore the stanza that caused the parsing exception and * If this class is used as callback, then Smack will silently ignore the stanza that caused the parsing exception and
* place the parser after the faulty stanza. * place the parser after the faulty stanza.
* * </p>
* Subclasses may or may not override certain methods of this class. Each of these methods will receive the exception * <p>
* that caused the parsing error and an instance of an Unparsed Stanza(/Packet) type. The latter can be used to inspect the
* stanza that caused the parsing error by using the getContent() (for example {@link UnparsablePacket#getContent()})
* method.
*
* Smack provides 2 predefined ParsingExceptionCallback's: {@link ExceptionLoggingCallback} and {@link ExceptionThrowingCallback}. * Smack provides 2 predefined ParsingExceptionCallback's: {@link ExceptionLoggingCallback} and {@link ExceptionThrowingCallback}.
* </p>
* *
* @author Florian Schmaus * @author Florian Schmaus
* *
*/ */
public abstract class ParsingExceptionCallback { public interface ParsingExceptionCallback {
/** /**
* Called when parsing an message stanza caused an exception. * Called when parsing a stanza caused an exception.
* *
* @param stanzaData * @param stanzaData the raw stanza data that caused the exception
* the raw message stanza data that caused the exception
* @throws Exception * @throws Exception
*/ */
public void handleUnparsablePacket(UnparsablePacket stanzaData) throws Exception { public void handleUnparsableStanza(UnparseableStanza stanzaData) throws Exception;
}
} }