[308] | 1 | package protocol;
|
---|
| 2 |
|
---|
| 3 | import java.util.concurrent.BlockingQueue;
|
---|
| 4 | import java.util.concurrent.LinkedBlockingQueue;
|
---|
| 5 |
|
---|
| 6 | import onetomany.bargainingchipsgame.interactions.Accept;
|
---|
| 7 | import onetomany.bargainingchipsgame.interactions.Offer;
|
---|
| 8 | import onetomany.bargainingchipsgame.interactions.OfferBy;
|
---|
| 9 |
|
---|
| 10 | public class AsynchronousOffersProtocol extends BilateralProtocol
|
---|
| 11 | {
|
---|
| 12 |
|
---|
| 13 | public AsynchronousOffersProtocol(BlockingQueue<Offer> fromA,
|
---|
| 14 | BlockingQueue<Offer> toA, BlockingQueue<Offer> fromB,
|
---|
| 15 | BlockingQueue<Offer> toB) {
|
---|
| 16 | super(fromA, toA, fromB, toB);
|
---|
| 17 | // TODO Auto-generated constructor stub
|
---|
| 18 | }
|
---|
| 19 |
|
---|
| 20 | /**
|
---|
| 21 | * An offer is valid iff:
|
---|
| 22 | * 1) An offer or walk-away is sent by anyone at any time: $o_{t+1} \in \Omega \cup \{End\}$; or
|
---|
| 23 | * 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
|
---|
| 24 | * 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}$.
|
---|
| 25 | */
|
---|
| 26 | @Override
|
---|
| 27 | protected boolean validate(OfferBy curOffer)
|
---|
| 28 | {
|
---|
| 29 | // 1)
|
---|
| 30 | if (curOffer.isBid() || curOffer.isEnd())
|
---|
| 31 | return true;
|
---|
| 32 |
|
---|
| 33 | // 2)
|
---|
| 34 | if (log.size() < 2) // o_t should exist
|
---|
| 35 | return false;
|
---|
| 36 |
|
---|
| 37 | String curSender = curOffer.getSender();
|
---|
| 38 | OfferBy prevOffer = getLastOffer();
|
---|
| 39 | String prevSender = prevOffer.getSender();
|
---|
| 40 | if (curOffer.isAccept() && prevOffer.isBid() && !curSender.equals(prevSender))
|
---|
| 41 | return true;
|
---|
| 42 |
|
---|
| 43 | // 3)
|
---|
| 44 | if (log.size() < 3) // o_{t-1} should exist
|
---|
| 45 | return false;
|
---|
| 46 |
|
---|
| 47 | OfferBy prevprev = log.get(log.size() - 2);
|
---|
| 48 | String prevprevSender = prevprev.getSender();
|
---|
| 49 |
|
---|
| 50 | if (curOffer.isAccept() && prevOffer.isAccept()
|
---|
| 51 | && prevprev.isBid() && prevprevSender.equals(curSender)
|
---|
| 52 | && !curSender.equals(prevSender))
|
---|
| 53 | return true;
|
---|
| 54 |
|
---|
| 55 | return false;
|
---|
| 56 | }
|
---|
| 57 |
|
---|
| 58 | public static void main(String[] args) throws InterruptedException
|
---|
| 59 | {
|
---|
| 60 | BlockingQueue<Offer> fromA = new LinkedBlockingQueue<Offer>();
|
---|
| 61 | BlockingQueue<Offer> toA = new LinkedBlockingQueue<Offer>();
|
---|
| 62 | BlockingQueue<Offer> fromB = new LinkedBlockingQueue<Offer>();
|
---|
| 63 | BlockingQueue<Offer> toB = new LinkedBlockingQueue<Offer>();
|
---|
| 64 |
|
---|
| 65 | AsynchronousOffersProtocol aop = new AsynchronousOffersProtocol(fromA, toA, fromB, toB);
|
---|
| 66 |
|
---|
| 67 | Thread aopThread = new Thread(aop);
|
---|
| 68 | aopThread.start();
|
---|
| 69 |
|
---|
| 70 | fromA.put(Offer.getSampleOffer(3));
|
---|
| 71 | Thread.sleep(1000);
|
---|
| 72 | fromA.put(Offer.getSampleOffer(6));
|
---|
| 73 | Thread.sleep(1000);
|
---|
| 74 | fromB.put(Offer.getSampleOffer(7));
|
---|
| 75 | Thread.sleep(1000);
|
---|
| 76 | fromA.put(new Accept(Offer.getSampleOffer(6)));
|
---|
| 77 |
|
---|
| 78 | Thread.sleep(1000);
|
---|
| 79 | System.out.println(toB);
|
---|
| 80 | }
|
---|
| 81 |
|
---|
| 82 | }
|
---|