package com.foo.bar;

import java.net.SocketAddress;
import java.util.Iterator;

import org.apache.mina.core.service.IoAcceptor;

import quickfix.Application;
import quickfix.ConfigError;
import quickfix.LogFactory;
import quickfix.MessageFactory;
import quickfix.MessageStoreFactory;
import quickfix.SessionFactory;
import quickfix.SessionSettings;
import quickfix.ThreadedSocketAcceptor;

/**
 * Accepts connections and uses a separate thread per session to process messages.
 */
public class MyThreadedSocketAcceptor extends ThreadedSocketAcceptor {

    public MyThreadedSocketAcceptor(Application application,
			MessageStoreFactory messageStoreFactory, SessionSettings settings,
			LogFactory logFactory, MessageFactory messageFactory,
			int queueCapacity) throws ConfigError {
		super(application, messageStoreFactory, settings, logFactory, messageFactory,
				queueCapacity);
	}

	public MyThreadedSocketAcceptor(Application application,
			MessageStoreFactory messageStoreFactory, SessionSettings settings,
			LogFactory logFactory, MessageFactory messageFactory)
			throws ConfigError {
		super(application, messageStoreFactory, settings, logFactory, messageFactory);
	}

	public MyThreadedSocketAcceptor(Application application,
			MessageStoreFactory messageStoreFactory, SessionSettings settings,
			MessageFactory messageFactory, int queueCapacity)
			throws ConfigError {
		super(application, messageStoreFactory, settings, messageFactory, queueCapacity);
	}

	public MyThreadedSocketAcceptor(Application application,
			MessageStoreFactory messageStoreFactory, SessionSettings settings,
			MessageFactory messageFactory) throws ConfigError {
		super(application, messageStoreFactory, settings, messageFactory);
	}

	public MyThreadedSocketAcceptor(SessionFactory sessionFactory,
			SessionSettings settings, int queueCapacity) throws ConfigError {
		super(sessionFactory, settings, queueCapacity);
	}

	public MyThreadedSocketAcceptor(SessionFactory sessionFactory,
			SessionSettings settings) throws ConfigError {
		super(sessionFactory, settings);
	}

    @Override
    protected void stopAcceptingConnections() throws ConfigError {
        Iterator<IoAcceptor> ioIt = getEndpoints().iterator();
        while (ioIt.hasNext()) {
            IoAcceptor ioAcceptor = ioIt.next();
            SocketAddress localAddress = ioAcceptor.getLocalAddress();
            ioAcceptor.unbind();
            final boolean awaitTermination = true;
            ioAcceptor.dispose(awaitTermination);
            log.info("No longer accepting connections on " + localAddress);
            ioIt.remove();
        }
    }
}
