1 package at.ac.tuwien.sbc.valesriegler.group.jms;
3 import java.util.ArrayList;
5 import java.util.HashMap;
7 import javax.jms.Connection;
8 import javax.jms.DeliveryMode;
9 import javax.jms.JMSException;
10 import javax.jms.Message;
11 import javax.jms.MessageConsumer;
12 import javax.jms.MessageListener;
13 import javax.jms.MessageProducer;
14 import javax.jms.ObjectMessage;
15 import javax.jms.Session;
17 import org.apache.activemq.ActiveMQConnectionFactory;
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
21 import at.ac.tuwien.sbc.valesriegler.common.AbstractAction;
22 import at.ac.tuwien.sbc.valesriegler.cook.actions.DeliveryOrderInfo;
23 import at.ac.tuwien.sbc.valesriegler.driver.actions.OrderDeliveredInfo;
24 import at.ac.tuwien.sbc.valesriegler.group.AbstractGroupConnector;
25 import at.ac.tuwien.sbc.valesriegler.group.Group;
26 import at.ac.tuwien.sbc.valesriegler.group.GroupAgent;
27 import at.ac.tuwien.sbc.valesriegler.group.actions.DeliveryOrderRequest;
28 import at.ac.tuwien.sbc.valesriegler.group.actions.DeliveryOrderResponse;
29 import at.ac.tuwien.sbc.valesriegler.group.actions.OrderRequest;
30 import at.ac.tuwien.sbc.valesriegler.group.actions.OrderResponse;
31 import at.ac.tuwien.sbc.valesriegler.group.actions.PayRequest;
32 import at.ac.tuwien.sbc.valesriegler.group.actions.PayResponse;
33 import at.ac.tuwien.sbc.valesriegler.group.actions.TableFree;
34 import at.ac.tuwien.sbc.valesriegler.group.actions.TableRequest;
35 import at.ac.tuwien.sbc.valesriegler.group.actions.TableResponse;
36 import at.ac.tuwien.sbc.valesriegler.types.DeliveryGroupData;
37 import at.ac.tuwien.sbc.valesriegler.waiter.actions.DeliverOrder;
40 * This class handles the communication with other processes using JMS.
45 public class JMSGroupConnector extends AbstractGroupConnector implements MessageListener {
46 private static final Logger log = LoggerFactory.getLogger(JMSGroupConnector.class);
47 private static HashMap<String, JMSGroupConnector> connectors = new HashMap<String, JMSGroupConnector>();
49 public final String JMS_CONNECTSTRING;
50 private Connection connection;
52 public JMSGroupConnector(String address) {
54 throw new IllegalArgumentException("Address may not be null!");
55 JMS_CONNECTSTRING = address;
62 connection = new ActiveMQConnectionFactory(JMS_CONNECTSTRING).createConnection();
64 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
65 MessageConsumer consumer = session.createConsumer(session.createQueue("GroupConnector"));
66 consumer.setMessageListener(this);
67 } catch (JMSException e) {
68 log.error("EXCEPTION!", e);
73 public void onMessage(Message msg) {
76 if (msg instanceof ObjectMessage) {
77 ObjectMessage objMsg = (ObjectMessage) msg;
78 Object obj = objMsg.getObject();
80 if (obj instanceof TableResponse) {
81 TableResponse tablerresponse = (TableResponse) obj;
82 log.debug("Received: " + tablerresponse);
83 Group g = GroupAgent.getInstance().getGroupModel().getGroupByID(tablerresponse.getGroupdata().getId());
84 g.assignTable(tablerresponse.getTable(), tablerresponse.getWaiterId());
86 } else if (obj instanceof OrderResponse) {
87 OrderResponse orderresponse = (OrderResponse) obj;
88 log.debug("Received: " + orderresponse);
89 Group g = GroupAgent.getInstance().getGroupModel().getGroupByID(orderresponse.getGroupdata().getId());
90 g.orderReceived(orderresponse.getWaiterId());
92 } else if (obj instanceof DeliverOrder) {
93 DeliverOrder deliverorder = (DeliverOrder) obj;
94 log.debug("Received: " + deliverorder);
95 Group g = GroupAgent.getInstance().getGroupModel().getGroupByID(deliverorder.getGroupdata().getId());
96 g.deliverPizzas(deliverorder.getGroupdata().getOrder(), deliverorder.getWaiterId());
98 } else if (obj instanceof PayResponse) {
99 PayResponse payresponse = (PayResponse) obj;
100 log.debug("Received: " + payresponse);
101 Group g = GroupAgent.getInstance().getGroupModel().getGroupByID(payresponse.getGroupdata().getId());
102 g.payForPizzas(payresponse.getWaiterId());
105 } else if (obj instanceof DeliveryOrderResponse) {
106 DeliveryOrderResponse deliveryOrderResponse = (DeliveryOrderResponse) obj;
107 log.debug("Received: " + deliveryOrderResponse);
108 deliveryOrderResponse.getDeliveryGroupData().setWaiterIdOfOrder(deliveryOrderResponse.getWaiterId());
109 ArrayList<DeliveryGroupData> gd = new ArrayList<DeliveryGroupData>();
110 gd.add(deliveryOrderResponse.getDeliveryGroupData());
111 GroupAgent.getInstance().getDeliveryModel().addDeliveries(gd);
114 } else if (obj instanceof DeliveryOrderInfo) {
115 DeliveryOrderInfo deliveryOrderInfo = (DeliveryOrderInfo) obj;
116 log.debug("Received: " + deliveryOrderInfo);
117 ArrayList<DeliveryGroupData> gd = new ArrayList<DeliveryGroupData>();
118 gd.add(deliveryOrderInfo.getDeliveryGroupData());
119 GroupAgent.getInstance().getDeliveryModel().addDeliveries(gd);
122 } else if (obj instanceof OrderDeliveredInfo) {
123 OrderDeliveredInfo orderDeliveredInfo = (OrderDeliveredInfo) obj;
124 log.debug("Received: " + orderDeliveredInfo);
125 orderDeliveredInfo.getDeliveryGroupData().setDriverId(orderDeliveredInfo.getDriverId());
126 ArrayList<DeliveryGroupData> gd = new ArrayList<DeliveryGroupData>();
127 gd.add(orderDeliveredInfo.getDeliveryGroupData());
128 GroupAgent.getInstance().getDeliveryModel().addDeliveries(gd);
130 if (GroupAgent.getInstance().getDeliveryModel().hasFinished()) {
131 log.warn("Finished after {} seconds", new Date().getTime() - GroupAgent.startTime.get() / 1000);
137 log.warn("Unknown messagetype received!");
138 } catch (JMSException e) {
139 log.error("EXCEPTION!", e);
144 public void send(AbstractAction request) {
146 if (request instanceof TableRequest) {
147 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
148 MessageProducer wantToSitAtTable = session.createProducer(session.createQueue("WantToSitAtTable"));
149 wantToSitAtTable.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
150 wantToSitAtTable.send(session.createObjectMessage(request));
152 MessageProducer informPizzariaGui = session.createProducer(session.createQueue("PizzeriaConnector"));
153 informPizzariaGui.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
154 informPizzariaGui.send(session.createObjectMessage(request));
157 } else if (request instanceof OrderRequest) {
158 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
159 MessageProducer wantToOrder = session.createProducer(session.createQueue("WantToOrder"));
160 wantToOrder.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
161 wantToOrder.send(session.createObjectMessage(request));
164 } else if (request instanceof PayRequest) {
165 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
166 MessageProducer wantToPay = session.createProducer(session.createQueue("WantToPay"));
167 wantToPay.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
168 wantToPay.send(session.createObjectMessage(request));
171 } else if (request instanceof TableFree) {
172 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
173 MessageProducer wantToSitAtTable = session.createProducer(session.createQueue("TablesFree"));
174 wantToSitAtTable.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
175 wantToSitAtTable.send(session.createObjectMessage(request.getGroupdata().getTable()));
177 MessageProducer wantToLeave = session.createProducer(session.createQueue("WantToLeave"));
178 wantToLeave.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
179 wantToLeave.send(session.createObjectMessage(request));
181 MessageProducer informPizzariaGui = session.createProducer(session.createQueue("PizzeriaConnector"));
182 informPizzariaGui.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
183 informPizzariaGui.send(session.createObjectMessage(request));
187 } else if (request instanceof DeliveryOrderRequest) {
188 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
189 MessageProducer wantToPay = session.createProducer(session.createQueue("WantADelivery"));
190 wantToPay.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
191 wantToPay.send(session.createObjectMessage(request));
193 MessageProducer informPizzariaGui = session.createProducer(session.createQueue("PizzeriaConnector"));
194 informPizzariaGui.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
195 informPizzariaGui.send(session.createObjectMessage(request));
199 } catch (JMSException e) {
200 log.error("EXCEPTION!", e);
204 public static HashMap<String, JMSGroupConnector> getConnectors() {
208 public static JMSGroupConnector getConnector(String key) {
209 return connectors.get(key);
212 public Connection getConnection() {