package omq.common.remote;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.QueueingConsumer;

/**
 * 
 * @author Sergi Toda <sergi.toda@estudiants.urv.cat> 
 *
 */
public abstract class RemoteListener extends Thread {
	private static String defaultXml = "eventListener.xml";

	protected Connection connection;
	protected Channel channel;
	protected QueueingConsumer consumer;
	protected boolean killed = false;

	protected RemoteListener() throws Exception {
		// Load the default environment
		FileInputStream fis = new FileInputStream(defaultXml);
		Properties env = new Properties();
		env.loadFromXML(fis);
		fis.close();

		startConnection(env);
	}

	protected RemoteListener(Properties env) throws Exception {
		startConnection(env);
	}

	private void startConnection(Properties env) throws Exception {
		connection = OmqConnectionFactory.getConnection(env);
		channel = connection.createChannel();
	}

	public synchronized Channel getChannel() throws Exception {
		return connection.createChannel();
	}

	/**
	 * Interrupt and kill the Thread
	 * 
	 * @throws IOException
	 */
	public void kill() throws IOException {
		interrupt();
		killed = true;
		channel.close();
		connection.close();
	}

	/**
	 * TODO RESTART CONNECTION FAULT TOLERANCE
	 */

}
