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    }