package org.rzo.netty.ahessian.rpc.server; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.rzo.netty.ahessian.Constants; import org.rzo.netty.ahessian.rpc.message.HessianRPCCallMessage; import org.rzo.netty.ahessian.rpc.message.HessianRPCReplyMessage; import org.rzo.netty.ahessian.session.Session; /** * Default implementation of a {@link Continuation}. */ class DefaultContinuation implements Continuation, Constants { /** The service. */ private ContinuationService _service; /** The call request message. */ private HessianRPCCallMessage _message; /** The headers for reply message. */ private Map _headers; /** Indicates if the continuation has been completed. */ private boolean _completed = false; /** Time to live. */ private Date _ttl; private Session _session = null; /** * Instantiates a new default continuation. * * @param message the message * @param service the service */ DefaultContinuation(HessianRPCCallMessage message, ContinuationService service, Session session) { _service = service; _message = message; _headers = _message.getHeaders(); if (_headers == null) _headers = new HashMap(); Long ttl = (Long) _headers.get("TTL"); if (ttl == null) _ttl = new Date(Long.MAX_VALUE); else _ttl = new Date(System.currentTimeMillis() + ttl.longValue()); _headers.put(COMPLETED_HEADER_KEY, Boolean.FALSE); _session = session; } /* (non-Javadoc) * @see org.rzo.netty.ahessian.rpc.server.Continuation#complete(java.lang.Object) */ public void complete(Object result) { checkCompleted(); _completed = true; sendReply(result, null); } /* (non-Javadoc) * @see org.rzo.netty.ahessian.rpc.server.Continuation#fault(java.lang.Throwable) */ public void fault(Throwable result) { checkCompleted(); _completed = true; sendReply(null, result); } /* (non-Javadoc) * @see org.rzo.netty.ahessian.rpc.server.Continuation#getTTL() */ public Date getTTL() { return _ttl; } /* (non-Javadoc) * @see org.rzo.netty.ahessian.rpc.server.Continuation#send(java.lang.Object) */ public void send(Object result) { checkCompleted(); sendReply(result, null); } private void checkCompleted() { if (_completed ) throw new RuntimeException("Continuation already completed"); if (System.currentTimeMillis() > _ttl.getTime()) { _completed = true; throw new RuntimeException("Continuation already completed"); } } private void sendReply(Object result, Object fault) { if (_completed) _headers.put(COMPLETED_HEADER_KEY, Boolean.TRUE); //TODO set reply headers _service.writeResult(new HessianRPCReplyMessage(result, fault, _message)); } public Session getSession() { return _session; } }