// ********************************************************************** // // Copyright (c) 2003-2006 ZeroC, Inc. All rights reserved. // // This copy of Ice is licensed to you under the terms described in the // ICE_LICENSE file included in this distribution. // // ********************************************************************** package IceGrid.TreeNode; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JTextField; import com.jgoodies.forms.builder.DefaultFormBuilder; import com.jgoodies.forms.layout.CellConstraints; import IceGrid.ListDialog; import IceGrid.Model; import IceGrid.ServerDescriptor; import IceGrid.TableDialog; import IceGrid.Utils; class ServerSubEditor extends CommunicatorSubEditor { ServerSubEditor(Editor mainEditor, JFrame parentFrame) { super(mainEditor, parentFrame); _id.getDocument().addDocumentListener( _mainEditor.getUpdateListener()); _id.setToolTipText("Must be unique within this IceGrid deployment"); _exe.getDocument().addDocumentListener( _mainEditor.getUpdateListener()); _exe.setToolTipText("Path to this server's executable, e.g.:
" + "icebox
" + "java
" + "myHelloServer
" + "C:\\testbed\\hello\\server"); _pwd.getDocument().addDocumentListener( _mainEditor.getUpdateListener()); _pwd.setToolTipText( "If not set, the server will start in " + "node data dir/servers/server-id;
" + "relative directories are relative to the current directory" + " of the icegridnode process."); _options.setEditable(false); _envs.setEditable(false); _activation = new JComboBox(new Object[]{ON_DEMAND, MANUAL}); _activation.setToolTipText("Select 'on-demand' to have IceGrid start your server on-demand"); JTextField activationTextField = (JTextField) _activation.getEditor().getEditorComponent(); activationTextField.getDocument().addDocumentListener( _mainEditor.getUpdateListener()); _activationTimeout.getDocument().addDocumentListener( _mainEditor.getUpdateListener()); _activationTimeout.setToolTipText("Number of seconds; if not set or set to 0, " + "the IceGrid Node
uses the value of its " + "IceGrid.Node.WaitTime property"); _deactivationTimeout.getDocument().addDocumentListener( _mainEditor.getUpdateListener()); _deactivationTimeout.setToolTipText("Number of seconds; if not set or set to 0, " + "the IceGrid Node
uses the value of its " + "IceGrid.Node.WaitTime property"); _envDialog = new TableDialog(parentFrame, "Environment Variables", "Name", "Value", true); Action openEnvDialog = new AbstractAction("...") { public void actionPerformed(ActionEvent e) { java.util.Map result = _envDialog.show( _envMap, _mainEditor.getProperties()); if(result != null) { _mainEditor.updated(); _envMap = result; setEnvsField(); } } }; openEnvDialog.putValue(Action.SHORT_DESCRIPTION, "Edit environment variables"); _envButton = new JButton(openEnvDialog); _optionDialog = new ListDialog(parentFrame, "Command Arguments", false); Action openOptionDialog = new AbstractAction("...") { public void actionPerformed(ActionEvent e) { java.util.LinkedList result = _optionDialog.show( _optionList, _mainEditor.getProperties()); if(result != null) { _mainEditor.updated(); _optionList = result; setOptionsField(); } } }; openOptionDialog.putValue(Action.SHORT_DESCRIPTION, "Edit command-line arguments"); _optionButton = new JButton(openOptionDialog); Action appDistrib = new AbstractAction("Depends on the application distribution") { public void actionPerformed(ActionEvent e) { _mainEditor.updated(); } }; appDistrib.putValue(Action.SHORT_DESCRIPTION, "Check this box if this server needs to be restarted
" + "each time the distribution for your application is refreshed."); _applicationDistrib = new JCheckBox(appDistrib); _distrib = new JComboBox(new Object[]{NO_DISTRIB, DEFAULT_DISTRIB}); _distrib.setToolTipText( "The proxy to the IcePatch2 server holding your files"); JTextField distribTextField = (JTextField) _distrib.getEditor().getEditorComponent(); distribTextField.getDocument().addDocumentListener( _mainEditor.getUpdateListener()); _distribDirs.setEditable(false); _distribDirsDialog = new ListDialog(parentFrame, "Directories", true); Action openDistribDirsDialog = new AbstractAction("...") { public void actionPerformed(ActionEvent e) { java.util.LinkedList result = _distribDirsDialog.show( _distribDirsList, _mainEditor.getProperties()); if(result != null) { _mainEditor.updated(); _distribDirsList = result; setDistribDirsField(); } } }; openDistribDirsDialog.putValue(Action.SHORT_DESCRIPTION, "Edit directory list"); _distribDirsButton = new JButton(openDistribDirsDialog); } ServerDescriptor getServerDescriptor() { return (ServerDescriptor) _mainEditor.getSubDescriptor(); } void appendProperties(DefaultFormBuilder builder) { builder.append("Server ID"); builder.append(_id, 3); builder.nextLine(); // // Add Communicator fields // super.appendProperties(builder); builder.appendSeparator("Activation"); builder.append("Path to Executable"); builder.append(_exe, 3); builder.nextLine(); builder.append("Working Directory"); builder.append(_pwd, 3); builder.nextLine(); builder.append("Command Arguments"); builder.append(_options, _optionButton); builder.nextLine(); builder.append("Environment Variables"); builder.append(_envs, _envButton); builder.nextLine(); builder.append("Activation Mode"); builder.append(_activation, 3); builder.nextLine(); builder.append("Activation Timeout"); builder.append(_activationTimeout, 3); builder.nextLine(); builder.append("Deactivation Timeout"); builder.append(_deactivationTimeout, 3); builder.nextLine(); JComponent c = builder.appendSeparator("Distribution"); c.setToolTipText("Files specific to this server"); builder.append("", _applicationDistrib); builder.nextLine(); builder.append("IcePatch2 Proxy"); builder.append(_distrib, 3); builder.nextLine(); builder.append("Directories"); builder.append(_distribDirs, _distribDirsButton); builder.nextLine(); } void writeDescriptor() { ServerDescriptor descriptor = getServerDescriptor(); descriptor.id = _id.getText(); descriptor.exe = _exe.getText(); descriptor.pwd = _pwd.getText(); descriptor.options = _optionList; descriptor.envs = new java.util.LinkedList(); java.util.Iterator p = _envMap.entrySet().iterator(); while(p.hasNext()) { java.util.Map.Entry entry = (java.util.Map.Entry)p.next(); descriptor.envs.add(entry.getKey().toString() + "=" + entry.getValue().toString()); } descriptor.activation = _activation.getSelectedItem().toString(); descriptor.activationTimeout = _activationTimeout.getText(); descriptor.deactivationTimeout = _deactivationTimeout.getText(); descriptor.applicationDistrib = _applicationDistrib.isSelected(); if(_distrib.getSelectedItem() == NO_DISTRIB) { descriptor.distrib.icepatch = ""; } else { descriptor.distrib.icepatch = _distrib.getSelectedItem().toString(); } descriptor.distrib.directories = _distribDirsList; super.writeDescriptor(descriptor); } boolean isSimpleUpdate() { return getServerDescriptor().id.equals(_id.getText()); } void show(boolean isEditable) { ServerDescriptor descriptor = getServerDescriptor(); Utils.Resolver detailResolver = _mainEditor.getDetailResolver(); isEditable = isEditable && (detailResolver == null); if(detailResolver != null) { _id.setText(detailResolver.find("server")); } else { _id.setText(descriptor.id); } _id.setEditable(isEditable); _exe.setText( Utils.substitute(descriptor.exe, detailResolver)); _exe.setEditable(isEditable); _pwd.setText( Utils.substitute(descriptor.pwd, detailResolver)); _pwd.setEditable(isEditable); _optionList = descriptor.options; setOptionsField(); _optionButton.setEnabled(isEditable); _envMap = new java.util.TreeMap(); java.util.Iterator p = descriptor.envs.iterator(); while(p.hasNext()) { String env = (String)p.next(); int equal = env.indexOf('='); if(equal == -1 || equal == env.length() - 1) { _envMap.put(env, ""); } else { _envMap.put(env.substring(0, equal), env.substring(equal + 1)); } } setEnvsField(); _envButton.setEnabled(isEditable); String activation = Utils.substitute(descriptor.activation, detailResolver); _activation.setEnabled(true); _activation.setEditable(true); if(activation.equals(ON_DEMAND)) { _activation.setSelectedItem(ON_DEMAND); } else if(activation.equals(MANUAL)) { _activation.setSelectedItem(MANUAL); } else { _activation.setSelectedItem(activation); } _activation.setEnabled(isEditable); _activation.setEditable(isEditable); _activationTimeout.setText( Utils.substitute(descriptor.activationTimeout, detailResolver)); _activationTimeout.setEditable(isEditable); _deactivationTimeout.setText( Utils.substitute(descriptor.deactivationTimeout, detailResolver)); _deactivationTimeout.setEditable(isEditable); _applicationDistrib.setSelected(descriptor.applicationDistrib); _applicationDistrib.setEnabled(isEditable); _distrib.setEnabled(true); _distrib.setEditable(true); String icepatch = Utils.substitute(descriptor.distrib.icepatch, detailResolver); if(icepatch.equals("")) { _distrib.setSelectedItem(NO_DISTRIB); } else { _distrib.setSelectedItem(icepatch); } _distrib.setEnabled(isEditable); _distrib.setEditable(isEditable); _distribDirsList = new java.util.LinkedList(descriptor.distrib.directories); setDistribDirsField(); _distribDirsButton.setEnabled(isEditable); show(descriptor, isEditable); } private void setEnvsField() { final Utils.Resolver resolver = _mainEditor.getDetailResolver(); Ice.StringHolder toolTipHolder = new Ice.StringHolder(); Utils.Stringifier stringifier = new Utils.Stringifier() { public String toString(Object obj) { java.util.Map.Entry entry = (java.util.Map.Entry)obj; return Utils.substitute((String)entry.getKey(), resolver) + "=" + Utils.substitute((String)entry.getValue(), resolver); } }; _envs.setText( Utils.stringify(_envMap.entrySet(), stringifier, ", ", toolTipHolder)); _envs.setToolTipText(toolTipHolder.value); } private void setOptionsField() { final Utils.Resolver resolver = _mainEditor.getDetailResolver(); Ice.StringHolder toolTipHolder = new Ice.StringHolder(); Utils.Stringifier stringifier = new Utils.Stringifier() { public String toString(Object obj) { return Utils.substitute((String)obj, resolver); } }; _options.setText( Utils.stringify(_optionList, stringifier, " ", toolTipHolder)); _options.setToolTipText(toolTipHolder.value); } private void setDistribDirsField() { final Utils.Resolver resolver = _mainEditor.getDetailResolver(); Ice.StringHolder toolTipHolder = new Ice.StringHolder(); Utils.Stringifier stringifier = new Utils.Stringifier() { public String toString(Object obj) { return Utils.substitute((String)obj, resolver); } }; _distribDirs.setText( Utils.stringify(_distribDirsList, stringifier, ", ", toolTipHolder)); String toolTip = "Include only these directories"; if(toolTipHolder.value != null) { toolTip += ":
" + toolTipHolder.value; } toolTip += ""; _distribDirs.setToolTipText(toolTip); } static private final String ON_DEMAND = "on-demand"; static private final String MANUAL = "manual"; static private final Object NO_DISTRIB = new Object() { public String toString() { return "None selected"; } }; static private final String DEFAULT_DISTRIB = "${application}.IcePatch2/server"; private JTextField _id = new JTextField(20); private JTextField _exe = new JTextField(20); private JTextField _pwd = new JTextField(20); private JComboBox _activation; private JTextField _activationTimeout = new JTextField(20); private JTextField _deactivationTimeout = new JTextField(20); private JTextField _envs = new JTextField(20); private java.util.Map _envMap; private TableDialog _envDialog; private JButton _envButton; private JTextField _options = new JTextField(20); private java.util.LinkedList _optionList; private ListDialog _optionDialog; private JButton _optionButton; private JCheckBox _applicationDistrib; private JComboBox _distrib; private JTextField _distribDirs = new JTextField(20); private java.util.LinkedList _distribDirsList; private ListDialog _distribDirsDialog; private JButton _distribDirsButton; }