view src/org/dancres/blitz/remote/transport/ClientSessionHandler.java @ 32:243c74d599bf

Update ignores
author Dan Creswell <dan.creswell@gmail.com>
date Sat, 12 Jun 2010 10:41:47 +0100
parents 3dc0c5604566
children
line wrap: on
line source

package org.dancres.blitz.remote.transport;

import java.rmi.RemoteException;

import edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import org.apache.mina.common.ByteBuffer;
import org.apache.mina.util.SessionLog;

/**
 */
public class ClientSessionHandler extends IoHandlerAdapter {
    private ConcurrentHashMap _requests = new ConcurrentHashMap();

    public void messageReceived(IoSession session, Object aMessage) {
        Message myMessage = (Message) aMessage;

        int myConversationId = myMessage.getConversationId();

        // System.err.println("Got response: " + myConversationId);

        Ticket myTicket = (Ticket)
            _requests.get(new Integer(myConversationId));

        if (myTicket != null)
            myTicket.postResponse(myMessage);
    }

    public void exceptionCaught(IoSession session, Throwable cause) {
        SessionLog.warn(session, "Server error, disconnecting...", cause);
        session.close();
    }

    Ticket getTicket(int aConversationId) {
        Ticket myTicket = new Ticket(aConversationId);

        _requests.put(new Integer(aConversationId), myTicket);
        return myTicket;
    }

    class Ticket {
        private int _conversationId;
        private Message _message;

        Ticket(int aConversationId) {
            _conversationId = aConversationId;
        }

        void postResponse(Message aMessage) {
            synchronized(this) {
                _message = aMessage;
                notify();
            }
        }

        Message getResponse(long aWait) throws RemoteException {
            try {
                synchronized(this) {
                    if (_message == null) {
                        wait(aWait);
                    }

                    return _message;
                }
            } catch(InterruptedException anIE) {
                throw new RemoteException("interrupted", anIE);
            } finally {
                _requests.remove(new Long(_conversationId));
            }
        }
    }
}