/** * JADE - Java Agent DEvelopment Framework is a framework to develop * multi-agent systems in compliance with the FIPA specifications. * Copyright (C) 2000 CSELT S.p.A. * * GNU Lesser General Public License * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ package jade; //#APIDOC_EXCLUDE_FILE //#J2ME_EXCLUDE_FILE import javax.swing.*; import javax.swing.border.Border; import javax.swing.filechooser.*; import java.awt.*; import java.awt.event.*; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Enumeration; import java.util.Vector; import jade.util.ExtendedProperties; import jade.gui.TreeHelp; /** * This class create the gui for the jade configuration * @author Tiziana Trucco - CSELT S.p.A. * @author Dick Cowan - HP Labs * @author Dominic Greenwood - Whitestein Technologies AG * @version $Date: 2010-04-19 16:16:41 +0200 (lun, 19 apr 2010) $ $Revision: 6320 $ */ public class BootGUI extends JDialog { static String EXTENSION = "conf"; static String TITLE = "--JADE Properties--"; Vector propertiesVector = null; File currentDir = null; JTextField statusField = new JTextField(); JPanel topPanel = new JPanel(); JPanel propertyPanel = new JPanel(); JPanel buttonPanel = new JPanel(); String propertyFileName = null; ExtendedProperties outProp = null; BootGUI thisBootGui; Boot3 booter; /** * Constructor - launches the GUI configurator. * @param theBooter The Boot class. */ public BootGUI(Boot3 theBooter) { super(); thisBootGui = this; booter = theBooter; propertiesVector = createPropertyVector(booter.getProperties()); setTitle("JADE Configurator"); Border raisedbevel = BorderFactory.createRaisedBevelBorder(); JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); mainPanel.setBorder(raisedbevel); topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS)); propertyPanel.setLayout(new BoxLayout(propertyPanel, BoxLayout.Y_AXIS)); for (Enumeration it = propertiesVector.elements(); it.hasMoreElements(); ) { singlePanel propPanel = new singlePanel(); PropertyType p = (PropertyType) it.nextElement(); JPanel panel = propPanel.newSinglePanel(p); propertyPanel.add(panel); } //////////////////////// // Status message //////////////////////// JPanel statusPanel = new JPanel(); statusPanel.setLayout(new BorderLayout()); statusField.setEditable(false); statusField.setFont(new Font("Monospaced", Font.PLAIN, 12)); statusField.setPreferredSize(new Dimension(600, 50)); //statusField.setMaximumSize(new Dimension(200,50)); statusField.setMinimumSize(new Dimension(50, 50)); //if(modified) // statusField.setText("Warning: default parameter overriden by \ncommand line ones"); statusPanel.add(statusField, BorderLayout.CENTER); buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS)); JButton openB = new JButton("Open File"); openB.setToolTipText("Read configuration from file"); openB.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String param = (String) e.getActionCommand(); if (param.equals("Open File")) { JFileChooser chooser = new JFileChooser(); chooser.setFileFilter(new myFileFilter()); if (currentDir != null) { chooser.setCurrentDirectory(currentDir); } int returnVal = chooser.showOpenDialog(null); if (returnVal == JFileChooser.APPROVE_OPTION) { currentDir = chooser.getCurrentDirectory(); String fileName = chooser.getSelectedFile().getAbsolutePath(); try { loadPropertiesFromFile(fileName); propertyFileName = fileName; updateProperties(); } catch (FileNotFoundException fe) { System.out.println("File not found Exception"); } catch (IOException ioe) { System.out.println("IO Exception"); } } } } }); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); buttonPanel.add(openB); JButton saveB = new JButton("Save File"); saveB.setToolTipText("Save configuration into a file"); saveB.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String param = (String) e.getActionCommand(); if (param.equals("Save File")) { ExtendedProperties propToSave = extractPropertiesFromGui(); //propToSave.list(System.out); try { booter.setProperties(propToSave); propToSave = booter.getProperties(); //propToSave.list(System.out); JFileChooser chooser = new JFileChooser(); chooser.setFileFilter(new myFileFilter()); if (currentDir != null) { chooser.setCurrentDirectory(currentDir); } int returnVal = chooser.showSaveDialog(null); if (returnVal == JFileChooser.APPROVE_OPTION) { currentDir = chooser.getCurrentDirectory(); String fileName = chooser.getSelectedFile().getAbsolutePath(); boolean ext = hasExtension(fileName); if (ext == false) { fileName = fileName.concat(".conf"); } propertyFileName = fileName; try { FileOutputStream out = new FileOutputStream(fileName); // do not save -conf=true otherwise // -conf <fileName starts the GUI again propToSave.put(BootProfileImpl.CONF_KEY,"false"); propToSave.store(out, TITLE); out.close(); outProp = propToSave; //dispose(); } catch (FileNotFoundException e1) { System.out .println("File not found Exception"); } catch (IOException e2) { System.out.println("IO exception"); } } } catch (BootException be) { statusField.setText(be.getMessage()); } } } }); buttonPanel.add(saveB); JButton runB = new JButton("Run"); runB.setToolTipText("Launch the system"); runB.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String param = (String) e.getActionCommand(); if (param.equals("Run")) { ExtendedProperties propToSave = extractPropertiesFromGui(); try { booter.setProperties(propToSave); propToSave = booter.getProperties(); boolean different = false; if (propertyFileName != null) { // compares the properties from gui with those in the file ExtendedProperties p = readPropertiesFromFile(propertyFileName); //p.list(System.out); different = compareProperties(propToSave, p); } if (different || (propertyFileName == null)) { int val = JOptionPane.showConfirmDialog(topPanel, "Save this configuration?", "JADE Configurator", JOptionPane.YES_NO_CANCEL_OPTION); if (val == JOptionPane.CANCEL_OPTION) { return; } else if (val == JOptionPane.YES_OPTION) { //Save file JFileChooser chooser = new JFileChooser(); chooser.setFileFilter(new myFileFilter()); if (currentDir != null) { chooser.setCurrentDirectory(currentDir); } int returnVal = chooser.showSaveDialog(null); if (returnVal == JFileChooser.APPROVE_OPTION) { currentDir = chooser.getCurrentDirectory(); String fileName = chooser.getSelectedFile() .getAbsolutePath(); boolean ext = hasExtension(fileName); if (ext == false) { fileName = fileName.concat(".conf"); } try { FileOutputStream out = new FileOutputStream(fileName); propToSave.store(out, TITLE); out.close(); } catch (FileNotFoundException e1) { System.out.println( "File not found exception"); } catch (IOException e2) { System.out.println("IO exception"); } } } } outProp = propToSave; dispose(); } catch (BootException be) { statusField.setText(be.getMessage()); } catch (FileNotFoundException e1) { System.out.println("File not found"); } catch (IOException e2) { System.out.println("Io Exception"); } } } }); buttonPanel.add(runB); JButton exitB = new JButton("Exit"); exitB.setToolTipText("Exit without executing"); exitB.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String param = (String) e.getActionCommand(); if (param.equals("Exit")) { System.exit(0); } } }); buttonPanel.add(exitB); JButton helpB = new JButton("Help"); helpB.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String param = (String) e.getActionCommand(); if (param.equals("Help")) { TreeHelp help = new TreeHelp(thisBootGui, "Boot Help", "help/BOOTGUI.html"); // must insert the listener for the close action help.setVisible(true); help.requestFocus(); } } }); buttonPanel.add(helpB); topPanel.add(buttonPanel); topPanel.add(propertyPanel); mainPanel.add(topPanel); mainPanel.add(statusPanel); getContentPane().add(mainPanel, BorderLayout.CENTER); setResizable(false); setModal(true); ShowCorrect(); } /** * Extract the values of the configuration properties from the GUI. */ ExtendedProperties extractPropertiesFromGui() { ExtendedProperties out = new ExtendedProperties(); int size = propertyPanel.getComponentCount(); for (Enumeration it = propertiesVector.elements(); it.hasMoreElements(); ) { PropertyType prop = (PropertyType) it.nextElement(); String name = prop.getName(); String type = prop.getType(); String defaultVal = prop.getDefaultValue(); boolean found = false; for (int i = 0; (i < size) &&!found; i++) { JPanel singlePanel = (JPanel) propertyPanel.getComponent(i); JLabel label = (JLabel) singlePanel.getComponent(0); if (name.equalsIgnoreCase(label.getText())) { found = true; if (type.equalsIgnoreCase(PropertyType.COMBO_TYPE)) { //JComboBox JComboBox box = (JComboBox) singlePanel.getComponent(1); out.setProperty(name.toLowerCase(), box.getSelectedItem().toString()); } else if (type.equalsIgnoreCase(PropertyType.BOOLEAN_TYPE)) { //JCheckBox JCheckBox box = (JCheckBox) singlePanel.getComponent(1); out.setProperty(name.toLowerCase(), (new Boolean(box.isSelected())) .toString()); } else { //JTextField JTextField textField = (JTextField) singlePanel.getComponent(1); String text = textField.getText(); //if the user not specificy a value the default one is saved. if (text.length() == 0) { text = defaultVal; } out.setProperty(name.toLowerCase(), text); } } } } //System.out.println("extract from GUI: "); //out.list(System.out); return out; } /** * Compare two property collections. */ boolean compareProperties(ExtendedProperties p1, ExtendedProperties p2) { Enumeration keys = p1.keys(); boolean modified = false; while (keys.hasMoreElements() &&!modified) { String k1 = (String) keys.nextElement(); String v1 = p1.getProperty(k1); String v2 = p2.getProperty(k1); if (v1 == null) { modified = (v2 != null); } else { modified = !(v1.equalsIgnoreCase(v2)); } } return modified; } /** * Update the gui when a new file is opened. * For every property it sets in the vector of property the value read in the file * or if it is absent the default value. */ void updateProperties() { int size = propertyPanel.getComponentCount(); for (Enumeration it = propertiesVector.elements(); it.hasMoreElements(); ) { PropertyType prop = (PropertyType) it.nextElement(); String name = prop.getName(); String type = prop.getType(); String newValue = prop.getDefaultValue(); boolean found = false; for (int i = 0; (i < size) &&!found; i++) { JPanel singlePanel = (JPanel) propertyPanel.getComponent(i); JLabel label = (JLabel) singlePanel.getComponent(0); if (name.equalsIgnoreCase(label.getText())) { found = true; if (type.equalsIgnoreCase(PropertyType.BOOLEAN_TYPE)) { //JCheckBox JCheckBox box = (JCheckBox) singlePanel.getComponent(1); box.setSelected(newValue.equalsIgnoreCase("true")); } else { //JTextField JTextField textField = (JTextField) singlePanel.getComponent(1); textField.setText(newValue); } } } } } /** * Show the gui in the center of the screen */ void ShowCorrect() { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension mySize = getPreferredSize(); int x = (screenSize.width - mySize.width) / 2; int y = (screenSize.height - mySize.height) / 2; setBounds(x, y, mySize.width, mySize.height); setResizable(true); pack(); setVisible(true); toFront(); } /** * Read the properties from file and update the vector of properties. */ void loadPropertiesFromFile(String fileName) throws FileNotFoundException, IOException { ExtendedProperties p = readPropertiesFromFile(fileName); // update the properties in the vector of properties // for every property set the value read in the file and set the command line value to null. Enumeration e = p.keys(); while (e.hasMoreElements()) { boolean found = false; String name = (String) e.nextElement(); Enumeration it = propertiesVector.elements(); while (it.hasMoreElements() &&!found) { PropertyType pt = (PropertyType) it.nextElement(); if (pt.getName().equalsIgnoreCase(name)) { found = true; pt.setDefaultValue(p.getProperty(name)); } } } } /** * Read the properties from a specific file. */ ExtendedProperties readPropertiesFromFile(String fileName) throws FileNotFoundException, IOException { ExtendedProperties p = new ExtendedProperties(); FileInputStream in = new FileInputStream(fileName); p.load(in); in.close(); return p; } /** * Verify if the file written by the user has the right extension. (Used in the save action) */ boolean hasExtension(String fileName) { String ext = null; boolean out = false; int i = fileName.lastIndexOf('.'); if ((i > 0) && (i < fileName.length() - 1)) { ext = fileName.substring(i + 1); } if (ext != null) { if (ext.equalsIgnoreCase("conf")) { out = true; } } return out; } /** * Returns a list of PropertyType used by the BootGUI to initialize the GUI. */ Vector createPropertyVector(ExtendedProperties theProperties) { Vector pv = new Vector(); String[] loginEnum = {"Simple", "Unix", "NT", "Kerberos"}; pv.add(new PropertyType(BootProfileImpl.LOGIN_KEY, PropertyType.COMBO_TYPE, loginEnum, theProperties.getProperty(BootProfileImpl.LOGIN_KEY), "User Authentication context", false)); pv.add(new PropertyType(BootProfileImpl.MAIN_HOST, PropertyType.STRING_TYPE, theProperties.getProperty(BootProfileImpl.MAIN_HOST), "Host Name of the main-container", false)); pv.add(new PropertyType(BootProfileImpl.GUI_KEY, PropertyType.BOOLEAN_TYPE, new Boolean(theProperties.getBooleanProperty(BootProfileImpl.GUI_KEY, false)).toString(), "Select to launch the RMA Gui", false)); pv.add(new PropertyType(BootProfileImpl.MAIN_PORT, PropertyType.STRING_TYPE, new Integer(theProperties.getIntProperty(BootProfileImpl.MAIN_PORT, BootProfileImpl.DEFAULT_PORT)).toString(), "Port Number of the main-container", false)); pv.add(new PropertyType(BootProfileImpl.NAME_KEY, PropertyType.STRING_TYPE, theProperties.getProperty(BootProfileImpl.NAME_KEY), "The symbolic plaform name", false)); pv.add(new PropertyType(BootProfileImpl.CONTAINER_KEY, PropertyType.BOOLEAN_TYPE, new Boolean(theProperties.getBooleanProperty(BootProfileImpl.CONTAINER_KEY, false)).toString(), "Select to launch an agent-container", false)); pv.add(new PropertyType(BootProfileImpl.MTP_KEY, PropertyType.STRING_TYPE, theProperties.getProperty(BootProfileImpl.MTP_KEY), "List of MTPs to activate", false)); pv.add(new PropertyType(BootProfileImpl.NOMTP_KEY, PropertyType.BOOLEAN_TYPE, new Boolean(theProperties.getBooleanProperty(BootProfileImpl.NOMTP_KEY, false)).toString(), "Disable all external MTPs on this container", false)); pv.add(new PropertyType(BootProfileImpl.ACLCODEC_KEY, PropertyType.STRING_TYPE, theProperties.getProperty(BootProfileImpl.ACLCODEC_KEY), "List of ACLCodec to install", false)); pv.add(new PropertyType(BootProfileImpl.AGENTS, PropertyType.STRING_TYPE, theProperties.getProperty(BootProfileImpl.AGENTS), "Agents to launch", false)); pv.add(new PropertyType(BootProfileImpl.NOMOBILITY_KEY, PropertyType.BOOLEAN_TYPE, new Boolean(theProperties.getBooleanProperty(BootProfileImpl.NOMOBILITY_KEY,false)).toString(), "Disable Mobility", false)); return pv; } /** * A JPanel for a single property. */ class singlePanel extends JPanel { singlePanel() { super(); } JPanel newSinglePanel(PropertyType property) { JPanel mainP = new JPanel(new FlowLayout(FlowLayout.LEFT)); Border etched = BorderFactory.createEtchedBorder(Color.white, Color.gray); String name = property.getName(); JLabel nameLabel = new JLabel(name.toUpperCase()); nameLabel.setPreferredSize(new Dimension(80, 26)); nameLabel.setMaximumSize(new Dimension(80, 26)); nameLabel.setMinimumSize(new Dimension(80, 26)); mainP.add(nameLabel); String type = property.getType(); JComboBox valueCombo; JCheckBox valueBox; JTextField valueText; // if the property has a command line value than it is used // otherwise is used the default value String value = property.getDefaultValue(); if (type.equalsIgnoreCase(PropertyType.COMBO_TYPE)) { valueCombo = new JComboBox(property.getComboValues()); valueCombo.setSelectedIndex(0); valueCombo.setToolTipText(property.getToolTip()); mainP.add(valueCombo); } else if (type.equalsIgnoreCase(PropertyType.BOOLEAN_TYPE)) { valueBox = new JCheckBox(); valueBox.setSelected((new Boolean(value)).booleanValue()); valueBox.setToolTipText(property.getToolTip()); mainP.add(valueBox); } else { valueText = new JTextField(); valueText.setBorder(etched); if (type.equalsIgnoreCase(PropertyType.INTEGER_TYPE)) { valueText.setPreferredSize(new Dimension(100, 26)); valueText.setMaximumSize(new Dimension(100,26)); } else { valueText.setPreferredSize(new Dimension(600, 26)); } valueText.setMinimumSize(new Dimension(50, 26)); valueText.setText(value); valueText.setToolTipText(property.getToolTip()); mainP.add(valueText); } return mainP; } } /** * Extends FileFilter in order to show only files with extension ".conf". */ class myFileFilter extends FileFilter { public boolean accept(File f) { if (f.isDirectory()) { return true; } String ext = getExtension(f); if (ext != null) { if (ext.equals(EXTENSION)) { return true; } else { return false; } } return false; } public String getDescription() { return "Configuration file (*." + EXTENSION + ")"; } String getExtension(File f) { String ext = null; String s = f.getName(); int i = s.lastIndexOf('.'); if ((i > 0) && (i < s.length() - 1)) { ext = s.substring(i + 1).toLowerCase(); } return ext; } } }