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

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

Breakoff works

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