View Javadoc

1   /***
2    * Redistribution and use of this software and associated documentation
3    * ("Software"), with or without modification, are permitted provided
4    * that the following conditions are met:
5    *
6    * 1. Redistributions of source code must retain copyright
7    *    statements and notices.  Redistributions must also contain a
8    *    copy of this document.
9    *
10   * 2. Redistributions in binary form must reproduce the
11   *    above copyright notice, this list of conditions and the
12   *    following disclaimer in the documentation and/or other
13   *    materials provided with the distribution.
14   *
15   * 3. The name "Exolab" must not be used to endorse or promote
16   *    products derived from this Software without prior written
17   *    permission of Exoffice Technologies.  For written permission,
18   *    please contact info@exolab.org.
19   *
20   * 4. Products derived from this Software may not be called "Exolab"
21   *    nor may "Exolab" appear in their names without prior written
22   *    permission of Exoffice Technologies. Exolab is a registered
23   *    trademark of Exoffice Technologies.
24   *
25   * 5. Due credit should be given to the Exolab Project
26   *    (http://www.exolab.org/).
27   *
28   * THIS SOFTWARE IS PROVIDED BY EXOFFICE TECHNOLOGIES AND CONTRIBUTORS
29   * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
32   * EXOFFICE TECHNOLOGIES OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39   * OF THE POSSIBILITY OF SUCH DAMAGE.
40   *
41   * Copyright 2000 (C) Exoffice Technologies Inc. All Rights Reserved.
42   *
43   * $Id: AdminMgr.java,v 1.6 2003/08/07 13:32:59 tanderson Exp $
44   *
45   * Date         Author  Changes
46   * $Date	    jimm    Created
47   */
48  
49  
50  package org.exolab.jms.jndiadministration;
51  
52  import java.awt.BorderLayout;
53  import java.awt.Dimension;
54  import java.awt.Toolkit;
55  import java.awt.event.ActionEvent;
56  import java.awt.event.ActionListener;
57  import java.awt.event.MouseAdapter;
58  import java.awt.event.MouseEvent;
59  import java.awt.event.WindowAdapter;
60  import java.awt.event.WindowEvent;
61  import java.io.PrintStream;
62  
63  import javax.swing.JComboBox;
64  import javax.swing.JFrame;
65  import javax.swing.JMenu;
66  import javax.swing.JMenuBar;
67  import javax.swing.JMenuItem;
68  import javax.swing.JOptionPane;
69  import javax.swing.JScrollPane;
70  import javax.swing.JTextField;
71  import javax.swing.JTree;
72  import javax.swing.SwingConstants;
73  import javax.swing.SwingUtilities;
74  import javax.swing.event.TreeExpansionEvent;
75  import javax.swing.event.TreeExpansionListener;
76  import javax.swing.tree.DefaultMutableTreeNode;
77  import javax.swing.tree.DefaultTreeModel;
78  import javax.swing.tree.TreePath;
79  
80  import org.exolab.jms.config.Configuration;
81  import org.exolab.jms.config.ConfigurationManager;
82  import org.exolab.jms.util.CommandLine;
83  
84  
85  /***
86   * This class is the Gui controller for the JMS JNDI administration. It
87   * displays data as a hierarchical set of tree nodes.
88   *
89   * <P>The Root is all the contactable JMS servers, idealy there can be several
90   * of these all on different ports, with one common admin port they all listen
91   * to. A user selects a JMSServer then connects via the menu item. This
92   * allows the admin GUI to connect to the server via the main port and begin
93   * displaying all its JndiContexts
94   *
95   * <P>For the moment this is not truly dynamic, that is a refresh needs to be
96   * activated on the Gui to cause an update (other than changes made
97   * through the Gui istelf).
98   *
99   * @version     $Revision: 1.6 $ $Date: 2003/08/07 13:32:59 $
100  * @author      <a href="mailto:mourikis@exolab.org">Jim Mourikis</a>
101  *
102  **/
103 
104 public class AdminMgr extends JFrame {
105 
106     // Gui Declarations
107     private JMenuBar menuBar_;
108     private JMenu file_;
109     private JMenuItem exit_;
110     private JMenu actions_;
111     private JMenu connections_;
112     private JMenuItem refresh_;
113     private JMenuItem online_;
114     private JMenuItem offline_;
115     private JMenuItem disconnect_;
116     private JScrollPane jMSServers_;
117     private JTree serverProperties_;
118     private JTextField messageArea_;
119     private JComboBox jMSCombo_;
120 
121     // If this Admin object is connected to any OpenJMS
122     private boolean connected_ = false;
123 
124     /***
125      * The default constructor performs all gui creations.
126      *
127      */
128     public AdminMgr() {
129         initComponents();
130         pack();
131     }
132 
133     /*** This method is called from within the constructor to
134      * initialize the form. All the GUI objects are created, and callbacks
135      * registered.
136      */
137     private void initComponents() {
138         menuBar_ = new JMenuBar();
139         file_ = new JMenu();
140         exit_ = new JMenuItem();
141         actions_ = new JMenu();
142         connections_ = new JMenu();
143         refresh_ = new JMenuItem();
144         online_ = new JMenuItem();
145         offline_ = new JMenuItem();
146         disconnect_ = new JMenuItem();
147         jMSServers_ = new JScrollPane();
148         jMSCombo_ = new JComboBox();
149         serverProperties_ = new JTree();
150         setTitle("OpenJMS JNDI Admin");
151         DefaultTreeModel serverModel =
152             OpenJMSServer.createServerList(serverProperties_);
153         serverProperties_.setModel(serverModel);
154 
155         messageArea_ = new JTextField();
156         file_.setText("File");
157         exit_.setToolTipText("Exit administration");
158         exit_.setText("Exit");
159         exit_.setMnemonic('x');
160 
161         serverProperties_.setRootVisible(false);
162         serverProperties_.setShowsRootHandles(true);
163         serverProperties_.putClientProperty("JTree.lineStyle", "Angled");
164         //		serverProperties_.setCellEditor(new OpenJMSEditor(serverProperties_,
165         //											  jMSCombo_));
166         serverProperties_.setEditable(false);
167         setupCallbacks();
168         file_.add(exit_);
169         file_.setMnemonic('F');
170         menuBar_.add(file_);
171         actions_.setText("Actions");
172         actions_.setMnemonic('A');
173         connections_.setText("Connections");
174         connections_.setMnemonic('C');
175         refresh_.setToolTipText("Refresh the display");
176         online_.setToolTipText("Connect to a running OpenJMS JNDI Server");
177         offline_.setToolTipText("Connect directly to a JNDI database");
178         refresh_.setText("Refresh");
179         refresh_.setMnemonic('R');
180         actions_.add(refresh_);
181 
182         online_.setText("Online");
183         online_.setMnemonic('O');
184         offline_.setText("Offline");
185         offline_.setMnemonic('f');
186         connections_.add(online_);
187         connections_.add(offline_);
188         actions_.add(connections_);
189         disconnect_.setToolTipText
190             ("Disconnect from any connected OpenJMS JNDI Servers");
191         disconnect_.setText("Disconnect");
192         disconnect_.setMnemonic('D');
193         actions_.add(disconnect_);
194 
195         menuBar_.add(actions_);
196 
197         jMSServers_.setViewportView(serverProperties_);
198 
199 
200         getContentPane().add(jMSServers_, BorderLayout.CENTER);
201 
202         messageArea_.setToolTipText("Message Area");
203         messageArea_.setEditable(false);
204         messageArea_.setForeground(java.awt.Color.red);
205         messageArea_.setText("Not Connected");
206         messageArea_.setHorizontalAlignment(SwingConstants.CENTER);
207 
208 
209         getContentPane().add(messageArea_, BorderLayout.SOUTH);
210         setJMenuBar(menuBar_);
211         refresh_.setEnabled(false);
212         disconnect_.setEnabled(false);
213     }
214 
215     /***
216      * The exit method for the application, when the user shutdowns the form.
217      *
218      * @param evt The event that triggered this action.
219      *
220      */
221     private void exitAdmin(ActionEvent evt) {
222         System.exit(0);
223     }
224 
225     /***
226      * Exit the Application when a user selects File->Exit from the menu
227      *
228      * @param evt The window event that triggered this call.
229      *
230      */
231     private void exitForm(WindowEvent evt) {
232         System.exit(0);
233     }
234 
235 
236     /***
237      * Refresh the display, and repaint all items.
238      *
239      * @param evt The event that triggered this operation.
240      *
241      */
242     private void refresh(ActionEvent evt) {
243         if (AdminConnection.instance() instanceof OnlineConnection) {
244             setConnected(false, null);
245             setConnected(true, "Connected - Online Mode");
246         } else {
247             ((OpenJMSServer) (serverProperties_.getModel().getRoot()
248                 )).refresh();
249         }
250     }
251 
252 
253     /***
254      * When a user wishes to connect to all known OpenJMSServers.
255      * Attempt to create an RMI connection to the OpenJMSServer. If the server
256      * is not running, this will fail. The user can start the server through
257      * the start server command, and attempt to re-connect, or use the offline
258      * method below.
259      *
260      * @param evt The event that triggered this operation.
261      *
262      */
263     private void onlineConnect(ActionEvent evt) {
264         try {
265             // if online.
266             new OnlineConnection(this);
267             setConnected(true, "Connected - Online Mode");
268         } catch (Exception err) {
269             JOptionPane.showMessageDialog
270                 (this, err.getMessage(), "Online Connection Error",
271                     JOptionPane.ERROR_MESSAGE);
272         }
273     }
274 
275 
276     /***
277      * Connect to the database in offline mode. This action causes
278      * the file chooser to be displayed, and the user must select an existing
279      * database, or enter a new name to create a new database.
280      *
281      * All databases are suffixed with a ".db".
282      *
283      * @param evt The event that triggered this operation.
284      *
285      */
286     private void offlineConnect(ActionEvent evt) {
287         try {
288             // if online.
289             new OfflineConnection(this);
290             setConnected(true, "Connected - OFFLine Mode");
291         } catch (Exception err) {
292             JOptionPane.showMessageDialog
293                 (this, err.getMessage(), "Database Error",
294                     JOptionPane.ERROR_MESSAGE);
295         }
296     }
297 
298     /***
299      * Disconnect from a connected OpenJMSServer. Close the database, set the
300      * connected flag to false, stop displaying the OpenJMS folder.
301      *
302      * @param evt The event that triggered this operation.
303      *
304      */
305     private void disconnect(ActionEvent evt) {
306         try {
307             AdminConnection.instance().close();
308             setConnected(false, null);
309         } catch (Exception e) {
310             JOptionPane.showMessageDialog
311                 (this, e.getMessage(), "Database Close Error",
312                     JOptionPane.ERROR_MESSAGE);
313         }
314     }
315 
316     /***
317      * A conveniance routine to open/close all database connections,
318      * and fix up the display.
319      *
320      * <P>When disconnecting, turn off the root, destroy all Gui objects
321      * close the db connection, turn off all context sensitive menus,
322      * disable disconnection menu and enable connection. Set the message
323      * text to disconnected.
324      *
325      * @param c a flag inidication if this is a connection or disconnection.
326      *
327      */
328 
329     private void setConnected(boolean c, String st) {
330         if (c) {
331             serverProperties_.setRootVisible(true);
332             ((OpenJMSServer)
333                 (serverProperties_.getModel().getRoot())).displayContexts();
334             connections_.setEnabled(false);
335             refresh_.setEnabled(true);
336             disconnect_.setEnabled(true);
337             messageArea_.setForeground(java.awt.Color.green.darker().darker());
338             messageArea_.setText(st);
339             connected_ = true;
340         } else {
341             serverProperties_.setRootVisible(false);
342             OpenJMSServer root =
343                 (OpenJMSServer) serverProperties_.getModel().getRoot();
344             root.removeAllChildren();
345             DefaultTreeModel model =
346                 (DefaultTreeModel) serverProperties_.getModel();
347             model.nodeStructureChanged((DefaultMutableTreeNode) root);
348             connections_.setEnabled(true);
349             refresh_.setEnabled(false);
350             disconnect_.setEnabled(false);
351             messageArea_.setForeground(java.awt.Color.red);
352             messageArea_.setText("Not Connected");
353             connected_ = false;
354         }
355     }
356 
357 
358     /***
359      * Set up all Action menu callbacks, and mouse events for the tree and its
360      * nodes. Check all mose 2 key presses on a node, select the node,
361      * then call the nodes appropriate display methos to display its
362      * specific popup menus.
363      *
364      */
365     private void setupCallbacks() {
366 
367         addWindowListener(new WindowAdapter() {
368 
369             public void windowClosing(WindowEvent evt) {
370                 exitForm(evt);
371             }
372         }
373         );
374 
375 
376         serverProperties_.addMouseListener(new MouseAdapter() {
377 
378             public void mousePressed(MouseEvent e) {
379                 if (!connected_) {
380                     return;
381                 }
382 
383                 if (SwingUtilities.isRightMouseButton(e)) {
384                     int selRow = serverProperties_.getRowForLocation
385                         (e.getX(), e.getY());
386 
387                     serverProperties_.setSelectionRow(selRow);
388                     Object loc =
389                         serverProperties_.getLastSelectedPathComponent();
390                     if (loc instanceof OpenJMSNode) {
391                         OpenJMSNode node = (OpenJMSNode) loc;
392                         node.displayCommands
393                             (serverProperties_.getRowBounds(selRow));
394                     } else if (loc instanceof OpenJMSServer) {
395                         ((OpenJMSServer) loc).displayCommands
396                             (serverProperties_.getRowBounds(selRow));
397                     }
398                 }
399             }
400         }
401         );
402 
403         serverProperties_.addTreeExpansionListener(new TreeExpansionListener() {
404 
405             public void treeCollapsed(TreeExpansionEvent e) {
406                 // todo Anything.....
407             }
408 
409             public void treeExpanded(TreeExpansionEvent e) {
410                 TreePath path = e.getPath();
411                 Object loc = path.getLastPathComponent();
412                 if (loc instanceof OpenJMSNode) {
413                     OpenJMSNode node = (OpenJMSNode) loc;
414                     node.update();
415                 }
416             }
417         }
418         );
419 
420         exit_.addActionListener(new ActionListener() {
421 
422             public void actionPerformed(ActionEvent evt) {
423                 exitAdmin(evt);
424             }
425         }
426         );
427 
428 
429         refresh_.addActionListener(new ActionListener() {
430 
431             public void actionPerformed(ActionEvent evt) {
432                 refresh(evt);
433             }
434         }
435         );
436 
437 
438         online_.addActionListener(new ActionListener() {
439 
440             public void actionPerformed(ActionEvent evt) {
441                 onlineConnect(evt);
442             }
443         }
444         );
445 
446         offline_.addActionListener(new ActionListener() {
447 
448             public void actionPerformed(ActionEvent evt) {
449                 offlineConnect(evt);
450             }
451         }
452         );
453 
454         disconnect_.addActionListener(new ActionListener() {
455 
456             public void actionPerformed(ActionEvent evt) {
457                 disconnect(evt);
458             }
459         }
460         );
461 
462     }
463 
464 
465     /***
466      * The main entry point for this admin gui.
467      * The main form and any support dialogs are created.
468      * An initial size is given, and the gui placed in the middle of the screen
469      *
470      * @param args the command line arguments
471      *
472      */
473     public static void main(String args[]) {
474         try {
475             CommandLine cmdline = new CommandLine(args);
476             if (cmdline.exists("help")) {
477                 // print the usage information
478                 usage();
479             } else if (cmdline.exists("config")) {
480                 ConfigurationManager.setConfig(cmdline.value("config"));
481                 Configuration config = ConfigurationManager.getConfig();
482 
483                 AdminMgr admin = new AdminMgr();
484                 QueryDialog.create(admin);
485                 ObjectDialog.create(admin);
486                 Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
487                 // About center of screen
488                 admin.setLocation(screen.width / 2 - 150, screen.height / 2 - 150);
489                 admin.setSize(300, 300);
490                 admin.invalidate();
491                 admin.show();
492             } else {
493                 // anything else print the usage message
494                 usage();
495             }
496         } catch (Exception err) {
497             err.printStackTrace();
498             System.err.println("Failed to initialize JNDI AdminMgr.\nExiting....");
499         }
500     }
501 
502     /***
503      * Print out information on running this sevice
504      */
505     static protected void usage() {
506         PrintStream out = System.out;
507 
508         out.println("\n\n");
509         out.println("=====================================================");
510         out.println("Usage information for org.exolab.jms." +
511             "jndiadministration.AdminMgr");
512         out.println("=====================================================");
513         out.println("\norg.exolab.jms.jndiadministration.AdminMgr");
514         out.println("    [-help | -config <xml config file>]\n");
515         out.println("\t-help   displays this screen\n");
516         out.println("\t-config file name of xml-based config file\n");
517     }
518 
519 } // End AdminMgr
520