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

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

More consistent ValidationResult

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