001 package org.cocome.tradingsystem.testdriver;
002
003 import javax.jms.JMSException;
004 import javax.naming.NamingException;
005
006 import org.cocome.tradingsystem.systests.interfaces.IBank;
007 import org.cocome.tradingsystem.systests.interfaces.ICashDesk;
008 import org.cocome.tradingsystem.systests.interfaces.IEnterprise;
009 import org.cocome.tradingsystem.systests.interfaces.IStorePC;
010 import org.cocome.tradingsystem.systests.interfaces.ITestDriver;
011
012 /**
013 * This is the test driver for the reference implementation of the system.
014 *
015 * @author Benjamin Hummel
016 * @author $Author: hummel $
017 * @version $Rev: 63 $
018 * @levd.rating GREEN Rev: 63
019 */
020 public class TestDriver implements ITestDriver {
021
022 /** The bank we are using. */
023 private Bank bank;
024
025 /** The next used store id (= the number of stores created so far). */
026 private int currentStore = 0;
027
028 /**
029 * The maximal number of stores supported (as prepared in the properties
030 * files).
031 */
032 private static final int MAX_STORES = 3;
033
034 /** The preloaded store PCs. */
035 private StorePC[] storePCs = new StorePC[MAX_STORES];
036
037 /**
038 * For each store the next used cash desk id (= number of cash desks of the
039 * store).
040 */
041 private final int[] currentCashdesk = new int[MAX_STORES];
042
043 /**
044 * The maximal number of cash desks supported (as prepared in the properties
045 * files).
046 */
047 private static final int MAX_CASHDESKS = 3;
048
049 /** The enterprise. */
050 private Enterprise enterprise = null;
051
052 /** {@inheritDoc} */
053 public ICashDesk createCashDesk(IStorePC store) throws NamingException,
054 JMSException {
055 StorePC storePC = (StorePC) store;
056 int storeIndex = storePC.getIndex();
057 if (storeIndex > 0) {
058 throw new IllegalStateException(
059 "Cash desks are only available for the first store (0)!");
060 }
061 if (currentCashdesk[storeIndex] >= MAX_CASHDESKS) {
062 throw new IllegalStateException(
063 "Maximal number of cash desks for store " + storeIndex
064 + " already created!");
065 }
066 return new CashDesk(storePC, currentCashdesk[storeIndex]++);
067 }
068
069 /** {@inheritDoc} */
070 public IStorePC createStore() {
071 if (currentStore >= MAX_STORES) {
072 throw new IllegalStateException(
073 "Maximal number of stores already created!");
074 }
075 return storePCs[currentStore++];
076 }
077
078 /** {@inheritDoc} */
079 public IEnterprise initializeSystem() throws Exception {
080 enterprise = new Enterprise();
081 bank = new Bank();
082
083 // precreate stores (so they always get the same store id)
084 for (int i = 0; i < MAX_STORES; ++i) {
085 storePCs[i] = new StorePC(i, enterprise);
086 }
087
088 return enterprise;
089 }
090
091 /** {@inheritDoc} */
092 public void shutdownSystem() {
093 enterprise = null;
094 try {
095 bank.unregister();
096 } catch (Exception e) {
097 // nothing we could handle here
098 }
099 bank = null;
100 }
101
102 /** {@inheritDoc} */
103 public IBank getBank() throws Exception {
104 return bank;
105 }
106 }