summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2005-10-11 18:08:21 +0000
committerBernard Normier <bernard@zeroc.com>2005-10-11 18:08:21 +0000
commit1abd663215b638655f7219723210600c3ac25b08 (patch)
tree91fc32da59b6247998898513e431c143ee8b9f61 /java/src
parentfix for bug 510 (diff)
downloadice-1abd663215b638655f7219723210600c3ac25b08.tar.bz2
ice-1abd663215b638655f7219723210600c3ac25b08.tar.xz
ice-1abd663215b638655f7219723210600c3ac25b08.zip
Ability to edit/delete/copy etc. nodes
Diffstat (limited to 'java/src')
-rwxr-xr-xjava/src/IceGrid/TreeNode/AbstractServerEditor.java2
-rwxr-xr-xjava/src/IceGrid/TreeNode/Adapter.java11
-rwxr-xr-xjava/src/IceGrid/TreeNode/EditableParent.java12
-rwxr-xr-xjava/src/IceGrid/TreeNode/InstanceParent.java4
-rwxr-xr-xjava/src/IceGrid/TreeNode/Node.java140
-rwxr-xr-xjava/src/IceGrid/TreeNode/NodeEditor.java98
-rwxr-xr-xjava/src/IceGrid/TreeNode/Nodes.java16
-rwxr-xr-xjava/src/IceGrid/TreeNode/Server.java26
-rwxr-xr-xjava/src/IceGrid/TreeNode/Services.java4
-rwxr-xr-xjava/src/IceGrid/TreeNode/Templates.java6
10 files changed, 269 insertions, 50 deletions
diff --git a/java/src/IceGrid/TreeNode/AbstractServerEditor.java b/java/src/IceGrid/TreeNode/AbstractServerEditor.java
index 20c332d2ebf..daaca3e8eb6 100755
--- a/java/src/IceGrid/TreeNode/AbstractServerEditor.java
+++ b/java/src/IceGrid/TreeNode/AbstractServerEditor.java
@@ -155,7 +155,7 @@ abstract class AbstractServerEditor extends Editor
//
// Success
//
- node.removeElement(server.getId());
+ node.removeElement(server.getId()); // replaced by brand new Server
if(instanceDescriptor != null)
{
diff --git a/java/src/IceGrid/TreeNode/Adapter.java b/java/src/IceGrid/TreeNode/Adapter.java
index 518d3032715..dc94dfc21f4 100755
--- a/java/src/IceGrid/TreeNode/Adapter.java
+++ b/java/src/IceGrid/TreeNode/Adapter.java
@@ -125,14 +125,11 @@ class Adapter extends Leaf
_instanceId,
this);
createToolTip();
-
- super.setParent(parent);
- fireNodeChangedEvent(this);
- }
- else
- {
- super.setParent(parent);
+ //
+ // No need to fire an event since this node is not yet in the tree
+ //
}
+ super.setParent(parent);
}
public void clearParent()
diff --git a/java/src/IceGrid/TreeNode/EditableParent.java b/java/src/IceGrid/TreeNode/EditableParent.java
index eb63b48ec08..27507ff9294 100755
--- a/java/src/IceGrid/TreeNode/EditableParent.java
+++ b/java/src/IceGrid/TreeNode/EditableParent.java
@@ -114,7 +114,17 @@ class EditableParent extends Parent implements Editable
{
this(o, false);
}
-
+
+ void clearNew()
+ {
+ _isNew = false;
+ }
+
+ void markNew()
+ {
+ _isNew = true;
+ }
+
private boolean _isNew = false;
private boolean _modified = false;
protected java.util.TreeSet _removedElements = new java.util.TreeSet();
diff --git a/java/src/IceGrid/TreeNode/InstanceParent.java b/java/src/IceGrid/TreeNode/InstanceParent.java
index b9557410e13..89f80b147a3 100755
--- a/java/src/IceGrid/TreeNode/InstanceParent.java
+++ b/java/src/IceGrid/TreeNode/InstanceParent.java
@@ -10,8 +10,8 @@ package IceGrid.TreeNode;
interface InstanceParent
{
- Object rebuild(CommonBase child, java.util.List editables)
+ Object rebuildChild(CommonBase child, java.util.List editables)
throws UpdateFailedException;
- void restore(CommonBase child, Object backup);
+ void restoreChild(CommonBase child, Object backup);
}
diff --git a/java/src/IceGrid/TreeNode/Node.java b/java/src/IceGrid/TreeNode/Node.java
index b219ae5860c..103c523fa30 100755
--- a/java/src/IceGrid/TreeNode/Node.java
+++ b/java/src/IceGrid/TreeNode/Node.java
@@ -266,25 +266,35 @@ class Node extends EditableParent implements InstanceParent
{
return _descriptor;
}
-
public boolean isEphemeral()
{
return _ephemeral;
}
+ public Object saveDescriptor()
+ {
+ return _descriptor.clone();
+ }
+
+ public void restoreDescriptor(Object savedCopy)
+ {
+ NodeDescriptor copy = (NodeDescriptor)savedCopy;
+ _descriptor.loadFactor = copy.loadFactor;
+ _descriptor.variables = copy.variables;
+ }
+
static private class Backup
{
java.util.TreeSet removedElements;
java.util.Map parameterValues;
}
- public Object rebuild(CommonBase child, java.util.List editables)
+ public Object rebuildChild(CommonBase child, java.util.List editables)
throws UpdateFailedException
{
Backup backup = new Backup();
- backup.removedElements = (java.util.TreeSet)_removedElements.clone();
- removeChild(child, true);
+ Server newServer = null;
Server server = (Server)child;
ServerInstanceDescriptor instanceDescriptor = server.getInstanceDescriptor();
@@ -300,39 +310,66 @@ class Node extends EditableParent implements InstanceParent
instanceDescriptor.parameterValues = Editor.makeParameterValues(
instanceDescriptor.parameterValues, templateDescriptor.parameters);
}
-
+ newServer = createServer(true, instanceDescriptor, getApplication());
+ }
+ else
+ {
+ newServer = createServer(true, server.getServerDescriptor(), getApplication());
+ }
+
+ if(server.getId().equals(newServer.getId()))
+ {
+ //
+ // A simple update. We can't simply rebuild server because
+ // we need to keep a backup
+ //
+ newServer.clearNew();
+ if(server.isModified())
+ {
+ newServer.markModified();
+ }
+
+ removeChild(server, true);
try
{
- Server newServer = createServer(true, instanceDescriptor, getApplication());
addChild(newServer, true);
}
catch(UpdateFailedException e)
{
- e.addParent(this);
- restore(child, backup);
- throw e;
+ assert false; // impossible, we just removed a child with
+ // this id
+ }
+
+ if(backup.parameterValues != null)
+ {
+ editables.add(newServer);
}
}
else
{
+ backup.removedElements = (java.util.TreeSet)_removedElements.clone();
+ removeElement(server, true);
try
{
- Server newServer = createServer(true, server.getServerDescriptor(), getApplication());
addChild(newServer, true);
}
catch(UpdateFailedException e)
{
- restore(child, backup);
+ restoreChild(server, backup);
throw e;
}
}
+
return backup;
}
- public void restore(CommonBase child, Object backupObject)
+ public void restoreChild(CommonBase child, Object backupObject)
{
Backup backup = (Backup)backupObject;
- _removedElements = backup.removedElements;
+ if(backup.removedElements != null)
+ {
+ _removedElements = backup.removedElements;
+ }
Server goodServer = (Server)child;
ServerInstanceDescriptor instanceDescriptor = goodServer.getInstanceDescriptor();
@@ -357,6 +394,51 @@ class Node extends EditableParent implements InstanceParent
}
}
+ void rebuild()
+ throws UpdateFailedException
+ {
+ Application application = getApplication();
+ Utils.Resolver oldResolver = _resolver;
+ _resolver = new Utils.Resolver(new java.util.Map[]
+ {_descriptor.variables, application.getVariables()});
+
+ _resolver.put("application", application.getId());
+ _resolver.put("node", getId());
+
+ java.util.List backupList = new java.util.Vector();
+ java.util.List editables = new java.util.LinkedList();
+ java.util.List children = (java.util.LinkedList)_children.clone();
+
+ java.util.Iterator p = children.iterator();
+ while(p.hasNext())
+ {
+ Server server = (Server)p.next();
+ try
+ {
+ backupList.add(rebuildChild(server, editables));
+ }
+ catch(UpdateFailedException e)
+ {
+ for(int i = backupList.size() - 1; i >= 0; --i)
+ {
+ restoreChild((Server)children.get(i), backupList.get(i));
+ }
+ _resolver = oldResolver;
+ throw e;
+ }
+ }
+
+ //
+ // Success, mark modifies servers modified
+ //
+ p = editables.iterator();
+ while(p.hasNext())
+ {
+ Editable editable = (Editable)p.next();
+ editable.markModified();
+ }
+ }
+
private Server createServer(boolean brandNew, ServerInstanceDescriptor instanceDescriptor,
Application application) throws UpdateFailedException
{
@@ -445,10 +527,6 @@ class Node extends EditableParent implements InstanceParent
else
{
update.removeServers = removedElements();
- for(int i = 0; i < update.removeServers.length; ++i)
- {
- System.err.println(update.removeServers[i]);
- }
}
update.serverInstances = new java.util.LinkedList();
@@ -482,6 +560,11 @@ class Node extends EditableParent implements InstanceParent
return null;
}
+ if(!_descriptor.loadFactor.equals(_origLoadFactor))
+ {
+ update.loadFactor = new IceGrid.BoxedString(_descriptor.loadFactor);
+ }
+
if(isNew())
{
update.variables = _descriptor.variables;
@@ -663,6 +746,7 @@ class Node extends EditableParent implements InstanceParent
if(_descriptor != null)
{
_origVariables = (java.util.Map)_descriptor.variables.clone();
+ _origLoadFactor = _descriptor.loadFactor;
}
}
@@ -686,7 +770,8 @@ class Node extends EditableParent implements InstanceParent
_descriptor = descriptor;
_origVariables = (java.util.Map)_descriptor.variables.clone();
-
+ _origLoadFactor = _descriptor.loadFactor;
+
_resolver = new Utils.Resolver(new java.util.Map[]
{_descriptor.variables, application.getVariables()});
@@ -719,9 +804,10 @@ class Node extends EditableParent implements InstanceParent
Node(String nodeName, NodeDescriptor descriptor, Model model)
{
- super(true, nodeName, model);
+ super(false, nodeName, model);
_ephemeral = true;
_inRegistry = false;
+ _descriptor = descriptor;
}
Node(Node o)
@@ -1030,6 +1116,21 @@ class Node extends EditableParent implements InstanceParent
}
}
+ boolean inRegistry()
+ {
+ return _inRegistry;
+ }
+
+ void moveToRegistry()
+ {
+ assert !_inRegistry;
+ assert !_ephemeral;
+
+ ((Nodes)_parent).addDescriptor(_id, _descriptor);
+ _inRegistry = true;
+ markNew();
+ }
+
private void newServer(ServerDescriptor descriptor)
{
descriptor.id = makeNewChildId(descriptor.id);
@@ -1094,6 +1195,7 @@ class Node extends EditableParent implements InstanceParent
private Utils.Resolver _resolver;
private java.util.Map _origVariables;
+ private String _origLoadFactor;
private boolean _up = false;
private final boolean _ephemeral;
diff --git a/java/src/IceGrid/TreeNode/NodeEditor.java b/java/src/IceGrid/TreeNode/NodeEditor.java
index f7194f0caf0..dd23b670154 100755
--- a/java/src/IceGrid/TreeNode/NodeEditor.java
+++ b/java/src/IceGrid/TreeNode/NodeEditor.java
@@ -14,6 +14,7 @@ import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
+import javax.swing.JOptionPane;
import javax.swing.JTextField;
import com.jgoodies.forms.builder.DefaultFormBuilder;
@@ -27,6 +28,102 @@ 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())
+ {
+ node.rebuild();
+ 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();
+ }
+ }
}
NodeEditor(JFrame parentFrame)
@@ -85,7 +182,6 @@ class NodeEditor extends Editor
descriptor.loadFactor = _loadFactor.getText();
}
-
void show(Node node)
{
detectUpdates(false);
diff --git a/java/src/IceGrid/TreeNode/Nodes.java b/java/src/IceGrid/TreeNode/Nodes.java
index d245fb92a4b..b8a13f325af 100755
--- a/java/src/IceGrid/TreeNode/Nodes.java
+++ b/java/src/IceGrid/TreeNode/Nodes.java
@@ -298,7 +298,21 @@ public class Nodes extends EditableParent
_descriptors.remove(nodeName);
}
-
+ void tryAdd(String nodeName, NodeDescriptor descriptor)
+ throws UpdateFailedException
+ {
+ try
+ {
+ Node node = new Node(true, nodeName, descriptor, getApplication(), false);
+ addChild(node, true);
+ }
+ catch(UpdateFailedException e)
+ {
+ e.addParent(this);
+ throw e;
+ }
+ }
+
private void newNode(NodeDescriptor descriptor)
{
String name = makeNewChildId("NewNode");
diff --git a/java/src/IceGrid/TreeNode/Server.java b/java/src/IceGrid/TreeNode/Server.java
index 4af0729545e..7af62cb4fbd 100755
--- a/java/src/IceGrid/TreeNode/Server.java
+++ b/java/src/IceGrid/TreeNode/Server.java
@@ -592,17 +592,19 @@ class Server extends EditableParent
if(!_ephemeral)
{
Ice.IntHolder pid = new Ice.IntHolder();
- ServerState state = _model.getRoot().registerServer(_resolver.find("node"),
- _id,
- this,
- pid);
- super.setParent(parent);
- updateDynamicInfo(state, pid.value);
- }
- else
- {
- super.setParent(parent);
+ _state = _model.getRoot().registerServer(_resolver.find("node"),
+ _id,
+ this,
+ pid);
+
+ _pid = pid.value;
+ _toolTip = toolTip(_state, _pid);
+ if(_state != null)
+ {
+ _stateIconIndex = _state.value() + 1;
+ }
}
+ super.setParent(parent);
}
public void clearParent()
@@ -715,7 +717,7 @@ class Server extends EditableParent
}
}
- private static String toolTip(ServerState state, int pid)
+ static private String toolTip(ServerState state, int pid)
{
String result = (state == null ? "Unknown" : state.toString());
@@ -730,7 +732,7 @@ class Server extends EditableParent
private boolean _enabled = true;
private int _stateIconIndex = 0;
private int _pid = 0;
- private String _toolTip = toolTip(_state, _pid);
+ private String _toolTip;
private ServerInstanceDescriptor _instanceDescriptor;
private ServerDescriptor _serverDescriptor;
diff --git a/java/src/IceGrid/TreeNode/Services.java b/java/src/IceGrid/TreeNode/Services.java
index ae66e317683..ae413ca94d6 100755
--- a/java/src/IceGrid/TreeNode/Services.java
+++ b/java/src/IceGrid/TreeNode/Services.java
@@ -475,7 +475,7 @@ class Services extends ListParent implements InstanceParent
// InstanceParent interface
//
- public Object rebuild(CommonBase child, java.util.List editables)
+ public Object rebuildChild(CommonBase child, java.util.List editables)
throws UpdateFailedException
{
int index = getIndex(child);
@@ -523,7 +523,7 @@ class Services extends ListParent implements InstanceParent
return savedParameterValues;
}
- public void restore(CommonBase child, Object backup)
+ public void restoreChild(CommonBase child, Object backup)
{
java.util.Map savedParameterValues = (java.util.Map)backup;
diff --git a/java/src/IceGrid/TreeNode/Templates.java b/java/src/IceGrid/TreeNode/Templates.java
index 543561b30d6..640fdcaec28 100755
--- a/java/src/IceGrid/TreeNode/Templates.java
+++ b/java/src/IceGrid/TreeNode/Templates.java
@@ -36,7 +36,6 @@ abstract class Templates extends EditableParent
java.util.List parentList = new java.util.Vector();
java.util.List backupList = new java.util.Vector();
- java.util.List oldInstanceList = new java.util.Vector();
java.util.List editables = new java.util.LinkedList();
@@ -48,14 +47,14 @@ abstract class Templates extends EditableParent
try
{
- backupList.add(parent.rebuild(instance, editables));
+ backupList.add(parent.rebuildChild(instance, editables));
}
catch(UpdateFailedException e)
{
for(int i = backupList.size() - 1; i >= 0; --i)
{
parent = (InstanceParent)parentList.get(i);
- parent.restore((CommonBase)instanceList.get(i), backupList.get(i));
+ parent.restoreChild((CommonBase)instanceList.get(i), backupList.get(i));
}
JOptionPane.showMessageDialog(
@@ -67,7 +66,6 @@ abstract class Templates extends EditableParent
return false;
}
- oldInstanceList.add(instance);
parentList.add(parent);
}