package org.zbus.common.remoting.ticket;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.zbus.common.remoting.Message;
public class Ticket {
private static TicketListener ticketListener = null;
private CountDownLatch latch = new CountDownLatch(1);
private String id = "";
private Message response = null;
private Message request = null;
private ResultCallback callback = null;
private volatile boolean expired = false;
protected long timeout = 1000;
public long startTime = System.currentTimeMillis();
public Ticket(Message request, long timeout) {
this.id = uuidTicket();
if(request != null){
request.setMsgId(this.id);
}
this.request = request;
this.timeout = timeout;
}
public static String uuidTicket(){
return UUID.randomUUID().toString();
}
public boolean await(long timeout, TimeUnit unit)
throws InterruptedException {
boolean status = this.latch.await(timeout, unit);
checkExpired();
return status;
}
public void await() throws InterruptedException {
this.latch.await();
checkExpired();
}
public void expired() {
this.expired = true;
this.countDown();
if (ticketListener != null)
ticketListener.onResponseExpired(this);
}
private void countDown() {
this.latch.countDown();
}
public boolean isDone() {
return this.latch.getCount() == 0;
}
public void notifyResponse(Message response) {
this.response = response;
if (this.callback != null)
this.callback.onCompleted(response);
if (ticketListener != null)
ticketListener.onResponseReceived(this);
this.countDown();
}
public ResultCallback getCallback() {
return callback;
}
public void setCallback(ResultCallback callback) {
this.callback = callback;
}
public String getId() {
return id;
}
public Message request() {
return this.request;
}
public Message response() {
return this.response;
}
protected void checkExpired() {
if (this.expired)
throw new TicketExpiredException("Ticket expired");
}
public static void setTicketListener(TicketListener listener) {
ticketListener = listener;
}
}