mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-22 14:22:05 +01:00
Improve parsing exception callback.
Fixes SMACK-631.
This commit is contained in:
parent
21c7007212
commit
0c8199650b
5 changed files with 31 additions and 33 deletions
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
|
@ -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());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue