// **********************************************************************
//
// 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 java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import IceGrid.Model;
import IceGrid.NodeDescriptor;
import IceGrid.NodeInfo;
import IceGrid.TableDialog;
import IceGrid.Utils;
class NodeEditor extends Editor
{
protected void applyUpdate()
{
Node node = (Node)_target;
Model model = node.getModel();
if(model.canUpdate())
{
model.disableDisplay();
try
{
if(node.isEphemeral())
{
Nodes nodes = (Nodes)node.getParent();
writeDescriptor();
NodeDescriptor descriptor = (NodeDescriptor)node.getDescriptor();
node.destroy(); // just removes the child
try
{
nodes.tryAdd(_name.getText(), descriptor);
}
catch(UpdateFailedException e)
{
//
// Add back ephemeral child
//
try
{
node.addChild(node, true);
}
catch(UpdateFailedException die)
{
assert false;
}
model.setSelectionPath(node.getPath());
JOptionPane.showMessageDialog(
model.getMainFrame(),
e.toString(),
"Apply failed",
JOptionPane.ERROR_MESSAGE);
return;
}
//
// Success
//
_target = nodes.findChildWithDescriptor(descriptor);
model.setSelectionPath(_target.getPath());
model.showActions(_target);
}
else if(isSimpleUpdate())
{
writeDescriptor();
node.markModified();
}
else
{
//
// Save to be able to rollback
//
Object savedDescriptor = node.saveDescriptor();
writeDescriptor();
try
{
if(node.inRegistry())
{
//
// Rebuild node; don't need the backup
// since it's just one node
//
java.util.List editables =
new java.util.LinkedList();
node.rebuild(editables);
java.util.Iterator p = editables.iterator();
while(p.hasNext())
{
Editable editable = (Editable)p.next();
editable.markModified();
}
node.markModified();
}
else
{
node.moveToRegistry();
}
}
catch(UpdateFailedException e)
{
node.restoreDescriptor(savedDescriptor);
JOptionPane.showMessageDialog(
model.getMainFrame(),
e.toString(),
"Apply failed",
JOptionPane.ERROR_MESSAGE);
return;
}
//
// Success
//
model.showActions(_target);
}
_applyButton.setEnabled(false);
_discardButton.setEnabled(false);
}
finally
{
model.enableDisplay();
}
}
}
Utils.Resolver getDetailResolver()
{
Node node = (Node)_target;
if(node.getModel().substitute())
{
return node.getResolver();
}
else
{
return null;
}
}
NodeEditor(JFrame parentFrame)
{
super(true, true);
_name.getDocument().addDocumentListener(_updateListener);
_name.setToolTipText("Must match the IceGrid.Node.Name property of the desired icegridnode process");
_description.getDocument().addDocumentListener(_updateListener);
_description.setToolTipText("An optional description for this node");
_variables.setEditable(false);
_hostname.setEditable(false);
_os.setEditable(false);
_machineType.setEditable(false);
_loadAverage.setEditable(false);
Action refresh = new AbstractAction("Refresh")
{
public void actionPerformed(ActionEvent e)
{
Node node = (Node)_target;
node.getLoad();
}
};
refresh.putValue(Action.SHORT_DESCRIPTION,
"Fetch the latest values from this IceGrid Node");
_refreshButton = new JButton(refresh);
//
// Variables
//
_variablesDialog = new TableDialog(parentFrame,
"Variables", "Name", "Value", true);
Action openVariablesDialog = new AbstractAction("...")
{
public void actionPerformed(ActionEvent e)
{
java.util.TreeMap result = _variablesDialog.show(_variablesMap,
getProperties());
if(result != null)
{
updated();
_variablesMap = result;
setVariablesField();
}
}
};
openVariablesDialog.putValue(Action.SHORT_DESCRIPTION,
"Edit variables");
_variablesButton = new JButton(openVariablesDialog);
_loadFactor.getDocument().addDocumentListener(_updateListener);
_loadFactor.setToolTipText("A floating point value.
"
+ "When not specified, IceGrid uses 1.0 on all platforms
"
+ "except Windows where it uses 1.0 divided by number of processors.");
}
public JComponent getCurrentStatus(Ice.StringHolder title)
{
title.value = "System information";
return super.getCurrentStatus(title);
}
public void refreshCurrentStatus()
{
Node node = (Node)_target;
NodeInfo info = node.getStaticInfo();
if(info == null)
{
_hostname.setText("Unknown");
_os.setText("Unknown");
_machineType.setText("Unknown");
_loadAverageLabel.setText("Load Average");
_loadAverage.setText("Unknown");
}
else
{
_hostname.setText(info.hostname);
_os.setText(info.os + " " + info.release + " " + info.version);
_machineType.setText(info.machine + " with " +
info.nProcessors
+ " CPU"
+ (info.nProcessors >= 2 ? "s" : ""));
if(node.isRunningWindows())
{
_loadAverageLabel.setText("CPU Usage");
_loadAverage.setToolTipText(
"CPU usage in the past 1 min, 5 min and 15 min period");
}
else
{
_loadAverageLabel.setText("Load Average");
_loadAverage.setToolTipText(
"Load average in the past 1 min, 5 min and 15 min period");
}
_loadAverage.setText("Refreshing...");
node.getLoad();
}
}
void setLoad(String load, Node node)
{
if(node == _target)
{
_loadAverage.setText(load);
}
//
// Otherwise, we've already moved to another node
//
}
void appendCurrentStatus(DefaultFormBuilder builder)
{
builder.append("Hostname");
builder.append(_hostname, 3);
builder.nextLine();
builder.append("Operating System");
builder.append(_os, 3);
builder.nextLine();
builder.append("Machine Type");
builder.append(_machineType, 3);
builder.append(_loadAverageLabel, _loadAverage);
builder.append(_refreshButton);
builder.nextLine();
}
void appendProperties(DefaultFormBuilder builder)
{
builder.append("Name");
builder.append(_name, 3);
builder.nextLine();
builder.append("Description");
builder.nextLine();
builder.append("");
builder.nextRow(-2);
CellConstraints cc = new CellConstraints();
JScrollPane scrollPane = new JScrollPane(_description);
builder.add(scrollPane,
cc.xywh(builder.getColumn(), builder.getRow(), 3, 3));
builder.nextRow(2);
builder.nextLine();
builder.append("Variables", _variables);
builder.append(_variablesButton);
builder.nextLine();
builder.append("Load Factor");
builder.append(_loadFactor, 3);
builder.nextLine();
}
boolean isSimpleUpdate()
{
NodeDescriptor descriptor = (NodeDescriptor)_target.getDescriptor();
return (_variablesMap.equals(descriptor.variables));
}
void writeDescriptor()
{
NodeDescriptor descriptor = (NodeDescriptor)_target.getDescriptor();
descriptor.description = _description.getText();
descriptor.variables = _variablesMap;
descriptor.loadFactor = _loadFactor.getText();
}
void show(Node node)
{
detectUpdates(false);
setTarget(node);
Utils.Resolver resolver = getDetailResolver();
boolean isEditable = (resolver == null);
_name.setText(_target.getId());
_name.setEditable(_target.isEphemeral());
NodeDescriptor descriptor = (NodeDescriptor)_target.getDescriptor();
_description.setText(
Utils.substitute(descriptor.description, resolver));
_description.setEditable(isEditable);
_description.setOpaque(isEditable);
_variablesMap = descriptor.variables;
setVariablesField();
_variablesButton.setEnabled(isEditable);
_loadFactor.setText(
Utils.substitute(descriptor.loadFactor, resolver));
_loadFactor.setEditable(isEditable);
_applyButton.setEnabled(node.isEphemeral());
_discardButton.setEnabled(node.isEphemeral());
detectUpdates(true);
refreshCurrentStatus();
}
private void setVariablesField()
{
Utils.Stringifier stringifier = new Utils.Stringifier()
{
final Utils.Resolver resolver = getDetailResolver();
public String toString(Object obj)
{
java.util.Map.Entry entry = (java.util.Map.Entry)obj;
return (String)entry.getKey() + "="
+ Utils.substitute((String)entry.getValue(), resolver);
}
};
Ice.StringHolder toolTipHolder = new Ice.StringHolder();
_variables.setText(
Utils.stringify(_variablesMap.entrySet(), stringifier,
", ", toolTipHolder));
_variables.setToolTipText(toolTipHolder.value);
}
private JTextField _name = new JTextField(20);
private JTextArea _description = new JTextArea(3, 20);
private JTextField _variables = new JTextField(20);
private JButton _variablesButton;
private TableDialog _variablesDialog;
private java.util.TreeMap _variablesMap;
private JTextField _loadFactor = new JTextField(20);
private JTextField _hostname = new JTextField(20);
private JTextField _os = new JTextField(20);
private JTextField _machineType = new JTextField(20);
private JLabel _loadAverageLabel = new JLabel();
private JTextField _loadAverage = new JTextField(20);
private JButton _refreshButton;
}