# HG changeset patch # User nikita@localhost # Date 1246045505 -7200 # Node ID 2cc05187c92e40b39cabd720111a16a0d0d30c82 # Parent 5427deeda4e0ce3dcc264b9e56dca63e4db623f6 ajout du sasl diff -r 5427deeda4e0 -r 2cc05187c92e .classpath --- a/.classpath Thu Jun 25 20:12:07 2009 +0200 +++ b/.classpath Fri Jun 26 21:45:05 2009 +0200 @@ -1,12 +1,18 @@ - - + + + + + + + + diff -r 5427deeda4e0 -r 2cc05187c92e libs/patch-smack-android-sasl.diff --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libs/patch-smack-android-sasl.diff Fri Jun 26 21:45:05 2009 +0200 @@ -0,0 +1,2074 @@ +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 diff -r 5427deeda4e0 -r 2cc05187c92e libs/security.jar Binary file libs/security.jar has changed diff -r 5427deeda4e0 -r 2cc05187c92e libs/smack.jar Binary file libs/smack.jar has changed diff -r 5427deeda4e0 -r 2cc05187c92e libs/smackx-debug.jar Binary file libs/smackx-debug.jar has changed diff -r 5427deeda4e0 -r 2cc05187c92e libs/smackx-jingle.jar Binary file libs/smackx-jingle.jar has changed diff -r 5427deeda4e0 -r 2cc05187c92e libs/smackx.jar Binary file libs/smackx.jar has changed