Router Pattern in Java : Router Pattern « Design Pattern « Java






Router Pattern in Java

Router Pattern in Java
//[C] 2002 Sun Microsystems, Inc.--- import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import java.io.Serializable; import java.rmi.Naming; import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import java.util.HashMap; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; publicclass RunRouterPattern { publicstaticvoid main(String[] arguments) { System.out.println("Example for the Router pattern"); System.out .println("This code same will create a series of GUIs, and use"); System.out .println(" the Router pattern to map message notifications between"); System.out .println(" them. In this code example, the Router will send messages"); System.out .println(" between the GUI clients based on the following mapping:"); System.out.println(); System.out.println("\tGUI # 1:\tGUI #2\tGUI #3"); System.out.println("\tGUI # 2:\tGUI #1\tGUI #4"); System.out.println("\tGUI # 3:\tGUI #1\tGUI #4"); System.out.println("\tGUI # 4:\tGUI #1\tGUI #2\tGUI #3\tGUI #4"); System.out.println(); System.out.println("Running the RMI compiler (rmic)"); try { Process p1 = Runtime.getRuntime().exec("rmic Router"); Process p2 = Runtime.getRuntime().exec("rmic RouterClient"); p1.waitFor(); p2.waitFor(); } catch (IOException exc) { System.err .println("Unable to run rmic utility. Exiting application."); System.exit(1); } catch (InterruptedException exc) { System.err .println("Threading problems encountered while using the rmic utility."); } System.out.println("Starting the rmiregistry"); System.out.println(); Process rmiProcess = null; try { rmiProcess = Runtime.getRuntime().exec("rmiregistry"); Thread.sleep(15000); } catch (IOException exc) { System.err .println("Unable to start the rmiregistry. Exiting application."); System.exit(1); } catch (InterruptedException exc) { System.err .println("Threading problems encountered when starting the rmiregistry."); } System.out.println("Creating the Router object"); System.out.println(); Router mainRouter = new Router(); InputKey keyOne = new InputKey(); InputKey keyTwo = new InputKey(); InputKey keyThree = new InputKey(); InputKey keyFour = new InputKey(); System.out.println("Creating the four RouterGui objects"); System.out.println(); RouterGui first = new RouterGui(keyOne); RouterGui second = new RouterGui(keyTwo); RouterGui third = new RouterGui(keyThree); RouterGui fourth = new RouterGui(keyFour); System.out.println("Creating GUI OutputChannel lists for the Router"); System.out.println(); OutputChannel[] subscriptionListOne = { second.getOutputChannel(), third.getOutputChannel() }; OutputChannel[] subscriptionListTwo = { first.getOutputChannel(), fourth.getOutputChannel() }; OutputChannel[] subscriptionListThree = { first.getOutputChannel(), second.getOutputChannel(), third.getOutputChannel(), fourth.getOutputChannel() }; mainRouter.addRoute(keyOne, subscriptionListOne); mainRouter.addRoute(keyTwo, subscriptionListTwo); mainRouter.addRoute(keyThree, subscriptionListTwo); mainRouter.addRoute(keyFour, subscriptionListThree); first.createGui(); second.createGui(); third.createGui(); fourth.createGui(); } } class Message implements Serializable { private InputChannel source; private String message; public Message(InputChannel source, String message) { this.source = source; this.message = message; } public InputChannel getSource() { return source; } public String getMessage() { return message; } } interface OutputChannel extends Remote { publicvoid sendMessage(Message message) throws RemoteException; } interface Receiver { publicvoid receiveMessage(Message message); } class Router implements OutputChannel { privatestaticfinal String ROUTER_SERVICE_NAME = "router"; private HashMap links = new HashMap(); public Router() { try { UnicastRemoteObject.exportObject(this); Naming.rebind(ROUTER_SERVICE_NAME, this); } catch (Exception exc) { System.err.println("Error using RMI to register the Router " + exc); } } publicsynchronizedvoid sendMessage(Message message) { Object key = message.getSource(); OutputChannel[] destinations = (OutputChannel[]) links.get(key); new RouterWorkThread(message, destinations); } publicvoid addRoute(InputChannel source, OutputChannel[] destinations) { links.put(source, destinations); } privateclass RouterWorkThread implements Runnable { private OutputChannel[] destinations; private Message message; private Thread runner; private RouterWorkThread(Message newMessage, OutputChannel[] newDestinations) { message = newMessage; destinations = newDestinations; runner = new Thread(this); runner.start(); } publicvoid run() { for (int i = 0; i < destinations.length; i++) { try { destinations[i].sendMessage(message); } catch (RemoteException exc) { System.err.println("Unable to send message to " + destinations[i]); } } } } } class RouterClient implements OutputChannel { privatestaticfinal String ROUTER_CLIENT_SERVICE_PREFIX = "routerClient"; privatestaticfinal String ROUTER_SERVER_MACHINE_NAME = "localhost"; privatestaticfinal String ROUTER_SERVER_SERVICE_NAME = "router"; privatestaticint clientIndex = 1; private String routerClientServiceName = ROUTER_CLIENT_SERVICE_PREFIX + clientIndex++; private OutputChannel router; private Receiver receiver; public RouterClient(Receiver newReceiver) { receiver = newReceiver; try { UnicastRemoteObject.exportObject(this); Naming.rebind(routerClientServiceName, this); String url = "//" + ROUTER_SERVER_MACHINE_NAME + "/"  + ROUTER_SERVER_SERVICE_NAME; router = (OutputChannel) Naming.lookup(url); } catch (Exception exc) { System.err.println("Error using RMI to register the Router " + exc); } } publicvoid sendMessageToRouter(Message message) { try { router.sendMessage(message); } catch (RemoteException exc) { } } publicvoid sendMessage(Message message) { receiver.receiveMessage(message); } public String toString() { return routerClientServiceName; } } class RouterGui implements ActionListener, Receiver { privatestaticint instanceCount = 1; private RouterClient routerClient; private JFrame mainFrame; private JButton exit, clearDisplay, sendMessage; private JTextArea display; private JTextField inputTextField; private InputChannel inputChannel; public OutputChannel getOutputChannel() { return routerClient; } public RouterGui(InputChannel newInputChannel) { inputChannel = newInputChannel; routerClient = new RouterClient(this); } publicvoid createGui() { mainFrame = new JFrame("Demonstration for the Router pattern - GUI #" + instanceCount++); Container content = mainFrame.getContentPane(); content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); JPanel displayPanel = new JPanel(); display = new JTextArea(10, 40); JScrollPane displayArea = new JScrollPane(display); display.setEditable(false); displayPanel.add(displayArea); content.add(displayPanel); JPanel dataPanel = new JPanel(); dataPanel.add(new JLabel("Message:")); inputTextField = new JTextField(30); dataPanel.add(inputTextField); content.add(dataPanel); JPanel controlPanel = new JPanel(); sendMessage = new JButton("Send Message"); clearDisplay = new JButton("Clear"); exit = new JButton("Exit"); controlPanel.add(sendMessage); controlPanel.add(clearDisplay); controlPanel.add(exit); content.add(controlPanel); sendMessage.addActionListener(this); clearDisplay.addActionListener(this); exit.addActionListener(this); inputTextField.addActionListener(this); mainFrame.addWindowListener(new WindowCloseManager()); mainFrame.pack(); mainFrame.setVisible(true); } publicvoid actionPerformed(ActionEvent evt) { Object source = evt.getSource(); if (source == sendMessage) { sendMessage(); } elseif (source == inputTextField) { sendMessage(); } elseif (source == clearDisplay) { clearDisplay(); } elseif (source == exit) { exitApplication(); } } privateclass WindowCloseManager extends WindowAdapter { publicvoid windowClosing(WindowEvent evt) { exitApplication(); } } privatevoid exitApplication() { System.exit(0); } privatevoid clearDisplay() { inputTextField.setText(""); display.setText(""); } privatevoid sendMessage() { String data = inputTextField.getText(); routerClient.sendMessageToRouter(new Message(inputChannel, data)); inputTextField.setText(""); } publicvoid receiveMessage(Message message) { display.append(message.getMessage() + "\n"); } } class InputKey implements InputChannel { privatestaticint nextValue = 1; privateint hashVal = nextValue++; publicint hashCode() { return hashVal; } publicboolean equals(Object object) { if (!(object instanceof InputKey)) { return false; } if (object.hashCode() != hashCode()) { return false; } return true; } } interface InputChannel extends Serializable { } 








Related examples in the same category

close