diff -r c88a6d0911ad -r 6dd33a633ddc libs/patch-smack-android-sasl.diff --- a/libs/patch-smack-android-sasl.diff Fri Jan 22 19:47:10 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2074 +0,0 @@ -diff -Nbdru org/jivesoftware/smack/ConnectionConfiguration.java /home/nikita/devel/beem-ui/src/org/jivesoftware/smack/ConnectionConfiguration.java ---- org/jivesoftware/smack/ConnectionConfiguration.java 2009-06-26 21:11:24.609252239 +0200 -+++ /home/nikita/devel/beem-ui/src/org/jivesoftware/smack/ConnectionConfiguration.java 2009-06-25 22:41:46.281648000 +0200 -@@ -63,7 +63,7 @@ - */ - private CallbackHandler callbackHandler; - -- private boolean debuggerEnabled = XMPPConnection.DEBUG_ENABLED; -+ private boolean debuggerEnabled = false; - - // Flag that indicates if a reconnection should be attempted when abruptly disconnected - private boolean reconnectionAllowed = true; -diff -Nbdru org/jivesoftware/smack/debugger/LiteDebugger.java /home/nikita/devel/beem-ui/src/org/jivesoftware/smack/debugger/LiteDebugger.java ---- org/jivesoftware/smack/debugger/LiteDebugger.java 2009-06-26 21:11:22.316252115 +0200 -+++ /home/nikita/devel/beem-ui/src/org/jivesoftware/smack/debugger/LiteDebugger.java 1970-01-01 01:00:00.000000000 +0100 -@@ -1,336 +0,0 @@ --/** -- * $RCSfile$ -- * $Revision: 7071 $ -- * $Date: 2007-02-12 01:59:05 +0100 (Mon, 12 Feb 2007) $ -- * -- * Copyright 2003-2007 Jive Software. -- * -- * All rights reserved. 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.debugger; -- --import java.awt.*; --import java.awt.datatransfer.*; --import java.awt.event.*; --import java.io.*; -- --import javax.swing.*; -- --import org.jivesoftware.smack.*; --import org.jivesoftware.smack.packet.*; --import org.jivesoftware.smack.util.*; -- --/** -- * The LiteDebugger is a very simple debugger that allows to debug sent, received and -- * interpreted messages. -- * -- * @author Gaston Dombiak -- */ --public class LiteDebugger implements SmackDebugger { -- -- private static final String NEWLINE = "\n"; -- -- private JFrame frame = null; -- private XMPPConnection connection = null; -- -- private PacketListener listener = 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; -- createDebug(); -- } -- -- /** -- * Creates the debug process, which is a GUI window that displays XML traffic. -- */ -- private void createDebug() { -- frame = new JFrame("Smack Debug Window -- " + connection.getServiceName() + ":" + -- connection.getPort()); -- -- // Add listener for window closing event -- frame.addWindowListener(new WindowAdapter() { -- public void windowClosing(WindowEvent evt) { -- rootWindowClosing(evt); -- } -- }); -- -- // We'll arrange the UI into four tabs. The first tab contains all data, the second -- // client generated XML, the third server generated XML, and the fourth is packet -- // data from the server as seen by Smack. -- JTabbedPane tabbedPane = new JTabbedPane(); -- -- JPanel allPane = new JPanel(); -- allPane.setLayout(new GridLayout(3, 1)); -- tabbedPane.add("All", allPane); -- -- // Create UI elements for client generated XML traffic. -- final JTextArea sentText1 = new JTextArea(); -- final JTextArea sentText2 = new JTextArea(); -- sentText1.setEditable(false); -- sentText2.setEditable(false); -- sentText1.setForeground(new Color(112, 3, 3)); -- sentText2.setForeground(new Color(112, 3, 3)); -- allPane.add(new JScrollPane(sentText1)); -- tabbedPane.add("Sent", new JScrollPane(sentText2)); -- -- // Add pop-up menu. -- JPopupMenu menu = new JPopupMenu(); -- JMenuItem menuItem1 = new JMenuItem("Copy"); -- menuItem1.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- // Get the clipboard -- Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); -- // Set the sent text as the new content of the clipboard -- clipboard.setContents(new StringSelection(sentText1.getText()), null); -- } -- }); -- -- JMenuItem menuItem2 = new JMenuItem("Clear"); -- menuItem2.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- sentText1.setText(""); -- sentText2.setText(""); -- } -- }); -- -- // Add listener to the text area so the popup menu can come up. -- MouseListener popupListener = new PopupListener(menu); -- sentText1.addMouseListener(popupListener); -- sentText2.addMouseListener(popupListener); -- menu.add(menuItem1); -- menu.add(menuItem2); -- -- // Create UI elements for server generated XML traffic. -- final JTextArea receivedText1 = new JTextArea(); -- final JTextArea receivedText2 = new JTextArea(); -- receivedText1.setEditable(false); -- receivedText2.setEditable(false); -- receivedText1.setForeground(new Color(6, 76, 133)); -- receivedText2.setForeground(new Color(6, 76, 133)); -- allPane.add(new JScrollPane(receivedText1)); -- tabbedPane.add("Received", new JScrollPane(receivedText2)); -- -- // Add pop-up menu. -- menu = new JPopupMenu(); -- menuItem1 = new JMenuItem("Copy"); -- menuItem1.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- // Get the clipboard -- Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); -- // Set the sent text as the new content of the clipboard -- clipboard.setContents(new StringSelection(receivedText1.getText()), null); -- } -- }); -- -- menuItem2 = new JMenuItem("Clear"); -- menuItem2.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- receivedText1.setText(""); -- receivedText2.setText(""); -- } -- }); -- -- // Add listener to the text area so the popup menu can come up. -- popupListener = new PopupListener(menu); -- receivedText1.addMouseListener(popupListener); -- receivedText2.addMouseListener(popupListener); -- menu.add(menuItem1); -- 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)); -- interpretedText2.setForeground(new Color(1, 94, 35)); -- allPane.add(new JScrollPane(interpretedText1)); -- tabbedPane.add("Interpreted", new JScrollPane(interpretedText2)); -- -- // Add pop-up menu. -- menu = new JPopupMenu(); -- menuItem1 = new JMenuItem("Copy"); -- menuItem1.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- // Get the clipboard -- Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); -- // Set the sent text as the new content of the clipboard -- clipboard.setContents(new StringSelection(interpretedText1.getText()), null); -- } -- }); -- -- menuItem2 = new JMenuItem("Clear"); -- menuItem2.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- interpretedText1.setText(""); -- interpretedText2.setText(""); -- } -- }); -- -- // Add listener to the text area so the popup menu can come up. -- popupListener = new PopupListener(menu); -- interpretedText1.addMouseListener(popupListener); -- interpretedText2.addMouseListener(popupListener); -- menu.add(menuItem1); -- menu.add(menuItem2); -- -- frame.getContentPane().add(tabbedPane); -- -- frame.setSize(550, 400); -- frame.setVisible(true); -- -- // Create a special Reader that wraps the main Reader and logs data to the GUI. -- ObservableReader debugReader = new ObservableReader(reader); -- readerListener = new ReaderListener() { -- public void read(String str) { -- int index = str.lastIndexOf(">"); -- if (index != -1) { -- receivedText1.append(str.substring(0, index + 1)); -- receivedText2.append(str.substring(0, index + 1)); -- receivedText1.append(NEWLINE); -- receivedText2.append(NEWLINE); -- if (str.length() > index) { -- receivedText1.append(str.substring(index + 1)); -- receivedText2.append(str.substring(index + 1)); -- } -- } -- else { -- receivedText1.append(str); -- receivedText2.append(str); -- } -- } -- }; -- debugReader.addReaderListener(readerListener); -- -- // Create a special Writer that wraps the main Writer and logs data to the GUI. -- ObservableWriter debugWriter = new ObservableWriter(writer); -- writerListener = new WriterListener() { -- public void write(String str) { -- sentText1.append(str); -- sentText2.append(str); -- if (str.endsWith(">")) { -- sentText1.append(NEWLINE); -- sentText2.append(NEWLINE); -- } -- } -- }; -- debugWriter.addWriterListener(writerListener); -- -- // Assign the reader/writer objects to use the debug versions. The packet reader -- // 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 PacketListener() { -- public void processPacket(Packet packet) { -- interpretedText1.append(packet.toXML()); -- interpretedText2.append(packet.toXML()); -- interpretedText1.append(NEWLINE); -- interpretedText2.append(NEWLINE); -- } -- }; -- } -- -- /** -- * Notification that the root window is closing. Stop listening for received and -- * transmitted packets. -- * -- * @param evt the event that indicates that the root window is closing -- */ -- public void rootWindowClosing(WindowEvent evt) { -- connection.removePacketListener(listener); -- ((ObservableReader)reader).removeReaderListener(readerListener); -- ((ObservableWriter)writer).removeWriterListener(writerListener); -- } -- -- /** -- * Listens for debug window popup dialog events. -- */ -- private class PopupListener extends MouseAdapter { -- JPopupMenu popup; -- -- PopupListener(JPopupMenu popupMenu) { -- popup = popupMenu; -- } -- -- public void mousePressed(MouseEvent e) { -- maybeShowPopup(e); -- } -- -- public void mouseReleased(MouseEvent e) { -- maybeShowPopup(e); -- } -- -- private void maybeShowPopup(MouseEvent e) { -- if (e.isPopupTrigger()) { -- popup.show(e.getComponent(), e.getX(), e.getY()); -- } -- } -- } -- -- public Reader newConnectionReader(Reader newReader) { -- ((ObservableReader)reader).removeReaderListener(readerListener); -- ObservableReader debugReader = new ObservableReader(newReader); -- debugReader.addReaderListener(readerListener); -- reader = debugReader; -- return reader; -- } -- -- public Writer newConnectionWriter(Writer newWriter) { -- ((ObservableWriter)writer).removeWriterListener(writerListener); -- ObservableWriter debugWriter = new ObservableWriter(newWriter); -- debugWriter.addWriterListener(writerListener); -- writer = debugWriter; -- return writer; -- } -- -- public void userHasLogged(String user) { -- boolean isAnonymous = "".equals(StringUtils.parseName(user)); -- String title = -- "Smack Debug Window -- " -- + (isAnonymous ? "" : StringUtils.parseBareAddress(user)) -- + "@" -- + connection.getServiceName() -- + ":" -- + connection.getPort(); -- title += "/" + StringUtils.parseResource(user); -- frame.setTitle(title); -- } -- -- public Reader getReader() { -- return reader; -- } -- -- public Writer getWriter() { -- return writer; -- } -- -- public PacketListener getReaderListener() { -- return listener; -- } -- -- public PacketListener getWriterListener() { -- return null; -- } --} -diff -Nbdru org/jivesoftware/smack/sasl/SASLGSSAPIMechanism.java /home/nikita/devel/beem-ui/src/org/jivesoftware/smack/sasl/SASLGSSAPIMechanism.java ---- org/jivesoftware/smack/sasl/SASLGSSAPIMechanism.java 2009-06-26 21:11:23.436473310 +0200 -+++ /home/nikita/devel/beem-ui/src/org/jivesoftware/smack/sasl/SASLGSSAPIMechanism.java 2009-06-26 20:56:01.656252399 +0200 -@@ -25,8 +25,9 @@ - import java.io.IOException; - import java.util.Map; - import java.util.HashMap; --import javax.security.sasl.Sasl; --import javax.security.sasl.SaslClient; -+ -+import security.javax.security.sasl.Sasl; -+ - import javax.security.auth.callback.CallbackHandler; - - /** -@@ -63,7 +64,7 @@ - String[] mechanisms = { getName() }; - Map props = new HashMap(); - props.put(Sasl.SERVER_AUTH,"TRUE"); -- sc = Sasl.createSaslClient(mechanisms, username, "xmpp", host, props, cbh); -+ sc = Sasl.createSaslClient(mechanisms, username, "xmpp", host, props, (javax.security.auth.callback.CallbackHandler)cbh); - authenticate(); - } - -diff -Nbdru org/jivesoftware/smack/sasl/SASLMechanism.java /home/nikita/devel/beem-ui/src/org/jivesoftware/smack/sasl/SASLMechanism.java ---- org/jivesoftware/smack/sasl/SASLMechanism.java 2009-06-26 21:11:23.436473310 +0200 -+++ /home/nikita/devel/beem-ui/src/org/jivesoftware/smack/sasl/SASLMechanism.java 2009-06-26 21:23:03.244251498 +0200 -@@ -20,23 +20,25 @@ - - package org.jivesoftware.smack.sasl; - --import org.jivesoftware.smack.XMPPException; --import org.jivesoftware.smack.SASLAuthentication; --import org.jivesoftware.smack.util.Base64; -- - import java.io.IOException; --import java.util.Map; - import java.util.HashMap; --import javax.security.auth.callback.CallbackHandler; --import javax.security.auth.callback.UnsupportedCallbackException; -+import java.util.Map; -+ - import javax.security.auth.callback.Callback; --import javax.security.auth.callback.NameCallback; -+import javax.security.auth.callback.CallbackHandler; - import javax.security.auth.callback.PasswordCallback; --import javax.security.sasl.RealmCallback; --import javax.security.sasl.RealmChoiceCallback; --import javax.security.sasl.Sasl; --import javax.security.sasl.SaslClient; --import javax.security.sasl.SaslException; -+import javax.security.auth.callback.UnsupportedCallbackException; -+ -+import org.jivesoftware.smack.SASLAuthentication; -+import org.jivesoftware.smack.XMPPException; -+import org.jivesoftware.smack.util.Base64; -+ -+import security.javax.security.auth.callback.NameCallback; -+import security.javax.security.sasl.RealmCallback; -+import security.javax.security.sasl.RealmChoiceCallback; -+import security.javax.security.sasl.Sasl; -+import security.javax.security.sasl.SaslClient; -+import security.javax.security.sasl.SaslException; - - /** - * Base class for SASL mechanisms. Subclasses must implement these methods: -@@ -148,12 +150,13 @@ - } else { - response = sc.evaluateChallenge(null); - } -- -- String authenticationText = Base64.encodeBytes(response,Base64.DONT_BREAK_LINES); -+ String authenticationText = ""; -+ if (response != null) { -+ authenticationText = Base64.encodeBytes(response,Base64.DONT_BREAK_LINES); - if(authenticationText.equals("")) { - authenticationText = "="; - } -- -+ } - stanza.append(""); - stanza.append(authenticationText); - stanza.append(""); -diff -Nbdru org/jivesoftware/smack/SASLAuthentication.java /home/nikita/devel/beem-ui/src/org/jivesoftware/smack/SASLAuthentication.java ---- org/jivesoftware/smack/SASLAuthentication.java 2009-06-26 21:11:24.597252589 +0200 -+++ /home/nikita/devel/beem-ui/src/org/jivesoftware/smack/SASLAuthentication.java 2009-06-26 21:31:16.445251493 +0200 -@@ -84,17 +84,15 @@ - - // Register SASL mechanisms supported by Smack - registerSASLMechanism("EXTERNAL", SASLExternalMechanism.class); -- registerSASLMechanism("GSSAPI", SASLGSSAPIMechanism.class); - registerSASLMechanism("DIGEST-MD5", SASLDigestMD5Mechanism.class); - registerSASLMechanism("CRAM-MD5", SASLCramMD5Mechanism.class); - registerSASLMechanism("PLAIN", SASLPlainMechanism.class); - registerSASLMechanism("ANONYMOUS", SASLAnonymous.class); - -- supportSASLMechanism("GSSAPI",0); -- supportSASLMechanism("DIGEST-MD5",1); -- supportSASLMechanism("CRAM-MD5",2); -- supportSASLMechanism("PLAIN",3); -- supportSASLMechanism("ANONYMOUS",4); -+ supportSASLMechanism("DIGEST-MD5",0); -+ supportSASLMechanism("CRAM-MD5",1); -+ supportSASLMechanism("PLAIN",2); -+ supportSASLMechanism("ANONYMOUS",3); - - } - -diff -Nbdru org/jivesoftware/smack/util/DNSUtil.java /home/nikita/devel/beem-ui/src/org/jivesoftware/smack/util/DNSUtil.java ---- org/jivesoftware/smack/util/DNSUtil.java 2009-06-26 21:11:24.585252398 +0200 -+++ /home/nikita/devel/beem-ui/src/org/jivesoftware/smack/util/DNSUtil.java 2009-06-26 00:41:16.932251881 +0200 -@@ -22,12 +22,6 @@ - import java.util.Hashtable; - import java.util.Map; - --import javax.naming.NamingEnumeration; --import javax.naming.directory.Attribute; --import javax.naming.directory.Attributes; --import javax.naming.directory.DirContext; --import javax.naming.directory.InitialDirContext; -- - /** - * Utilty class to perform DNS lookups for XMPP services. - * -@@ -41,13 +35,13 @@ - */ - private static Map cache = new Cache(100, 1000*60*10); - -- private static DirContext context; -+// private static DirContext context; - - static { - try { - Hashtable env = new Hashtable(); - env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory"); -- context = new InitialDirContext(env); -+ // context = new InitialDirContext(env); - } - catch (Exception e) { - // Ignore. -@@ -79,65 +73,8 @@ - * server can be reached at for the specified domain. - */ - public static HostAddress resolveXMPPDomain(String domain) { -- if (context == null) { - return new HostAddress(domain, 5222); - } -- String key = "c" + domain; -- // Return item from cache if it exists. -- if (cache.containsKey(key)) { -- HostAddress address = (HostAddress)cache.get(key); -- if (address != null) { -- return address; -- } -- } -- String bestHost = domain; -- int bestPort = 5222; -- int bestPriority = 0; -- int bestWeight = 0; -- try { -- Attributes dnsLookup = context.getAttributes("_xmpp-client._tcp." + domain, new String[]{"SRV"}); -- Attribute srvAttribute = dnsLookup.get("SRV"); -- NamingEnumeration srvRecords = srvAttribute.getAll(); -- while(srvRecords.hasMore()) { -- String srvRecord = (String) srvRecords.next(); -- String [] srvRecordEntries = srvRecord.split(" "); -- int priority = Integer.parseInt(srvRecordEntries[srvRecordEntries.length - 4]); -- int port = Integer.parseInt(srvRecordEntries[srvRecordEntries.length-2]); -- int weight = Integer.parseInt(srvRecordEntries[srvRecordEntries.length - 3]); -- String host = srvRecordEntries[srvRecordEntries.length-1]; -- -- // Randomize the weight. -- weight *= Math.random() * weight; -- -- if ((bestPriority == 0) || (priority < bestPriority)) { -- // Choose a server with the lowest priority. -- bestPriority = priority; -- bestWeight = weight; -- bestHost = host; -- bestPort = port; -- } else if (priority == bestPriority) { -- // When we have like priorities then randomly choose a server based on its weight -- // The weights were randomized above. -- if (weight > bestWeight) { -- bestWeight = weight; -- bestHost = host; -- bestPort = port; -- } -- } -- } -- } -- catch (Exception e) { -- // Ignore. -- } -- // Host entries in DNS should end with a ".". -- if (bestHost.endsWith(".")) { -- bestHost = bestHost.substring(0, bestHost.length()-1); -- } -- HostAddress address = new HostAddress(bestHost, bestPort); -- // Add item to cache. -- cache.put(key, address); -- return address; -- } - - /** - * Returns the host name and port that the specified XMPP server can be -@@ -157,50 +94,8 @@ - * server can be reached at for the specified domain. - */ - public static HostAddress resolveXMPPServerDomain(String domain) { -- if (context == null) { - return new HostAddress(domain, 5269); - } -- String key = "s" + domain; -- // Return item from cache if it exists. -- if (cache.containsKey(key)) { -- HostAddress address = (HostAddress)cache.get(key); -- if (address != null) { -- return address; -- } -- } -- String host = domain; -- int port = 5269; -- try { -- Attributes dnsLookup = -- context.getAttributes("_xmpp-server._tcp." + domain, new String[]{"SRV"}); -- String srvRecord = (String)dnsLookup.get("SRV").get(); -- String [] srvRecordEntries = srvRecord.split(" "); -- port = Integer.parseInt(srvRecordEntries[srvRecordEntries.length-2]); -- host = srvRecordEntries[srvRecordEntries.length-1]; -- } -- catch (Exception e) { -- // Attempt lookup with older "jabber" name. -- try { -- Attributes dnsLookup = -- context.getAttributes("_jabber._tcp." + domain, new String[]{"SRV"}); -- String srvRecord = (String)dnsLookup.get("SRV").get(); -- String [] srvRecordEntries = srvRecord.split(" "); -- port = Integer.parseInt(srvRecordEntries[srvRecordEntries.length-2]); -- host = srvRecordEntries[srvRecordEntries.length-1]; -- } -- catch (Exception e2) { -- // Ignore. -- } -- } -- // Host entries in DNS should end with a ".". -- if (host.endsWith(".")) { -- host = host.substring(0, host.length()-1); -- } -- HostAddress address = new HostAddress(host, port); -- // Add item to cache. -- cache.put(key, address); -- return address; -- } - - /** - * Encapsulates a hostname and port. -diff -Nbdru org/jivesoftware/smack/util/PacketParserUtils.java /home/nikita/devel/beem-ui/src/org/jivesoftware/smack/util/PacketParserUtils.java ---- org/jivesoftware/smack/util/PacketParserUtils.java 2009-06-26 21:11:24.585252398 +0200 -+++ /home/nikita/devel/beem-ui/src/org/jivesoftware/smack/util/PacketParserUtils.java 2009-06-25 22:34:41.252416000 +0200 -@@ -25,7 +25,7 @@ - import org.jivesoftware.smack.provider.ProviderManager; - import org.xmlpull.v1.XmlPullParser; - --import java.beans.PropertyDescriptor; -+//import java.beans.PropertyDescriptor; - import java.io.ByteArrayInputStream; - import java.io.ObjectInputStream; - import java.util.ArrayList; -@@ -428,26 +428,26 @@ - { - boolean done = false; - Object object = objectClass.newInstance(); -- while (!done) { -- int eventType = parser.next(); -- if (eventType == XmlPullParser.START_TAG) { -- String name = parser.getName(); -- String stringValue = parser.nextText(); -- PropertyDescriptor descriptor = new PropertyDescriptor(name, objectClass); -- // Load the class type of the property. -- Class propertyType = descriptor.getPropertyType(); -- // Get the value of the property by converting it from a -- // String to the correct object type. -- Object value = decode(propertyType, stringValue); -- // Set the value of the bean. -- descriptor.getWriteMethod().invoke(object, value); -- } -- else if (eventType == XmlPullParser.END_TAG) { -- if (parser.getName().equals(elementName)) { -- done = true; -- } -- } -- } -+// while (!done) { -+// int eventType = parser.next(); -+// if (eventType == XmlPullParser.START_TAG) { -+// String name = parser.getName(); -+// String stringValue = parser.nextText(); -+// PropertyDescriptor descriptor = new PropertyDescriptor(name, objectClass); -+// // Load the class type of the property. -+// Class propertyType = descriptor.getPropertyType(); -+// // Get the value of the property by converting it from a -+// // String to the correct object type. -+// Object value = decode(propertyType, stringValue); -+// // Set the value of the bean. -+// descriptor.getWriteMethod().invoke(object, value); -+// } -+// else if (eventType == XmlPullParser.END_TAG) { -+// if (parser.getName().equals(elementName)) { -+// done = true; -+// } -+// } -+// } - return object; - } - -diff -Nbdru org/jivesoftware/smack/XMPPConnection.java /home/nikita/devel/beem-ui/src/org/jivesoftware/smack/XMPPConnection.java ---- org/jivesoftware/smack/XMPPConnection.java 2009-06-26 21:11:24.601252412 +0200 -+++ /home/nikita/devel/beem-ui/src/org/jivesoftware/smack/XMPPConnection.java 2009-06-25 22:34:41.252416000 +0200 -@@ -1082,7 +1082,7 @@ - catch (Exception ex) { - try { - debuggerClass = -- Class.forName("org.jivesoftware.smack.debugger.LiteDebugger"); -+ Class.forName("org.jivesoftware.smack.debugger.ConsoleDebugger"); - } - catch (Exception ex2) { - ex2.printStackTrace(); -diff -Nbdru org/jivesoftware/smackx/debugger/EnhancedDebugger.java /home/nikita/devel/beem-ui/src/org/jivesoftware/smackx/debugger/EnhancedDebugger.java ---- org/jivesoftware/smackx/debugger/EnhancedDebugger.java 2009-06-26 21:11:18.348252001 +0200 -+++ /home/nikita/devel/beem-ui/src/org/jivesoftware/smackx/debugger/EnhancedDebugger.java 1970-01-01 01:00:00.000000000 +0100 -@@ -1,1005 +0,0 @@ --/** -- * $RCSfile$ -- * $Revision: 11024 $ -- * $Date: 2009-06-04 13:58:25 +0200 (Thu, 04 Jun 2009) $ -- * -- * Copyright 2003-2007 Jive Software. -- * -- * All rights reserved. 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.smackx.debugger; -- --import org.jivesoftware.smack.ConnectionListener; --import org.jivesoftware.smack.PacketListener; --import org.jivesoftware.smack.XMPPConnection; --import org.jivesoftware.smack.debugger.SmackDebugger; --import org.jivesoftware.smack.packet.IQ; --import org.jivesoftware.smack.packet.Message; --import org.jivesoftware.smack.packet.Packet; --import org.jivesoftware.smack.packet.Presence; --import org.jivesoftware.smack.util.*; -- --import javax.swing.*; --import javax.swing.event.ListSelectionEvent; --import javax.swing.event.ListSelectionListener; --import javax.swing.table.DefaultTableModel; --import javax.swing.text.BadLocationException; --import javax.xml.transform.*; --import javax.xml.transform.stream.StreamResult; --import javax.xml.transform.stream.StreamSource; --import java.awt.*; --import java.awt.datatransfer.Clipboard; --import java.awt.datatransfer.StringSelection; --import java.awt.event.ActionEvent; --import java.awt.event.ActionListener; --import java.awt.event.MouseAdapter; --import java.awt.event.MouseEvent; --import java.io.Reader; --import java.io.StringReader; --import java.io.StringWriter; --import java.io.Writer; --import java.net.URL; --import java.text.SimpleDateFormat; --import java.util.Date; -- --/** -- * The EnhancedDebugger is a debugger that allows to debug sent, received and interpreted messages -- * but also provides the ability to send ad-hoc messages composed by the user.

