// Path: code/api/src/main/java/ar/edu/itba/tpf/chatterbot/exception/ChatterbotClientException.java
// public class ChatterbotClientException extends ChatterbotException {
//     private static final long serialVersionUID = 1L;
// 
//     public ChatterbotClientException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
// }


import org.apache.log4j.Logger;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.filter.PacketTypeFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import ar.edu.itba.tpf.chatterbot.exception.ChatterbotClientException;
package ar.edu.itba.tpf.chatterbot.dispatcher;



/**
 * Bean que ofrece servicios para enviar y recibir mensajes a través del procotolo XMPP.
 * 
 * Primero se deben setear las propiedades server, username y password. Luego, en el método <code>init</code> se realiza
 * la conexión al servidor. Durante todo el tiempo que el bean esté en memoria, el cliente permanecerá conectado. Al
 * destruirlo se desconecta del servidor. Para enviar mensajes de manera sincrónica se utiliza el método
 * <code>sendMessage</code>. Para recibir mensajes se debe registrar un observer, que va a ser invocado cuando llegue un
 * mensaje nuevo.
 */
public class JabberClient {

    private static final Logger logger = Logger.getLogger(JabberClient.class);

    private String server;
    private String username;
    private String password;
    private JabberClientObserver observer;
    private XMPPConnection connection;

    /**
     * Inicializa el bean realizando el login al servidor Jabber, y dejando al cliente online.
     * 
     * @throws ChatterbotClientException Si falla la conexión, retornará en esta excepción información del error.
     */
// Path: code/api/src/main/java/ar/edu/itba/tpf/chatterbot/exception/ChatterbotClientException.java
// public class ChatterbotClientException extends ChatterbotException {
//     private static final long serialVersionUID = 1L;
// 
//     public ChatterbotClientException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
// }


// Path: code/dispatcher/src/main/java/ar/edu/itba/tpf/chatterbot/dispatcher/JabberClient.java
import org.apache.log4j.Logger;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.filter.PacketTypeFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import ar.edu.itba.tpf.chatterbot.exception.ChatterbotClientException;

package ar.edu.itba.tpf.chatterbot.dispatcher;



/**
 * Bean que ofrece servicios para enviar y recibir mensajes a través del procotolo XMPP.
 * 
 * Primero se deben setear las propiedades server, username y password. Luego, en el método <code>init</code> se realiza
 * la conexión al servidor. Durante todo el tiempo que el bean esté en memoria, el cliente permanecerá conectado. Al
 * destruirlo se desconecta del servidor. Para enviar mensajes de manera sincrónica se utiliza el método
 * <code>sendMessage</code>. Para recibir mensajes se debe registrar un observer, que va a ser invocado cuando llegue un
 * mensaje nuevo.
 */
public class JabberClient {

    private static final Logger logger = Logger.getLogger(JabberClient.class);

    private String server;
    private String username;
    private String password;
    private JabberClientObserver observer;
    private XMPPConnection connection;

    /**
     * Inicializa el bean realizando el login al servidor Jabber, y dejando al cliente online.
     * 
     * @throws ChatterbotClientException Si falla la conexión, retornará en esta excepción información del error.
     */
    public void init() throws ChatterbotClientException {