1 package at.ac.tuwien.sbc.valesriegler.group.jms;
3 import at.ac.tuwien.sbc.valesriegler.common.AbstractAction;
4 import at.ac.tuwien.sbc.valesriegler.cook.actions.DeliveryOrderInfo;
5 import at.ac.tuwien.sbc.valesriegler.driver.actions.OrderDeliveredInfo;
6 import at.ac.tuwien.sbc.valesriegler.group.AbstractGroupConnector;
7 import at.ac.tuwien.sbc.valesriegler.group.Group;
8 import at.ac.tuwien.sbc.valesriegler.group.GroupAgent;
9 import at.ac.tuwien.sbc.valesriegler.group.actions.*;
10 import at.ac.tuwien.sbc.valesriegler.types.DeliveryGroupData;
11 import at.ac.tuwien.sbc.valesriegler.waiter.actions.DeliverOrder;
12 import org.apache.activemq.ActiveMQConnectionFactory;
13 import org.slf4j.Logger;
14 import org.slf4j.LoggerFactory;
17 import java.util.ArrayList;
18 import java.util.Date;
19 import java.util.HashMap;
22 * This class handles the communication with other processes using JMS.
26 public class JMSGroupConnector extends AbstractGroupConnector implements MessageListener {
27 private static final Logger log = LoggerFactory.getLogger(JMSGroupConnector.class);
28 private static HashMap<String, JMSGroupConnector> connectors = new HashMap<String, JMSGroupConnector>();
30 public final String JMS_CONNECTSTRING;
31 private Connection connection;
33 public JMSGroupConnector(String address) {
35 throw new IllegalArgumentException("Address may not be null!");
36 JMS_CONNECTSTRING = address;
43 connection = new ActiveMQConnectionFactory(JMS_CONNECTSTRING).createConnection();
45 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
46 MessageConsumer consumer = session.createConsumer(session.createQueue("GroupConnector"));
47 consumer.setMessageListener(this);
48 } catch (JMSException e) {
49 log.error("EXCEPTION!", e);
54 public void onMessage(Message msg) {
57 if (msg instanceof ObjectMessage) {
58 ObjectMessage objMsg = (ObjectMessage) msg;
59 Object obj = objMsg.getObject();
61 if (obj instanceof TableResponse) {
62 TableResponse tablerresponse = (TableResponse) obj;
63 log.debug("Received: " + tablerresponse);
64 Group g = GroupAgent.getInstance().getGroupModel().getGroupByID(tablerresponse.getGroupdata().getId());
65 g.assignTable(tablerresponse.getTable(), tablerresponse.getWaiterId());
67 } else if (obj instanceof OrderResponse) {
68 OrderResponse orderresponse = (OrderResponse) obj;
69 log.debug("Received: " + orderresponse);
70 Group g = GroupAgent.getInstance().getGroupModel().getGroupByID(orderresponse.getGroupdata().getId());
71 g.orderReceived(orderresponse.getWaiterId());
73 } else if (obj instanceof DeliverOrder) {
74 DeliverOrder deliverorder = (DeliverOrder) obj;
75 log.debug("Received: " + deliverorder);
76 Group g = GroupAgent.getInstance().getGroupModel().getGroupByID(deliverorder.getGroupdata().getId());
77 g.deliverPizzas(deliverorder.getGroupdata().getOrder(), deliverorder.getWaiterId());
79 } else if (obj instanceof PayResponse) {
80 PayResponse payresponse = (PayResponse) obj;
81 log.debug("Received: " + payresponse);
82 Group g = GroupAgent.getInstance().getGroupModel().getGroupByID(payresponse.getGroupdata().getId());
83 g.payForPizzas(payresponse.getWaiterId());
86 } else if (obj instanceof DeliveryOrderResponse) {
87 DeliveryOrderResponse deliveryOrderResponse = (DeliveryOrderResponse) obj;
88 log.debug("Received: " + deliveryOrderResponse);
89 deliveryOrderResponse.getDeliveryGroupData().setWaiterIdOfOrder(deliveryOrderResponse.getWaiterId());
90 ArrayList<DeliveryGroupData> gd = new ArrayList<DeliveryGroupData>();
91 gd.add(deliveryOrderResponse.getDeliveryGroupData());
92 GroupAgent.getInstance().getDeliveryModel().addDeliveries(gd);
95 } else if (obj instanceof DeliveryOrderInfo) {
96 DeliveryOrderInfo deliveryOrderInfo = (DeliveryOrderInfo) obj;
97 log.debug("Received: " + deliveryOrderInfo);
98 ArrayList<DeliveryGroupData> gd = new ArrayList<DeliveryGroupData>();
99 gd.add(deliveryOrderInfo.getDeliveryGroupData());
100 GroupAgent.getInstance().getDeliveryModel().addDeliveries(gd);
103 } else if (obj instanceof OrderDeliveredInfo) {
104 OrderDeliveredInfo orderDeliveredInfo = (OrderDeliveredInfo) obj;
105 log.debug("Received: " + orderDeliveredInfo);
106 orderDeliveredInfo.getDeliveryGroupData().setDriverId(orderDeliveredInfo.getDriverId());
107 ArrayList<DeliveryGroupData> gd = new ArrayList<DeliveryGroupData>();
108 gd.add(orderDeliveredInfo.getDeliveryGroupData());
109 GroupAgent.getInstance().getDeliveryModel().addDeliveries(gd);
111 if (GroupAgent.getInstance().getDeliveryModel().hasFinished()) {
112 log.warn("Finished after {} seconds", (new Date().getTime() - GroupAgent.startTime.get()) / 1000);
118 log.warn("Unknown messagetype received!");
119 } catch (JMSException e) {
120 log.error("EXCEPTION!", e);
125 public void send(AbstractAction request) {
127 if (request instanceof TableRequest) {
128 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
129 MessageProducer wantToSitAtTable = session.createProducer(session.createQueue("WantToSitAtTable"));
130 wantToSitAtTable.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
131 wantToSitAtTable.send(session.createObjectMessage(request));
133 MessageProducer informPizzariaGui = session.createProducer(session.createQueue("PizzeriaConnector"));
134 informPizzariaGui.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
135 informPizzariaGui.send(session.createObjectMessage(request));
138 } else if (request instanceof OrderRequest) {
139 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
140 MessageProducer wantToOrder = session.createProducer(session.createQueue("WantToOrder"));
141 wantToOrder.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
142 wantToOrder.send(session.createObjectMessage(request));
145 } else if (request instanceof PayRequest) {
146 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
147 MessageProducer wantToPay = session.createProducer(session.createQueue("WantToPay"));
148 wantToPay.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
149 wantToPay.send(session.createObjectMessage(request));
152 } else if (request instanceof TableFree) {
153 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
154 MessageProducer wantToSitAtTable = session.createProducer(session.createQueue("TablesFree"));
155 wantToSitAtTable.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
156 wantToSitAtTable.send(session.createObjectMessage(request.getGroupdata().getTable()));
158 MessageProducer wantToLeave = session.createProducer(session.createQueue("WantToLeave"));
159 wantToLeave.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
160 wantToLeave.send(session.createObjectMessage(request));
162 MessageProducer informPizzariaGui = session.createProducer(session.createQueue("PizzeriaConnector"));
163 informPizzariaGui.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
164 informPizzariaGui.send(session.createObjectMessage(request));
168 } else if (request instanceof DeliveryOrderRequest) {
169 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
170 MessageProducer wantToPay = session.createProducer(session.createQueue("WantADelivery"));
171 wantToPay.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
172 wantToPay.send(session.createObjectMessage(request));
174 MessageProducer informPizzariaGui = session.createProducer(session.createQueue("PizzeriaConnector"));
175 informPizzariaGui.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
176 informPizzariaGui.send(session.createObjectMessage(request));
180 } catch (JMSException e) {
181 log.error("EXCEPTION!", e);
185 public static HashMap<String, JMSGroupConnector> getConnectors() {
189 public static JMSGroupConnector getConnector(String key) {
190 return connectors.get(key);
193 public Connection getConnection() {