mirror of
https://github.com/vanitasvitae/Smack.git
synced 2025-09-09 00:59:39 +02:00
Rework Smack debugger.
Also fixes SMACK-728.
This commit is contained in:
parent
104146c5ed
commit
b8ee8d808f
24 changed files with 328 additions and 390 deletions
|
@ -72,13 +72,14 @@ import javax.xml.transform.stream.StreamSource;
|
|||
import org.jivesoftware.smack.AbstractConnectionListener;
|
||||
import org.jivesoftware.smack.ConnectionListener;
|
||||
import org.jivesoftware.smack.SmackException.NotConnectedException;
|
||||
import org.jivesoftware.smack.StanzaListener;
|
||||
import org.jivesoftware.smack.XMPPConnection;
|
||||
import org.jivesoftware.smack.debugger.SmackDebugger;
|
||||
import org.jivesoftware.smack.debugger.SmackDebuggerFactory;
|
||||
import org.jivesoftware.smack.packet.IQ;
|
||||
import org.jivesoftware.smack.packet.Message;
|
||||
import org.jivesoftware.smack.packet.Presence;
|
||||
import org.jivesoftware.smack.packet.Stanza;
|
||||
import org.jivesoftware.smack.packet.TopLevelStreamElement;
|
||||
import org.jivesoftware.smack.util.ObservableReader;
|
||||
import org.jivesoftware.smack.util.ObservableWriter;
|
||||
import org.jivesoftware.smack.util.ReaderListener;
|
||||
|
@ -97,7 +98,7 @@ import org.jxmpp.jid.Jid;
|
|||
*
|
||||
* @author Gaston Dombiak
|
||||
*/
|
||||
public class EnhancedDebugger implements SmackDebugger {
|
||||
public class EnhancedDebugger extends SmackDebugger {
|
||||
|
||||
private static final Logger LOGGER = Logger.getLogger(EnhancedDebugger.class.getName());
|
||||
|
||||
|
@ -149,10 +150,6 @@ public class EnhancedDebugger implements SmackDebugger {
|
|||
private JFormattedTextField userField = null;
|
||||
private JFormattedTextField statusField = null;
|
||||
|
||||
private XMPPConnection connection = null;
|
||||
|
||||
private StanzaListener packetReaderListener = null;
|
||||
private StanzaListener packetWriterListener = null;
|
||||
private ConnectionListener connListener = null;
|
||||
|
||||
private Writer writer;
|
||||
|
@ -177,18 +174,9 @@ public class EnhancedDebugger implements SmackDebugger {
|
|||
|
||||
JTabbedPane tabbedPane;
|
||||
|
||||
public EnhancedDebugger(XMPPConnection connection, Writer writer, Reader reader) {
|
||||
this.connection = connection;
|
||||
this.writer = writer;
|
||||
this.reader = reader;
|
||||
createDebug();
|
||||
EnhancedDebuggerWindow.addDebugger(this);
|
||||
}
|
||||
public EnhancedDebugger(XMPPConnection connection) {
|
||||
super(connection);
|
||||
|
||||
/**
|
||||
* Creates the debug process, which is a GUI window that displays XML traffic.
|
||||
*/
|
||||
private void createDebug() {
|
||||
// We'll arrange the UI into six tabs. The first tab contains all data, the second
|
||||
// client generated XML, the third server generated XML, the fourth allows to send
|
||||
// ad-hoc messages and the fifth contains connection information.
|
||||
|
@ -203,41 +191,6 @@ public class EnhancedDebugger implements SmackDebugger {
|
|||
// Add the connection information panel
|
||||
addInformationPanel();
|
||||
|
||||
// Create a thread that will listen for all incoming packets and write them to
|
||||
// the GUI. This is what we call "interpreted" packet data, since it's the packet
|
||||
// data as Smack sees it and not as it's coming in as raw XML.
|
||||
packetReaderListener = new StanzaListener() {
|
||||
SimpleDateFormat dateFormatter = new SimpleDateFormat("HH:mm:ss:SS");
|
||||
|
||||
@Override
|
||||
public void processStanza(final Stanza packet) {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
addReadPacketToTable(dateFormatter, packet);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
// Create a thread that will listen for all outgoing packets and write them to
|
||||
// the GUI.
|
||||
packetWriterListener = new StanzaListener() {
|
||||
SimpleDateFormat dateFormatter = new SimpleDateFormat("HH:mm:ss:SS");
|
||||
|
||||
@Override
|
||||
public void processStanza(final Stanza packet) {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
addSentPacketToTable(dateFormatter, packet);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
// Create a thread that will listen for any connection closed event
|
||||
connListener = new AbstractConnectionListener() {
|
||||
@Override
|
||||
|
@ -294,6 +247,8 @@ public class EnhancedDebugger implements SmackDebugger {
|
|||
});
|
||||
}
|
||||
};
|
||||
|
||||
EnhancedDebuggerWindow.addDebugger(this);
|
||||
}
|
||||
|
||||
private void addBasicPanels() {
|
||||
|
@ -793,26 +748,6 @@ public class EnhancedDebugger implements SmackDebugger {
|
|||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Reader getReader() {
|
||||
return reader;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Writer getWriter() {
|
||||
return writer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StanzaListener getReaderListener() {
|
||||
return packetReaderListener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StanzaListener getWriterListener() {
|
||||
return packetWriterListener;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the statistics table
|
||||
*/
|
||||
|
@ -839,12 +774,21 @@ public class EnhancedDebugger implements SmackDebugger {
|
|||
* @param dateFormatter the SimpleDateFormat to use to format Dates
|
||||
* @param packet the read stanza(/packet) to add to the table
|
||||
*/
|
||||
private void addReadPacketToTable(final SimpleDateFormat dateFormatter, final Stanza packet) {
|
||||
private void addReadPacketToTable(final SimpleDateFormat dateFormatter, final TopLevelStreamElement packet) {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
String messageType;
|
||||
Jid from = packet.getFrom();
|
||||
Jid from;
|
||||
String stanzaId;
|
||||
if (packet instanceof Stanza) {
|
||||
Stanza stanza = (Stanza) packet;
|
||||
from = stanza.getFrom();
|
||||
stanzaId = stanza.getStanzaId();
|
||||
} else {
|
||||
from = null;
|
||||
stanzaId = "(Nonza)";
|
||||
}
|
||||
String type = "";
|
||||
Icon packetTypeIcon;
|
||||
receivedPackets++;
|
||||
|
@ -885,7 +829,7 @@ public class EnhancedDebugger implements SmackDebugger {
|
|||
packetReceivedIcon,
|
||||
packetTypeIcon,
|
||||
messageType,
|
||||
packet.getStanzaId(),
|
||||
stanzaId,
|
||||
type,
|
||||
"",
|
||||
from});
|
||||
|
@ -901,12 +845,21 @@ public class EnhancedDebugger implements SmackDebugger {
|
|||
* @param dateFormatter the SimpleDateFormat to use to format Dates
|
||||
* @param packet the sent stanza(/packet) to add to the table
|
||||
*/
|
||||
private void addSentPacketToTable(final SimpleDateFormat dateFormatter, final Stanza packet) {
|
||||
private void addSentPacketToTable(final SimpleDateFormat dateFormatter, final TopLevelStreamElement packet) {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
String messageType;
|
||||
Jid to = packet.getTo();
|
||||
Jid to;
|
||||
String stanzaId;
|
||||
if (packet instanceof Stanza) {
|
||||
Stanza stanza = (Stanza) packet;
|
||||
to = stanza.getTo();
|
||||
stanzaId = stanza.getStanzaId();
|
||||
} else {
|
||||
to = null;
|
||||
stanzaId = "(Nonza)";
|
||||
}
|
||||
String type = "";
|
||||
Icon packetTypeIcon;
|
||||
sentPackets++;
|
||||
|
@ -947,7 +900,7 @@ public class EnhancedDebugger implements SmackDebugger {
|
|||
packetSentIcon,
|
||||
packetTypeIcon,
|
||||
messageType,
|
||||
packet.getStanzaId(),
|
||||
stanzaId,
|
||||
type,
|
||||
to,
|
||||
""});
|
||||
|
@ -1006,8 +959,6 @@ public class EnhancedDebugger implements SmackDebugger {
|
|||
*/
|
||||
void cancel() {
|
||||
connection.removeConnectionListener(connListener);
|
||||
connection.removeAsyncStanzaListener(packetReaderListener);
|
||||
connection.removePacketSendingListener(packetWriterListener);
|
||||
((ObservableReader) reader).removeReaderListener(readerListener);
|
||||
((ObservableWriter) writer).removeWriterListener(writerListener);
|
||||
messagesTable = null;
|
||||
|
@ -1099,4 +1050,40 @@ public class EnhancedDebugger implements SmackDebugger {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onIncomingStreamElement(final TopLevelStreamElement streamElement) {
|
||||
final SimpleDateFormat dateFormatter = new SimpleDateFormat("HH:mm:ss:SS");
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
addReadPacketToTable(dateFormatter, streamElement);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOutgoingStreamElement(final TopLevelStreamElement streamElement) {
|
||||
final SimpleDateFormat dateFormatter = new SimpleDateFormat("HH:mm:ss:SS");
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
addSentPacketToTable(dateFormatter, streamElement);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static final class Factory implements SmackDebuggerFactory {
|
||||
|
||||
public static final SmackDebuggerFactory INSTANCE = new Factory();
|
||||
|
||||
private Factory() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmackDebugger create(XMPPConnection connection) throws IllegalArgumentException {
|
||||
return new EnhancedDebugger(connection);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -114,7 +114,7 @@ public final class EnhancedDebuggerWindow {
|
|||
*
|
||||
* @return the unique EnhancedDebuggerWindow instance
|
||||
*/
|
||||
public static EnhancedDebuggerWindow getInstance() {
|
||||
public synchronized static EnhancedDebuggerWindow getInstance() {
|
||||
if (instance == null) {
|
||||
instance = new EnhancedDebuggerWindow();
|
||||
}
|
||||
|
@ -345,7 +345,7 @@ public final class EnhancedDebuggerWindow {
|
|||
*
|
||||
* @param evt the event that indicates that the root window is closing
|
||||
*/
|
||||
public void rootWindowClosing(WindowEvent evt) {
|
||||
private synchronized void rootWindowClosing(WindowEvent evt) {
|
||||
// Notify to all the debuggers to stop debugging
|
||||
for (EnhancedDebugger debugger : debuggers) {
|
||||
debugger.cancel();
|
||||
|
@ -354,6 +354,8 @@ public final class EnhancedDebuggerWindow {
|
|||
debuggers.clear();
|
||||
// Release the default instance
|
||||
instance = null;
|
||||
frame = null;
|
||||
notifyAll();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -393,4 +395,14 @@ public final class EnhancedDebuggerWindow {
|
|||
public boolean isVisible() {
|
||||
return frame != null && frame.isVisible();
|
||||
}
|
||||
|
||||
public synchronized void waitUntilClosed() throws InterruptedException {
|
||||
if (frame == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
while (frame != null) {
|
||||
wait();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,10 +40,9 @@ import javax.swing.JScrollPane;
|
|||
import javax.swing.JTabbedPane;
|
||||
import javax.swing.JTextArea;
|
||||
|
||||
import org.jivesoftware.smack.StanzaListener;
|
||||
import org.jivesoftware.smack.XMPPConnection;
|
||||
import org.jivesoftware.smack.debugger.SmackDebugger;
|
||||
import org.jivesoftware.smack.packet.Stanza;
|
||||
import org.jivesoftware.smack.packet.TopLevelStreamElement;
|
||||
import org.jivesoftware.smack.util.ObservableReader;
|
||||
import org.jivesoftware.smack.util.ObservableWriter;
|
||||
import org.jivesoftware.smack.util.ReaderListener;
|
||||
|
@ -57,24 +56,22 @@ import org.jxmpp.jid.EntityFullJid;
|
|||
*
|
||||
* @author Gaston Dombiak
|
||||
*/
|
||||
public class LiteDebugger implements SmackDebugger {
|
||||
public class LiteDebugger extends SmackDebugger {
|
||||
|
||||
private static final String NEWLINE = "\n";
|
||||
|
||||
private JFrame frame = null;
|
||||
private XMPPConnection connection = null;
|
||||
private final JTextArea interpretedText1 = new JTextArea();
|
||||
private final JTextArea interpretedText2 = new JTextArea();
|
||||
|
||||
private StanzaListener listener = null;
|
||||
private JFrame frame = null;
|
||||
|
||||
private Writer writer;
|
||||
private Reader reader;
|
||||
private ReaderListener readerListener;
|
||||
private WriterListener writerListener;
|
||||
|
||||
public LiteDebugger(XMPPConnection connection, Writer writer, Reader reader) {
|
||||
this.connection = connection;
|
||||
this.writer = writer;
|
||||
this.reader = reader;
|
||||
public LiteDebugger(XMPPConnection connection) {
|
||||
super(connection);
|
||||
createDebug();
|
||||
}
|
||||
|
||||
|
@ -181,8 +178,6 @@ public class LiteDebugger implements SmackDebugger {
|
|||
menu.add(menuItem2);
|
||||
|
||||
// Create UI elements for interpreted XML traffic.
|
||||
final JTextArea interpretedText1 = new JTextArea();
|
||||
final JTextArea interpretedText2 = new JTextArea();
|
||||
interpretedText1.setEditable(false);
|
||||
interpretedText2.setEditable(false);
|
||||
interpretedText1.setForeground(new Color(1, 94, 35));
|
||||
|
@ -267,19 +262,6 @@ public class LiteDebugger implements SmackDebugger {
|
|||
// and writer will use the debug versions when they are created.
|
||||
reader = debugReader;
|
||||
writer = debugWriter;
|
||||
|
||||
// Create a thread that will listen for all incoming packets and write them to
|
||||
// the GUI. This is what we call "interpreted" packet data, since it's the packet
|
||||
// data as Smack sees it and not as it's coming in as raw XML.
|
||||
listener = new StanzaListener() {
|
||||
@Override
|
||||
public void processStanza(Stanza packet) {
|
||||
interpretedText1.append(packet.toXML().toString());
|
||||
interpretedText2.append(packet.toXML().toString());
|
||||
interpretedText1.append(NEWLINE);
|
||||
interpretedText2.append(NEWLINE);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -289,7 +271,7 @@ public class LiteDebugger implements SmackDebugger {
|
|||
* @param evt the event that indicates that the root window is closing
|
||||
*/
|
||||
public void rootWindowClosing(WindowEvent evt) {
|
||||
connection.removeAsyncStanzaListener(listener);
|
||||
// TODO: Remove debugger from connection.
|
||||
((ObservableReader) reader).removeReaderListener(readerListener);
|
||||
((ObservableWriter) writer).removeWriterListener(writerListener);
|
||||
}
|
||||
|
@ -348,22 +330,16 @@ public class LiteDebugger implements SmackDebugger {
|
|||
}
|
||||
|
||||
@Override
|
||||
public Reader getReader() {
|
||||
return reader;
|
||||
public void onIncomingStreamElement(TopLevelStreamElement streamElement) {
|
||||
interpretedText1.append(streamElement.toXML().toString());
|
||||
interpretedText2.append(streamElement.toXML().toString());
|
||||
interpretedText1.append(NEWLINE);
|
||||
interpretedText2.append(NEWLINE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Writer getWriter() {
|
||||
return writer;
|
||||
public void onOutgoingStreamElement(TopLevelStreamElement streamElement) {
|
||||
// Does nothing.
|
||||
}
|
||||
|
||||
@Override
|
||||
public StanzaListener getReaderListener() {
|
||||
return listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StanzaListener getWriterListener() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue