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

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

OfferBy no longer an offer

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