001 package com.hammurapi.eventbus.tests.fastfood;
002
003 import java.util.concurrent.atomic.AtomicInteger;
004
005 /**
006 * @author Pavel Vlasov
007 *
008 */
009 public class Order {
010
011 private static AtomicInteger INSTANCE_COUNTER = new AtomicInteger();
012
013 private final int instanceId = INSTANCE_COUNTER.incrementAndGet();
014
015 private Class<? extends MainDish> mainDishType;
016 private Class<? extends SideDish> sideDishType;
017 private MainDish mainDish;
018 private SideDish sideDish;
019
020 public Order(Class<? extends MainDish> mainDishType, Class<? extends SideDish> sideDishType) {
021 super();
022 this.mainDishType = mainDishType;
023 this.sideDishType = sideDishType;
024 }
025
026 public Class<? extends MainDish> getMainDishType() {
027 return mainDishType;
028 }
029
030 public Class<? extends SideDish> getSideDishType() {
031 return sideDishType;
032 }
033
034 public MainDish getMainDish() {
035 return mainDish;
036 }
037
038 /**
039 * Sets main dish
040 * @param mainDish
041 * @return true if success, false if main dish is of the wrong type or already consumed.
042 */
043 public boolean setMainDish(MainDish mainDish) {
044 if (this.mainDish==null) {
045 if (mainDishType.isInstance(mainDish)) {
046 if (mainDish.consume()) {
047 this.mainDish = mainDish;
048 return true;
049 }
050 } else {
051 System.err.println("Wrong main dish: "+mainDish+", expected "+mainDishType);
052 }
053 } else {
054 System.err.println("Order already has main dish: "+this);
055 }
056 return false;
057 }
058
059 public SideDish getSideDish() {
060 return sideDish;
061 }
062
063 /**
064 * Sets side dish
065 * @param sideDish
066 * @return true if success, false if side dish is of wrong type or already consumed.
067 */
068 public boolean setSideDish(SideDish sideDish) {
069 if (this.sideDish==null) {
070 if (sideDishType.isInstance(sideDish)) {
071 if (sideDish.consume()) {
072 this.sideDish = sideDish;
073 return true;
074 }
075 } else {
076 System.err.println("Wrong side dish: "+sideDish+", expected "+sideDishType);
077 }
078 } else {
079 System.err.println("Order already has side dish: "+this);
080 }
081 return false;
082 }
083
084 public boolean isFulfilled() {
085 return mainDish!=null && sideDish!=null;
086 }
087
088 @Override
089 public String toString() {
090 return "Order [" + instanceId + "]";
091 }
092
093 }