1 | package bargainingchips.protocol;
|
---|
2 |
|
---|
3 | import java.util.concurrent.BlockingQueue;
|
---|
4 | import java.util.concurrent.LinkedBlockingQueue;
|
---|
5 |
|
---|
6 | import bargainingchips.actions.Breakoff;
|
---|
7 | import bargainingchips.actions.Offer;
|
---|
8 | import bargainingchips.actions.OfferBy;
|
---|
9 | import bargainingchips.actions.PreAccept;
|
---|
10 |
|
---|
11 |
|
---|
12 | public class AsynchronousOffersProtocol extends BilateralProtocol
|
---|
13 | {
|
---|
14 | public AsynchronousOffersProtocol(BlockingQueue<OfferBy> from, String nameA,
|
---|
15 | BlockingQueue<Offer> toA, String nameB, BlockingQueue<Offer> toB) {
|
---|
16 | super(from, nameA, toA, nameB, toB);
|
---|
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
|
---|
26 | protected ValidationResult validate(OfferBy curOfferBy)
|
---|
27 | {
|
---|
28 | Offer curOffer = curOfferBy.getOffer();
|
---|
29 | String curSender = curOfferBy.getSender();
|
---|
30 |
|
---|
31 | // 1) Offer or breakoff
|
---|
32 |
|
---|
33 | if (curOffer.isBid())
|
---|
34 | return new ValidationSuccess();
|
---|
35 |
|
---|
36 | if (curOffer.isBreakoff())
|
---|
37 | return new ValidationSuccessWithDisagreement(); // we are done
|
---|
38 |
|
---|
39 | // 2) PreAccept of an offer. TODO: check for equality of the contents of the accepts in 2) and 3)
|
---|
40 |
|
---|
41 | if (log.size() < 1) // o_t should exist
|
---|
42 | return new ValidationFailure();
|
---|
43 |
|
---|
44 | OfferBy prevOfferBy = getLastOffer();
|
---|
45 | Offer prevOffer = prevOfferBy.getOffer();
|
---|
46 | String prevSender = prevOfferBy.getSender();
|
---|
47 |
|
---|
48 | if (curOffer.isPreAccept() && prevOffer.isBid() && !curSender.equals(prevSender))
|
---|
49 | return new ValidationSuccess();
|
---|
50 |
|
---|
51 | // 3) FinalAccept of a PreAccept (of an offer)
|
---|
52 |
|
---|
53 | if (log.size() < 2) // o_{t-1} should exist
|
---|
54 | return new ValidationFailure();
|
---|
55 |
|
---|
56 | OfferBy prevprevBy = log.get(log.size() - 2);
|
---|
57 | Offer prevprev = prevprevBy.getOffer();
|
---|
58 | String prevprevSender = prevprevBy.getSender();
|
---|
59 |
|
---|
60 | if (curOffer.isFinalAccept() && prevOffer.isPreAccept()
|
---|
61 | && prevprev.isBid() && prevprevSender.equals(curSender)
|
---|
62 | && !curSender.equals(prevSender))
|
---|
63 | return new ValidationSuccessWithAgreement(prevprev.getBundle()); // we are done
|
---|
64 |
|
---|
65 | return new ValidationFailure();
|
---|
66 | }
|
---|
67 |
|
---|
68 | public static void main(String[] args) throws InterruptedException
|
---|
69 | {
|
---|
70 | BlockingQueue<OfferBy> from = new LinkedBlockingQueue<OfferBy>();
|
---|
71 | String nameA = "Buyer";
|
---|
72 | BlockingQueue<Offer> toA = new LinkedBlockingQueue<Offer>();
|
---|
73 | String nameB = "Seller";
|
---|
74 | BlockingQueue<Offer> toB = new LinkedBlockingQueue<Offer>();
|
---|
75 |
|
---|
76 | AsynchronousOffersProtocol aop = new AsynchronousOffersProtocol(from, nameA, toA, nameB, toB);
|
---|
77 |
|
---|
78 | Thread aopThread = new Thread(aop);
|
---|
79 | aopThread.start();
|
---|
80 |
|
---|
81 | from.put(OfferBy.getSampleOffer("Buyer", "Red", 3));
|
---|
82 | // Thread.sleep(1000);
|
---|
83 | from.put(OfferBy.getSampleOffer("Buyer", "Red", 6));
|
---|
84 | // Thread.sleep(1000);
|
---|
85 | from.put(new OfferBy("Seller", new PreAccept(Offer.getSampleOffer(6))));
|
---|
86 | // Thread.sleep(1000);
|
---|
87 | // from.put(new OfferBy("Buyer", new Accept(Offer.getSampleOffer(6))));
|
---|
88 | from.put(new OfferBy("Buyer", new Breakoff()));
|
---|
89 |
|
---|
90 | Thread.sleep(1000);
|
---|
91 | System.out.println("Sent to A:" + toA);
|
---|
92 | System.out.println("Sent to B:" + toB);
|
---|
93 | }
|
---|
94 |
|
---|
95 | @Override
|
---|
96 | public String toString()
|
---|
97 | {
|
---|
98 | return "Asynchronous Offers Protocol between " + nameA + " and " + nameB;
|
---|
99 | }
|
---|
100 |
|
---|
101 |
|
---|
102 | }
|
---|