[316] | 1 | package bargainingchips.protocol;
|
---|
[315] | 2 |
|
---|
| 3 | import java.util.concurrent.BlockingQueue;
|
---|
| 4 | import java.util.concurrent.LinkedBlockingQueue;
|
---|
| 5 |
|
---|
[316] | 6 | import bargainingchips.actions.Accept;
|
---|
[321] | 7 | import bargainingchips.actions.Breakoff;
|
---|
[316] | 8 | import bargainingchips.actions.Offer;
|
---|
| 9 | import bargainingchips.actions.OfferBy;
|
---|
[315] | 10 |
|
---|
[316] | 11 |
|
---|
[315] | 12 | public class AsynchronousOffersProtocol extends BilateralProtocol
|
---|
| 13 | {
|
---|
[322] | 14 | public AsynchronousOffersProtocol(BlockingQueue<OfferBy> from, String nameA,
|
---|
| 15 | BlockingQueue<Offer> toA, String nameB, BlockingQueue<Offer> toB) {
|
---|
| 16 | super(from, nameA, toA, nameB, toB);
|
---|
[315] | 17 | }
|
---|
| 18 |
|
---|
| 19 | /**
|
---|
| 20 | * An offer is valid iff:
|
---|
| 21 | * 1) An offer or walk-away is sent by anyone at any time: $o_{t+1} \in \Omega \cup \{End\}$; or
|
---|
| 22 | * 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
|
---|
| 23 | * 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}$.
|
---|
| 24 | */
|
---|
| 25 | @Override
|
---|
[320] | 26 | protected ValidationResult validate(OfferBy curOfferBy)
|
---|
[315] | 27 | {
|
---|
[320] | 28 | Offer curOffer = curOfferBy.getOffer();
|
---|
| 29 | String curSender = curOfferBy.getSender();
|
---|
[319] | 30 |
|
---|
[315] | 31 | // 1)
|
---|
[318] | 32 | if (curOffer.isBid())
|
---|
[319] | 33 | return new ValidationSuccess();
|
---|
[315] | 34 |
|
---|
[318] | 35 | if (curOffer.isBreakoff())
|
---|
[319] | 36 | return new ValidationSuccessWithBreakoff(); // we are done
|
---|
[318] | 37 |
|
---|
[315] | 38 | // 2)
|
---|
| 39 | if (log.size() < 2) // o_t should exist
|
---|
[319] | 40 | return new ValidationFailure();
|
---|
[315] | 41 |
|
---|
[320] | 42 | OfferBy prevOfferBy = getLastOffer();
|
---|
| 43 | Offer prevOffer = prevOfferBy.getOffer();
|
---|
| 44 | String prevSender = prevOfferBy.getSender();
|
---|
| 45 |
|
---|
[315] | 46 | if (curOffer.isAccept() && prevOffer.isBid() && !curSender.equals(prevSender))
|
---|
[319] | 47 | return new ValidationSuccess();
|
---|
[315] | 48 |
|
---|
| 49 | // 3)
|
---|
| 50 | if (log.size() < 3) // o_{t-1} should exist
|
---|
[319] | 51 | return new ValidationFailure();
|
---|
[315] | 52 |
|
---|
[320] | 53 | OfferBy prevprevBy = log.get(log.size() - 2);
|
---|
| 54 | Offer prevprev = prevprevBy.getOffer();
|
---|
| 55 | String prevprevSender = prevprevBy.getSender();
|
---|
[315] | 56 |
|
---|
| 57 | if (curOffer.isAccept() && prevOffer.isAccept()
|
---|
| 58 | && prevprev.isBid() && prevprevSender.equals(curSender)
|
---|
| 59 | && !curSender.equals(prevSender))
|
---|
[319] | 60 | return new ValidationSuccessWithOutcome(prevprev); // we are done
|
---|
[315] | 61 |
|
---|
[320] | 62 | return new ValidationFailure();
|
---|
[315] | 63 | }
|
---|
| 64 |
|
---|
| 65 | public static void main(String[] args) throws InterruptedException
|
---|
| 66 | {
|
---|
[322] | 67 | BlockingQueue<OfferBy> from = new LinkedBlockingQueue<OfferBy>();
|
---|
| 68 | String nameA = "Buyer";
|
---|
[315] | 69 | BlockingQueue<Offer> toA = new LinkedBlockingQueue<Offer>();
|
---|
[322] | 70 | String nameB = "Seller";
|
---|
[315] | 71 | BlockingQueue<Offer> toB = new LinkedBlockingQueue<Offer>();
|
---|
| 72 |
|
---|
[322] | 73 | AsynchronousOffersProtocol aop = new AsynchronousOffersProtocol(from, nameA, toA, nameB, toB);
|
---|
[315] | 74 |
|
---|
| 75 | Thread aopThread = new Thread(aop);
|
---|
| 76 | aopThread.start();
|
---|
| 77 |
|
---|
[322] | 78 | from.put(OfferBy.getSampleOffer("Buyer", "Red", 3));
|
---|
| 79 | // Thread.sleep(1000);
|
---|
| 80 | from.put(OfferBy.getSampleOffer("Buyer", "Red", 6));
|
---|
| 81 | // Thread.sleep(1000);
|
---|
| 82 | from.put(new OfferBy("Seller", new Accept(Offer.getSampleOffer(6))));
|
---|
| 83 | // Thread.sleep(1000);
|
---|
| 84 | // from.put(new OfferBy("Buyer", new Accept(Offer.getSampleOffer(6))));
|
---|
| 85 | from.put(new OfferBy("Buyer", new Breakoff()));
|
---|
[315] | 86 |
|
---|
| 87 | Thread.sleep(1000);
|
---|
[321] | 88 | System.out.println("Sent to A:" + toA);
|
---|
[317] | 89 | System.out.println("Sent to B:" + toB);
|
---|
[315] | 90 | }
|
---|
| 91 |
|
---|
| 92 | }
|
---|