public Writer newConnectionWriter(Writer newWriter) {
   ((ObservableWriter) writer).removeWriterListener(writerListener);
   ObservableWriter debugWriter = new ObservableWriter(newWriter);
   debugWriter.addWriterListener(writerListener);
   writer = debugWriter;
   return writer;
 }
  /** Creates the listeners that will print in the console when new activity is detected. */
  private void createDebug() {
    // 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) {
            System.out.println(
                dateFormatter.format(new Date()) + " RCV  (" + connection.hashCode() + "): " + 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) {
            System.out.println(
                dateFormatter.format(new Date()) + " SENT (" + connection.hashCode() + "): " + str);
          }
        };
    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) {
            if (printInterpreted) {
              System.out.println(
                  dateFormatter.format(new Date())
                      + " RCV PKT ("
                      + connection.hashCode()
                      + "): "
                      + packet.toXML());
            }
          }
        };

    connListener =
        new ConnectionListener() {
          public void connectionClosed() {
            System.out.println(
                dateFormatter.format(new Date())
                    + " Connection closed ("
                    + connection.hashCode()
                    + ")");
          }

          public void connectionClosedOnError(Exception e) {
            System.out.println(
                dateFormatter.format(new Date())
                    + " Connection closed due to an exception ("
                    + connection.hashCode()
                    + ")");
            e.printStackTrace();
          }

          public void reconnectionFailed(Exception e) {
            System.out.println(
                dateFormatter.format(new Date())
                    + " Reconnection failed due to an exception ("
                    + connection.hashCode()
                    + ")");
            e.printStackTrace();
          }

          public void reconnectionSuccessful() {
            System.out.println(
                dateFormatter.format(new Date())
                    + " Connection reconnected ("
                    + connection.hashCode()
                    + ")");
          }

          public void reconnectingIn(int seconds) {
            System.out.println(
                dateFormatter.format(new Date())
                    + " Connection ("
                    + connection.hashCode()
                    + ") will reconnect in "
                    + seconds);
          }
        };
  }