import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.ObjectMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class ServerQueue implements MessageListener {
 
    private final static String JMS_FACTORY = 
	"javax.jms.QueueConnectionFactory";
    private final static String QUEUE = 
	"ACMProcessQueue";
    
    private static ServerQueue thisServer;

    private Queue queue;
    private QueueConnectionFactory qconFactory;
    private QueueConnection qcon;
    private QueueReceiver qReceiver;
    private QueueSession qsession;

    /**
     * constructor requires a context so that the JMS queue can be found.
     *
     * @param ctx context to be used to find the JMS queue.
     */
    private ServerQueue( Context ctx ) {
	
	try {
	    qconFactory = 
		( QueueConnectionFactory ) ctx.lookup( JMS_FACTORY );
	    
	    qcon = qconFactory.createQueueConnection();
	    
	    qsession = qcon.createQueueSession(false, 
					       Session.AUTO_ACKNOWLEDGE);
	    
	    // Creating a new queue
	    queue = qsession.createQueue( QUEUE );
	    
	    ctx.bind( QUEUE, queue );
	    
	    qReceiver = qsession.createReceiver( queue );
	    qReceiver.setMessageListener( this );
	    
	    qcon.start();

	} catch ( Exception err ) {
	    System.out.println("Could not ServerQueue server.");
	    err.printStackTrace();
	}
	
    }

    public void onMessage( Message msg ) {

	try{
	    
	    Controller myController;
	    if ( msg instanceof ObjectMessage ) {

		myController = (Controller) ((ObjectMessage)msg).getObject();

		myController.reallyStartACM();

	    } else {
	    }
	} catch ( Exception err ) {
	    
	    err.printStackTrace();
	}
    }

    /**
     * used to start the server.  Should only be called from Weblogic startup. 
     */
    public static void main( String args[] ) {
	try {
	    InitialContext ic = new InitialContext();
	    if ( thisServer == null ) {
		thisServer = new ServerQueue( ic );
	    } else {
		System.out.println("The ServerQueue has already been started.");
	    }
	} catch (NamingException nameErr) {
	    nameErr.printStackTrace();
	}
    }    
} // ServerQueue
