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

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

Connected AsynchronousOffersProtocol

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;
[321]7import bargainingchips.actions.Breakoff;
[316]8import bargainingchips.actions.Offer;
9import bargainingchips.actions.OfferBy;
[315]10
[316]11
[315]12public class AsynchronousOffersProtocol extends BilateralProtocol
13{
[322]14 public AsynchronousOffersProtocol(BlockingQueue<OfferBy> from, String nameA,
15 BlockingQueue<Offer> toA, String nameB, BlockingQueue<Offer> toB) {
16 super(from, nameA, toA, nameB, toB);
[315]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
[320]26 protected ValidationResult validate(OfferBy curOfferBy)
[315]27 {
[320]28 Offer curOffer = curOfferBy.getOffer();
29 String curSender = curOfferBy.getSender();
[319]30
[315]31 // 1)
[318]32 if (curOffer.isBid())
[319]33 return new ValidationSuccess();
[315]34
[318]35 if (curOffer.isBreakoff())
[319]36 return new ValidationSuccessWithBreakoff(); // we are done
[318]37
[315]38 // 2)
39 if (log.size() < 2) // o_t should exist
[319]40 return new ValidationFailure();
[315]41
[320]42 OfferBy prevOfferBy = getLastOffer();
43 Offer prevOffer = prevOfferBy.getOffer();
44 String prevSender = prevOfferBy.getSender();
45
[315]46 if (curOffer.isAccept() && prevOffer.isBid() && !curSender.equals(prevSender))
[319]47 return new ValidationSuccess();
[315]48
49 // 3)
50 if (log.size() < 3) // o_{t-1} should exist
[319]51 return new ValidationFailure();
[315]52
[320]53 OfferBy prevprevBy = log.get(log.size() - 2);
54 Offer prevprev = prevprevBy.getOffer();
55 String prevprevSender = prevprevBy.getSender();
[315]56
57 if (curOffer.isAccept() && prevOffer.isAccept()
58 && prevprev.isBid() && prevprevSender.equals(curSender)
59 && !curSender.equals(prevSender))
[319]60 return new ValidationSuccessWithOutcome(prevprev); // we are done
[315]61
[320]62 return new ValidationFailure();
[315]63 }
64
65 public static void main(String[] args) throws InterruptedException
66 {
[322]67 BlockingQueue<OfferBy> from = new LinkedBlockingQueue<OfferBy>();
68 String nameA = "Buyer";
[315]69 BlockingQueue<Offer> toA = new LinkedBlockingQueue<Offer>();
[322]70 String nameB = "Seller";
[315]71 BlockingQueue<Offer> toB = new LinkedBlockingQueue<Offer>();
72
[322]73 AsynchronousOffersProtocol aop = new AsynchronousOffersProtocol(from, nameA, toA, nameB, toB);
[315]74
75 Thread aopThread = new Thread(aop);
76 aopThread.start();
77
[322]78 from.put(OfferBy.getSampleOffer("Buyer", "Red", 3));
79// Thread.sleep(1000);
80 from.put(OfferBy.getSampleOffer("Buyer", "Red", 6));
81// Thread.sleep(1000);
82 from.put(new OfferBy("Seller", new Accept(Offer.getSampleOffer(6))));
83// Thread.sleep(1000);
84// from.put(new OfferBy("Buyer", new Accept(Offer.getSampleOffer(6))));
85 from.put(new OfferBy("Buyer", new Breakoff()));
[315]86
87 Thread.sleep(1000);
[321]88 System.out.println("Sent to A:" + toA);
[317]89 System.out.println("Sent to B:" + toB);
[315]90 }
91
92}
Note: See TracBrowser for help on using the repository browser.