001 package org.cocome.tradingsystem.testdriver;
002
003 import java.io.Serializable;
004
005 import javax.jms.JMSException;
006 import javax.jms.TopicPublisher;
007 import javax.jms.TopicSession;
008 import javax.jms.TopicSubscriber;
009
010 import org.cocome.tradingsystem.cashdeskline.datatypes.KeyStroke;
011 import org.cocome.tradingsystem.cashdeskline.datatypes.PaymentMode;
012 import org.cocome.tradingsystem.cashdeskline.events.CashAmountEnteredEvent;
013 import org.cocome.tradingsystem.cashdeskline.events.CashBoxClosedEvent;
014 import org.cocome.tradingsystem.cashdeskline.events.ChangeAmountCalculatedEvent;
015 import org.cocome.tradingsystem.cashdeskline.events.CreditCardPaymentEnabledEvent;
016 import org.cocome.tradingsystem.cashdeskline.events.PaymentModeEvent;
017 import org.cocome.tradingsystem.cashdeskline.events.SaleFinishedEvent;
018 import org.cocome.tradingsystem.cashdeskline.events.SaleStartedEvent;
019 import org.cocome.tradingsystem.systests.interfaces.ICashBox;
020
021 /**
022 * Glue code for the cash box.
023 *
024 * @author Benjamin Hummel
025 * @author $Author: hummel $
026 * @version $Rev: 63 $
027 * @levd.rating GREEN Rev: 63
028 */
029 public class CashBox extends UpdateReceiver implements ICashBox {
030
031 /** Publisher for sending events. */
032 private final TopicPublisher publisher;
033
034 /** Session used for creating object messages. */
035 private final TopicSession session;
036
037 /** Constructor. */
038 public CashBox(TopicPublisher publisher, TopicSession session,
039 TopicSubscriber subscriber) throws JMSException {
040 super(subscriber, ChangeAmountCalculatedEvent.class);
041 this.publisher = publisher;
042 this.session = session;
043 }
044
045 /** Publish a serializable message. */
046 private void publish(Serializable message) throws JMSException {
047 publisher.publish(session.createObjectMessage(message));
048 }
049
050 /** {@inheritDoc} */
051 public void enterReceivedCash(int centAmount) throws JMSException {
052 // we have to generate multiple events for this one
053 if (centAmount >= 100) {
054 for (char c : Integer.toString(centAmount / 100).toCharArray()) {
055 publish(new CashAmountEnteredEvent(charToStroke(c)));
056 }
057 }
058
059 publish(new CashAmountEnteredEvent(KeyStroke.COMMA));
060
061 String cents = Integer.toString(centAmount % 100);
062 if (cents.length() < 2) {
063 cents = "0" + cents;
064 }
065 for (char c : cents.toCharArray()) {
066 publish(new CashAmountEnteredEvent(charToStroke(c)));
067 }
068
069 publish(new CashAmountEnteredEvent(KeyStroke.ENTER));
070 }
071
072 /** Convert characters to keystrokes. */
073 private KeyStroke charToStroke(char c) {
074 switch (c) {
075 case '0':
076 return KeyStroke.ZERO;
077 case '1':
078 return KeyStroke.ONE;
079 case '2':
080 return KeyStroke.TWO;
081 case '3':
082 return KeyStroke.THREE;
083 case '4':
084 return KeyStroke.FOUR;
085 case '5':
086 return KeyStroke.FIVE;
087 case '6':
088 return KeyStroke.SIX;
089 case '7':
090 return KeyStroke.SEVEN;
091 case '8':
092 return KeyStroke.EIGHT;
093 case '9':
094 return KeyStroke.NINE;
095 default:
096 throw new IllegalArgumentException("Only number supported!");
097 }
098 }
099
100 /** {@inheritDoc} */
101 public void finishSale() throws JMSException {
102 publish(new SaleFinishedEvent());
103 }
104
105 /** {@inheritDoc} */
106 public void setCashboxStatus(boolean closed) throws JMSException {
107 if (closed) {
108 publish(new CashBoxClosedEvent());
109 } else {
110 // this signal os not used by the implementation
111 }
112 }
113
114 /** {@inheritDoc} */
115 public void startCashPayment() throws JMSException {
116 publish(new PaymentModeEvent(PaymentMode.CASH));
117 }
118
119 /** {@inheritDoc} */
120 public void startCreditCardPayment() throws JMSException {
121 publish(new PaymentModeEvent(PaymentMode.CREDITCARD));
122 }
123
124 /** {@inheritDoc} */
125 public void startNewSale() throws JMSException {
126 publish(new SaleStartedEvent());
127 }
128
129 /** {@inheritDoc} */
130 public boolean wasOpenSignalSent() {
131 // this is slightly bogus, but this is how it is implemented in the GUI
132 return getLastRelevantMessage() instanceof ChangeAmountCalculatedEvent;
133 }
134
135 /** {@inheritDoc} */
136 public void manuallyEnableCreditCardReader() throws JMSException {
137 publish(new CreditCardPaymentEnabledEvent());
138 }
139 }