package cern.cmw.mom.test.chat; import cern.cmw.mom.pubsub.MOMException; import cern.cmw.mom.pubsub.PubSubFactory; import cern.cmw.mom.pubsub.Publisher; import cern.cmw.mom.pubsub.Subscriber; import cern.cmw.mom.pubsub.SubscriptionListener; import cern.cmw.mom.util.TopicAdminHelper; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.TextMessage; import javax.naming.NamingException; import javax.swing.UIManager; import org.apache.log4j.Category; /** * Chat application implemented via the CMW pubsub API. */ public class ChatClient implements SubscriptionListener { final static String CHAT_TOPIC = "CMW.TEMP.CHAT"; final static Category cat = Category.getInstance(ChatClient.class.getName()); boolean packFrame = false; ChatFrame1 frame = null; boolean connected = false; Subscriber sub = null; Publisher pub = null; long subscriptionToken = 0; //Construct the application public ChatClient() { frame = new ChatFrame1(); //Validate frames that have preset sizes //Pack frames that have useful preferred size info, e.g. from their layout if (packFrame) { frame.pack(); } else { frame.validate(); } //Center the window Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = frame.getSize(); if (frameSize.height > screenSize.height) { frameSize.height = screenSize.height; } if (frameSize.width > screenSize.width) { frameSize.width = screenSize.width; } frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); frame.setVisible(true); frame.jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { connect(e); } }); frame.jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { disconnect(e); } }); frame.jButton3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { post(e); } }); } void connect(ActionEvent e) { if (!connected) { frame.statusBar.setText("Connecting, please wait..."); try { pub = PubSubFactory.publisher(); sub = PubSubFactory.subscriber(); subscriptionToken = sub.subscribe(CHAT_TOPIC, this, null); connected = true; frame.statusBar.setText("Connected."); cat.info("connected"); frame.jButton1.setEnabled(false); frame.jButton2.setEnabled(true); frame.jButton3.setEnabled(true); frame.jTextArea1.setText("Welcome to the CMW chat !!"); } catch (MOMException me) { frame.statusBar.setText(me.getMessage()); cat.error(me.getMessage()); me.printStackTrace(); } catch (JMSException je) { frame.statusBar.setText(je.getMessage()); cat.error(je.getMessage()); je.printStackTrace(); } catch (NamingException ne) { frame.statusBar.setText(ne.getMessage()); cat.error(ne.getMessage()); ne.printStackTrace(); } } } void disconnect(ActionEvent e) { if (connected) { frame.statusBar.setText("Disconnecting, please wait..."); cat.info("Disconnecting..."); pub.close(); try { sub.unSubscribe(subscriptionToken); } catch (JMSException je) { cat.error(je.getMessage()); je.printStackTrace(); } sub.close(); connected = false; frame.statusBar.setText("Not connected."); frame.jButton1.setEnabled(true); frame.jButton2.setEnabled(false); frame.jButton3.setEnabled(false); } } void post(ActionEvent e) { if (connected) { cat.info("Posting message " + frame.jTextField1.getText() + "..."); try { TextMessage tm = pub.createTextMessage(); tm.setText(frame.jTextField1.getText()); pub.publish(CHAT_TOPIC, tm); frame.jTextField1.setText(""); } catch (JMSException je) { frame.statusBar.setText(je.getMessage()); cat.error(je.getMessage()); je.printStackTrace(); } catch (NamingException ne) { frame.statusBar.setText(ne.getMessage()); cat.error(ne.getMessage()); ne.printStackTrace(); } } } public void onMessage(Message m) { TextMessage tm = (TextMessage) m; try { frame.jTextArea1.append("\n" + tm.getText()); } catch (JMSException je) { je.printStackTrace(); } } //Main method public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { cat.error(e.getMessage()); e.printStackTrace(); } new ChatClient(); } }