package protocol; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import onetomany.bargainingchipsgame.interactions.Accept; import onetomany.bargainingchipsgame.interactions.Offer; import onetomany.bargainingchipsgame.interactions.OfferBy; public class AsynchronousOffersProtocol extends BilateralProtocol { public AsynchronousOffersProtocol(BlockingQueue fromA, BlockingQueue toA, BlockingQueue fromB, BlockingQueue toB) { super(fromA, toA, fromB, toB); // TODO Auto-generated constructor stub } /** * An offer is valid iff: * 1) An offer or walk-away is sent by anyone at any time: $o_{t+1} \in \Omega \cup \{End\}$; or * 2) A bid is accepted by the other: $o_{t+1} = Accept$ and $o_{t}\in\Omega$ and $g_t \neq g_{t+1}$; or * 3) An accept is acknowledged, concluding the thread: $o_{t+1} = Accept$ and $o_{t} = Accept$ and $o_{t-1} \in \Omega$ and $g_{t-1} = g_{t+1} \neq g_{t}$. */ @Override protected boolean validate(OfferBy curOffer) { // 1) if (curOffer.isBid() || curOffer.isEnd()) return true; // 2) if (log.size() < 2) // o_t should exist return false; String curSender = curOffer.getSender(); OfferBy prevOffer = getLastOffer(); String prevSender = prevOffer.getSender(); if (curOffer.isAccept() && prevOffer.isBid() && !curSender.equals(prevSender)) return true; // 3) if (log.size() < 3) // o_{t-1} should exist return false; OfferBy prevprev = log.get(log.size() - 2); String prevprevSender = prevprev.getSender(); if (curOffer.isAccept() && prevOffer.isAccept() && prevprev.isBid() && prevprevSender.equals(curSender) && !curSender.equals(prevSender)) return true; return false; } public static void main(String[] args) throws InterruptedException { BlockingQueue fromA = new LinkedBlockingQueue(); BlockingQueue toA = new LinkedBlockingQueue(); BlockingQueue fromB = new LinkedBlockingQueue(); BlockingQueue toB = new LinkedBlockingQueue(); AsynchronousOffersProtocol aop = new AsynchronousOffersProtocol(fromA, toA, fromB, toB); Thread aopThread = new Thread(aop); aopThread.start(); fromA.put(Offer.getSampleOffer(3)); Thread.sleep(1000); fromA.put(Offer.getSampleOffer(6)); Thread.sleep(1000); fromB.put(Offer.getSampleOffer(7)); Thread.sleep(1000); fromA.put(new Accept(Offer.getSampleOffer(6))); Thread.sleep(1000); System.out.println(toB); } }