summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2005-09-27 14:57:58 +0000
committerBernard Normier <bernard@zeroc.com>2005-09-27 14:57:58 +0000
commit731b70f3de99ecc9be2137a383d087a0f51c8553 (patch)
treeafa4de6f5748a2609297a65a205107869fbb72ca /java/src
parentFixed bug 495 - assertion on server side udp shutdown (diff)
downloadice-731b70f3de99ecc9be2137a383d087a0f51c8553.tar.bz2
ice-731b70f3de99ecc9be2137a383d087a0f51c8553.tar.xz
ice-731b70f3de99ecc9be2137a383d087a0f51c8553.zip
Service templates editing + refactoring
Diffstat (limited to 'java/src')
-rwxr-xr-xjava/src/IceGrid/TreeNode/Adapter.java83
-rwxr-xr-xjava/src/IceGrid/TreeNode/AdapterEditor.java6
-rwxr-xr-xjava/src/IceGrid/TreeNode/Adapters.java79
-rwxr-xr-xjava/src/IceGrid/TreeNode/Application.java244
-rwxr-xr-xjava/src/IceGrid/TreeNode/CommonBase.java34
-rwxr-xr-xjava/src/IceGrid/TreeNode/CommonBaseI.java47
-rwxr-xr-xjava/src/IceGrid/TreeNode/DbEnvs.java2
-rwxr-xr-xjava/src/IceGrid/TreeNode/EditableParent.java16
-rwxr-xr-xjava/src/IceGrid/TreeNode/Editor.java104
-rwxr-xr-xjava/src/IceGrid/TreeNode/InstanceParent.java17
-rwxr-xr-xjava/src/IceGrid/TreeNode/Leaf.java16
-rwxr-xr-xjava/src/IceGrid/TreeNode/ListElementEditor.java103
-rwxr-xr-xjava/src/IceGrid/TreeNode/ListParent.java127
-rwxr-xr-xjava/src/IceGrid/TreeNode/Node.java186
-rwxr-xr-xjava/src/IceGrid/TreeNode/Nodes.java47
-rwxr-xr-xjava/src/IceGrid/TreeNode/Parent.java367
-rwxr-xr-xjava/src/IceGrid/TreeNode/ReplicatedAdapters.java15
-rwxr-xr-xjava/src/IceGrid/TreeNode/Root.java268
-rwxr-xr-xjava/src/IceGrid/TreeNode/Server.java105
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServerTemplate.java45
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServerTemplates.java31
-rwxr-xr-xjava/src/IceGrid/TreeNode/Service.java100
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServiceEditor.java2
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServiceInstanceEditor.java2
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServiceTemplate.java133
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServiceTemplateEditor.java5
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServiceTemplates.java142
-rwxr-xr-xjava/src/IceGrid/TreeNode/Services.java359
-rwxr-xr-xjava/src/IceGrid/TreeNode/SimpleContainer.java52
-rwxr-xr-xjava/src/IceGrid/TreeNode/TemplateEditor.java120
-rwxr-xr-xjava/src/IceGrid/TreeNode/Templates.java76
-rwxr-xr-xjava/src/IceGrid/TreeNode/UpdateFailedException.java66
32 files changed, 1936 insertions, 1063 deletions
diff --git a/java/src/IceGrid/TreeNode/Adapter.java b/java/src/IceGrid/TreeNode/Adapter.java
index 85fa36bfd5a..9414c8644a9 100755
--- a/java/src/IceGrid/TreeNode/Adapter.java
+++ b/java/src/IceGrid/TreeNode/Adapter.java
@@ -63,39 +63,46 @@ class Adapter extends Leaf
public boolean destroy()
{
- if(isEphemeral() || isEditable() && _model.canUpdate())
- {
- Adapters adapters = (Adapters)_parent;
-
- if(isEphemeral())
- {
- adapters.removeChild(this, true);
- }
- else
- {
- adapters.removeDescriptor(_descriptor);
- getEditable().markModified();
- getApplication().applySafeUpdate();
- }
- return true;
- }
- else
+ return _parent == null ? false :
+ ((ListParent)_parent).destroyChild(this);
+ }
+
+
+ public void setParent(CommonBase parent)
+ {
+ if(_resolver != null)
{
- return false;
+ //
+ // In a server instance
+ //
+ _instanceId
+ = new AdapterInstanceId(_resolver.find("server"),
+ _resolver.substitute(_descriptor.id));
+
+ _proxy = _model.getRoot().registerAdapter(_resolver.find("node"),
+ _instanceId,
+ this);
+ createToolTip();
}
+
+ super.setParent(parent);
}
- public void unregister()
+ public void clearParent()
{
- if(_instanceId != null)
+ if(_parent != null)
{
- getApplication().unregisterAdapter(_resolver.find("node"),
- _instanceId,
- this);
+ if(_instanceId != null)
+ {
+ _model.getRoot().unregisterAdapter(_resolver.find("node"),
+ _instanceId, this);
+ }
+ super.clearParent();
}
}
+
static public AdapterDescriptor copyDescriptor(AdapterDescriptor d)
{
return (AdapterDescriptor)d.clone();
@@ -128,28 +135,12 @@ class Adapter extends Leaf
}
Adapter(String adapterName, AdapterDescriptor descriptor,
- Utils.Resolver resolver, Application application, Model model)
+ Utils.Resolver resolver, Model model)
{
super(adapterName, model);
_descriptor = descriptor;
_resolver = resolver;
_ephemeral = false;
-
- if(resolver != null)
- {
- assert application != null;
- //
- // In a server instance
- //
- _instanceId
- = new AdapterInstanceId(_resolver.find("server"),
- _resolver.substitute(_descriptor.id));
-
- _proxy = application.registerAdapter(_resolver.find("node"),
- _instanceId,
- this);
- createToolTip();
- }
}
//
@@ -159,7 +150,7 @@ class Adapter extends Leaf
//
Adapter(String name, AdapterDescriptor descriptor, Model model)
{
- super("*" + name, model);
+ super(name, model);
_descriptor = descriptor;
_ephemeral = true;
}
@@ -180,7 +171,15 @@ class Adapter extends Leaf
boolean isEditable()
{
- return ((Adapters)_parent).isEditable();
+ if(_parent == null)
+ {
+ return false;
+ }
+ else
+ {
+ return ((Adapters)_parent).isEditable();
+ }
+
}
boolean inIceBox()
diff --git a/java/src/IceGrid/TreeNode/AdapterEditor.java b/java/src/IceGrid/TreeNode/AdapterEditor.java
index e9d592f4e45..2d3978e1fed 100755
--- a/java/src/IceGrid/TreeNode/AdapterEditor.java
+++ b/java/src/IceGrid/TreeNode/AdapterEditor.java
@@ -26,7 +26,7 @@ import IceGrid.ObjectDescriptor;
import IceGrid.TableDialog;
import IceGrid.Utils;
-class AdapterEditor extends Editor
+class AdapterEditor extends ListElementEditor
{
AdapterEditor(JFrame parentFrame)
{
@@ -179,9 +179,7 @@ class AdapterEditor extends Editor
//
getAdapter().setEndpoints(_name.getText(), _endpoints.getText());
}
-
-
-
+
void setObjectsField()
{
Adapter adapter = getAdapter();
diff --git a/java/src/IceGrid/TreeNode/Adapters.java b/java/src/IceGrid/TreeNode/Adapters.java
index 3402e29687b..15c70c6dfeb 100755
--- a/java/src/IceGrid/TreeNode/Adapters.java
+++ b/java/src/IceGrid/TreeNode/Adapters.java
@@ -12,13 +12,14 @@ import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
+import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import IceGrid.AdapterDescriptor;
import IceGrid.Model;
import IceGrid.Utils;
-class Adapters extends SimpleContainer
+class Adapters extends ListParent
{
static class NewPopupMenu extends JPopupMenu
{
@@ -60,16 +61,6 @@ class Adapters extends SimpleContainer
return null;
}
}
-
- public void unregister()
- {
- java.util.Iterator p = _children.iterator();
- while(p.hasNext())
- {
- Adapter adapter = (Adapter)p.next();
- adapter.unregister();
- }
- }
static public java.util.LinkedList
copyDescriptors(java.util.LinkedList descriptors)
@@ -85,8 +76,8 @@ class Adapters extends SimpleContainer
Adapters(java.util.List descriptors, boolean isEditable,
boolean inIceBox, Utils.Resolver resolver,
- Application application, Model model)
- throws DuplicateIdException
+ Model model)
+ throws UpdateFailedException
{
super("Adapters", model);
_descriptors = descriptors;
@@ -102,15 +93,62 @@ class Adapters extends SimpleContainer
String adapterName = Utils.substitute(descriptor.name, _resolver);
addChild(new Adapter(adapterName, descriptor,
- _resolver, application, _model));
+ _resolver, _model));
}
}
-
+
boolean isEditable()
{
return _isEditable;
}
+ protected boolean validate(Object d)
+ {
+ AdapterDescriptor descriptor = (AdapterDescriptor)d;
+
+ String newName = Utils.substitute(descriptor.name, _resolver);
+
+ CommonBase child = findChild(newName);
+ if(child != null && child.getDescriptor() != descriptor)
+ {
+ JOptionPane.showMessageDialog(
+ _model.getMainFrame(),
+ _model.getRoot().identify(_parent.getPath())
+ + " has already an adapter named '"
+ + newName + "'",
+ "Duplicate adapter name error",
+ JOptionPane.ERROR_MESSAGE);
+ return false;
+ }
+ return true;
+ }
+
+ protected void applyUpdate(Object d)
+ {
+ AdapterDescriptor descriptor = (AdapterDescriptor)d;
+
+ CommonBase oldChild = findChildWithDescriptor(descriptor);
+ if(oldChild != null)
+ {
+ removeChild(oldChild, true);
+ }
+
+ String adapterName = Utils.substitute(descriptor.name, _resolver);
+ Adapter newChild = new Adapter(adapterName, descriptor,
+ _resolver, _model);
+
+ try
+ {
+ addChild(newChild, true);
+ }
+ catch(UpdateFailedException e)
+ {
+ assert false;
+ }
+ }
+
+
+
boolean inIceBox()
{
return _inIceBox;
@@ -127,13 +165,7 @@ class Adapters extends SimpleContainer
// Generate a unique child name; ignore substitution for simplicity
//
String baseName = descriptor == null ? "NewAdapter" : descriptor.name;
- String name = baseName;
-
- int i = 0;
- while(findChild(name) != null || findChild("*" + name) != null)
- {
- name = baseName + "-" + (++i);
- }
+ String name = makeNewChildId(baseName);
if(descriptor == null)
{
@@ -159,11 +191,10 @@ class Adapters extends SimpleContainer
{
addChild(adapter, true);
}
- catch(DuplicateIdException e)
+ catch(UpdateFailedException e)
{
assert false;
}
- adapter.setParent(this);
_model.setSelectionPath(adapter.getPath());
}
diff --git a/java/src/IceGrid/TreeNode/Application.java b/java/src/IceGrid/TreeNode/Application.java
index 68411b09c48..8070dbccdaf 100755
--- a/java/src/IceGrid/TreeNode/Application.java
+++ b/java/src/IceGrid/TreeNode/Application.java
@@ -120,7 +120,7 @@ public class Application extends EditableParent
// Builds the application and all its subtrees
//
Application(boolean brandNew, ApplicationDescriptor descriptor, Model model)
- throws DuplicateIdException
+ throws UpdateFailedException
{
super(brandNew, descriptor.name, model);
_descriptor = descriptor;
@@ -170,7 +170,7 @@ public class Application extends EditableParent
_nodes = new Nodes(o._nodes);
addChild(_nodes);
}
- catch(DuplicateIdException e)
+ catch(UpdateFailedException e)
{
assert false; // impossible
}
@@ -188,7 +188,7 @@ public class Application extends EditableParent
{
update();
}
- catch(DuplicateIdException e)
+ catch(UpdateFailedException e)
{
JOptionPane.showMessageDialog(
_model.getMainFrame(),
@@ -211,13 +211,13 @@ public class Application extends EditableParent
{
update();
}
- catch(DuplicateIdException e)
+ catch(UpdateFailedException e)
{
assert false;
}
}
- void update() throws DuplicateIdException
+ void update() throws UpdateFailedException
{
_replicatedAdapters.update();
_serviceTemplates.update();
@@ -225,19 +225,28 @@ public class Application extends EditableParent
_nodes.update();
}
- void cascadeDeleteServerInstance(String templateId)
+ //
+ // Called when a server-template is deleted, to remove all
+ // corresponding instances
+ // children.
+ //
+ void removeServerInstances(String templateId)
{
- _nodes.cascadeDeleteServerInstance(templateId);
+ _nodes.removeServerInstances(templateId);
}
- void cascadeDeleteServiceInstance(String templateId)
+ //
+ // Called when a service-template is deleted, to remove all
+ // corresponding instances
+ //
+ void removeServiceInstances(String templateId)
{
- _nodes.cascadeDeleteServiceInstance(templateId);
- _serverTemplates.cascadeDeleteServiceInstance(templateId);
+ _nodes.removeServiceInstances(templateId);
+ _serverTemplates.removeServiceInstances(templateId);
}
void update(ApplicationUpdateDescriptor desc)
- throws DuplicateIdException
+ throws UpdateFailedException
{
//
// Description
@@ -331,6 +340,14 @@ public class Application extends EditableParent
return _nodes.findServerInstances(template);
}
+ java.util.List findServiceInstances(String template)
+ {
+ java.util.List result = _serverTemplates.findServiceInstances(template);
+ result.addAll(_nodes.findServiceInstances(template));
+ return result;
+ }
+
+
TemplateDescriptor findServerTemplateDescriptor(String templateName)
{
return (TemplateDescriptor)
@@ -366,222 +383,19 @@ public class Application extends EditableParent
return _descriptor.variables;
}
- void nodeUp(String nodeName, Root.DynamicInfo info)
+ void nodeUp(String nodeName)
{
- //
- // Need to tell *every* server on this node
- //
- java.util.List serverList = (java.util.List)_nodeServerMap.get(nodeName);
- if(serverList != null)
- {
- java.util.Iterator p = serverList.iterator();
- while(p.hasNext())
- {
- Server server = (Server)p.next();
- ServerDynamicInfo serverInfo = (ServerDynamicInfo)
- info.serverInfoMap.get(server.getId());
- if(serverInfo == null)
- {
- server.updateDynamicInfo(ServerState.Inactive, 0);
- }
- else
- {
- server.updateDynamicInfo(serverInfo.state, serverInfo.pid);
- }
- }
- }
-
- //
- // Tell adapters
- //
- java.util.List adapterList = (java.util.List)_nodeAdapterMap.get(nodeName);
- if(adapterList != null)
- {
- java.util.Iterator p = adapterList.iterator();
- while(p.hasNext())
- {
- Adapter adapter = (Adapter)p.next();
- Ice.ObjectPrx proxy =
- (Ice.ObjectPrx)info.adapterInfoMap.get(adapter.getInstanceId());
- if(proxy != null)
- {
- adapter.updateProxy(proxy);
- }
- }
- }
-
_nodes.nodeUp(nodeName);
}
void nodeDown(String nodeName)
{
_nodes.nodeDown(nodeName);
-
- java.util.List serverList = (java.util.List)_nodeServerMap.get(nodeName);
- if(serverList != null)
- {
- java.util.Iterator p = serverList.iterator();
- while(p.hasNext())
- {
- Server server = (Server)p.next();
- server.updateDynamicInfo(null, 0);
- }
- }
-
- java.util.List adapterList = (java.util.List)_nodeAdapterMap.get(nodeName);
- if(adapterList != null)
- {
- java.util.Iterator p = adapterList.iterator();
- while(p.hasNext())
- {
- Adapter adapter = (Adapter)p.next();
- adapter.updateProxy(null);
- }
- }
}
- Ice.ObjectPrx registerAdapter(String nodeName, AdapterInstanceId instanceId,
- Adapter adapter)
- {
- _adapterMap.put(instanceId, adapter);
-
- java.util.List adapterList = (java.util.List)_nodeAdapterMap.get(nodeName);
- if(adapterList == null)
- {
- adapterList = new java.util.LinkedList();
- _nodeAdapterMap.put(nodeName, adapterList);
- }
- adapterList.add(adapter);
-
- Root.DynamicInfo info = (Root.DynamicInfo)_model.getRoot().getDynamicInfo(nodeName);
- if(info == null)
- {
- // Node is down
- return null;
- }
- else
- {
- return (Ice.ObjectPrx)info.adapterInfoMap.get(instanceId);
- }
- }
-
- void unregisterAdapter(String nodeName, AdapterInstanceId instanceId,
- Adapter adapter)
- {
- _adapterMap.remove(instanceId);
-
- java.util.List adapterList = (java.util.List)_nodeAdapterMap.get(nodeName);
- if(adapterList != null)
- {
- adapterList.remove(adapter);
- }
- }
-
- ServerState registerServer(String nodeName, String serverId, Server server,
- Ice.IntHolder pid)
- {
- _serverMap.put(serverId, server);
-
- java.util.List serverList = (java.util.List)_nodeServerMap.get(nodeName);
- if(serverList == null)
- {
- serverList = new java.util.LinkedList();
- _nodeServerMap.put(nodeName, serverList);
- }
- serverList.add(server);
-
- Root.DynamicInfo info = (Root.DynamicInfo)_model.getRoot().getDynamicInfo(nodeName);
- if(info == null)
- {
- // Node is down
- pid.value = 0;
- return null;
- }
- else
- {
- ServerDynamicInfo serverInfo =
- (ServerDynamicInfo)info.serverInfoMap.get(serverId);
- if(serverInfo == null)
- {
- pid.value = 0;
- return ServerState.Inactive;
- }
- else
- {
- pid.value = serverInfo.pid;
- return serverInfo.state;
- }
- }
- }
-
- void unregisterServer(String nodeName, String serverId, Server server)
- {
- _serverMap.remove(serverId);
- java.util.List serverList = (java.util.List)_nodeServerMap.get(nodeName);
- if(serverList != null)
- {
- serverList.remove(server);
- }
- }
-
- public boolean updateServer(ServerDynamicInfo updatedInfo)
- {
- //
- // Is this Server registered?
- //
- Server server = (Server)_serverMap.get(updatedInfo.id);
- if(server != null)
- {
- server.updateDynamicInfo(updatedInfo.state, updatedInfo.pid);
- return true;
- }
- else
- {
- return false;
- }
- }
-
- public boolean updateAdapter(AdapterInstanceId instanceId, Ice.ObjectPrx proxy)
- {
- //
- // Is this Adapter registered?
- //
- Adapter adapter = (Adapter)_adapterMap.get(instanceId);
- if(adapter != null)
- {
- adapter.updateProxy(proxy);
- return true;
- }
- else
- {
- return false;
- }
- }
-
-
private ApplicationDescriptor _descriptor;
//
- // AdapterInstanceId to Adapter
- //
- private java.util.Map _adapterMap = new java.util.HashMap();
-
- //
- // Nodename to list of Adapter (used when a node goes down)
- //
- private java.util.Map _nodeAdapterMap = new java.util.HashMap();
-
- //
- // ServerId to Server
- //
- private java.util.Map _serverMap = new java.util.HashMap();
-
- //
- // Nodename to list of Server (used when a node goes down)
- //
- private java.util.Map _nodeServerMap = new java.util.HashMap();
-
- //
// Keeps original version (as deep copies) to be able to build
// ApplicationUpdateDescriptor
//
diff --git a/java/src/IceGrid/TreeNode/CommonBase.java b/java/src/IceGrid/TreeNode/CommonBase.java
index ce7f6a80d21..eb674869c07 100755
--- a/java/src/IceGrid/TreeNode/CommonBase.java
+++ b/java/src/IceGrid/TreeNode/CommonBase.java
@@ -38,12 +38,6 @@ public interface CommonBase extends TreeCellRenderer
Model getModel();
//
- // Unregister this element with the enclosing application;
- // often no-op
- //
- void unregister();
-
- //
// Ephemeral objects are destroyed when you switch selection
// without "apply"ing the changes.
//
@@ -54,23 +48,16 @@ public interface CommonBase extends TreeCellRenderer
//
boolean destroy();
+
//
- // Set this node as a parent, and recursively update
- // the path of all children.
- // This method has no effect on the parent->children relationship,
- // only child->parent.
- //
- void setParent(CommonBase newParent);
-
- //
- // Get this node's parent
- // This is used by nodes to create events
- // pointing to themselves
+ // Get this node's parent;
+ // null when the node is not attached to the root
//
CommonBase getParent();
//
- // The path to this node
+ // The path to this node;
+ // null when the node is not attached to the root
// typically used by children to create TreeModelEvents
//
TreePath getPath();
@@ -134,4 +121,15 @@ public interface CommonBase extends TreeCellRenderer
//
void moveUp();
void moveDown();
+
+ //
+ // Set this child's parent
+ //
+ void setParent(CommonBase parent);
+ void clearParent();
+
+ //
+ // Find all instances of this child (including this child)
+ //
+ java.util.List findAllInstances(CommonBase child);
}
diff --git a/java/src/IceGrid/TreeNode/CommonBaseI.java b/java/src/IceGrid/TreeNode/CommonBaseI.java
index ce5a99cded6..cbcb863ae34 100755
--- a/java/src/IceGrid/TreeNode/CommonBaseI.java
+++ b/java/src/IceGrid/TreeNode/CommonBaseI.java
@@ -27,42 +27,21 @@ abstract class CommonBaseI implements CommonBase
{
public String toString()
{
- return _id;
- }
-
- public String getId()
- {
- return _id;
- }
-
- public void unregister()
- {
- //
- // Nothing to do
- //
- }
-
- public void setParent(CommonBase parent)
- {
- _parent = parent;
- if(_parent == null)
+ if(isEphemeral())
{
- _path = null;
+ return "*" + _id;
}
else
{
- TreePath parentPath = _parent.getPath();
- if(parentPath == null)
- {
- _path = null;
- }
- else
- {
- _path = parentPath.pathByAddingChild(this);
- }
+ return _id;
}
}
+ public String getId()
+ {
+ return _id;
+ }
+
public TreePath getPath()
{
return _path;
@@ -172,6 +151,14 @@ abstract class CommonBaseI implements CommonBase
}
}
+ public java.util.List findAllInstances(CommonBase child)
+ {
+ assert getIndex(child) != -1;
+
+ java.util.List result = new java.util.LinkedList();
+ result.add(child);
+ return result;
+ }
//
// Fires a nodesChanged event with this node
@@ -284,7 +271,7 @@ abstract class CommonBaseI implements CommonBase
protected TreePath _path;
- protected CommonBase _parent;
+ protected Parent _parent;
//
// Id (application name, server instance name etc)
diff --git a/java/src/IceGrid/TreeNode/DbEnvs.java b/java/src/IceGrid/TreeNode/DbEnvs.java
index edfa339d03c..96d3b08767c 100755
--- a/java/src/IceGrid/TreeNode/DbEnvs.java
+++ b/java/src/IceGrid/TreeNode/DbEnvs.java
@@ -30,7 +30,7 @@ class DbEnvs extends Parent
boolean isEditable,
Utils.Resolver resolver,
Model model)
- throws DuplicateIdException
+ throws UpdateFailedException
{
super("DbEnvs", model);
_isEditable = isEditable;
diff --git a/java/src/IceGrid/TreeNode/EditableParent.java b/java/src/IceGrid/TreeNode/EditableParent.java
index 5a4b9b8e44e..0680face377 100755
--- a/java/src/IceGrid/TreeNode/EditableParent.java
+++ b/java/src/IceGrid/TreeNode/EditableParent.java
@@ -54,23 +54,31 @@ class EditableParent extends Parent implements Editable
}
}
- void removeElement(CommonBase child)
+ void removeElement(CommonBase child, boolean fireEvent)
{
_removedElements.add(child.getId());
- removeChild(child);
+ removeChild(child, fireEvent);
}
void purgeChildren(java.util.Set keepSet)
{
+ java.util.List toRemove = new java.util.LinkedList();
+
java.util.Iterator p = _children.iterator();
while(p.hasNext())
{
CommonBase child = (CommonBase)p.next();
if(!keepSet.contains(child.getId()))
{
- removeElement(child);
+ _removedElements.add(child.getId());
+ toRemove.add(child.getId());
}
}
+
+ if(toRemove.size() > 0)
+ {
+ removeChildren((String[])toRemove.toArray(new String[0]));
+ }
}
String[] removedElements()
@@ -104,7 +112,7 @@ class EditableParent extends Parent implements Editable
private boolean _isNew = false;
private boolean _modified = false;
- private java.util.TreeSet _removedElements = new java.util.TreeSet();
+ protected java.util.TreeSet _removedElements = new java.util.TreeSet();
}
diff --git a/java/src/IceGrid/TreeNode/Editor.java b/java/src/IceGrid/TreeNode/Editor.java
index 5ecf9433877..cd121886024 100755
--- a/java/src/IceGrid/TreeNode/Editor.java
+++ b/java/src/IceGrid/TreeNode/Editor.java
@@ -37,12 +37,9 @@ import IceGrid.Utils;
// Base class for all editors
//
abstract class Editor
-{
- abstract void writeDescriptor();
- abstract boolean isSimpleUpdate();
+{
abstract void append(DefaultFormBuilder builder);
-
- void postUpdate() {}
+ abstract protected void applyUpdate();
//
// Used by the sub-editor (when there is one)
@@ -112,8 +109,6 @@ abstract class Editor
return _target;
}
-
-
JComponent getComponent()
{
if(_panel == null)
@@ -175,101 +170,6 @@ abstract class Editor
_detectUpdates = val;
}
- //
- // Update when parent is a SimpleContainer
- //
- protected void applyUpdate()
- {
- Model model = _target.getModel();
-
- if(model.canUpdate())
- {
- model.disableDisplay();
-
- try
- {
- if(_target.isEphemeral())
- {
- SimpleContainer parent = (SimpleContainer)_target.getParent();
- writeDescriptor();
- parent.addDescriptor(_target.getDescriptor());
- _target.destroy(); // just removes the child
-
- if(!_target.getApplication().applyUpdate())
- {
- //
- // Restores old display
- //
- parent = (SimpleContainer)model.findNewNode(parent.getPath());
- parent.removeDescriptor(_target.getDescriptor());
- try
- {
- parent.addChild(_target, true);
- }
- catch(DuplicateIdException die)
- {
- assert false;
- }
- _target.setParent(parent);
- model.setSelectionPath(_target.getPath());
- return;
- }
- else
- {
- parent = (SimpleContainer)model.findNewNode(parent.getPath());
- _target = parent.findChildWithDescriptor(_target.getDescriptor());
- model.setSelectionPath(_target.getPath());
- }
- }
- else if(isSimpleUpdate())
- {
- writeDescriptor();
- }
- else
- {
- //
- // Save to be able to rollback
- //
- Object savedDescriptor = _target.saveDescriptor();
- SimpleContainer parent = (SimpleContainer)_target.getParent();
- writeDescriptor();
-
- if(!_target.getApplication().applyUpdate())
- {
- _target.restoreDescriptor(savedDescriptor);
-
- //
- // Need to find new node!
- //
- _target = model.findNewNode(_target.getPath());
- model.setSelectionPath(_target.getPath());
- //
- //
- // Everything was restored, user must deal with error
- //
- return;
- }
- else
- {
- parent = (SimpleContainer)model.findNewNode(parent.getPath());
- _target = parent.findChildWithDescriptor(_target.getDescriptor());
- model.setSelectionPath(_target.getPath());
- }
- }
-
- postUpdate();
-
- _target.getEditable().markModified();
- _applyButton.setEnabled(false);
- _discardButton.setEnabled(false);
- }
- finally
- {
- model.enableDisplay();
- }
- }
- }
-
protected void discardUpdate()
{
_target.getModel().refreshDisplay();
diff --git a/java/src/IceGrid/TreeNode/InstanceParent.java b/java/src/IceGrid/TreeNode/InstanceParent.java
new file mode 100755
index 00000000000..b9557410e13
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/InstanceParent.java
@@ -0,0 +1,17 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 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;
+
+interface InstanceParent
+{
+ Object rebuild(CommonBase child, java.util.List editables)
+ throws UpdateFailedException;
+
+ void restore(CommonBase child, Object backup);
+}
diff --git a/java/src/IceGrid/TreeNode/Leaf.java b/java/src/IceGrid/TreeNode/Leaf.java
index 77060ec3900..4d03df9e152 100755
--- a/java/src/IceGrid/TreeNode/Leaf.java
+++ b/java/src/IceGrid/TreeNode/Leaf.java
@@ -8,6 +8,7 @@
// **********************************************************************
package IceGrid.TreeNode;
+import javax.swing.tree.TreePath;
import IceGrid.Model;
//
@@ -46,6 +47,21 @@ class Leaf extends CommonBaseI
return null;
}
+ public void setParent(CommonBase parent)
+ {
+ assert parent != null;
+ _parent = (Parent)parent;
+ TreePath parentPath = _parent.getPath();
+ _path = parentPath.pathByAddingChild(this);
+ }
+
+ public void clearParent()
+ {
+ _parent = null;
+ _path = null;
+ }
+
+
protected Leaf(String id, Model model)
{
super(id, model, false);
diff --git a/java/src/IceGrid/TreeNode/ListElementEditor.java b/java/src/IceGrid/TreeNode/ListElementEditor.java
new file mode 100755
index 00000000000..23fd3d06f8f
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/ListElementEditor.java
@@ -0,0 +1,103 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 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 IceGrid.Model;
+
+abstract class ListElementEditor extends Editor
+{
+ abstract void writeDescriptor();
+ abstract boolean isSimpleUpdate();
+ void postUpdate() {}
+
+ //
+ // Update when parent is a ListParent
+ //
+ protected void applyUpdate()
+ {
+ Model model = _target.getModel();
+
+ if(model.canUpdate())
+ {
+ model.disableDisplay();
+
+ try
+ {
+ if(_target.isEphemeral())
+ {
+ ListParent parent = (ListParent)_target.getParent();
+ writeDescriptor();
+ Object descriptor = _target.getDescriptor();
+ parent.addDescriptor(descriptor);
+ _target.destroy(); // just removes the child
+
+ if(!parent.tryUpdate(descriptor))
+ {
+ //
+ // Restores old display
+ //
+ parent.removeDescriptor(descriptor);
+ try
+ {
+ parent.addChild(_target, true);
+ }
+ catch(UpdateFailedException die)
+ {
+ assert false;
+ }
+ return;
+ }
+ else
+ {
+ _target = parent.findChildWithDescriptor(descriptor);
+ model.setSelectionPath(_target.getPath());
+ }
+ }
+ else if(isSimpleUpdate())
+ {
+ writeDescriptor();
+ }
+ else
+ {
+ //
+ // Save to be able to rollback
+ //
+ Object savedDescriptor = _target.saveDescriptor();
+ ListParent parent = (ListParent)_target.getParent();
+ writeDescriptor();
+
+ if(!parent.tryUpdate(_target.getDescriptor()))
+ {
+ _target.restoreDescriptor(savedDescriptor);
+
+ //
+ // Everything was restored, user must deal with error
+ //
+ return;
+ }
+ else
+ {
+ _target = parent.findChildWithDescriptor(_target.getDescriptor());
+ model.setSelectionPath(_target.getPath());
+ }
+ }
+
+ postUpdate();
+
+ _target.getEditable().markModified();
+ _applyButton.setEnabled(false);
+ _discardButton.setEnabled(false);
+ }
+ finally
+ {
+ model.enableDisplay();
+ }
+ }
+ }
+}
diff --git a/java/src/IceGrid/TreeNode/ListParent.java b/java/src/IceGrid/TreeNode/ListParent.java
new file mode 100755
index 00000000000..c26f9a7e7b4
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/ListParent.java
@@ -0,0 +1,127 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 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 IceGrid.Model;
+
+//
+// A parent that holds a list of children
+//
+abstract class ListParent extends Parent
+{
+ abstract boolean isEditable();
+
+ abstract protected boolean validate(Object descriptor);
+ abstract protected void applyUpdate(Object descriptor);
+
+ protected ListParent(String id, Model model, boolean root)
+ {
+ super(id, model, root);
+ }
+
+ protected ListParent(String id, Model model)
+ {
+ this(id, model, false);
+ }
+
+ void addDescriptor(Object descriptor)
+ {
+ _descriptors.add(descriptor);
+ }
+
+ void removeDescriptor(Object descriptor)
+ {
+ //
+ // A straight remove uses equals(), which is not the desired behavior
+ //
+ java.util.Iterator p = _descriptors.iterator();
+ while(p.hasNext())
+ {
+ if(descriptor == p.next())
+ {
+ p.remove();
+ break;
+ }
+ }
+ }
+
+ //
+ // Try to update, returns true upon success
+ // Only the child corresponding to the given descriptor needs to
+ // be created or recreated
+ //
+ boolean tryUpdate(Object descriptor)
+ {
+ java.util.List list = _parent.findAllInstances(this);
+
+ //
+ // First validate
+ //
+ java.util.Iterator p = list.iterator();
+ while(p.hasNext())
+ {
+ ListParent container = (ListParent)p.next();
+ if(!container.validate(descriptor))
+ {
+ return false;
+ }
+ }
+
+ //
+ // Then applyUpdate
+ //
+ p = list.iterator();
+ while(p.hasNext())
+ {
+ ListParent container = (ListParent)p.next();
+ container.applyUpdate(descriptor);
+ }
+ return true;
+ }
+
+
+ boolean destroyChild(CommonBase child)
+ {
+ if(isEditable() && _model.canUpdate())
+ {
+ if(child.isEphemeral())
+ {
+ removeChild(child, true);
+ }
+ else
+ {
+ Object descriptor = child.getDescriptor();
+ removeDescriptor(descriptor);
+ getEditable().markModified();
+
+ //
+ // List of Services, Adapters etc
+ //
+ java.util.List list = _parent.findAllInstances(this);
+ java.util.Iterator p = list.iterator();
+ while(p.hasNext())
+ {
+ ListParent parent = (ListParent)p.next();
+ parent.removeChild(
+ parent.findChildWithDescriptor(descriptor),
+ true);
+ }
+ }
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ protected java.util.List _descriptors;
+}
+
+
diff --git a/java/src/IceGrid/TreeNode/Node.java b/java/src/IceGrid/TreeNode/Node.java
index aaf9dac798e..48d142a84e5 100755
--- a/java/src/IceGrid/TreeNode/Node.java
+++ b/java/src/IceGrid/TreeNode/Node.java
@@ -112,17 +112,6 @@ class Node extends EditableParent
}
}
- public void unregister()
- {
- java.util.Iterator p = _children.iterator();
- while(p.hasNext())
- {
- Server server = (Server)p.next();
- server.unregister();
- }
- }
-
-
NodeUpdateDescriptor getUpdate()
{
if(!isNew() && !isModified())
@@ -202,7 +191,7 @@ class Node extends EditableParent
NodeDescriptor update(NodeUpdateDescriptor update, Application application)
- throws DuplicateIdException
+ throws UpdateFailedException
{
if(_descriptor == null)
{
@@ -334,13 +323,6 @@ class Node extends EditableParent
updateChildren((CommonBaseI[])updatedChildren.toArray(new CommonBaseI[0]));
addChildren((CommonBaseI[])newChildren.toArray(new CommonBaseI[0]));
- p = newChildren.iterator();
- while(p.hasNext())
- {
- Server server = (Server)p.next();
- server.setParent(this);
- }
-
return null;
}
@@ -360,7 +342,7 @@ class Node extends EditableParent
}
Node(boolean brandNew, String nodeName, NodeDescriptor descriptor, Application application)
- throws DuplicateIdException
+ throws UpdateFailedException
{
super(brandNew, nodeName, application.getModel());
init(descriptor, application, false);
@@ -385,7 +367,7 @@ class Node extends EditableParent
{
addChild(new Server(server));
}
- catch(DuplicateIdException e)
+ catch(UpdateFailedException e)
{
assert false; // impossible
}
@@ -393,7 +375,7 @@ class Node extends EditableParent
}
void init(NodeDescriptor descriptor, Application application, boolean fireEvent)
- throws DuplicateIdException
+ throws UpdateFailedException
{
assert _descriptor == null;
_descriptor = descriptor;
@@ -443,7 +425,6 @@ class Node extends EditableParent
Server server = new Server(false, serverId, instanceResolver, instanceDescriptor,
serverDescriptor, application);
addChild(server);
- server.setParent(this);
}
//
@@ -467,7 +448,6 @@ class Node extends EditableParent
Server server = new Server(false, serverId, instanceResolver, null, serverDescriptor,
application);
addChild(server);
- server.setParent(this);
}
if(fireEvent)
@@ -477,7 +457,7 @@ class Node extends EditableParent
}
- void update() throws DuplicateIdException
+ void update() throws UpdateFailedException
{
if(_descriptor == null)
{
@@ -515,49 +495,40 @@ class Node extends EditableParent
TemplateDescriptor templateDescriptor =
application.findServerTemplateDescriptor(instanceDescriptor.template);
- if(templateDescriptor != null)
- {
- ServerDescriptor serverDescriptor =
- (ServerDescriptor)templateDescriptor.descriptor;
-
- assert serverDescriptor != null;
-
- //
- // Build resolver
- //
- Utils.Resolver instanceResolver =
- new Utils.Resolver(_resolver, instanceDescriptor.parameterValues);
+ assert templateDescriptor != null;
+
+ ServerDescriptor serverDescriptor =
+ (ServerDescriptor)templateDescriptor.descriptor;
- String serverId = instanceResolver.substitute(serverDescriptor.id);
- instanceResolver.put("server", serverId);
- serverIdSet.add(serverId);
-
- //
- // Lookup server
- //
- Server server = (Server)findChild(serverId);
- if(server != null)
- {
- server.rebuild(instanceResolver, instanceDescriptor,
- serverDescriptor, application);
- }
- else
- {
- //
- // Create server
- //
- server = new Server(true, serverId, instanceResolver, instanceDescriptor,
- serverDescriptor, application);
- addChild(server, true);
- server.setParent(this);
- }
+ assert serverDescriptor != null;
+
+ //
+ // Build resolver
+ //
+ Utils.Resolver instanceResolver =
+ new Utils.Resolver(_resolver, instanceDescriptor.parameterValues);
+
+ String serverId = instanceResolver.substitute(serverDescriptor.id);
+ instanceResolver.put("server", serverId);
+ serverIdSet.add(serverId);
+
+ //
+ // Lookup server
+ //
+ Server server = (Server)findChild(serverId);
+ if(server != null)
+ {
+ server.rebuild(instanceResolver, instanceDescriptor,
+ serverDescriptor, application);
}
else
{
//
- // The child will be deleted through purgeChildren, and the descriptor
- // will be deleted (later) through cascadeDeleteServerInstance
+ // Create server
//
+ server = new Server(true, serverId, instanceResolver, instanceDescriptor,
+ serverDescriptor, application);
+ addChild(server, true);
}
}
@@ -593,74 +564,101 @@ class Node extends EditableParent
server = new Server(true, serverId, instanceResolver, null, serverDescriptor,
application);
addChild(server);
- server.setParent(this);
}
}
purgeChildren(serverIdSet);
}
- void cascadeDeleteServerInstance(String templateId)
+
+ void removeInstanceDescriptor(ServerInstanceDescriptor d)
{
- if(_descriptor == null)
- {
- //
- // Nothing to do
- //
- return;
- }
-
+ //
+ // A straight remove uses equals(), which is not the desired behavior
+ //
java.util.Iterator p = _descriptor.serverInstances.iterator();
while(p.hasNext())
{
- ServerInstanceDescriptor instanceDescriptor =
- (ServerInstanceDescriptor)p.next();
-
- if(instanceDescriptor.template.equals(templateId))
+ if(d == p.next())
{
p.remove();
+ break;
}
}
}
- void cascadeDeleteServiceInstance(String templateId)
+ java.util.List findServerInstances(String template)
{
- if(_descriptor == null)
+ java.util.List result = new java.util.LinkedList();
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
{
- //
- // Nothing to do
- //
- return;
+ Server server = (Server)p.next();
+ ServerInstanceDescriptor instanceDescriptor
+ = server.getInstanceDescriptor();
+
+ if(instanceDescriptor != null &&
+ instanceDescriptor.template.equals(template))
+ {
+ result.add(server);
+ }
}
-
+ return result;
+ }
+
+
+ void removeServerInstances(String template)
+ {
+ java.util.List toRemove = new java.util.LinkedList();
+
java.util.Iterator p = _children.iterator();
while(p.hasNext())
{
Server server = (Server)p.next();
- server.cascadeDeleteServiceInstance(templateId);
+ ServerInstanceDescriptor instanceDescriptor
+ = server.getInstanceDescriptor();
+
+ if(instanceDescriptor != null &&
+ instanceDescriptor.template.equals(template))
+ {
+ //
+ // Remove instance
+ //
+ removeInstanceDescriptor(instanceDescriptor);
+ _removedElements.add(server.getId());
+ toRemove.add(server.getId());
+ }
+ }
+
+ if(toRemove.size() > 0)
+ {
+ removeChildren((String[])toRemove.toArray(new String[0]));
}
}
- java.util.List findServerInstances(String template)
+ java.util.List findServiceInstances(String template)
{
java.util.List result = new java.util.LinkedList();
java.util.Iterator p = _children.iterator();
while(p.hasNext())
{
Server server = (Server)p.next();
- Object descriptor = server.getDescriptor();
- if(descriptor instanceof ServerInstanceDescriptor)
- {
- ServerInstanceDescriptor sid = (ServerInstanceDescriptor)descriptor;
- if(sid.template.equals(template))
- {
- result.add(server);
- }
- }
+ result.addAll(server.findServiceInstances(template));
}
return result;
}
+
+ void removeServiceInstances(String template)
+ {
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ Server server = (Server)p.next();
+ server.removeServiceInstances(template);
+ }
+ }
+
private NodeDescriptor _descriptor;
private Utils.Resolver _resolver;
diff --git a/java/src/IceGrid/TreeNode/Nodes.java b/java/src/IceGrid/TreeNode/Nodes.java
index b8059b76f29..24d1e2bc9ef 100755
--- a/java/src/IceGrid/TreeNode/Nodes.java
+++ b/java/src/IceGrid/TreeNode/Nodes.java
@@ -22,7 +22,7 @@ import IceGrid.ServerState;
public class Nodes extends EditableParent
{
public Nodes(java.util.Map nodeMap, Application application)
- throws DuplicateIdException
+ throws UpdateFailedException
{
super(false, "Nodes", application.getModel());
_descriptors = nodeMap;
@@ -66,7 +66,7 @@ public class Nodes extends EditableParent
{
addChild(new Node((Node)p.next()));
}
- catch(DuplicateIdException e)
+ catch(UpdateFailedException e)
{
assert false;
}
@@ -86,7 +86,7 @@ public class Nodes extends EditableParent
}
}
- void update() throws DuplicateIdException
+ void update() throws UpdateFailedException
{
java.util.Iterator p = _descriptors.entrySet().iterator();
while(p.hasNext())
@@ -105,28 +105,41 @@ public class Nodes extends EditableParent
fireStructureChangedEvent(this);
}
- void cascadeDeleteServerInstance(String templateId)
+ void removeServerInstances(String templateId)
{
java.util.Iterator p = _children.iterator();
while(p.hasNext())
{
Node node = (Node)p.next();
- node.cascadeDeleteServerInstance(templateId);
+ node.removeServerInstances(templateId);
}
}
- void cascadeDeleteServiceInstance(String templateId)
+ java.util.List findServiceInstances(String template)
+ {
+ java.util.List result = new java.util.LinkedList();
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ Node node = (Node)p.next();
+ result.addAll(node.findServiceInstances(template));
+ }
+ return result;
+ }
+
+
+ void removeServiceInstances(String templateId)
{
java.util.Iterator p = _children.iterator();
while(p.hasNext())
{
Node node = (Node)p.next();
- node.cascadeDeleteServiceInstance(templateId);
+ node.removeServiceInstances(templateId);
}
}
void update(java.util.List updates, String[] removeNodes)
- throws DuplicateIdException
+ throws UpdateFailedException
{
Application application = (Application)getParent();
@@ -171,12 +184,6 @@ public class Nodes extends EditableParent
}
addChildren((CommonBaseI[])newChildren.toArray(new CommonBaseI[0]));
- p = newChildren.iterator();
- while(p.hasNext())
- {
- Node node = (Node)p.next();
- node.setParent(this);
- }
}
void nodeUp(String nodeName)
@@ -189,7 +196,7 @@ public class Nodes extends EditableParent
{
addChild(node, true);
}
- catch(DuplicateIdException e)
+ catch(UpdateFailedException e)
{
// Impossible
assert false;
@@ -218,16 +225,6 @@ public class Nodes extends EditableParent
// Else log a warning?
//
}
-
- public void unregister()
- {
- java.util.Iterator p = _children.iterator();
- while(p.hasNext())
- {
- Node node = (Node)p.next();
- node.unregister();
- }
- }
Node findNode(String nodeName)
{
diff --git a/java/src/IceGrid/TreeNode/Parent.java b/java/src/IceGrid/TreeNode/Parent.java
index aae8fe13399..34d7e901a89 100755
--- a/java/src/IceGrid/TreeNode/Parent.java
+++ b/java/src/IceGrid/TreeNode/Parent.java
@@ -90,36 +90,6 @@ class Parent extends CommonBaseI
return false;
}
- public void setParent(CommonBase parent)
- {
- _parent = parent;
- if(parent == null)
- {
- _path = null;
- }
- else
- {
- TreePath parentPath = _parent.getPath();
- if(parentPath == null)
- {
- _path = null;
- }
- else
- {
- _path = parentPath.pathByAddingChild(this);
- }
- }
-
- //
- // Propagate to children
- //
- java.util.Iterator p = _children.iterator();
- while(p.hasNext())
- {
- CommonBase child = (CommonBase)p.next();
- child.setParent(this);
- }
- }
public CommonBase findChild(String id)
{
@@ -149,13 +119,51 @@ class Parent extends CommonBaseI
return null;
}
- void addChild(CommonBase child) throws DuplicateIdException
+ public void setParent(CommonBase parent)
+ {
+ _parent = (Parent)parent;
+
+ TreePath parentPath = _parent.getPath();
+ _path = parentPath.pathByAddingChild(this);
+
+ //
+ // Propagate to children
+ //
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ CommonBaseI child = (CommonBaseI)p.next();
+ child.setParent(this);
+ }
+ }
+
+ public void clearParent()
+ {
+ if(_parent != null)
+ {
+ _parent = null;
+ _path = null;
+
+ //
+ // Propagate to children
+ //
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ CommonBaseI child = (CommonBaseI)p.next();
+ child.clearParent();
+ }
+ }
+ }
+
+
+ void addChild(CommonBase child) throws UpdateFailedException
{
addChild(child, false);
}
void addChild(CommonBase child, boolean fireEvent)
- throws DuplicateIdException
+ throws UpdateFailedException
{
if(_sortChildren)
{
@@ -173,7 +181,7 @@ class Parent extends CommonBaseI
if(cmp == 0)
{
- throw new DuplicateIdException(this, id);
+ throw new UpdateFailedException(this, id);
}
if(cmp < 0)
{
@@ -190,6 +198,11 @@ class Parent extends CommonBaseI
{
_children.add(child);
}
+ if(_path != null)
+ {
+ child.setParent(this);
+ }
+
if(fireEvent)
{
fireNodeInsertedEvent(this, child, i);
@@ -198,7 +211,7 @@ class Parent extends CommonBaseI
else
{
//
- // Unsorted insert
+ // Unsorted insert (i.e. at the end)
//
String id = child.getId();
java.util.Iterator p = _children.iterator();
@@ -207,11 +220,16 @@ class Parent extends CommonBaseI
CommonBase existingChild = (CommonBase)p.next();
if(id.equals(existingChild.getId()))
{
- throw new DuplicateIdException(this, id);
+ throw new UpdateFailedException(this, id);
}
}
_children.add(child);
+ if(_path != null)
+ {
+ child.setParent(this);
+ }
+
if(fireEvent)
{
fireNodeInsertedEvent(this, child, _children.size() - 1);
@@ -219,6 +237,35 @@ class Parent extends CommonBaseI
}
}
+ void addChild(int index, CommonBase child, boolean fireEvent)
+ throws UpdateFailedException
+ {
+ assert !_sortChildren;
+
+ String id = child.getId();
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ CommonBase existingChild = (CommonBase)p.next();
+ if(id.equals(existingChild.getId()))
+ {
+ throw new UpdateFailedException(this, id);
+ }
+ }
+
+ _children.add(index, child);
+
+ if(_path != null)
+ {
+ child.setParent(this);
+ }
+
+ if(fireEvent)
+ {
+ fireNodeInsertedEvent(this, child, index);
+ }
+ }
+
void moveChild(int index, boolean up, boolean fireEvent)
{
assert !_sortChildren;
@@ -254,7 +301,7 @@ class Parent extends CommonBaseI
{
if(_children.remove(child))
{
- child.unregister();
+ child.clearParent();
}
}
@@ -263,8 +310,8 @@ class Parent extends CommonBaseI
int index = _children.indexOf(child);
if(index > -1)
{
- child.unregister();
_children.remove(child);
+ child.clearParent();
if(fireEvent)
{
fireNodeRemovedEvent(this, child, index);
@@ -282,8 +329,8 @@ class Parent extends CommonBaseI
i++;
if(id.equals(child.getId()))
{
- child.unregister();
p.remove();
+ child.clearParent();
if(fireEvent)
{
fireNodeRemovedEvent(this, child, i);
@@ -299,7 +346,7 @@ class Parent extends CommonBaseI
while(p.hasNext())
{
CommonBase child = (CommonBase)p.next();
- child.unregister();
+ child.clearParent();
}
_children.clear();
}
@@ -327,7 +374,7 @@ class Parent extends CommonBaseI
}
void addChildren(CommonBaseI[] newChildren)
- throws DuplicateIdException
+ throws UpdateFailedException
{
if(newChildren.length == 0)
{
@@ -337,52 +384,69 @@ class Parent extends CommonBaseI
return;
}
- //
- // Shallow copy
- //
- CommonBaseI[] children = (CommonBaseI[])newChildren.clone();
-
- java.util.Arrays.sort(children, _childComparator);
-
- int[] indices = new int[children.length];
-
- int i = 0;
- java.util.Iterator p = _children.iterator();
- for(int j = 0; j < children.length; ++j)
+ if(_sortChildren)
{
- String id = children[j].getId();
+ //
+ // Shallow copy
+ //
+ CommonBaseI[] children = (CommonBaseI[])newChildren.clone();
+
+ java.util.Arrays.sort(children, _childComparator);
+
+ int[] indices = new int[children.length];
- while(p.hasNext())
+ int i = 0;
+ java.util.Iterator p = _children.iterator();
+ for(int j = 0; j < children.length; ++j)
{
- CommonBase existingChild = (CommonBase)p.next();
- int cmp = id.compareTo(existingChild.getId());
- if(cmp == 0)
+ String id = children[j].getId();
+
+ while(p.hasNext())
{
- throw new DuplicateIdException(this, id);
+ CommonBase existingChild = (CommonBase)p.next();
+ int cmp = id.compareTo(existingChild.getId());
+ if(cmp == 0)
+ {
+ throw new UpdateFailedException(this, id);
+ }
+ if(cmp < 0)
+ {
+ break; // while
+ }
+ i++;
}
- if(cmp < 0)
+
+ if(i < _children.size())
+ {
+ // Insert here, and increment i (since children is sorted)
+ _children.add(i, children[j]);
+ indices[j] = i;
+ i++;
+ }
+ else
{
- break; // while
+ // Append
+ _children.add(children[j]);
+ indices[j] = i;
+ i++;
+ }
+ if(_path != null)
+ {
+ children[j].setParent(this);
}
- i++;
- }
-
- if(i < _children.size())
- {
- // Insert here, and increment i (since children is sorted)
- _children.add(i, children[j]);
- indices[j] = i;
- i++;
}
- else
+ fireNodesInsertedEvent(this, children, indices);
+ }
+ else
+ {
+ //
+ // Could optimize later!
+ //
+ for(int i = 0; i < newChildren.length; ++i)
{
- // Append
- _children.add(children[j]);
- indices[j] = i;
- i++;
+ addChild(newChildren[i], true);
}
}
- fireNodesInsertedEvent(this, children, indices);
}
@@ -396,116 +460,70 @@ class Parent extends CommonBaseI
return;
}
- //
- // Shallow copy
- //
- String[] ids = (String[])childIds.clone();
-
- java.util.Arrays.sort(ids);
-
- Object[] childrenToRemove = new Object[ids.length];
- int[] indices = new int[ids.length];
-
- int i = 0;
- int j = 0;
- int k = 0;
- java.util.Iterator p = _children.iterator();
-
- while(p.hasNext() && j < ids.length)
- {
- CommonBase child = (CommonBase)p.next();
- if(ids[j].equals(child.getId()))
- {
- child.unregister();
- childrenToRemove[k] = child;
- indices[k] = i;
- p.remove();
- ++j;
- ++k;
- }
- ++i;
- }
-
- //
- // Should be all removed
- //
- assert(k == ids.length);
- fireNodesRemovedEvent(this, childrenToRemove, indices);
- }
-
-
- //
- // in childIds: the children to remove
- // out childIds: the children not removed
- //
- void removeChildren(java.util.List childIds)
- {
- if(childIds.size() == 0)
+ if(_sortChildren)
{
//
- // Nothing to do;
+ // Shallow copy
//
- return;
- }
-
- java.util.Collections.sort(childIds);
-
- java.util.Vector childrenToRemove = new java.util.Vector(childIds.size());
- int[] indices = new int[childIds.size()];
-
- java.util.Iterator q = childIds.iterator();
- java.util.Iterator p = _children.iterator();
-
- int i = -1;
- int k = 0;
- while(q.hasNext() && p.hasNext())
- {
- String id = (String)q.next();
+ String[] ids = (String[])childIds.clone();
+
+ java.util.Arrays.sort(ids);
+
+ Object[] childrenToRemove = new Object[ids.length];
+ int[] indices = new int[ids.length];
+
+ int i = 0;
+ int j = 0;
+ int k = 0;
+ java.util.Iterator p = _children.iterator();
- while(p.hasNext())
+ while(p.hasNext() && j < ids.length)
{
- CommonBase child = (CommonBase)p.next();
- i++;
-
- if(id.equals(child.getId()))
+ CommonBase child = (CommonBase)p.next();
+ if(ids[j].equals(child.getId()))
{
- child.unregister();
- childrenToRemove.add(child);
- indices[k++] = i;
+ child.clearParent();
+ childrenToRemove[k] = child;
+ indices[k] = i;
p.remove();
- q.remove();
- break; // while
- }
- else if(id.compareTo(child.getId()) < 0)
- {
- //
- // Need to get next id
- //
- break; // while
+ ++j;
+ ++k;
}
+ ++i;
}
+
+ //
+ // Should be all removed
+ //
+ assert(k == ids.length);
+ fireNodesRemovedEvent(this, childrenToRemove, indices);
}
-
- if(k > 0)
+ else
{
- childrenToRemove.trimToSize();
- int[] trimedIndices;
- if(childIds.size() > 0)
+ //
+ // Could optimize later!
+ //
+ for(int i = 0; i < childIds.length; ++i)
{
- trimedIndices = new int[k];
- System.arraycopy(indices, 0, trimedIndices, 0, k);
+ removeChild(childIds[i], true);
}
- else
+ }
+ }
+
+ java.util.List findChildrenWithType(Class type)
+ {
+ java.util.List result = new java.util.LinkedList();
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ Object child = p.next();
+ if(child.getClass() == type)
{
- trimedIndices = indices;
+ result.add(child);
}
-
- fireNodesRemovedEvent(this,
- childrenToRemove.toArray(),
- trimedIndices);
}
+ return result;
}
-
void fireNodeInsertedEvent(Object source, Object child, int index)
{
@@ -577,8 +595,19 @@ class Parent extends CommonBaseI
{
_sortChildren = val;
}
+
+ protected String makeNewChildId(String base)
+ {
+ String id = base;
+ int i = 0;
+ while(findChild(id) != null)
+ {
+ id = base + "-" + (++i);
+ }
+ return id;
+ }
protected java.util.LinkedList _children = new java.util.LinkedList();
private ChildComparator _childComparator = new ChildComparator();
- private boolean _sortChildren = true;
+ protected boolean _sortChildren = true;
}
diff --git a/java/src/IceGrid/TreeNode/ReplicatedAdapters.java b/java/src/IceGrid/TreeNode/ReplicatedAdapters.java
index 827158ca53e..92e6cd479a9 100755
--- a/java/src/IceGrid/TreeNode/ReplicatedAdapters.java
+++ b/java/src/IceGrid/TreeNode/ReplicatedAdapters.java
@@ -17,7 +17,7 @@ import IceGrid.Utils;
class ReplicatedAdapters extends EditableParent
{
ReplicatedAdapters(java.util.List descriptors, Model model)
- throws DuplicateIdException
+ throws UpdateFailedException
{
super(false, "Replicated Adapters", model);
_descriptors = descriptors;
@@ -33,7 +33,7 @@ class ReplicatedAdapters extends EditableParent
}
ReplicatedAdapters(ReplicatedAdapters o)
- throws DuplicateIdException
+ throws UpdateFailedException
{
super(o);
_descriptors = o._descriptors;
@@ -59,7 +59,7 @@ class ReplicatedAdapters extends EditableParent
}
- void update() throws DuplicateIdException
+ void update() throws UpdateFailedException
{
java.util.Set keepSet = new java.util.HashSet();
@@ -80,7 +80,7 @@ class ReplicatedAdapters extends EditableParent
void update(java.util.List descriptors, String[] removeAdapters)
- throws DuplicateIdException
+ throws UpdateFailedException
{
_descriptors = descriptors;
@@ -118,13 +118,6 @@ class ReplicatedAdapters extends EditableParent
updateChildren((CommonBaseI[])updatedChildren.toArray
(new CommonBaseI[0]));
addChildren((CommonBaseI[])newChildren.toArray(new CommonBaseI[0]));
-
- p = newChildren.iterator();
- while(p.hasNext())
- {
- ReplicatedAdapter replicatedAdapter = (ReplicatedAdapter)p.next();
- replicatedAdapter.setParent(this);
- }
}
private java.util.List _descriptors;
diff --git a/java/src/IceGrid/TreeNode/Root.java b/java/src/IceGrid/TreeNode/Root.java
index 5aad57b5880..88a28b50934 100755
--- a/java/src/IceGrid/TreeNode/Root.java
+++ b/java/src/IceGrid/TreeNode/Root.java
@@ -8,6 +8,8 @@
// **********************************************************************
package IceGrid.TreeNode;
+import javax.swing.tree.TreePath;
+
import IceGrid.AdapterDynamicInfo;
import IceGrid.ApplicationDescriptor;
import IceGrid.ApplicationUpdateDescriptor;
@@ -51,9 +53,8 @@ public class Root extends Parent
{
Application child = new Application(false, descriptor, _model);
addChild(child);
- child.setParent(this);
}
- catch(DuplicateIdException e)
+ catch(UpdateFailedException e)
{
//
// Bug in the IceGrid registry
@@ -79,10 +80,9 @@ public class Root extends Parent
try
{
Application child = new Application(false, desc, _model);
- child.setParent(this);
addChild(child, true);
}
- catch(DuplicateIdException e)
+ catch(UpdateFailedException e)
{
//
// Bug in the IceGrid registry
@@ -108,7 +108,7 @@ public class Root extends Parent
Application application = (Application)findChild(desc.name);
application.update(desc);
}
- catch(DuplicateIdException e)
+ catch(UpdateFailedException e)
{
//
// Bug in the IceGrid registry
@@ -143,11 +143,53 @@ public class Root extends Parent
info.adapterInfoMap.put(instanceId, updatedInfo.adapters[i].proxy);
}
+ //
+ // Need to tell *every* server on this node
+ //
+ java.util.List serverList = (java.util.List)_nodeServerMap.get(nodeName);
+ if(serverList != null)
+ {
+ java.util.Iterator p = serverList.iterator();
+ while(p.hasNext())
+ {
+ Server server = (Server)p.next();
+ ServerDynamicInfo serverInfo = (ServerDynamicInfo)
+ info.serverInfoMap.get(server.getId());
+ if(serverInfo == null)
+ {
+ server.updateDynamicInfo(ServerState.Inactive, 0);
+ }
+ else
+ {
+ server.updateDynamicInfo(serverInfo.state, serverInfo.pid);
+ }
+ }
+ }
+
+ //
+ // Tell adapters
+ //
+ java.util.List adapterList = (java.util.List)_nodeAdapterMap.get(nodeName);
+ if(adapterList != null)
+ {
+ java.util.Iterator p = adapterList.iterator();
+ while(p.hasNext())
+ {
+ Adapter adapter = (Adapter)p.next();
+ Ice.ObjectPrx proxy =
+ (Ice.ObjectPrx)info.adapterInfoMap.get(adapter.getInstanceId());
+ if(proxy != null)
+ {
+ adapter.updateProxy(proxy);
+ }
+ }
+ }
+
java.util.Iterator p = _children.iterator();
while(p.hasNext())
{
Application application = (Application)p.next();
- application.nodeUp(nodeName, info);
+ application.nodeUp(nodeName);
}
}
@@ -155,6 +197,28 @@ public class Root extends Parent
{
_dynamicInfoMap.remove(nodeName);
+ java.util.List serverList = (java.util.List)_nodeServerMap.get(nodeName);
+ if(serverList != null)
+ {
+ java.util.Iterator p = serverList.iterator();
+ while(p.hasNext())
+ {
+ Server server = (Server)p.next();
+ server.updateDynamicInfo(null, 0);
+ }
+ }
+
+ java.util.List adapterList = (java.util.List)_nodeAdapterMap.get(nodeName);
+ if(adapterList != null)
+ {
+ java.util.Iterator p = adapterList.iterator();
+ while(p.hasNext())
+ {
+ Adapter adapter = (Adapter)p.next();
+ adapter.updateProxy(null);
+ }
+ }
+
java.util.Iterator p = _children.iterator();
while(p.hasNext())
{
@@ -167,7 +231,74 @@ public class Root extends Parent
{
return _dynamicInfoMap.keySet();
}
+
+ void restore(Application copy)
+ {
+ removeChild(copy.getId(), true);
+ try
+ {
+ addChild(copy, true);
+ }
+ catch(UpdateFailedException e)
+ {
+ assert false; // impossible
+ }
+ }
+
+
+ ServerState registerServer(String nodeName, String serverId, Server server,
+ Ice.IntHolder pid)
+ {
+ java.util.List serverList = (java.util.List)_serverMap.get(serverId);
+
+ if(serverList == null)
+ {
+ serverList = new java.util.LinkedList();
+ _serverMap.put(serverId, serverList);
+ }
+ serverList.add(server);
+
+ serverList = (java.util.List)_nodeServerMap.get(nodeName);
+ if(serverList == null)
+ {
+ serverList = new java.util.LinkedList();
+ _nodeServerMap.put(nodeName, serverList);
+ }
+ serverList.add(server);
+
+ DynamicInfo info = (DynamicInfo)_dynamicInfoMap.get(nodeName);
+ if(info == null)
+ {
+ // Node is down
+ pid.value = 0;
+ return null;
+ }
+ else
+ {
+ ServerDynamicInfo serverInfo =
+ (ServerDynamicInfo)info.serverInfoMap.get(serverId);
+ if(serverInfo == null)
+ {
+ pid.value = 0;
+ return ServerState.Inactive;
+ }
+ else
+ {
+ pid.value = serverInfo.pid;
+ return serverInfo.state;
+ }
+ }
+ }
+ void unregisterServer(String nodeName, String serverId, Server server)
+ {
+ java.util.List serverList = (java.util.List)_serverMap.get(serverId);
+ serverList.remove(server);
+
+ serverList = (java.util.List)_nodeServerMap.get(nodeName);
+ serverList.remove(server);
+ }
+
public void updateServer(String nodeName, ServerDynamicInfo updatedInfo)
{
//
@@ -177,18 +308,66 @@ public class Root extends Parent
assert info != null;
info.serverInfoMap.put(updatedInfo.id, updatedInfo);
- java.util.Iterator p = _children.iterator();
- while(p.hasNext())
+ java.util.List serverList = (java.util.List)_serverMap.get(updatedInfo.id);
+ if(serverList != null)
{
- Application application = (Application)p.next();
- if(application.updateServer(updatedInfo))
+ java.util.Iterator p = serverList.iterator();
+ while(p.hasNext())
{
- break; // while
+ Server server = (Server)p.next();
+ server.updateDynamicInfo(updatedInfo.state, updatedInfo.pid);
}
}
}
- public void updateAdapter(String nodeName, AdapterDynamicInfo updatedInfo)
+
+
+ Ice.ObjectPrx registerAdapter(String nodeName, AdapterInstanceId instanceId,
+ Adapter adapter)
+ {
+ java.util.List adapterList = (java.util.List)_adapterMap.get(instanceId);
+
+ if(adapterList == null)
+ {
+ adapterList = new java.util.LinkedList();
+ _adapterMap.put(instanceId, adapterList);
+ }
+ adapterList.add(adapter);
+
+ adapterList = (java.util.List)_nodeAdapterMap.get(nodeName);
+ if(adapterList == null)
+ {
+ adapterList = new java.util.LinkedList();
+ _nodeAdapterMap.put(nodeName, adapterList);
+ }
+ adapterList.add(adapter);
+
+ DynamicInfo info = (DynamicInfo)_dynamicInfoMap.get(nodeName);
+ if(info == null)
+ {
+ // Node is down
+ return null;
+ }
+ else
+ {
+ return (Ice.ObjectPrx)info.adapterInfoMap.get(instanceId);
+ }
+ }
+
+ void unregisterAdapter(String nodeName,
+ AdapterInstanceId instanceId,
+ Adapter adapter)
+ {
+ java.util.List adapterList = (java.util.List)_adapterMap.
+ get(instanceId);
+ adapterList.remove(adapter);
+
+ adapterList = (java.util.List)_nodeAdapterMap.get(nodeName);
+ adapterList.remove(adapter);
+ }
+
+ public void updateAdapter(String nodeName,
+ AdapterDynamicInfo updatedInfo)
{
//
// This node must be up
@@ -196,42 +375,61 @@ public class Root extends Parent
DynamicInfo info = (DynamicInfo)_dynamicInfoMap.get(nodeName);
assert info != null;
AdapterInstanceId instanceId
- = new AdapterInstanceId("" /* updatedInfo.serverId */, updatedInfo.id);
+ = new AdapterInstanceId(updatedInfo.serverId,
+ updatedInfo.id);
info.adapterInfoMap.put(instanceId, updatedInfo.proxy);
- java.util.Iterator p = _children.iterator();
- while(p.hasNext())
+ //
+ // Is this Adapter registered?
+ //
+ Adapter adapter = (Adapter)_adapterMap.get(instanceId);
+ if(adapter != null)
{
- Application application = (Application)p.next();
- if(application.updateAdapter(instanceId, updatedInfo.proxy))
- {
- break; // while
- }
+ adapter.updateProxy(updatedInfo.proxy);
}
}
-
- DynamicInfo getDynamicInfo(String nodeName)
- {
- return (DynamicInfo)_dynamicInfoMap.get(nodeName);
- }
- void restore(Application copy)
+ String identify(TreePath path)
{
- removeChild(copy.getId(), true);
- try
- {
- addChild(copy, true);
- copy.setParent(this);
- }
- catch(DuplicateIdException e)
+ String result = "";
+ for(int i = 1; i < path.getPathCount(); ++i)
{
- assert false; // impossible
+ if(!result.equals(""))
+ {
+ result += "/";
+ }
+ result += ((CommonBase)path.getPathComponent(i)).getId();
}
+ return result;
}
-
+
//
// Nodename to DynamicInfo
//
private java.util.Map _dynamicInfoMap = new java.util.HashMap();
+ //
+ // AdapterInstanceId to list of Adapters
+ // The registry enforeces a single adapter per adapterInstanceId;
+ // however in order to support copy & paste, we can have temporarily
+ // an inconsistency: several adapters with the same instance id.
+ //
+ private java.util.Map _adapterMap = new java.util.HashMap();
+
+ //
+ // Nodename to list of Adapter (used when a node goes down)
+ //
+ private java.util.Map _nodeAdapterMap = new java.util.HashMap();
+
+ //
+ // ServerId to list of Servers
+ // See _adapterMap comment above
+ //
+ private java.util.Map _serverMap = new java.util.HashMap();
+
+ //
+ // Nodename to list of Server (used when a node goes down)
+ //
+ private java.util.Map _nodeServerMap = new java.util.HashMap();
+
}
diff --git a/java/src/IceGrid/TreeNode/Server.java b/java/src/IceGrid/TreeNode/Server.java
index dc786c8def0..da12f3e3414 100755
--- a/java/src/IceGrid/TreeNode/Server.java
+++ b/java/src/IceGrid/TreeNode/Server.java
@@ -439,15 +439,9 @@ class Server extends EditableParent
Server(boolean brandNew, String serverId,
Utils.Resolver resolver, ServerInstanceDescriptor instanceDescriptor,
ServerDescriptor serverDescriptor,
- Application application) throws DuplicateIdException
+ Application application) throws UpdateFailedException
{
super(brandNew, serverId, application.getModel());
- Ice.IntHolder pid = new Ice.IntHolder();
- _state = application.registerServer(resolver.find("node"),
- _id,
- this,
- pid);
- _pid = pid.value;
rebuild(resolver, instanceDescriptor, serverDescriptor, application);
}
@@ -476,7 +470,7 @@ class Server extends EditableParent
void rebuild(Utils.Resolver resolver,
ServerInstanceDescriptor instanceDescriptor,
ServerDescriptor serverDescriptor,
- Application application) throws DuplicateIdException
+ Application application) throws UpdateFailedException
{
assert serverDescriptor != null;
_resolver = resolver;
@@ -487,54 +481,81 @@ class Server extends EditableParent
boolean isEditable = (instanceDescriptor == null);
_propertiesHolder = new PropertiesHolder(serverDescriptor);
- if(serverDescriptor instanceof IceBoxDescriptor)
+ try
{
- IceBoxDescriptor iceBoxDescriptor = (IceBoxDescriptor)serverDescriptor;
-
- _services = new Services(iceBoxDescriptor.services,
- isEditable ? this : null, _resolver, application);
- addChild(_services);
- _services.setParent(this);
+ if(serverDescriptor instanceof IceBoxDescriptor)
+ {
+ IceBoxDescriptor iceBoxDescriptor = (IceBoxDescriptor)serverDescriptor;
+
+ _services = new Services(iceBoxDescriptor.services,
+ isEditable, _resolver, application);
+ addChild(_services);
+ //
+ // IceBox has not dbEnv
+ //
+ assert serverDescriptor.dbEnvs.size() == 0;
+ _dbEnvs = null;
+ }
+ else
+ {
+ _services = null;
+ _dbEnvs = new DbEnvs(serverDescriptor.dbEnvs,
+ isEditable, _resolver, _model);
+ addChild(_dbEnvs);
+ }
- //
- // IceBox has not dbEnv
- //
- assert serverDescriptor.dbEnvs.size() == 0;
- _dbEnvs = null;
+ _adapters = new Adapters(serverDescriptor.adapters,
+ isEditable, _services != null,
+ _resolver, _model);
+ addChild(_adapters);
}
- else
+ catch(UpdateFailedException e)
{
- _services = null;
- _dbEnvs = new DbEnvs(serverDescriptor.dbEnvs,
- isEditable, _resolver, _model);
- addChild(_dbEnvs);
- _dbEnvs.setParent(this);
+ e.addParent(this);
+ throw e;
}
+ }
- _adapters = new Adapters(serverDescriptor.adapters,
- isEditable, _services != null,
- _resolver, application, _model);
- addChild(_adapters);
- _adapters.setParent(this);
+
+ public void setParent(CommonBase parent)
+ {
+ Ice.IntHolder pid = new Ice.IntHolder();
+ _state = _model.getRoot().registerServer(_resolver.find("node"),
+ _id,
+ this,
+ pid);
+ _pid = pid.value;
+ super.setParent(parent);
}
- public void unregister()
+ public void clearParent()
{
- getApplication().unregisterServer(_resolver.find("node"),
- _id,
- this);
- _adapters.unregister();
- if(_services != null)
+ if(_parent != null)
{
- _services.unregister();
+ _model.getRoot().unregisterServer(_resolver.find("node"),
+ _id, this);
+ super.clearParent();
}
+
}
- void cascadeDeleteServiceInstance(String templateId)
+ java.util.List findServiceInstances(String template)
+ {
+ if(_services != null)
+ {
+ return _services.findServiceInstances(template);
+ }
+ else
+ {
+ return new java.util.LinkedList();
+ }
+ }
+
+ void removeServiceInstances(String template)
{
if(_services != null)
{
- _services.cascadeDeleteServiceInstance(templateId);
+ _services.removeServiceInstances(template);
}
}
@@ -634,9 +655,9 @@ class Server extends EditableParent
public String toString()
{
- if(_instanceDescriptor == null)
+ if(_instanceDescriptor == null || isEphemeral())
{
- return _id;
+ return super.toString();
}
else
{
diff --git a/java/src/IceGrid/TreeNode/ServerTemplate.java b/java/src/IceGrid/TreeNode/ServerTemplate.java
index 103a8c6ca48..5bafa173871 100755
--- a/java/src/IceGrid/TreeNode/ServerTemplate.java
+++ b/java/src/IceGrid/TreeNode/ServerTemplate.java
@@ -49,7 +49,7 @@ class ServerTemplate extends EditableParent
//
ServerTemplate(boolean brandNew, String name, TemplateDescriptor descriptor,
Application application)
- throws DuplicateIdException
+ throws UpdateFailedException
{
super(brandNew, name, application.getModel());
rebuild(descriptor, application);
@@ -68,7 +68,7 @@ class ServerTemplate extends EditableParent
}
void rebuild(TemplateDescriptor descriptor, Application application)
- throws DuplicateIdException
+ throws UpdateFailedException
{
_templateDescriptor = descriptor;
_propertiesHolder = new PropertiesHolder(_templateDescriptor.descriptor);
@@ -83,10 +83,9 @@ class ServerTemplate extends EditableParent
{
_iceBoxDescriptor = (IceBoxDescriptor)_templateDescriptor.descriptor;
- _services = new Services(_iceBoxDescriptor.services, this, null,
+ _services = new Services(_iceBoxDescriptor.services, true, null,
application);
addChild(_services);
- _services.setParent(this);
assert _templateDescriptor.descriptor.dbEnvs.size() == 0;
_dbEnvs = null;
@@ -99,23 +98,51 @@ class ServerTemplate extends EditableParent
_dbEnvs = new DbEnvs(_templateDescriptor.descriptor.dbEnvs, true,
null, _model);
addChild(_dbEnvs);
- _dbEnvs.setParent(this);
}
_adapters = new Adapters(_templateDescriptor.descriptor.adapters, true,
- _services != null, null, null, _model);
+ _services != null, null, _model);
addChild(_adapters);
- _adapters.setParent(this);
}
- void cascadeDeleteServiceInstance(String templateId)
+ void removeServiceInstances(String template)
{
if(_services != null)
{
- _services.cascadeDeleteServiceInstance(templateId);
+ _services.removeServiceInstances(template);
}
}
+ public java.util.List findAllInstances(CommonBase child)
+ {
+ java.util.List result = super.findAllInstances(child);
+
+ java.util.List serverInstances =
+ getApplication().findServerInstances(_id);
+
+ java.util.Iterator p = serverInstances.iterator();
+ while(p.hasNext())
+ {
+ Server server = (Server)p.next();
+ result.addAll(server.findChildrenWithType(child.getClass()));
+ }
+
+ return result;
+ }
+
+ java.util.List findServiceInstances(String template)
+ {
+ if(_services != null)
+ {
+ return _services.findServiceInstances(template);
+ }
+ else
+ {
+ return new java.util.LinkedList();
+ }
+ }
+
+
public PropertiesHolder getPropertiesHolder()
{
return _propertiesHolder;
diff --git a/java/src/IceGrid/TreeNode/ServerTemplates.java b/java/src/IceGrid/TreeNode/ServerTemplates.java
index 53eb4bede28..6211997ef12 100755
--- a/java/src/IceGrid/TreeNode/ServerTemplates.java
+++ b/java/src/IceGrid/TreeNode/ServerTemplates.java
@@ -15,7 +15,7 @@ import IceGrid.TreeModelI;
class ServerTemplates extends EditableParent
{
ServerTemplates(java.util.Map descriptors, Application application)
- throws DuplicateIdException
+ throws UpdateFailedException
{
super(false, "Server templates", application.getModel());
@@ -47,7 +47,7 @@ class ServerTemplates extends EditableParent
{
addChild(new ServerTemplate((ServerTemplate)p.next()));
}
- catch(DuplicateIdException e)
+ catch(UpdateFailedException e)
{
assert false;
}
@@ -67,7 +67,7 @@ class ServerTemplates extends EditableParent
}
}
- void update() throws DuplicateIdException
+ void update() throws UpdateFailedException
{
//
// The only template-descriptor update going through the
@@ -94,18 +94,30 @@ class ServerTemplates extends EditableParent
fireStructureChangedEvent(this);
}
- void cascadeDeleteServiceInstance(String templateId)
+ java.util.List findServiceInstances(String template)
{
+ java.util.List result = new java.util.LinkedList();
java.util.Iterator p = _children.iterator();
while(p.hasNext())
{
ServerTemplate t = (ServerTemplate)p.next();
- t.cascadeDeleteServiceInstance(templateId);
+ result.addAll(t.findServiceInstances(template));
+ }
+ return result;
+ }
+
+ void removeServiceInstances(String template)
+ {
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ ServerTemplate t = (ServerTemplate)p.next();
+ t.removeServiceInstances(template);
}
}
void update(java.util.Map updates, String[] removeTemplates)
- throws DuplicateIdException
+ throws UpdateFailedException
{
//
// Note: _descriptors is updated by Application
@@ -147,13 +159,6 @@ class ServerTemplates extends EditableParent
updateChildren((CommonBaseI[])updatedChildren.toArray
(new CommonBaseI[0]));
addChildren((CommonBaseI[])newChildren.toArray(new CommonBaseI[0]));
-
- p = newChildren.iterator();
- while(p.hasNext())
- {
- ServerTemplate serverTemplate = (ServerTemplate)p.next();
- serverTemplate.setParent(this);
- }
}
private java.util.Map _descriptors;
diff --git a/java/src/IceGrid/TreeNode/Service.java b/java/src/IceGrid/TreeNode/Service.java
index 187532df994..b35da57e1f2 100755
--- a/java/src/IceGrid/TreeNode/Service.java
+++ b/java/src/IceGrid/TreeNode/Service.java
@@ -66,9 +66,7 @@ class Service extends Parent
_instanceDescriptor.parameterValues = sd.parameterValues;
if(_instanceDescriptor.descriptor != null)
{
- _instanceDescriptor.descriptor.adapters = sd.descriptor.adapters;
_instanceDescriptor.descriptor.properties = sd.descriptor.properties;
- _instanceDescriptor.descriptor.dbEnvs = sd.descriptor.properties;
_instanceDescriptor.descriptor.description = sd.descriptor.description;
_instanceDescriptor.descriptor.name = sd.descriptor.name;
@@ -83,26 +81,8 @@ class Service extends Parent
public boolean destroy()
{
- if(isEphemeral() || isEditable() && _model.canUpdate())
- {
- Services services = (Services)_parent;
-
- if(isEphemeral())
- {
- services.removeChild(this, true);
- }
- else
- {
- services.removeDescriptor(_instanceDescriptor);
- getEditable().markModified();
- getApplication().applySafeUpdate();
- }
- return true;
- }
- else
- {
- return false;
- }
+ return _parent == null ? false :
+ ((ListParent)_parent).destroyChild(this);
}
public void displayProperties()
@@ -140,7 +120,7 @@ class Service extends Parent
}
else
{
- return _id;
+ return super.toString();
}
}
@@ -149,14 +129,6 @@ class Service extends Parent
return _propertiesHolder;
}
- public void unregister()
- {
- if(_adapters != null)
- {
- _adapters.unregister();
- }
- }
-
public void moveUp()
{
move(true);
@@ -167,6 +139,33 @@ class Service extends Parent
move(false);
}
+ //
+ // child == _adapters or _dbEnvs
+ //
+ public java.util.List findAllInstances(Object child)
+ {
+ assert getIndex(child) != -1;
+
+ java.util.List result = new java.util.LinkedList();
+
+ //
+ // First find all instances of the enclosing Services
+ //
+ java.util.List servicesList = _parent.getParent().findAllInstances(_parent);
+
+ //
+ // And then their children with the appropriate type
+ //
+ java.util.Iterator p = servicesList.iterator();
+ while(p.hasNext())
+ {
+ Services services = (Services)p.next();
+ result.addAll(services.findChildrenWithType(child.getClass()));
+ }
+ return result;
+ }
+
+
private void move(boolean up)
{
if(!_ephemeral)
@@ -181,9 +180,8 @@ class Service extends Parent
ServiceDescriptor serviceDescriptor,
boolean isEditable,
Utils.Resolver resolver,
- Application application,
Model model)
- throws DuplicateIdException
+ throws UpdateFailedException
{
super(name, model);
_displayString = displayString;
@@ -197,15 +195,22 @@ class Service extends Parent
boolean areChildrenEditable = _instanceDescriptor.template.length() == 0
&& isEditable;
- _adapters = new Adapters(serviceDescriptor.adapters,
- areChildrenEditable, false, resolver,
- application,
- _model);
- addChild(_adapters);
-
- _dbEnvs = new DbEnvs(serviceDescriptor.dbEnvs,
- areChildrenEditable, resolver, _model);
- addChild(_dbEnvs);
+ try
+ {
+ _adapters = new Adapters(serviceDescriptor.adapters,
+ areChildrenEditable, false, resolver,
+ _model);
+ addChild(_adapters);
+
+ _dbEnvs = new DbEnvs(serviceDescriptor.dbEnvs,
+ areChildrenEditable, resolver, _model);
+ addChild(_dbEnvs);
+ }
+ catch(UpdateFailedException e)
+ {
+ e.addParent(this);
+ throw e;
+ }
}
//
@@ -215,7 +220,7 @@ class Service extends Parent
ServiceInstanceDescriptor instanceDescriptor,
Model model)
{
- super("*" + name, model);
+ super(name, model);
_instanceDescriptor = instanceDescriptor;
_serviceDescriptor = instanceDescriptor.descriptor;
_ephemeral = true;
@@ -239,7 +244,14 @@ class Service extends Parent
boolean isEditable()
{
- return ((Services)_parent).isEditable();
+ if(_parent == null)
+ {
+ return false;
+ }
+ else
+ {
+ return ((Services)_parent).isEditable();
+ }
}
public boolean isEphemeral()
diff --git a/java/src/IceGrid/TreeNode/ServiceEditor.java b/java/src/IceGrid/TreeNode/ServiceEditor.java
index 387058ebe8d..a5bf22dcffa 100755
--- a/java/src/IceGrid/TreeNode/ServiceEditor.java
+++ b/java/src/IceGrid/TreeNode/ServiceEditor.java
@@ -16,7 +16,7 @@ import IceGrid.Model;
import IceGrid.ServiceInstanceDescriptor;
import IceGrid.Utils;
-class ServiceEditor extends Editor
+class ServiceEditor extends ListElementEditor
{
ServiceEditor(JFrame parentFrame)
{
diff --git a/java/src/IceGrid/TreeNode/ServiceInstanceEditor.java b/java/src/IceGrid/TreeNode/ServiceInstanceEditor.java
index f4a8c6b8ec8..6ec97e35b41 100755
--- a/java/src/IceGrid/TreeNode/ServiceInstanceEditor.java
+++ b/java/src/IceGrid/TreeNode/ServiceInstanceEditor.java
@@ -28,7 +28,7 @@ import IceGrid.TableDialog;
import IceGrid.TemplateDescriptor;
import IceGrid.Utils;
-class ServiceInstanceEditor extends Editor
+class ServiceInstanceEditor extends ListElementEditor
{
ServiceInstanceEditor(JFrame parentFrame)
{
diff --git a/java/src/IceGrid/TreeNode/ServiceTemplate.java b/java/src/IceGrid/TreeNode/ServiceTemplate.java
index 0f555515362..f1b9e0ed419 100755
--- a/java/src/IceGrid/TreeNode/ServiceTemplate.java
+++ b/java/src/IceGrid/TreeNode/ServiceTemplate.java
@@ -10,6 +10,7 @@ package IceGrid.TreeNode;
import com.jgoodies.uif_lite.panel.SimpleInternalFrame;
+import IceGrid.ServiceDescriptor;
import IceGrid.TemplateDescriptor;
import IceGrid.Model;
@@ -33,15 +34,32 @@ class ServiceTemplate extends EditableParent
ServiceTemplate(boolean brandNew, String name,
TemplateDescriptor descriptor, Model model)
- throws DuplicateIdException
+ throws UpdateFailedException
{
super(brandNew, name, model);
+ _ephemeral = false;
rebuild(descriptor);
}
+ ServiceTemplate(String name, TemplateDescriptor descriptor, Model model)
+ {
+ super(true, name, model);
+ _ephemeral = true;
+ try
+ {
+ rebuild(descriptor);
+ }
+ catch(UpdateFailedException e)
+ {
+ assert false;
+ }
+ }
+
ServiceTemplate(ServiceTemplate o)
{
super(o, true);
+ assert o._ephemeral == false;
+
_templateDescriptor = o._templateDescriptor;
_adapters = o._adapters;
_dbEnvs = o._dbEnvs;
@@ -50,26 +68,32 @@ class ServiceTemplate extends EditableParent
void rebuild(TemplateDescriptor descriptor)
- throws DuplicateIdException
+ throws UpdateFailedException
{
_templateDescriptor = descriptor;
_propertiesHolder = new PropertiesHolder(_templateDescriptor.descriptor);
- clearChildren();
//
// Fix-up parameters order
//
java.util.Collections.sort(_templateDescriptor.parameters);
- _adapters = new Adapters(_templateDescriptor.descriptor.adapters, true,
- false, null, null, _model);
- addChild(_adapters);
- _adapters.setParent(this);
-
- _dbEnvs = new DbEnvs(_templateDescriptor.descriptor.dbEnvs, true,
- null, _model);
- addChild(_dbEnvs);
- _dbEnvs.setParent(this);
+ clearChildren();
+ if(_ephemeral)
+ {
+ _adapters = null;
+ _dbEnvs = null;
+ }
+ else
+ {
+ _adapters = new Adapters(_templateDescriptor.descriptor.adapters, true,
+ false, null, _model);
+ addChild(_adapters);
+
+ _dbEnvs = new DbEnvs(_templateDescriptor.descriptor.dbEnvs, true,
+ null, _model);
+ addChild(_dbEnvs);
+ }
}
public PropertiesHolder getPropertiesHolder()
@@ -79,7 +103,14 @@ class ServiceTemplate extends EditableParent
public String toString()
{
- return templateLabel(_id, _templateDescriptor.parameters);
+ if(_ephemeral)
+ {
+ return "*" + _id;
+ }
+ else
+ {
+ return templateLabel(_id, _templateDescriptor.parameters);
+ }
}
public Object getDescriptor()
@@ -87,11 +118,87 @@ class ServiceTemplate extends EditableParent
return _templateDescriptor;
}
+ public boolean isEphemeral()
+ {
+ return _ephemeral;
+ }
+
+ public boolean destroy()
+ {
+ if(_parent != null && _model.canUpdate())
+ {
+ ServiceTemplates serviceTemplates = (ServiceTemplates)_parent;
+
+ if(_ephemeral)
+ {
+ serviceTemplates.removeChild(this, true);
+ }
+ else
+ {
+ serviceTemplates.removeDescriptor(_id);
+ getApplication().removeServiceInstances(_id);
+ serviceTemplates.removeElement(this, true);
+ }
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ public java.util.List findAllInstances(CommonBase child)
+ {
+ java.util.List result = super.findAllInstances(child);
+
+ java.util.List serviceInstances =
+ getApplication().findServiceInstances(_id);
+
+ java.util.Iterator p = serviceInstances.iterator();
+ while(p.hasNext())
+ {
+ Service service = (Service)p.next();
+ result.addAll(service.findChildrenWithType(child.getClass()));
+ }
+
+ return result;
+ }
+
+
+ public Object saveDescriptor()
+ {
+ //
+ // Shallow copy
+ //
+ TemplateDescriptor clone = (TemplateDescriptor)_templateDescriptor.clone();
+ clone.descriptor = (ServiceDescriptor)_templateDescriptor.descriptor.clone();
+ return clone;
+ }
+
+ public void restoreDescriptor(Object savedDescriptor)
+ {
+ TemplateDescriptor clone = (TemplateDescriptor)savedDescriptor;
+ //
+ // Keep the same object
+ //
+ _templateDescriptor.parameters = clone.parameters;
+
+ ServiceDescriptor sd = (ServiceDescriptor)_templateDescriptor.descriptor;
+ ServiceDescriptor csd = (ServiceDescriptor)clone.descriptor;
+
+ sd.properties = csd.properties;
+ sd.description = csd.description;
+ sd.name = csd.name;
+ sd.entry = csd.entry;
+ }
+
private TemplateDescriptor _templateDescriptor;
private Adapters _adapters;
private DbEnvs _dbEnvs;
private PropertiesHolder _propertiesHolder;
+ private boolean _ephemeral;
+
static private ServiceTemplateEditor _editor;
}
diff --git a/java/src/IceGrid/TreeNode/ServiceTemplateEditor.java b/java/src/IceGrid/TreeNode/ServiceTemplateEditor.java
index 73af00f50cc..b423e0b8399 100755
--- a/java/src/IceGrid/TreeNode/ServiceTemplateEditor.java
+++ b/java/src/IceGrid/TreeNode/ServiceTemplateEditor.java
@@ -25,6 +25,11 @@ class ServiceTemplateEditor extends TemplateEditor
_subEditor.writeDescriptor();
}
+ boolean isSimpleUpdate()
+ {
+ return super.isSimpleUpdate() && _subEditor.isSimpleUpdate();
+ }
+
void append(DefaultFormBuilder builder)
{
super.append(builder);
diff --git a/java/src/IceGrid/TreeNode/ServiceTemplates.java b/java/src/IceGrid/TreeNode/ServiceTemplates.java
index 5a41b5a1842..f693dbd1bd1 100755
--- a/java/src/IceGrid/TreeNode/ServiceTemplates.java
+++ b/java/src/IceGrid/TreeNode/ServiceTemplates.java
@@ -8,15 +8,58 @@
// **********************************************************************
package IceGrid.TreeNode;
-import IceGrid.TemplateDescriptor;
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JOptionPane;
+import javax.swing.JPopupMenu;
+
+
import IceGrid.Model;
+import IceGrid.ServiceDescriptor;
+import IceGrid.TemplateDescriptor;
-class ServiceTemplates extends EditableParent
+class ServiceTemplates extends Templates
{
+ static class NewPopupMenu extends JPopupMenu
+ {
+ NewPopupMenu()
+ {
+ _new = new AbstractAction("New service template")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ _parent.newServiceTemplate();
+ }
+ };
+
+ add(_new);
+ }
+
+ void setParent(ServiceTemplates parent)
+ {
+ _parent = parent;
+ }
+
+ private ServiceTemplates _parent;
+ private Action _new;
+ }
+
+ public JPopupMenu getPopupMenu()
+ {
+ if(_popup == null)
+ {
+ _popup = new NewPopupMenu();
+ }
+ _popup.setParent(this);
+ return _popup;
+ }
+
ServiceTemplates(java.util.Map descriptors, Model model)
- throws DuplicateIdException
+ throws UpdateFailedException
{
- super(false, "Service templates", model);
+ super("Service templates", model);
_descriptors = descriptors;
@@ -46,13 +89,85 @@ class ServiceTemplates extends EditableParent
{
addChild(new ServiceTemplate((ServiceTemplate)p.next()));
}
- catch(DuplicateIdException e)
+ catch(UpdateFailedException e)
{
assert false;
}
}
}
+ void newServiceTemplate()
+ {
+ ServiceDescriptor sd = new ServiceDescriptor(
+ new java.util.LinkedList(),
+ new java.util.LinkedList(),
+ new java.util.LinkedList(),
+ "",
+ "",
+ "");
+
+ newServiceTemplate(new TemplateDescriptor(
+ sd, new java.util.LinkedList()));
+ }
+
+ void newServiceTemplate(TemplateDescriptor descriptor)
+ {
+ String id = makeNewChildId("NewServiceTemplate");
+
+ ServiceTemplate t = new ServiceTemplate(id, descriptor, _model);
+ try
+ {
+ addChild(t, true);
+ }
+ catch(UpdateFailedException e)
+ {
+ assert false;
+ }
+ _model.setSelectionPath(t.getPath());
+ }
+
+ public void paste(Object descriptor)
+ {
+ if(descriptor instanceof TemplateDescriptor)
+ {
+ TemplateDescriptor td = (TemplateDescriptor)descriptor;
+ if(td.descriptor instanceof ServiceDescriptor)
+ {
+ newServiceTemplate(td);
+ }
+ }
+ }
+
+ boolean tryAdd(String newId, TemplateDescriptor descriptor)
+ {
+ if(findChild(newId) != null)
+ {
+ JOptionPane.showMessageDialog(
+ _model.getMainFrame(),
+ "There is already a service template with the same id.",
+ "Duplicate id",
+ JOptionPane.INFORMATION_MESSAGE);
+ return false;
+ }
+ _descriptors.put(newId, descriptor);
+
+ try
+ {
+ addChild(new ServiceTemplate(true, newId, descriptor, _model), true);
+ }
+ catch(UpdateFailedException e)
+ {
+ assert false; // impossible
+ }
+ return true;
+ }
+
+ protected java.util.List findAllTemplateInstances(String templateId)
+ {
+ return getApplication().findServiceInstances(templateId);
+ }
+
+
void getUpdates(java.util.Map updates)
{
java.util.Iterator p = _children.iterator();
@@ -66,7 +181,7 @@ class ServiceTemplates extends EditableParent
}
}
- void update() throws DuplicateIdException
+ void update() throws UpdateFailedException
{
//
// The only template-descriptor update going through the
@@ -92,7 +207,7 @@ class ServiceTemplates extends EditableParent
void update(java.util.Map descriptors, String[] removeTemplates)
- throws DuplicateIdException
+ throws UpdateFailedException
{
//
// Note: _descriptors is updated by Application
@@ -133,14 +248,15 @@ class ServiceTemplates extends EditableParent
(new CommonBaseI[0]));
addChildren((CommonBaseI[])newChildren.toArray(new CommonBaseI[0]));
- p = newChildren.iterator();
- while(p.hasNext())
- {
- ServiceTemplate serviceTemplate = (ServiceTemplate)p.next();
- serviceTemplate.setParent(this);
- }
+ }
+ void removeDescriptor(String id)
+ {
+ _descriptors.remove(id);
}
+
private java.util.Map _descriptors;
+
+ static private NewPopupMenu _popup;
}
diff --git a/java/src/IceGrid/TreeNode/Services.java b/java/src/IceGrid/TreeNode/Services.java
index a9a97a1fb2b..08b7597f353 100755
--- a/java/src/IceGrid/TreeNode/Services.java
+++ b/java/src/IceGrid/TreeNode/Services.java
@@ -21,7 +21,7 @@ import IceGrid.ServiceInstanceDescriptor;
import IceGrid.TemplateDescriptor;
import IceGrid.Utils;
-class Services extends SimpleContainer
+class Services extends ListParent implements InstanceParent
{
static class NewPopupMenu extends JPopupMenu
{
@@ -103,15 +103,79 @@ class Services extends SimpleContainer
return copy;
}
+
+ private Service createService(ServiceInstanceDescriptor descriptor,
+ Application application) throws UpdateFailedException
+ {
+ ServiceDescriptor serviceDescriptor = null;
+ String serviceName = null;
+ String displayString = null;
+ Utils.Resolver serviceResolver = null;
+
+ if(descriptor.template.length() > 0)
+ {
+ TemplateDescriptor templateDescriptor
+ = application.findServiceTemplateDescriptor(descriptor.template);
+
+ assert templateDescriptor != null;
+
+ serviceDescriptor = (ServiceDescriptor)templateDescriptor.descriptor;
+ assert serviceDescriptor != null;
+
+ if(_resolver != null)
+ {
+ serviceResolver = new Utils.Resolver(_resolver, descriptor.parameterValues);
+ serviceName = serviceResolver.substitute(serviceDescriptor.name);
+ serviceResolver.put("service", serviceName);
+ displayString = serviceName + ": "
+ + templateLabel(descriptor.template,
+ serviceResolver.getParameters().values());
+ }
+ else
+ {
+ //
+ // serviceName = TemplateName<unsubstituted param 1, ....>
+ //
+ serviceName = templateLabel(descriptor.template,
+ descriptor.parameterValues.values());
+
+ }
+ }
+ else
+ {
+ serviceDescriptor = descriptor.descriptor;
+ assert serviceDescriptor != null;
+
+ if(_resolver != null)
+ {
+ serviceResolver = new Utils.Resolver(_resolver);
+ serviceName = _resolver.substitute(serviceDescriptor.name);
+ serviceResolver.put("service", serviceName);
+ }
+ else
+ {
+ serviceName = serviceDescriptor.name;
+ }
+ }
+
+ return new Service(serviceName,
+ displayString,
+ descriptor,
+ serviceDescriptor,
+ _isEditable,
+ serviceResolver,
+ _model);
+ }
+
Services(java.util.List descriptors,
- Editable editable,
+ boolean isEditable,
Utils.Resolver resolver, // Null within template
Application application)
- throws DuplicateIdException
+ throws UpdateFailedException
{
super("Services", application.getModel());
_descriptors = descriptors;
- _isEditable = (editable != null);
+ _isEditable = isEditable;
_resolver = resolver;
sortChildren(false);
@@ -122,86 +186,15 @@ class Services extends SimpleContainer
ServiceInstanceDescriptor descriptor =
(ServiceInstanceDescriptor)p.next();
- ServiceDescriptor serviceDescriptor = null;
- String serviceName = null;
- String displayString = null;
- Utils.Resolver serviceResolver = null;
-
- if(descriptor.template.length() > 0)
+ try
{
- TemplateDescriptor templateDescriptor
- = application.findServiceTemplateDescriptor(descriptor.template);
-
- if(templateDescriptor == null)
- {
- //
- // We've just removed this template instance;
- // cascadeDeleteServiceInstance will later remove this descriptor
- //
- assert editable != null;
- editable.markModified();
- continue;
- }
- else
- {
- serviceDescriptor = (ServiceDescriptor)templateDescriptor.descriptor;
- assert serviceDescriptor != null;
-
- if(resolver != null)
- {
- serviceResolver = new Utils.Resolver(resolver, descriptor.parameterValues);
- serviceName = serviceResolver.substitute(serviceDescriptor.name);
- serviceResolver.put("service", serviceName);
- displayString = serviceName + ": "
- + templateLabel(descriptor.template,
- serviceResolver.getParameters().values());
- }
- else
- {
- //
- // serviceName = TemplateName<unsubstituted param 1, ....>
- //
- serviceName = templateLabel(descriptor.template,
- descriptor.parameterValues.values());
-
- }
- }
+ addChild(createService(descriptor, application));
}
- else
+ catch(UpdateFailedException e)
{
- serviceDescriptor = descriptor.descriptor;
- assert serviceDescriptor != null;
-
- if(resolver != null)
- {
- serviceResolver = new Utils.Resolver(resolver);
- serviceName = resolver.substitute(serviceDescriptor.name);
- serviceResolver.put("service", serviceName);
- }
- else
- {
- serviceName = serviceDescriptor.name;
- }
+ e.addParent(this);
+ throw e;
}
-
- addChild(new Service(serviceName,
- displayString,
- descriptor,
- serviceDescriptor,
- editable != null,
- serviceResolver,
- application,
- _model));
- }
- }
-
- public void unregister()
- {
- java.util.Iterator p = _children.iterator();
- while(p.hasNext())
- {
- Service service = (Service)p.next();
- service.unregister();
}
}
@@ -209,12 +202,7 @@ class Services extends SimpleContainer
{
String baseName = descriptor.descriptor == null ? "NewService" :
descriptor.descriptor.name;
- String name = baseName;
- int i = 0;
- while(findChild(name) != null || findChild("*" + name) != null)
- {
- name = baseName + "-" + (++i);
- }
+ String name = makeNewChildId(baseName);
if(descriptor.descriptor != null)
{
@@ -261,11 +249,10 @@ class Services extends SimpleContainer
{
addChild(service, true);
}
- catch(DuplicateIdException e)
+ catch(UpdateFailedException e)
{
assert false;
}
- service.setParent(this);
_model.setSelectionPath(service.getPath());
}
@@ -278,25 +265,131 @@ class Services extends SimpleContainer
}
}
+ boolean isEditable()
+ {
+ return _isEditable;
+ }
- void cascadeDeleteServiceInstance(String templateId)
+ protected boolean validate(Object d)
{
- java.util.Iterator p = _descriptors.iterator();
- while(p.hasNext())
+ ServiceInstanceDescriptor descriptor = (ServiceInstanceDescriptor)d;
+
+ String newName;
+ if(descriptor.template.length() > 0)
{
- ServiceInstanceDescriptor instanceDescriptor =
- (ServiceInstanceDescriptor)p.next();
+ TemplateDescriptor templateDescriptor
+ = getApplication().findServiceTemplateDescriptor(descriptor.template);
+
+ assert templateDescriptor != null;
- if(instanceDescriptor.template.equals(templateId))
+ ServiceDescriptor serviceDescriptor = (ServiceDescriptor)templateDescriptor.descriptor;
+ assert serviceDescriptor != null;
+ Utils.Resolver serviceResolver = _resolver == null ? null :
+ new Utils.Resolver(_resolver, descriptor.parameterValues);
+
+ newName = Utils.substitute(serviceDescriptor.name, serviceResolver);
+ }
+ else
+ {
+ newName = Utils.substitute(descriptor.descriptor.name, _resolver);
+ }
+
+ CommonBase child = findChild(newName);
+ if(child != null && child.getDescriptor() != descriptor)
+ {
+ JOptionPane.showMessageDialog(
+ _model.getMainFrame(),
+ _model.getRoot().identify(_parent.getPath())
+ + " has already a service named '"
+ + newName + "'",
+ "Duplicate service name error",
+ JOptionPane.ERROR_MESSAGE);
+ return false;
+ }
+ return true;
+ }
+
+ protected void applyUpdate(Object d)
+ {
+ ServiceInstanceDescriptor descriptor = (ServiceInstanceDescriptor)d;
+
+ CommonBase oldChild = findChildWithDescriptor(descriptor);
+ int index = -1;
+ if(oldChild != null)
+ {
+ index = getIndex(oldChild);
+ removeChild(oldChild, true);
+ }
+
+ Service service = null;
+
+ try
+ {
+ service = createService(descriptor, getApplication());
+ }
+ catch(UpdateFailedException e)
+ {
+ assert false; // impossible
+ }
+
+ try
+ {
+ if(index != -1)
{
- p.remove();
+ addChild(index, service, true);
}
+ else
+ {
+ addChild(service, true);
+ }
+ }
+ catch(UpdateFailedException e)
+ {
+ assert false;
}
}
- boolean isEditable()
+ java.util.List findServiceInstances(String template)
{
- return _isEditable;
+ java.util.List result = new java.util.LinkedList();
+
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ Service service = (Service)p.next();
+ ServiceInstanceDescriptor d =
+ (ServiceInstanceDescriptor)service.getDescriptor();
+ if(d.template.equals(template))
+ {
+ result.add(service);
+ }
+ }
+ return result;
+ }
+
+
+ void removeServiceInstances(String template)
+ {
+ java.util.List toRemove = new java.util.LinkedList();
+
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ Service service = (Service)p.next();
+ ServiceInstanceDescriptor d =
+ (ServiceInstanceDescriptor)service.getDescriptor();
+ if(d.template.equals(template))
+ {
+ removeDescriptor(d);
+ toRemove.add(service.getId());
+ }
+ }
+
+ if(toRemove.size() > 0)
+ {
+ getEditable().markModified();
+ removeChildren((String[])toRemove.toArray(new String[0]));
+ }
}
Utils.Resolver getResolver()
@@ -362,6 +455,78 @@ class Services extends SimpleContainer
}
}
+
+ //
+ // InstanceParent interface
+ //
+
+ public Object rebuild(CommonBase child, java.util.List editables)
+ throws UpdateFailedException
+ {
+ int index = getIndex(child);
+ assert index != -1;
+ removeChild(child, true);
+ ServiceInstanceDescriptor descriptor = (ServiceInstanceDescriptor)child.getDescriptor();
+
+ java.util.TreeMap savedParameterValues = null;
+
+ if(descriptor.template.length() > 0)
+ {
+ TemplateDescriptor templateDescriptor
+ = getApplication().findServiceTemplateDescriptor(descriptor.template);
+
+ java.util.Set parameters = new java.util.HashSet(templateDescriptor.parameters);
+ if(!parameters.equals(descriptor.parameterValues.keySet()))
+ {
+ savedParameterValues = descriptor.parameterValues;
+ descriptor.parameterValues = Editor.makeParameterValues(
+ descriptor.parameterValues, templateDescriptor.parameters);
+ editables.add(getEditable());
+ }
+ }
+
+ try
+ {
+ Service newChild = createService(descriptor, getApplication());
+ addChild(index, newChild, true);
+ }
+ catch(UpdateFailedException e)
+ {
+ restore(child, savedParameterValues);
+ throw e;
+ }
+
+ return savedParameterValues;
+ }
+
+ public void restore(CommonBase child, Object backup)
+ {
+ java.util.TreeMap savedParameterValues = (java.util.TreeMap)backup;
+
+ ServiceInstanceDescriptor descriptor =
+ (ServiceInstanceDescriptor)child.getDescriptor();
+
+ if(savedParameterValues != null)
+ {
+ descriptor.parameterValues = savedParameterValues;
+ }
+
+ CommonBase badChild = findChildWithDescriptor(descriptor);
+ int index = getIndex(badChild);
+ assert index != -1;
+ removeChild(badChild, true);
+
+ try
+ {
+ addChild(index, child, true);
+ }
+ catch(UpdateFailedException e)
+ {
+ assert false; // impossible
+ }
+ }
+
+
private final boolean _isEditable;
private final Utils.Resolver _resolver;
diff --git a/java/src/IceGrid/TreeNode/SimpleContainer.java b/java/src/IceGrid/TreeNode/SimpleContainer.java
deleted file mode 100755
index bd2dde0a577..00000000000
--- a/java/src/IceGrid/TreeNode/SimpleContainer.java
+++ /dev/null
@@ -1,52 +0,0 @@
-// **********************************************************************
-//
-// Copyright (c) 2003-2005 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 IceGrid.Model;
-
-//
-// A simple container, for example: Services, Adapters, DbEnvs
-//
-class SimpleContainer extends Parent
-{
- protected SimpleContainer(String id, Model model, boolean root)
- {
- super(id, model, root);
- }
-
- protected SimpleContainer(String id, Model model)
- {
- this(id, model, false);
- }
-
- void addDescriptor(Object descriptor)
- {
- _descriptors.add(descriptor);
- }
-
- void removeDescriptor(Object descriptor)
- {
- //
- // A straight remove uses equals(), which is not the desired behavior
- //
- java.util.Iterator p = _descriptors.iterator();
- while(p.hasNext())
- {
- if(descriptor == p.next())
- {
- p.remove();
- break;
- }
- }
- }
-
- protected java.util.List _descriptors;
-}
-
-
diff --git a/java/src/IceGrid/TreeNode/TemplateEditor.java b/java/src/IceGrid/TreeNode/TemplateEditor.java
index abab7d965c2..4e68ea07491 100755
--- a/java/src/IceGrid/TreeNode/TemplateEditor.java
+++ b/java/src/IceGrid/TreeNode/TemplateEditor.java
@@ -9,6 +9,9 @@
package IceGrid.TreeNode;
import javax.swing.JTextField;
+import javax.swing.text.*;
+
+import java.util.regex.Pattern;
import com.jgoodies.forms.builder.DefaultFormBuilder;
@@ -18,10 +21,43 @@ import IceGrid.Utils;
class TemplateEditor extends Editor
{
+ static class ParametersFilter extends DocumentFilter
+ {
+ public void insertString(DocumentFilter.FilterBypass fb,
+ int offset,
+ String string,
+ AttributeSet attr)
+ throws BadLocationException
+ {
+ if(_pattern.matcher(string).matches())
+ {
+ super.insertString(fb, offset, string, attr);
+ }
+ }
+
+ public void replace(DocumentFilter.FilterBypass fb,
+ int offset,
+ int length,
+ String text,
+ AttributeSet attrs)
+ throws BadLocationException
+ {
+ if(_pattern.matcher(text).matches())
+ {
+ super.replace(fb, offset, length, text, attrs);
+ }
+ }
+
+ private Pattern _pattern = Pattern.compile("[\\w\\s]*");
+ }
+
TemplateEditor()
{
_template.getDocument().addDocumentListener(_updateListener);
_parameters.getDocument().addDocumentListener(_updateListener);
+
+ AbstractDocument doc = (AbstractDocument)_parameters.getDocument();
+ doc.setDocumentFilter(_parametersFilter);
}
TemplateDescriptor getDescriptor()
@@ -42,10 +78,8 @@ class TemplateEditor extends Editor
boolean isSimpleUpdate()
{
- //
- // Not used since we have our own applyUpdate()
- //
- return false;
+ TemplateDescriptor descriptor = getDescriptor();
+ return _parameters.getText().equals(descriptor.parameters);
}
void append(DefaultFormBuilder builder)
@@ -66,9 +100,86 @@ class TemplateEditor extends Editor
{
TemplateDescriptor descriptor = getDescriptor();
_template.setText(_target.getId());
+ _template.setEditable(_target.isEphemeral());
_parameters.setText(parametersToString(descriptor.parameters));
}
+ protected void applyUpdate()
+ {
+ Model model = _target.getModel();
+
+ if(model.canUpdate())
+ {
+ model.disableDisplay();
+
+ try
+ {
+ if(_target.isEphemeral())
+ {
+ writeDescriptor();
+ TemplateDescriptor descriptor = getDescriptor();
+ Templates parent = (Templates)_target.getParent();
+ _target.destroy(); // just removes the child
+
+ if(!parent.tryAdd(_template.getText(), descriptor))
+ {
+ try
+ {
+ parent.addChild(_target, true);
+ }
+ catch(UpdateFailedException die)
+ {
+ assert false;
+ }
+ return;
+ }
+ else
+ {
+ _target = parent.findChildWithDescriptor(descriptor);
+ model.setSelectionPath(_target.getPath());
+ _template.setEditable(false);
+ }
+ }
+ else if(isSimpleUpdate())
+ {
+ writeDescriptor();
+ }
+ else
+ {
+ //
+ // Save to be able to rollback
+ //
+ Object savedDescriptor = _target.saveDescriptor();
+ Templates parent = (Templates)_target.getParent();
+ writeDescriptor();
+
+ if(!parent.tryUpdate(_target))
+ {
+ _target.restoreDescriptor(savedDescriptor);
+
+ //
+ // Everything was restored, user must deal with error
+ //
+ return;
+ }
+ else
+ {
+ _target = parent.findChildWithDescriptor(getDescriptor());
+ model.setSelectionPath(_target.getPath());
+ }
+ }
+
+ _target.getEditable().markModified();
+ _applyButton.setEnabled(false);
+ _discardButton.setEnabled(false);
+ }
+ finally
+ {
+ model.enableDisplay();
+ }
+ }
+ }
+
static private java.util.LinkedList stringToParameters(String s)
{
java.util.List params = java.util.Arrays.asList(s.split("\\s+"));
@@ -97,4 +208,5 @@ class TemplateEditor extends Editor
private JTextField _template = new JTextField(20);
private JTextField _parameters = new JTextField(20);
+ private DocumentFilter _parametersFilter = new ParametersFilter();
}
diff --git a/java/src/IceGrid/TreeNode/Templates.java b/java/src/IceGrid/TreeNode/Templates.java
new file mode 100755
index 00000000000..a27f017ebdb
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/Templates.java
@@ -0,0 +1,76 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 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 IceGrid.Model;
+import IceGrid.TemplateDescriptor;
+
+
+abstract class Templates extends EditableParent
+{
+ abstract boolean tryAdd(String newId, TemplateDescriptor descriptor);
+
+ abstract protected java.util.List findAllTemplateInstances(String templateId);
+
+ protected Templates(String id, Model model)
+ {
+ super(false, id, model, false);
+ }
+
+ protected Templates(Templates o)
+ {
+ super(o);
+ }
+
+ boolean tryUpdate(CommonBase child)
+ {
+ java.util.List instanceList = findAllTemplateInstances(child.getId());
+
+ 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();
+
+ java.util.Iterator p = instanceList.iterator();
+ while(p.hasNext())
+ {
+ CommonBase instance = (CommonBase)p.next();
+ InstanceParent parent = (InstanceParent)instance.getParent();
+
+ try
+ {
+ backupList.add(parent.rebuild(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));
+ }
+ return false;
+ }
+
+ oldInstanceList.add(instance);
+ parentList.add(parent);
+ }
+
+ p = editables.iterator();
+ while(p.hasNext())
+ {
+ Editable editable = (Editable)p.next();
+ editable.markModified();
+ }
+
+ ((CommonBaseI)child).fireNodeChangedEvent(this);
+
+ return true;
+ }
+}
diff --git a/java/src/IceGrid/TreeNode/UpdateFailedException.java b/java/src/IceGrid/TreeNode/UpdateFailedException.java
new file mode 100755
index 00000000000..2b68fa2f0d9
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/UpdateFailedException.java
@@ -0,0 +1,66 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 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;
+
+class UpdateFailedException extends Exception
+{
+ UpdateFailedException(Parent parent, String duplicateName)
+ {
+ _duplicateName = duplicateName;
+ _parentList = new java.util.LinkedList();
+ addParent(parent);
+ }
+
+ UpdateFailedException(String message)
+ {
+ _message = message;
+ }
+
+ void addParent(Parent parent)
+ {
+ if(_message == null)
+ {
+ if(_parentList.get(0) != parent)
+ {
+ _parentList.addFirst(parent);
+ }
+ }
+ }
+
+ public String toString()
+ {
+ if(_message == null)
+ {
+ _message = "";
+ if(_parentList != null)
+ {
+ java.util.Iterator p = _parentList.iterator();
+ while(p.hasNext())
+ {
+ Parent parent = (Parent)p.next();
+ if(!_message.equals(""))
+ {
+ _message += "/";
+ }
+ _message += parent.getId();
+ }
+ }
+ else
+ {
+ _message = "???";
+ }
+ _message += " cannot have two children named " + _duplicateName;
+ }
+ return _message;
+ }
+
+ private String _message;
+ private String _duplicateName;
+ private java.util.LinkedList _parentList;
+}