/*
 * Created on 26 oct. 2005
 *
 */
package archean.util;

import java.io.IOException;

import org.apache.mina.common.IdleStatus;
import org.apache.mina.protocol.ProtocolFilter;
import org.apache.mina.protocol.ProtocolProvider;
import org.apache.mina.protocol.ProtocolSession;
import org.apache.mina.protocol.io.IoProtocolConnector;

/**
 * A simple auto reconnection filter.
 * Retry to reconnect a closed session until it's connected.
 * A delay between the reconnection is avaible as parameter. 
 * @author Julien Vermillard - Archean
 *
 */
public class ReconnectionFilter implements ProtocolFilter {
	
	
	/** 
	 * @param delay delay in mili-seconds between 2 reconnections
	 * @param connector the ProtocolConnector to reconnect
	 * @param timeout connection timeout
	 * @param provider protocol provider to use for the connection
	 */
	public ReconnectionFilter(int delay,IoProtocolConnector connector,int timeout, ProtocolProvider provider ) {
		this.delay=delay;
		this.connector=connector;
		this.timeout=timeout;
		this.provider=provider;
		
	}
	
	private Thread connectionThread;
	private int delay;
	private IoProtocolConnector connector;
	private int timeout;
	private ProtocolProvider provider; 
	
	
	public void sessionOpened(NextFilter nextFilter, ProtocolSession session) throws Exception {
		final ProtocolSession sess=session;
		connectionThread=new Thread() {
			public void run() {
				
				while(!sess.isConnected()) {
					// try
						try {
							connector.connect(sess.getRemoteAddress(),sess.getLocalAddress(),timeout,provider);
						} catch (IOException e1) {
							try {
								sess.getHandler().exceptionCaught(sess,e1);
							} catch (Exception e) {
							}
						}
					// wait
					if(!sess.isConnected()) {
						synchronized (this) {
							try {
								sleep(delay);
							} catch (InterruptedException e) {
							}
						}
					}
				}
			}
		};
		connectionThread.start();
	}

	public void sessionClosed(NextFilter nextFilter, ProtocolSession session) throws Exception {
		
	}

	public void sessionIdle(NextFilter nextFilter, ProtocolSession session, IdleStatus status) throws Exception {

	}

	public void exceptionCaught(NextFilter nextFilter, ProtocolSession session, Throwable cause) throws Exception {

	}

	public void messageReceived(NextFilter nextFilter, ProtocolSession session, Object message) throws Exception {

	}

	public void messageSent(NextFilter nextFilter, ProtocolSession session, Object message) throws Exception {

	}

	public void filterWrite(NextFilter nextFilter, ProtocolSession session, Object message) throws Exception {

	}

}
