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

Last change on this file since 318 was 318, checked in by Tim Baarslag, 6 years ago

End messaging

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