source: src/main/java/bargainingchips/protocol/AsynchronousOffersProtocol.java@ 340

Last change on this file since 340 was 337, checked in by Tim Baarslag, 5 years ago

Added support for PreAccept and FinalAccept

File size: 3.4 KB
Line 
1package bargainingchips.protocol;
2
3import java.util.concurrent.BlockingQueue;
4import java.util.concurrent.LinkedBlockingQueue;
5
6import bargainingchips.actions.Breakoff;
7import bargainingchips.actions.Offer;
8import bargainingchips.actions.OfferBy;
9import bargainingchips.actions.PreAccept;
10
11
12public 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}
Note: See TracBrowser for help on using the repository browser.