-- *

-- * A new EnhancedDebugger will be created for each connection to debug. All the EnhancedDebuggers -- * will be shown in the same debug window provided by the class EnhancedDebuggerWindow. -- * -- * @author Gaston Dombiak -- */ --public class EnhancedDebugger implements SmackDebugger { -- -- private static final String NEWLINE = "\n"; -- -- private static ImageIcon packetReceivedIcon; -- private static ImageIcon packetSentIcon; -- private static ImageIcon presencePacketIcon; -- private static ImageIcon iqPacketIcon; -- private static ImageIcon messagePacketIcon; -- private static ImageIcon unknownPacketTypeIcon; -- -- { -- URL url; -- // Load the image icons -- url = -- Thread.currentThread().getContextClassLoader().getResource("images/nav_left_blue.png"); -- if (url != null) { -- packetReceivedIcon = new ImageIcon(url); -- } -- url = -- Thread.currentThread().getContextClassLoader().getResource("images/nav_right_red.png"); -- if (url != null) { -- packetSentIcon = new ImageIcon(url); -- } -- url = -- Thread.currentThread().getContextClassLoader().getResource("images/photo_portrait.png"); -- if (url != null) { -- presencePacketIcon = new ImageIcon(url); -- } -- url = -- Thread.currentThread().getContextClassLoader().getResource( -- "images/question_and_answer.png"); -- if (url != null) { -- iqPacketIcon = new ImageIcon(url); -- } -- url = Thread.currentThread().getContextClassLoader().getResource("images/message.png"); -- if (url != null) { -- messagePacketIcon = new ImageIcon(url); -- } -- url = Thread.currentThread().getContextClassLoader().getResource("images/unknown.png"); -- if (url != null) { -- unknownPacketTypeIcon = new ImageIcon(url); -- } -- } -- -- private DefaultTableModel messagesTable = null; -- private JTextArea messageTextArea = null; -- private JFormattedTextField userField = null; -- private JFormattedTextField statusField = null; -- -- private XMPPConnection connection = null; -- -- private PacketListener packetReaderListener = null; -- private PacketListener packetWriterListener = null; -- private ConnectionListener connListener = null; -- -- private Writer writer; -- private Reader reader; -- private ReaderListener readerListener; -- private WriterListener writerListener; -- -- private Date creationTime = new Date(); -- -- // Statistics variables -- private DefaultTableModel statisticsTable = null; -- private int sentPackets = 0; -- private int receivedPackets = 0; -- private int sentIQPackets = 0; -- private int receivedIQPackets = 0; -- private int sentMessagePackets = 0; -- private int receivedMessagePackets = 0; -- private int sentPresencePackets = 0; -- private int receivedPresencePackets = 0; -- private int sentOtherPackets = 0; -- private int receivedOtherPackets = 0; -- -- JTabbedPane tabbedPane; -- -- public EnhancedDebugger(XMPPConnection connection, Writer writer, Reader reader) { -- this.connection = connection; -- this.writer = writer; -- this.reader = reader; -- createDebug(); -- EnhancedDebuggerWindow.addDebugger(this); -- } -- -- /** -- * 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. -- tabbedPane = new JTabbedPane(); -- -- // Add the All Packets, Sent, Received and Interpreted panels -- addBasicPanels(); -- -- // Add the panel to send ad-hoc messages -- addAdhocPacketPanel(); -- -- // 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 PacketListener() { -- SimpleDateFormat dateFormatter = new SimpleDateFormat("hh:mm:ss aaa"); -- -- public void processPacket(final Packet packet) { -- SwingUtilities.invokeLater(new Runnable() { -- public void run() { -- addReadPacketToTable(dateFormatter, packet); -- } -- }); -- -- } -- }; -- -- // Create a thread that will listen for all outgoing packets and write them to -- // the GUI. -- packetWriterListener = new PacketListener() { -- SimpleDateFormat dateFormatter = new SimpleDateFormat("hh:mm:ss aaa"); -- -- public void processPacket(final Packet packet) { -- SwingUtilities.invokeLater(new Runnable() { -- public void run() { -- addSentPacketToTable(dateFormatter, packet); -- } -- }); -- -- } -- }; -- -- // Create a thread that will listen for any connection closed event -- connListener = new ConnectionListener() { -- public void connectionClosed() { -- SwingUtilities.invokeLater(new Runnable() { -- public void run() { -- statusField.setValue("Closed"); -- EnhancedDebuggerWindow.connectionClosed(EnhancedDebugger.this); -- } -- }); -- -- } -- -- public void connectionClosedOnError(final Exception e) { -- SwingUtilities.invokeLater(new Runnable() { -- public void run() { -- statusField.setValue("Closed due to an exception"); -- EnhancedDebuggerWindow.connectionClosedOnError(EnhancedDebugger.this, e); -- } -- }); -- -- } -- public void reconnectingIn(final int seconds){ -- SwingUtilities.invokeLater(new Runnable() { -- public void run() { -- statusField.setValue("Attempt to reconnect in " + seconds + " seconds"); -- } -- }); -- } -- -- public void reconnectionSuccessful() { -- SwingUtilities.invokeLater(new Runnable() { -- public void run() { -- statusField.setValue("Reconnection stablished"); -- EnhancedDebuggerWindow.connectionEstablished(EnhancedDebugger.this); -- } -- }); -- } -- -- public void reconnectionFailed(Exception e) { -- SwingUtilities.invokeLater(new Runnable() { -- public void run() { -- statusField.setValue("Reconnection failed"); -- } -- }); -- } -- }; -- } -- -- private void addBasicPanels() { -- JSplitPane allPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); -- allPane.setOneTouchExpandable(true); -- -- messagesTable = -- new DefaultTableModel( -- new Object[]{"Hide", "Timestamp", "", "", "Message", "Id", "Type", "To", "From"}, -- 0) { -- private static final long serialVersionUID = 8136121224474217264L; -- public boolean isCellEditable(int rowIndex, int mColIndex) { -- return false; -- } -- -- public Class getColumnClass(int columnIndex) { -- if (columnIndex == 2 || columnIndex == 3) { -- return Icon.class; -- } -- return super.getColumnClass(columnIndex); -- } -- -- }; -- JTable table = new JTable(messagesTable); -- // Allow only single a selection -- table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); -- // Hide the first column -- table.getColumnModel().getColumn(0).setMaxWidth(0); -- table.getColumnModel().getColumn(0).setMinWidth(0); -- table.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(0); -- table.getTableHeader().getColumnModel().getColumn(0).setMinWidth(0); -- // Set the column "timestamp" size -- table.getColumnModel().getColumn(1).setMaxWidth(300); -- table.getColumnModel().getColumn(1).setPreferredWidth(70); -- // Set the column "direction" icon size -- table.getColumnModel().getColumn(2).setMaxWidth(50); -- table.getColumnModel().getColumn(2).setPreferredWidth(30); -- // Set the column "packet type" icon size -- table.getColumnModel().getColumn(3).setMaxWidth(50); -- table.getColumnModel().getColumn(3).setPreferredWidth(30); -- // Set the column "Id" size -- table.getColumnModel().getColumn(5).setMaxWidth(100); -- table.getColumnModel().getColumn(5).setPreferredWidth(55); -- // Set the column "type" size -- table.getColumnModel().getColumn(6).setMaxWidth(200); -- table.getColumnModel().getColumn(6).setPreferredWidth(50); -- // Set the column "to" size -- table.getColumnModel().getColumn(7).setMaxWidth(300); -- table.getColumnModel().getColumn(7).setPreferredWidth(90); -- // Set the column "from" size -- table.getColumnModel().getColumn(8).setMaxWidth(300); -- table.getColumnModel().getColumn(8).setPreferredWidth(90); -- // Create a table listener that listen for row selection events -- SelectionListener selectionListener = new SelectionListener(table); -- table.getSelectionModel().addListSelectionListener(selectionListener); -- table.getColumnModel().getSelectionModel().addListSelectionListener(selectionListener); -- allPane.setTopComponent(new JScrollPane(table)); -- messageTextArea = new JTextArea(); -- messageTextArea.setEditable(false); -- // Add pop-up menu. -- JPopupMenu menu = new JPopupMenu(); -- JMenuItem menuItem1 = new JMenuItem("Copy"); -- menuItem1.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- // Get the clipboard -- Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); -- // Set the sent text as the new content of the clipboard -- clipboard.setContents(new StringSelection(messageTextArea.getText()), null); -- } -- }); -- menu.add(menuItem1); -- // Add listener to the text area so the popup menu can come up. -- messageTextArea.addMouseListener(new PopupListener(menu)); -- allPane.setBottomComponent(new JScrollPane(messageTextArea)); -- allPane.setDividerLocation(150); -- -- tabbedPane.add("All Packets", allPane); -- tabbedPane.setToolTipTextAt(0, "Sent and received packets processed by Smack"); -- -- // Create UI elements for client generated XML traffic. -- final JTextArea sentText = new JTextArea(); -- sentText.setWrapStyleWord(true); -- sentText.setLineWrap(true); -- sentText.setEditable(false); -- sentText.setForeground(new Color(112, 3, 3)); -- tabbedPane.add("Raw Sent Packets", new JScrollPane(sentText)); -- tabbedPane.setToolTipTextAt(1, "Raw text of the sent packets"); -- -- // Add pop-up menu. -- menu = new JPopupMenu(); -- menuItem1 = new JMenuItem("Copy"); -- menuItem1.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- // Get the clipboard -- Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); -- // Set the sent text as the new content of the clipboard -- clipboard.setContents(new StringSelection(sentText.getText()), null); -- } -- }); -- -- JMenuItem menuItem2 = new JMenuItem("Clear"); -- menuItem2.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- sentText.setText(""); -- } -- }); -- -- // Add listener to the text area so the popup menu can come up. -- sentText.addMouseListener(new PopupListener(menu)); -- menu.add(menuItem1); -- menu.add(menuItem2); -- -- // Create UI elements for server generated XML traffic. -- final JTextArea receivedText = new JTextArea(); -- receivedText.setWrapStyleWord(true); -- receivedText.setLineWrap(true); -- receivedText.setEditable(false); -- receivedText.setForeground(new Color(6, 76, 133)); -- tabbedPane.add("Raw Received Packets", new JScrollPane(receivedText)); -- tabbedPane.setToolTipTextAt( -- 2, -- "Raw text of the received packets before Smack process them"); -- -- // Add pop-up menu. -- menu = new JPopupMenu(); -- menuItem1 = new JMenuItem("Copy"); -- menuItem1.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- // Get the clipboard -- Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); -- // Set the sent text as the new content of the clipboard -- clipboard.setContents(new StringSelection(receivedText.getText()), null); -- } -- }); -- -- menuItem2 = new JMenuItem("Clear"); -- menuItem2.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- receivedText.setText(""); -- } -- }); -- -- // Add listener to the text area so the popup menu can come up. -- receivedText.addMouseListener(new PopupListener(menu)); -- menu.add(menuItem1); -- menu.add(menuItem2); -- -- // Create a special Reader that wraps the main Reader and logs data to the GUI. -- ObservableReader debugReader = new ObservableReader(reader); -- readerListener = new ReaderListener() { -- public void read(final String str) { -- SwingUtilities.invokeLater(new Runnable() { -- public void run() { -- if (EnhancedDebuggerWindow.PERSISTED_DEBUGGER && -- !EnhancedDebuggerWindow.getInstance().isVisible()) { -- // Do not add content if the parent is not visible -- return; -- } -- -- int index = str.lastIndexOf(">"); -- if (index != -1) { -- if (receivedText.getLineCount() >= EnhancedDebuggerWindow.MAX_TABLE_ROWS) -- { -- try { -- receivedText.replaceRange("", 0, receivedText.getLineEndOffset(0)); -- } -- catch (BadLocationException e) { -- e.printStackTrace(); -- } -- } -- receivedText.append(str.substring(0, index + 1)); -- receivedText.append(NEWLINE); -- if (str.length() > index) { -- receivedText.append(str.substring(index + 1)); -- } -- } -- else { -- receivedText.append(str); -- } -- } -- }); -- } -- }; -- debugReader.addReaderListener(readerListener); -- -- // Create a special Writer that wraps the main Writer and logs data to the GUI. -- ObservableWriter debugWriter = new ObservableWriter(writer); -- writerListener = new WriterListener() { -- public void write(final String str) { -- SwingUtilities.invokeLater(new Runnable() { -- public void run() { -- if (EnhancedDebuggerWindow.PERSISTED_DEBUGGER && -- !EnhancedDebuggerWindow.getInstance().isVisible()) { -- // Do not add content if the parent is not visible -- return; -- } -- -- if (sentText.getLineCount() >= EnhancedDebuggerWindow.MAX_TABLE_ROWS) { -- try { -- sentText.replaceRange("", 0, sentText.getLineEndOffset(0)); -- } -- catch (BadLocationException e) { -- e.printStackTrace(); -- } -- } -- -- sentText.append(str); -- if (str.endsWith(">")) { -- sentText.append(NEWLINE); -- } -- } -- }); -- -- -- } -- }; -- debugWriter.addWriterListener(writerListener); -- -- // Assign the reader/writer objects to use the debug versions. The packet reader -- // and writer will use the debug versions when they are created. -- reader = debugReader; -- writer = debugWriter; -- -- } -- -- private void addAdhocPacketPanel() { -- // Create UI elements for sending ad-hoc messages. -- final JTextArea adhocMessages = new JTextArea(); -- adhocMessages.setEditable(true); -- adhocMessages.setForeground(new Color(1, 94, 35)); -- tabbedPane.add("Ad-hoc message", new JScrollPane(adhocMessages)); -- tabbedPane.setToolTipTextAt(3, "Panel that allows you to send adhoc packets"); -- -- // Add pop-up menu. -- JPopupMenu menu = new JPopupMenu(); -- JMenuItem menuItem = new JMenuItem("Message"); -- menuItem.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- adhocMessages.setText( -- ""); -- } -- }); -- menu.add(menuItem); -- -- menuItem = new JMenuItem("IQ Get"); -- menuItem.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- adhocMessages.setText( -- ""); -- } -- }); -- menu.add(menuItem); -- -- menuItem = new JMenuItem("IQ Set"); -- menuItem.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- adhocMessages.setText( -- ""); -- } -- }); -- menu.add(menuItem); -- -- menuItem = new JMenuItem("Presence"); -- menuItem.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- adhocMessages.setText( -- ""); -- } -- }); -- menu.add(menuItem); -- menu.addSeparator(); -- -- menuItem = new JMenuItem("Send"); -- menuItem.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- if (!"".equals(adhocMessages.getText())) { -- AdHocPacket packetToSend = new AdHocPacket(adhocMessages.getText()); -- connection.sendPacket(packetToSend); -- } -- } -- }); -- menu.add(menuItem); -- -- menuItem = new JMenuItem("Clear"); -- menuItem.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- adhocMessages.setText(null); -- } -- }); -- menu.add(menuItem); -- -- // Add listener to the text area so the popup menu can come up. -- adhocMessages.addMouseListener(new PopupListener(menu)); -- } -- -- private void addInformationPanel() { -- // Create UI elements for connection information. -- JPanel informationPanel = new JPanel(); -- informationPanel.setLayout(new BorderLayout()); -- -- // Add the Host information -- JPanel connPanel = new JPanel(); -- connPanel.setLayout(new GridBagLayout()); -- connPanel.setBorder(BorderFactory.createTitledBorder("Connection information")); -- -- JLabel label = new JLabel("Host: "); -- label.setMinimumSize(new java.awt.Dimension(150, 14)); -- label.setMaximumSize(new java.awt.Dimension(150, 14)); -- connPanel.add( -- label, -- new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, 21, 0, new Insets(0, 0, 0, 0), 0, 0)); -- JFormattedTextField field = new JFormattedTextField(connection.getServiceName()); -- field.setMinimumSize(new java.awt.Dimension(150, 20)); -- field.setMaximumSize(new java.awt.Dimension(150, 20)); -- field.setEditable(false); -- field.setBorder(null); -- connPanel.add( -- field, -- new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0, 10, 2, new Insets(0, 0, 0, 0), 0, 0)); -- -- // Add the Port information -- label = new JLabel("Port: "); -- label.setMinimumSize(new java.awt.Dimension(150, 14)); -- label.setMaximumSize(new java.awt.Dimension(150, 14)); -- connPanel.add( -- label, -- new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, 21, 0, new Insets(0, 0, 0, 0), 0, 0)); -- field = new JFormattedTextField(connection.getPort()); -- field.setMinimumSize(new java.awt.Dimension(150, 20)); -- field.setMaximumSize(new java.awt.Dimension(150, 20)); -- field.setEditable(false); -- field.setBorder(null); -- connPanel.add( -- field, -- new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0, 10, 2, new Insets(0, 0, 0, 0), 0, 0)); -- -- // Add the connection's User information -- label = new JLabel("User: "); -- label.setMinimumSize(new java.awt.Dimension(150, 14)); -- label.setMaximumSize(new java.awt.Dimension(150, 14)); -- connPanel.add( -- label, -- new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0, 21, 0, new Insets(0, 0, 0, 0), 0, 0)); -- userField = new JFormattedTextField(); -- userField.setMinimumSize(new java.awt.Dimension(150, 20)); -- userField.setMaximumSize(new java.awt.Dimension(150, 20)); -- userField.setEditable(false); -- userField.setBorder(null); -- connPanel.add( -- userField, -- new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0, 10, 2, new Insets(0, 0, 0, 0), 0, 0)); -- -- // Add the connection's creationTime information -- label = new JLabel("Creation time: "); -- label.setMinimumSize(new java.awt.Dimension(150, 14)); -- label.setMaximumSize(new java.awt.Dimension(150, 14)); -- connPanel.add( -- label, -- new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0, 21, 0, new Insets(0, 0, 0, 0), 0, 0)); -- field = new JFormattedTextField(new SimpleDateFormat("yyyy.MM.dd hh:mm:ss aaa")); -- field.setMinimumSize(new java.awt.Dimension(150, 20)); -- field.setMaximumSize(new java.awt.Dimension(150, 20)); -- field.setValue(creationTime); -- field.setEditable(false); -- field.setBorder(null); -- connPanel.add( -- field, -- new GridBagConstraints(1, 3, 1, 1, 0.0, 0.0, 10, 2, new Insets(0, 0, 0, 0), 0, 0)); -- -- // Add the connection's creationTime information -- label = new JLabel("Status: "); -- label.setMinimumSize(new java.awt.Dimension(150, 14)); -- label.setMaximumSize(new java.awt.Dimension(150, 14)); -- connPanel.add( -- label, -- new GridBagConstraints(0, 4, 1, 1, 0.0, 0.0, 21, 0, new Insets(0, 0, 0, 0), 0, 0)); -- statusField = new JFormattedTextField(); -- statusField.setMinimumSize(new java.awt.Dimension(150, 20)); -- statusField.setMaximumSize(new java.awt.Dimension(150, 20)); -- statusField.setValue("Active"); -- statusField.setEditable(false); -- statusField.setBorder(null); -- connPanel.add( -- statusField, -- new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0, 10, 2, new Insets(0, 0, 0, 0), 0, 0)); -- // Add the connection panel to the information panel -- informationPanel.add(connPanel, BorderLayout.NORTH); -- -- // Add the Number of sent packets information -- JPanel packetsPanel = new JPanel(); -- packetsPanel.setLayout(new GridLayout(1, 1)); -- packetsPanel.setBorder(BorderFactory.createTitledBorder("Transmitted Packets")); -- -- statisticsTable = -- new DefaultTableModel(new Object[][]{{"IQ", 0, 0}, {"Message", 0, 0}, -- {"Presence", 0, 0}, {"Other", 0, 0}, {"Total", 0, 0}}, -- new Object[]{"Type", "Received", "Sent"}) { -- private static final long serialVersionUID = -6793886085109589269L; -- public boolean isCellEditable(int rowIndex, int mColIndex) { -- return false; -- } -- }; -- JTable table = new JTable(statisticsTable); -- // Allow only single a selection -- table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); -- packetsPanel.add(new JScrollPane(table)); -- -- // Add the packets panel to the information panel -- informationPanel.add(packetsPanel, BorderLayout.CENTER); -- -- tabbedPane.add("Information", new JScrollPane(informationPanel)); -- tabbedPane.setToolTipTextAt(4, "Information and statistics about the debugged connection"); -- } -- -- public Reader newConnectionReader(Reader newReader) { -- ((ObservableReader) reader).removeReaderListener(readerListener); -- ObservableReader debugReader = new ObservableReader(newReader); -- debugReader.addReaderListener(readerListener); -- reader = debugReader; -- return reader; -- } -- -- public Writer newConnectionWriter(Writer newWriter) { -- ((ObservableWriter) writer).removeWriterListener(writerListener); -- ObservableWriter debugWriter = new ObservableWriter(newWriter); -- debugWriter.addWriterListener(writerListener); -- writer = debugWriter; -- return writer; -- } -- -- public void userHasLogged(final String user) { -- final EnhancedDebugger debugger = this; -- SwingUtilities.invokeLater(new Runnable() { -- public void run() { -- userField.setText(user); -- EnhancedDebuggerWindow.userHasLogged(debugger, user); -- // Add the connection listener to the connection so that the debugger can be notified -- // whenever the connection is closed. -- connection.addConnectionListener(connListener); -- } -- }); -- -- } -- -- public Reader getReader() { -- return reader; -- } -- -- public Writer getWriter() { -- return writer; -- } -- -- public PacketListener getReaderListener() { -- return packetReaderListener; -- } -- -- public PacketListener getWriterListener() { -- return packetWriterListener; -- } -- -- /** -- * Updates the statistics table -- */ -- private void updateStatistics() { -- statisticsTable.setValueAt(Integer.valueOf(receivedIQPackets), 0, 1); -- statisticsTable.setValueAt(Integer.valueOf(sentIQPackets), 0, 2); -- -- statisticsTable.setValueAt(Integer.valueOf(receivedMessagePackets), 1, 1); -- statisticsTable.setValueAt(Integer.valueOf(sentMessagePackets), 1, 2); -- -- statisticsTable.setValueAt(Integer.valueOf(receivedPresencePackets), 2, 1); -- statisticsTable.setValueAt(Integer.valueOf(sentPresencePackets), 2, 2); -- -- statisticsTable.setValueAt(Integer.valueOf(receivedOtherPackets), 3, 1); -- statisticsTable.setValueAt(Integer.valueOf(sentOtherPackets), 3, 2); -- -- statisticsTable.setValueAt(Integer.valueOf(receivedPackets), 4, 1); -- statisticsTable.setValueAt(Integer.valueOf(sentPackets), 4, 2); -- } -- -- /** -- * Adds the received packet detail to the messages table. -- * -- * @param dateFormatter the SimpleDateFormat to use to format Dates -- * @param packet the read packet to add to the table -- */ -- private void addReadPacketToTable(final SimpleDateFormat dateFormatter, final Packet packet) { -- SwingUtilities.invokeLater(new Runnable() { -- public void run() { -- String messageType; -- String from = packet.getFrom(); -- String type = ""; -- Icon packetTypeIcon; -- receivedPackets++; -- if (packet instanceof IQ) { -- packetTypeIcon = iqPacketIcon; -- messageType = "IQ Received (class=" + packet.getClass().getName() + ")"; -- type = ((IQ) packet).getType().toString(); -- receivedIQPackets++; -- } -- else if (packet instanceof Message) { -- packetTypeIcon = messagePacketIcon; -- messageType = "Message Received"; -- type = ((Message) packet).getType().toString(); -- receivedMessagePackets++; -- } -- else if (packet instanceof Presence) { -- packetTypeIcon = presencePacketIcon; -- messageType = "Presence Received"; -- type = ((Presence) packet).getType().toString(); -- receivedPresencePackets++; -- } -- else { -- packetTypeIcon = unknownPacketTypeIcon; -- messageType = packet.getClass().getName() + " Received"; -- receivedOtherPackets++; -- } -- -- // Check if we need to remove old rows from the table to keep memory consumption low -- if (EnhancedDebuggerWindow.MAX_TABLE_ROWS > 0 && -- messagesTable.getRowCount() >= EnhancedDebuggerWindow.MAX_TABLE_ROWS) { -- messagesTable.removeRow(0); -- } -- -- messagesTable.addRow( -- new Object[]{ -- formatXML(packet.toXML()), -- dateFormatter.format(new Date()), -- packetReceivedIcon, -- packetTypeIcon, -- messageType, -- packet.getPacketID(), -- type, -- "", -- from}); -- // Update the statistics table -- updateStatistics(); -- } -- }); -- } -- -- /** -- * Adds the sent packet detail to the messages table. -- * -- * @param dateFormatter the SimpleDateFormat to use to format Dates -- * @param packet the sent packet to add to the table -- */ -- private void addSentPacketToTable(final SimpleDateFormat dateFormatter, final Packet packet) { -- SwingUtilities.invokeLater(new Runnable() { -- public void run() { -- String messageType; -- String to = packet.getTo(); -- String type = ""; -- Icon packetTypeIcon; -- sentPackets++; -- if (packet instanceof IQ) { -- packetTypeIcon = iqPacketIcon; -- messageType = "IQ Sent (class=" + packet.getClass().getName() + ")"; -- type = ((IQ) packet).getType().toString(); -- sentIQPackets++; -- } -- else if (packet instanceof Message) { -- packetTypeIcon = messagePacketIcon; -- messageType = "Message Sent"; -- type = ((Message) packet).getType().toString(); -- sentMessagePackets++; -- } -- else if (packet instanceof Presence) { -- packetTypeIcon = presencePacketIcon; -- messageType = "Presence Sent"; -- type = ((Presence) packet).getType().toString(); -- sentPresencePackets++; -- } -- else { -- packetTypeIcon = unknownPacketTypeIcon; -- messageType = packet.getClass().getName() + " Sent"; -- sentOtherPackets++; -- } -- -- // Check if we need to remove old rows from the table to keep memory consumption low -- if (EnhancedDebuggerWindow.MAX_TABLE_ROWS > 0 && -- messagesTable.getRowCount() >= EnhancedDebuggerWindow.MAX_TABLE_ROWS) { -- messagesTable.removeRow(0); -- } -- -- messagesTable.addRow( -- new Object[]{ -- formatXML(packet.toXML()), -- dateFormatter.format(new Date()), -- packetSentIcon, -- packetTypeIcon, -- messageType, -- packet.getPacketID(), -- type, -- to, -- ""}); -- -- // Update the statistics table -- updateStatistics(); -- } -- }); -- } -- -- private String formatXML(String str) { -- try { -- // Use a Transformer for output -- TransformerFactory tFactory = TransformerFactory.newInstance(); -- // Surround this setting in a try/catch for compatibility with Java 1.4. This setting is required -- // for Java 1.5 -- try { -- tFactory.setAttribute("indent-number", 2); -- } -- catch (IllegalArgumentException e) { -- // Ignore -- } -- Transformer transformer = tFactory.newTransformer(); -- transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); -- transformer.setOutputProperty(OutputKeys.INDENT, "yes"); -- transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); -- -- // Transform the requested string into a nice formatted XML string -- StreamSource source = new StreamSource(new StringReader(str)); -- StringWriter sw = new StringWriter(); -- StreamResult result = new StreamResult(sw); -- transformer.transform(source, result); -- return sw.toString(); -- -- } -- catch (TransformerConfigurationException tce) { -- // Error generated by the parser -- System.out.println("\n** Transformer Factory error"); -- System.out.println(" " + tce.getMessage()); -- -- // Use the contained exception, if any -- Throwable x = tce; -- if (tce.getException() != null) -- x = tce.getException(); -- x.printStackTrace(); -- -- } -- catch (TransformerException te) { -- // Error generated by the parser -- System.out.println("\n** Transformation error"); -- System.out.println(" " + te.getMessage()); -- -- // Use the contained exception, if any -- Throwable x = te; -- if (te.getException() != null) -- x = te.getException(); -- x.printStackTrace(); -- -- } -- return str; -- } -- -- /** -- * Returns true if the debugger's connection with the server is up and running. -- * -- * @return true if the connection with the server is active. -- */ -- boolean isConnectionActive() { -- return connection.isConnected(); -- } -- -- /** -- * Stops debugging the connection. Removes any listener on the connection. -- */ -- void cancel() { -- connection.removeConnectionListener(connListener); -- connection.removePacketListener(packetReaderListener); -- connection.removePacketWriterListener(packetWriterListener); -- ((ObservableReader) reader).removeReaderListener(readerListener); -- ((ObservableWriter) writer).removeWriterListener(writerListener); -- messagesTable = null; -- } -- -- /** -- * An ad-hoc packet is like any regular packet but with the exception that it's intention is -- * to be used only to send packets.

-- *

-- * The whole text to send must be passed to the constructor. This implies that the client of -- * this class is responsible for sending a valid text to the constructor. -- */ -- private class AdHocPacket extends Packet { -- -- private String text; -- -- /** -- * Create a new AdHocPacket with the text to send. The passed text must be a valid text to -- * send to the server, no validation will be done on the passed text. -- * -- * @param text the whole text of the packet to send -- */ -- public AdHocPacket(String text) { -- this.text = text; -- } -- -- public String toXML() { -- return text; -- } -- -- } -- -- /** -- * Listens for debug window popup dialog events. -- */ -- private class PopupListener extends MouseAdapter { -- -- JPopupMenu popup; -- -- PopupListener(JPopupMenu popupMenu) { -- popup = popupMenu; -- } -- -- public void mousePressed(MouseEvent e) { -- maybeShowPopup(e); -- } -- -- public void mouseReleased(MouseEvent e) { -- maybeShowPopup(e); -- } -- -- private void maybeShowPopup(MouseEvent e) { -- if (e.isPopupTrigger()) { -- popup.show(e.getComponent(), e.getX(), e.getY()); -- } -- } -- } -- -- private class SelectionListener implements ListSelectionListener { -- -- JTable table; -- -- // It is necessary to keep the table since it is not possible -- // to determine the table from the event's source -- SelectionListener(JTable table) { -- this.table = table; -- } -- -- public void valueChanged(ListSelectionEvent e) { -- if (table.getSelectedRow() == -1) { -- // Clear the messageTextArea since there is none packet selected -- messageTextArea.setText(null); -- } -- else { -- // Set the detail of the packet in the messageTextArea -- messageTextArea.setText( -- (String) table.getModel().getValueAt(table.getSelectedRow(), 0)); -- // Scroll up to the top -- messageTextArea.setCaretPosition(0); -- } -- } -- } --} -diff -Nbdru org/jivesoftware/smackx/debugger/EnhancedDebuggerWindow.java /home/nikita/devel/beem-ui/src/org/jivesoftware/smackx/debugger/EnhancedDebuggerWindow.java ---- org/jivesoftware/smackx/debugger/EnhancedDebuggerWindow.java 2009-06-26 21:11:18.348252001 +0200 -+++ /home/nikita/devel/beem-ui/src/org/jivesoftware/smackx/debugger/EnhancedDebuggerWindow.java 1970-01-01 01:00:00.000000000 +0100 -@@ -1,375 +0,0 @@ --/** -- * $RCSfile$ -- * $Revision: 7071 $ -- * $Date: 2007-02-12 01:59:05 +0100 (Mon, 12 Feb 2007) $ -- * -- * Copyright 2003-2007 Jive Software. -- * -- * All rights reserved. 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.smackx.debugger; -- --import org.jivesoftware.smack.SmackConfiguration; --import org.jivesoftware.smack.provider.ProviderManager; -- --import javax.swing.*; --import java.awt.*; --import java.awt.event.*; --import java.net.URL; --import java.util.ArrayList; --import java.util.Collections; --import java.util.Vector; -- --/** -- * The EnhancedDebuggerWindow is the main debug window that will show all the EnhancedDebuggers. -- * For each connection to debug there will be an EnhancedDebugger that will be shown in the -- * EnhancedDebuggerWindow.

-- *

-- * This class also provides information about Smack like for example the Smack version and the -- * installed providers. -- * -- * @author Gaston Dombiak -- */ --public class EnhancedDebuggerWindow { -- -- private static EnhancedDebuggerWindow instance; -- -- private static ImageIcon connectionCreatedIcon; -- private static ImageIcon connectionActiveIcon; -- private static ImageIcon connectionClosedIcon; -- private static ImageIcon connectionClosedOnErrorIcon; -- -- public static boolean PERSISTED_DEBUGGER = false; -- /** -- * Keeps the max number of rows to keep in the tables. A value less than 0 means that packets -- * will never be removed. If you are planning to use this debugger in a -- * production environment then you should set a lower value (e.g. 50) to prevent the debugger -- * from consuming all the JVM memory. -- */ -- public static int MAX_TABLE_ROWS = 150; -- -- { -- URL url; -- -- url = -- Thread.currentThread().getContextClassLoader().getResource( -- "images/trafficlight_off.png"); -- if (url != null) { -- connectionCreatedIcon = new ImageIcon(url); -- } -- url = -- Thread.currentThread().getContextClassLoader().getResource( -- "images/trafficlight_green.png"); -- if (url != null) { -- connectionActiveIcon = new ImageIcon(url); -- } -- url = -- Thread.currentThread().getContextClassLoader().getResource( -- "images/trafficlight_red.png"); -- if (url != null) { -- connectionClosedIcon = new ImageIcon(url); -- } -- url = Thread.currentThread().getContextClassLoader().getResource("images/warning.png"); -- if (url != null) { -- connectionClosedOnErrorIcon = new ImageIcon(url); -- } -- -- } -- -- private JFrame frame = null; -- private JTabbedPane tabbedPane = null; -- private java.util.List debuggers = new ArrayList(); -- -- private EnhancedDebuggerWindow() { -- } -- -- /** -- * Returns the unique EnhancedDebuggerWindow instance available in the system. -- * -- * @return the unique EnhancedDebuggerWindow instance -- */ -- public static EnhancedDebuggerWindow getInstance() { -- if (instance == null) { -- instance = new EnhancedDebuggerWindow(); -- } -- return instance; -- } -- -- /** -- * Adds the new specified debugger to the list of debuggers to show in the main window. -- * -- * @param debugger the new debugger to show in the debug window -- */ -- synchronized static void addDebugger(EnhancedDebugger debugger) { -- getInstance().showNewDebugger(debugger); -- } -- -- /** -- * Shows the new debugger in the debug window. -- * -- * @param debugger the new debugger to show -- */ -- private void showNewDebugger(EnhancedDebugger debugger) { -- if (frame == null) { -- createDebug(); -- } -- debugger.tabbedPane.setName("Connection_" + tabbedPane.getComponentCount()); -- tabbedPane.add(debugger.tabbedPane, tabbedPane.getComponentCount() - 1); -- tabbedPane.setIconAt(tabbedPane.indexOfComponent(debugger.tabbedPane), connectionCreatedIcon); -- frame.setTitle( -- "Smack Debug Window -- Total connections: " + (tabbedPane.getComponentCount() - 1)); -- // Keep the added debugger for later access -- debuggers.add(debugger); -- } -- -- /** -- * Notification that a user has logged in to the server. A new title will be set -- * to the tab of the given debugger. -- * -- * @param debugger the debugger whose connection logged in to the server -- * @param user the user@host/resource that has just logged in -- */ -- synchronized static void userHasLogged(EnhancedDebugger debugger, String user) { -- int index = getInstance().tabbedPane.indexOfComponent(debugger.tabbedPane); -- getInstance().tabbedPane.setTitleAt( -- index, -- user); -- getInstance().tabbedPane.setIconAt( -- index, -- connectionActiveIcon); -- } -- -- /** -- * Notification that the connection was properly closed. -- * -- * @param debugger the debugger whose connection was properly closed. -- */ -- synchronized static void connectionClosed(EnhancedDebugger debugger) { -- getInstance().tabbedPane.setIconAt( -- getInstance().tabbedPane.indexOfComponent(debugger.tabbedPane), -- connectionClosedIcon); -- } -- -- /** -- * Notification that the connection was closed due to an exception. -- * -- * @param debugger the debugger whose connection was closed due to an exception. -- * @param e the exception. -- */ -- synchronized static void connectionClosedOnError(EnhancedDebugger debugger, Exception e) { -- int index = getInstance().tabbedPane.indexOfComponent(debugger.tabbedPane); -- getInstance().tabbedPane.setToolTipTextAt( -- index, -- "Connection closed due to the exception: " + e.getMessage()); -- getInstance().tabbedPane.setIconAt( -- index, -- connectionClosedOnErrorIcon); -- } -- -- synchronized static void connectionEstablished(EnhancedDebugger debugger) { -- getInstance().tabbedPane.setIconAt( -- getInstance().tabbedPane.indexOfComponent(debugger.tabbedPane), -- connectionActiveIcon); -- } -- -- /** -- * Creates the main debug window that provides information about Smack and also shows -- * a tab panel for each connection that is being debugged. -- */ -- private void createDebug() { -- -- frame = new JFrame("Smack Debug Window"); -- -- if (!PERSISTED_DEBUGGER) { -- // Add listener for window closing event -- frame.addWindowListener(new WindowAdapter() { -- public void windowClosing(WindowEvent evt) { -- rootWindowClosing(evt); -- } -- }); -- } -- -- // We'll arrange the UI into tabs. The last tab contains Smack's information. -- // All the connection debugger tabs will be shown before the Smack info tab. -- tabbedPane = new JTabbedPane(); -- -- // Create the Smack info panel -- JPanel informationPanel = new JPanel(); -- informationPanel.setLayout(new BoxLayout(informationPanel, BoxLayout.Y_AXIS)); -- -- // Add the Smack version label -- JPanel versionPanel = new JPanel(); -- versionPanel.setLayout(new BoxLayout(versionPanel, BoxLayout.X_AXIS)); -- versionPanel.setMaximumSize(new Dimension(2000, 31)); -- versionPanel.add(new JLabel(" Smack version: ")); -- JFormattedTextField field = new JFormattedTextField(SmackConfiguration.getVersion()); -- field.setEditable(false); -- field.setBorder(null); -- versionPanel.add(field); -- informationPanel.add(versionPanel); -- -- // Add the list of installed IQ Providers -- JPanel iqProvidersPanel = new JPanel(); -- iqProvidersPanel.setLayout(new GridLayout(1, 1)); -- iqProvidersPanel.setBorder(BorderFactory.createTitledBorder("Installed IQ Providers")); -- Vector providers = new Vector(); -- for (Object provider : ProviderManager.getInstance().getIQProviders()) { -- if (provider.getClass() == Class.class) { -- providers.add(((Class) provider).getName()); -- } -- else { -- providers.add(provider.getClass().getName()); -- } -- } -- // Sort the collection of providers -- Collections.sort(providers); -- JList list = new JList(providers); -- iqProvidersPanel.add(new JScrollPane(list)); -- informationPanel.add(iqProvidersPanel); -- -- // Add the list of installed Extension Providers -- JPanel extensionProvidersPanel = new JPanel(); -- extensionProvidersPanel.setLayout(new GridLayout(1, 1)); -- extensionProvidersPanel.setBorder(BorderFactory.createTitledBorder("Installed Extension Providers")); -- providers = new Vector(); -- for (Object provider : ProviderManager.getInstance().getExtensionProviders()) { -- if (provider.getClass() == Class.class) { -- providers.add(((Class) provider).getName()); -- } -- else { -- providers.add(provider.getClass().getName()); -- } -- } -- // Sort the collection of providers -- Collections.sort(providers); -- list = new JList(providers); -- extensionProvidersPanel.add(new JScrollPane(list)); -- informationPanel.add(extensionProvidersPanel); -- -- tabbedPane.add("Smack Info", informationPanel); -- -- // Add pop-up menu. -- JPopupMenu menu = new JPopupMenu(); -- // Add a menu item that allows to close the current selected tab -- JMenuItem menuItem = new JMenuItem("Close"); -- menuItem.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- // Remove the selected tab pane if it's not the Smack info pane -- if (tabbedPane.getSelectedIndex() < tabbedPane.getComponentCount() - 1) { -- int index = tabbedPane.getSelectedIndex(); -- // Notify to the debugger to stop debugging -- EnhancedDebugger debugger = debuggers.get(index); -- debugger.cancel(); -- // Remove the debugger from the root window -- tabbedPane.remove(debugger.tabbedPane); -- debuggers.remove(debugger); -- // Update the root window title -- frame.setTitle( -- "Smack Debug Window -- Total connections: " -- + (tabbedPane.getComponentCount() - 1)); -- } -- } -- }); -- menu.add(menuItem); -- // Add a menu item that allows to close all the tabs that have their connections closed -- menuItem = new JMenuItem("Close All Not Active"); -- menuItem.addActionListener(new ActionListener() { -- public void actionPerformed(ActionEvent e) { -- ArrayList debuggersToRemove = new ArrayList(); -- // Remove all the debuggers of which their connections are no longer valid -- for (int index = 0; index < tabbedPane.getComponentCount() - 1; index++) { -- EnhancedDebugger debugger = debuggers.get(index); -- if (!debugger.isConnectionActive()) { -- // Notify to the debugger to stop debugging -- debugger.cancel(); -- debuggersToRemove.add(debugger); -- } -- } -- for (EnhancedDebugger debugger : debuggersToRemove) { -- // Remove the debugger from the root window -- tabbedPane.remove(debugger.tabbedPane); -- debuggers.remove(debugger); -- } -- // Update the root window title -- frame.setTitle( -- "Smack Debug Window -- Total connections: " -- + (tabbedPane.getComponentCount() - 1)); -- } -- }); -- menu.add(menuItem); -- // Add listener to the text area so the popup menu can come up. -- tabbedPane.addMouseListener(new PopupListener(menu)); -- -- frame.getContentPane().add(tabbedPane); -- -- frame.setSize(650, 400); -- -- if (!PERSISTED_DEBUGGER) { -- frame.setVisible(true); -- } -- } -- -- /** -- * Notification that the root window is closing. Stop listening for received and -- * transmitted packets in all the debugged connections. -- * -- * @param evt the event that indicates that the root window is closing -- */ -- public void rootWindowClosing(WindowEvent evt) { -- // Notify to all the debuggers to stop debugging -- for (EnhancedDebugger debugger : debuggers) { -- debugger.cancel(); -- } -- // Release any reference to the debuggers -- debuggers.removeAll(debuggers); -- // Release the default instance -- instance = null; -- } -- -- /** -- * Listens for debug window popup dialog events. -- */ -- private class PopupListener extends MouseAdapter { -- -- JPopupMenu popup; -- -- PopupListener(JPopupMenu popupMenu) { -- popup = popupMenu; -- } -- -- public void mousePressed(MouseEvent e) { -- maybeShowPopup(e); -- } -- -- public void mouseReleased(MouseEvent e) { -- maybeShowPopup(e); -- } -- -- private void maybeShowPopup(MouseEvent e) { -- if (e.isPopupTrigger()) { -- popup.show(e.getComponent(), e.getX(), e.getY()); -- } -- } -- } -- -- public void setVisible(boolean visible) { -- if (frame != null) { -- frame.setVisible(visible); -- } -- } -- -- public boolean isVisible() { -- return frame != null && frame.isVisible(); -- } --} -diff -Nbdru org/jivesoftware/smackx/debugger/package.html /home/nikita/devel/beem-ui/src/org/jivesoftware/smackx/debugger/package.html ---- org/jivesoftware/smackx/debugger/package.html 2009-06-26 21:11:18.352250912 +0200 -+++ /home/nikita/devel/beem-ui/src/org/jivesoftware/smackx/debugger/package.html 1970-01-01 01:00:00.000000000 +0100 -@@ -1 +0,0 @@ --Smack optional Debuggers. -\ No newline at end of file