Source code: org/jabbee/Jabbee.java
1 /*
2 * Jabbee.java
3 *
4 * Created on October 23, 2002, 3:32 AM
5 *
6 *
7 * License:
8 *
9 * The contents of this file are subject to the Jabber Open Source
10 * License Version 1.0 (the "License"). You may not copy or use this
11 * file, in either source code or executable form, except in compliance
12 * with the License. You may obtain a copy of the License at
13 * http://www.jabber.com/license/ or at http://www.opensource.org/.
14 * Software distributed under the License is distributed on an "AS IS"
15 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
16 * the License for the specific language governing rights and limitations
17 * under the License.
18 *
19 * Copyrights:
20 *
21 * Portions created by or assigned to Jabber.com, Inc. are Copyright
22 * (c) 1999-2000 Jabber.com, Inc. All Rights Reserved. Contact information
23 * for Jabber.com, Inc. is available at http://www.jabber.com/. Portions
24 * Copyright (c) 1998-1999 Jeremie Miller.
25 *
26 * Acknowledgements:
27 *
28 * Special thanks to the Jabber Open Source Contributors for their
29 * suggestions and support of Jabber.
30 *
31 */
32
33 package org.jabbee;
34
35 import java.io.File;
36 import java.io.IOException;
37 import javax.swing.JOptionPane;
38 import javax.xml.parsers.DocumentBuilder;
39 import javax.xml.parsers.DocumentBuilderFactory;
40 import javax.xml.parsers.FactoryConfigurationError;
41 import javax.xml.parsers.ParserConfigurationException;
42 import org.jabbee.resources.PreferencesHandler;
43 import org.jabbee.ui.dialogs.*;
44 import org.jabbee.ui.panels.*;
45 import org.jabbee.util.ConfigReader;
46 import org.jabbee.util.ConfigWriter;
47 import org.w3c.dom.Document;
48 import org.xml.sax.SAXException;
49
50 /** Jabber v0.01 - Main Class of the configuration utility for jabberd.
51 *
52 * @author Gregory Kaczmarczyk
53 *
54 * @version 0.02
55 */
56 public class Jabbee extends javax.swing.JFrame {
57
58 /** Creates new form Jabbee
59 *
60 * @param handler Jabbee will start using the following PreferencesHandler
61 */
62 public Jabbee(PreferencesHandler handler) {
63
64 prefsHandler = handler;
65
66 initComponents();
67
68 addCards();
69 initForm();
70 loadConfigFile();
71
72 setSize(560,360);
73 centerWindow();
74 }
75
76 /** Creates new form Jabbee
77 *
78 * @param file The jabberd configuration file to use. Jabbee will create a
79 * new PreferencesHandler.
80 */
81 public Jabbee(String file) {
82 prefs = java.util.prefs.Preferences.userRoot();
83 prefsHandler = new PreferencesHandler(prefs);
84 prefsHandler.setConfigFile(file);
85
86 initComponents();
87
88 addCards();
89 initForm();
90 loadConfigFile();
91
92 setSize(560,350);
93 centerWindow();
94 }
95
96 /** This method is called from within the constructor to
97 * initialize the form.
98 * WARNING: Do NOT modify this code. The content of this method is
99 * always regenerated by the Form Editor.
100 */
101 private void initComponents() {//GEN-BEGIN:initComponents
102 mainConfigPanel = new javax.swing.JPanel();
103 configListScrollPane = new javax.swing.JScrollPane();
104 configList = new javax.swing.JList();
105 configCardPanel = new javax.swing.JPanel();
106 actionPanel = new javax.swing.JPanel();
107 saveButton = new javax.swing.JButton();
108 quitButton = new javax.swing.JButton();
109 menuBar = new javax.swing.JMenuBar();
110 fileMenu = new javax.swing.JMenu();
111 reloadFileMenu = new javax.swing.JMenuItem();
112 saveFileMenu = new javax.swing.JMenuItem();
113 fileMenuSeparator = new javax.swing.JSeparator();
114 quitFileMenu = new javax.swing.JMenuItem();
115 editMenu = new javax.swing.JMenu();
116 settingsEditMenu = new javax.swing.JMenuItem();
117 helpMenu = new javax.swing.JMenu();
118 toolTipsHelpMenu = new javax.swing.JCheckBoxMenuItem();
119 sep0HelpMenu = new javax.swing.JSeparator();
120 aboutHelpMenu = new javax.swing.JMenuItem();
121
122 setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
123 setTitle("Jabbee");
124 setIconImage(new javax.swing.ImageIcon(getClass().getResource("/org/jabbee/resources/images/logo-16.png")).getImage());
125 addWindowListener(new java.awt.event.WindowAdapter() {
126 public void windowClosing(java.awt.event.WindowEvent evt) {
127 exitForm(evt);
128 }
129 });
130
131 mainConfigPanel.setLayout(new java.awt.BorderLayout());
132
133 mainConfigPanel.setBorder(new javax.swing.border.EtchedBorder());
134 configList.setModel(new javax.swing.AbstractListModel() {
135 String[] strings = { "General", "Filters", "Logging", "Filesystem", "Security", "Connections", "Input/Output", "Components", "Additional Services" };
136 public int getSize() { return strings.length; }
137 public Object getElementAt(int i) { return strings[i]; }
138 });
139 configList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
140 configList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
141 public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
142 configListValueChanged(evt);
143 }
144 });
145
146 configListScrollPane.setViewportView(configList);
147
148 mainConfigPanel.add(configListScrollPane, java.awt.BorderLayout.WEST);
149
150 configCardPanel.setLayout(new java.awt.CardLayout());
151
152 configCardPanel.setLayout(configCards);
153 mainConfigPanel.add(configCardPanel, java.awt.BorderLayout.CENTER);
154
155 getContentPane().add(mainConfigPanel, java.awt.BorderLayout.CENTER);
156
157 saveButton.setMnemonic(java.awt.event.KeyEvent.VK_S);
158 saveButton.setText("Save Configuration");
159 saveButton.addActionListener(new java.awt.event.ActionListener() {
160 public void actionPerformed(java.awt.event.ActionEvent evt) {
161 saveButtonActionPerformed(evt);
162 }
163 });
164
165 actionPanel.add(saveButton);
166
167 quitButton.setMnemonic(java.awt.event.KeyEvent.VK_Q);
168 quitButton.setText("Quit");
169 quitButton.addActionListener(new java.awt.event.ActionListener() {
170 public void actionPerformed(java.awt.event.ActionEvent evt) {
171 quitButtonActionPerformed(evt);
172 }
173 });
174
175 actionPanel.add(quitButton);
176
177 getContentPane().add(actionPanel, java.awt.BorderLayout.SOUTH);
178
179 fileMenu.setMnemonic(java.awt.event.KeyEvent.VK_F);
180 fileMenu.setText("File");
181 reloadFileMenu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R, java.awt.event.InputEvent.CTRL_MASK));
182 reloadFileMenu.setMnemonic(java.awt.event.KeyEvent.VK_R);
183 reloadFileMenu.setText("Reload Config");
184 reloadFileMenu.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/jabbee/ui/images/Redo16.gif")));
185 reloadFileMenu.addActionListener(new java.awt.event.ActionListener() {
186 public void actionPerformed(java.awt.event.ActionEvent evt) {
187 reloadFileMenuActionPerformed(evt);
188 }
189 });
190
191 fileMenu.add(reloadFileMenu);
192 saveFileMenu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
193 saveFileMenu.setMnemonic(java.awt.event.KeyEvent.VK_S);
194 saveFileMenu.setText("Save Config");
195 saveFileMenu.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/jabbee/ui/images/Save16.gif")));
196 saveFileMenu.addActionListener(new java.awt.event.ActionListener() {
197 public void actionPerformed(java.awt.event.ActionEvent evt) {
198 saveFileMenuActionPerformed(evt);
199 }
200 });
201
202 fileMenu.add(saveFileMenu);
203 fileMenu.add(fileMenuSeparator);
204 quitFileMenu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Q, java.awt.event.InputEvent.CTRL_MASK));
205 quitFileMenu.setMnemonic(java.awt.event.KeyEvent.VK_Q);
206 quitFileMenu.setText("Quit");
207 quitFileMenu.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/jabbee/ui/images/Exit16.gif")));
208 quitFileMenu.addActionListener(new java.awt.event.ActionListener() {
209 public void actionPerformed(java.awt.event.ActionEvent evt) {
210 quitFileMenuActionPerformed(evt);
211 }
212 });
213
214 fileMenu.add(quitFileMenu);
215 menuBar.add(fileMenu);
216 editMenu.setMnemonic(java.awt.event.KeyEvent.VK_E);
217 editMenu.setText("Edit");
218 settingsEditMenu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_SEMICOLON, java.awt.event.InputEvent.CTRL_MASK));
219 settingsEditMenu.setMnemonic(java.awt.event.KeyEvent.VK_S);
220 settingsEditMenu.setText("Server Settings...");
221 settingsEditMenu.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/jabbee/ui/images/Preferences16.gif")));
222 settingsEditMenu.addActionListener(new java.awt.event.ActionListener() {
223 public void actionPerformed(java.awt.event.ActionEvent evt) {
224 settingsEditMenuActionPerformed(evt);
225 }
226 });
227
228 editMenu.add(settingsEditMenu);
229 menuBar.add(editMenu);
230 helpMenu.setMnemonic(java.awt.event.KeyEvent.VK_H);
231 helpMenu.setText("Help");
232 toolTipsHelpMenu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_T, java.awt.event.InputEvent.CTRL_MASK));
233 toolTipsHelpMenu.setMnemonic(java.awt.event.KeyEvent.VK_T);
234 toolTipsHelpMenu.setText("Use Tooltips");
235 toolTipsHelpMenu.addItemListener(new java.awt.event.ItemListener() {
236 public void itemStateChanged(java.awt.event.ItemEvent evt) {
237 toolTipsHelpMenuItemStateChanged(evt);
238 }
239 });
240
241 helpMenu.add(toolTipsHelpMenu);
242 helpMenu.add(sep0HelpMenu);
243 aboutHelpMenu.setMnemonic(java.awt.event.KeyEvent.VK_A);
244 aboutHelpMenu.setText("About...");
245 aboutHelpMenu.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/jabbee/ui/images/About16.gif")));
246 aboutHelpMenu.addActionListener(new java.awt.event.ActionListener() {
247 public void actionPerformed(java.awt.event.ActionEvent evt) {
248 aboutHelpMenuActionPerformed(evt);
249 }
250 });
251
252 helpMenu.add(aboutHelpMenu);
253 menuBar.add(helpMenu);
254 setJMenuBar(menuBar);
255
256 pack();
257 }//GEN-END:initComponents
258
259 private void saveFileMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveFileMenuActionPerformed
260 saveConfigFile();
261 }//GEN-LAST:event_saveFileMenuActionPerformed
262
263 private void reloadFileMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reloadFileMenuActionPerformed
264 loadConfigFile();
265 }//GEN-LAST:event_reloadFileMenuActionPerformed
266
267 private void toolTipsHelpMenuItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_toolTipsHelpMenuItemStateChanged
268 if (toolTipsHelpMenu.isSelected()) {
269 javax.swing.ToolTipManager.sharedInstance().setEnabled(true);
270 prefsHandler.setToolTips(true);
271 } else {
272 javax.swing.ToolTipManager.sharedInstance().setEnabled(false);
273 prefsHandler.setToolTips(false);
274 }
275 }//GEN-LAST:event_toolTipsHelpMenuItemStateChanged
276
277 private void configListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_configListValueChanged
278 int index = configList.getSelectedIndex();
279 configCards.show(configCardPanel, "Card" + index);
280 switch (index) {
281 case 0:
282 general.resetTab();
283 break;
284 case 5:
285 connections.resetTab();
286 break;
287 case 7:
288 components.resetTab();
289 break;
290 }
291 }//GEN-LAST:event_configListValueChanged
292
293 private void quitButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_quitButtonActionPerformed
294 if (!unsavedChanges)
295 System.exit(0);
296 else {
297 }
298 }//GEN-LAST:event_quitButtonActionPerformed
299
300 private void saveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveButtonActionPerformed
301 saveConfigFile();
302 }//GEN-LAST:event_saveButtonActionPerformed
303
304 private void aboutHelpMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_aboutHelpMenuActionPerformed
305 AboutWindow about = new AboutWindow(this, true);
306 about.show();
307 }//GEN-LAST:event_aboutHelpMenuActionPerformed
308
309 private void settingsEditMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_settingsEditMenuActionPerformed
310 ServerSettings ss = new ServerSettings(this, true);
311 ss.setPrefs(prefsHandler);
312 ss.show();
313 }//GEN-LAST:event_settingsEditMenuActionPerformed
314
315 private void quitFileMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_quitFileMenuActionPerformed
316 if (!unsavedChanges)
317 System.exit(0);
318 else {
319 }
320 }//GEN-LAST:event_quitFileMenuActionPerformed
321
322 /** Exit the Application */
323 private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
324 if (!unsavedChanges)
325 System.exit(0);
326 else {
327 }
328 }//GEN-LAST:event_exitForm
329
330 private void centerWindow() {
331 java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
332 this.setLocation(screenSize.width/2 - (this.getPreferredSize().width/2), screenSize.height/2 - (this.getPreferredSize().height/2));
333 }
334
335 private void addCards() {
336 general = new General(this);
337 configCardPanel.add(general, "Card0");
338 filters = new Filters();
339 configCardPanel.add(filters, "Card1");
340 logging = new Logging();
341 logging.setPrefsHandler(prefsHandler);
342 configCardPanel.add(logging, "Card2");
343 filesystem = new Filesystem();
344 filesystem.setPrefsHandler(prefsHandler);
345 configCardPanel.add(filesystem, "Card3");
346 security = new Security(this);
347 security.setPrefsHandler(prefsHandler);
348 configCardPanel.add(security, "Card4");
349 connections = new Connections(this);
350 configCardPanel.add(connections, "Card5");
351 inputOutput = new InputOutput();
352 configCardPanel.add(inputOutput, "Card6");
353 components = new Components(this);
354 configCardPanel.add(components, "Card7");
355 services = new AdditionalServices();
356 configCardPanel.add(services, "Card8");
357 }
358
359 private void initForm() {
360 if (prefsHandler.areToolTipsEnabled()) {
361 toolTipsHelpMenu.setSelected(true);
362 javax.swing.ToolTipManager.sharedInstance().setEnabled(true);
363 } else {
364 javax.swing.ToolTipManager.sharedInstance().setEnabled(false);
365 }
366 configList.setSelectedIndex(0);
367 }
368
369 private void loadConfigFile() {
370 try {
371 File file = new File(prefsHandler.getConfigFile());
372 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
373 factory.setIgnoringElementContentWhitespace(true);
374 DocumentBuilder builder = factory.newDocumentBuilder();
375 configDoc = builder.parse(file);
376 ConfigReader cr = new ConfigReader(configDoc);
377
378 if (cr.validateRoot("jabber")) {
379 cr.setGeneralPanel(general);
380 cr.setFiltersPanel(filters);
381 cr.setLoggingPanel(logging);
382 cr.setFilesystemPanel(filesystem);
383 cr.setSecurityPanel(security);
384 cr.setConnectionsPanel(connections);
385 cr.setInputOutputPanel(inputOutput);
386 cr.setComponentsPanel(components);
387 cr.setServicePanel(services);
388
389 cr.start();
390 } else
391 JOptionPane.showMessageDialog(this, "This does not appear to be a valid jabber configuration file.", "Invalid Jabber Config File", JOptionPane.ERROR_MESSAGE);
392 } catch (IOException e) {
393 JOptionPane.showMessageDialog(this, "IOException", "IOException: " + e.toString(), JOptionPane.ERROR_MESSAGE);
394 } catch (FactoryConfigurationError e) {
395 JOptionPane.showMessageDialog(this, "FactoryConfigurationError", "FactoryConfigurationError: " + e.toString(), JOptionPane.ERROR_MESSAGE);
396 } catch (ParserConfigurationException e) {
397 JOptionPane.showMessageDialog(this, "ParserConfigurationException", "ParserConfigurationException: " + e.toString(), JOptionPane.ERROR_MESSAGE);
398 } catch (SAXException e) {
399 JOptionPane.showMessageDialog(this, "SAXException", "SAXException: " + e.toString(), JOptionPane.ERROR_MESSAGE);
400 }
401 }
402
403 private void saveConfigFile() {
404 File file = new File(prefsHandler.getConfigFile());
405 ConfigWriter cw = new ConfigWriter(configDoc, file);
406 cw.setParent(this);
407
408 cw.setGeneralPanel(general);
409 cw.setFiltersPanel(filters);
410 cw.setLoggingPanel(logging);
411 cw.setFilesystemPanel(filesystem);
412 cw.setSecurityPanel(security);
413 cw.setConnectionsPanel(connections);
414 cw.setInputOutputPanel(inputOutput);
415 cw.setComponentsPanel(components);
416 cw.setServicePanel(services);
417
418 cw.start();
419 }
420
421 /**
422 * @param args the command line arguments
423 */
424 public static void main(String args[]) {
425 String file = "";
426 java.util.prefs.Preferences p = java.util.prefs.Preferences.userRoot();
427 PreferencesHandler handler = new PreferencesHandler(p);
428 Jabbee j;
429
430 for (int i = 0; i < args.length; i++) {
431 if (args[i].endsWith("-h") || args[i].endsWith("?")) {
432 System.out.println("Jabbee v0.01 - Jabber Daemon Configuration Tool");
433 System.out.println("");
434 System.out.println("Usage: java -jar Jabbee.jar [options] [jabberconfig]");
435 System.out.println("");
436 System.out.println("Options:");
437 System.out.println(" -h Display this help");
438 System.out.println("");
439 System.out.println("Jabberconfig:");
440 System.out.println(" Full path to jabberd configuration file");
441 System.out.println("");
442 System.exit(0);
443 } else if (i == (args.length - 1)) {
444 if (new java.io.File(args[i]).exists())
445 file = args[i];
446 else
447 System.out.println("File \"" + args[i] + "\" appears invalid. Using default...");
448 }
449 }
450
451 if ((file.length() == 0) && (handler.getConfigFile().length() == 0)) {
452 getConfigPath();
453 } else if (file.length() != 0) {
454 if (new File(file).exists()) {
455 j = new Jabbee(file);
456 j.show();
457 } else
458 getConfigPath();
459 } else {
460 if (new File(handler.getConfigFile()).exists()) {
461 j = new Jabbee(handler);
462 j.show();
463 } else
464 getConfigPath();
465 }
466
467 }
468
469 private static void getConfigPath() {
470 GetConfigPath cp = new GetConfigPath();
471 cp.show();
472 }
473
474 // Variables declaration - do not modify//GEN-BEGIN:variables
475 private javax.swing.JMenu fileMenu;
476 private javax.swing.JScrollPane configListScrollPane;
477 private javax.swing.JMenuItem reloadFileMenu;
478 private javax.swing.JMenuBar menuBar;
479 private javax.swing.JPanel configCardPanel;
480 private javax.swing.JSeparator sep0HelpMenu;
481 private javax.swing.JPanel actionPanel;
482 private javax.swing.JMenuItem aboutHelpMenu;
483 private javax.swing.JMenuItem quitFileMenu;
484 private javax.swing.JSeparator fileMenuSeparator;
485 private javax.swing.JPanel mainConfigPanel;
486 private javax.swing.JButton quitButton;
487 private javax.swing.JMenuItem saveFileMenu;
488 private javax.swing.JCheckBoxMenuItem toolTipsHelpMenu;
489 private javax.swing.JButton saveButton;
490 private javax.swing.JMenuItem settingsEditMenu;
491 private javax.swing.JMenu editMenu;
492 private javax.swing.JList configList;
493 private javax.swing.JMenu helpMenu;
494 // End of variables declaration//GEN-END:variables
495 private java.util.prefs.Preferences prefs;
496 private PreferencesHandler prefsHandler;
497
498 private java.awt.CardLayout configCards = new java.awt.CardLayout();
499 /** Retains value of unsaved changes throughout configuration process */
500 public boolean unsavedChanges = false;
501 //public String configFile = "";
502 private Document configDoc;
503
504 private General general;
505 private Filters filters;
506 private Logging logging;
507 private Filesystem filesystem;
508 private Security security;
509 private Connections connections;
510 private InputOutput inputOutput;
511 private Components components;
512 private AdditionalServices services;
513 }