summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
Diffstat (limited to 'java/src')
-rwxr-xr-xjava/src/IceGrid/TreeNode/Adapters.java61
-rwxr-xr-xjava/src/IceGrid/TreeNode/CommunicatorSubEditor.java54
-rwxr-xr-xjava/src/IceGrid/TreeNode/DbEnv.java111
-rwxr-xr-xjava/src/IceGrid/TreeNode/DbEnvEditor.java165
-rwxr-xr-xjava/src/IceGrid/TreeNode/DbEnvs.java124
-rwxr-xr-xjava/src/IceGrid/TreeNode/Editor.java9
-rwxr-xr-xjava/src/IceGrid/TreeNode/InstanceParent.java17
-rwxr-xr-xjava/src/IceGrid/TreeNode/ListElementEditor.java63
-rwxr-xr-xjava/src/IceGrid/TreeNode/ListParent.java93
-rwxr-xr-xjava/src/IceGrid/TreeNode/Node.java6
-rwxr-xr-xjava/src/IceGrid/TreeNode/Parent.java40
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServerTemplates.java27
-rwxr-xr-xjava/src/IceGrid/TreeNode/Service.java15
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServiceTemplates.java27
-rwxr-xr-xjava/src/IceGrid/TreeNode/Services.java126
-rwxr-xr-xjava/src/IceGrid/TreeNode/TemplateEditor.java58
-rwxr-xr-xjava/src/IceGrid/TreeNode/Templates.java23
17 files changed, 679 insertions, 340 deletions
diff --git a/java/src/IceGrid/TreeNode/Adapters.java b/java/src/IceGrid/TreeNode/Adapters.java
index f80811725e0..17d4d3f7737 100755
--- a/java/src/IceGrid/TreeNode/Adapters.java
+++ b/java/src/IceGrid/TreeNode/Adapters.java
@@ -8,12 +8,7 @@
// **********************************************************************
package IceGrid.TreeNode;
-import java.awt.event.ActionEvent;
-
-import javax.swing.AbstractAction;
-import javax.swing.Action;
import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import IceGrid.AdapterDescriptor;
@@ -119,11 +114,7 @@ class Adapters extends ListParent
while(p.hasNext())
{
AdapterDescriptor descriptor = (AdapterDescriptor)p.next();
-
- String adapterName = Utils.substitute(descriptor.name, _resolver);
-
- addChild(new Adapter(adapterName, descriptor,
- _resolver, _model));
+ addChild(createAdapter(descriptor));
}
}
@@ -131,49 +122,21 @@ class Adapters extends ListParent
{
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)
+
+ CommonBase addNewChild(Object d) throws UpdateFailedException
{
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);
+ Adapter adapter = createAdapter(descriptor);
+ addChild(adapter, true);
+ return adapter;
}
catch(UpdateFailedException e)
{
- assert false;
+ e.addParent(this);
+ throw e;
}
}
@@ -201,6 +164,12 @@ class Adapters extends ListParent
_model.setSelectionPath(adapter.getPath());
}
+ private Adapter createAdapter(AdapterDescriptor descriptor)
+ {
+ String adapterName = Utils.substitute(descriptor.name, _resolver);
+ return new Adapter(adapterName, descriptor, _resolver, _model);
+ }
+
private Utils.Resolver _resolver;
private boolean _isEditable;
private boolean _inIceBox;
diff --git a/java/src/IceGrid/TreeNode/CommunicatorSubEditor.java b/java/src/IceGrid/TreeNode/CommunicatorSubEditor.java
index 001e4ae14d2..4ff6dea69e7 100755
--- a/java/src/IceGrid/TreeNode/CommunicatorSubEditor.java
+++ b/java/src/IceGrid/TreeNode/CommunicatorSubEditor.java
@@ -15,7 +15,6 @@ import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
-import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
@@ -64,30 +63,7 @@ class CommunicatorSubEditor
_mainEditor.getUpdateListener());
}
- void setPropertiesField()
- {
- final Utils.Resolver detailResolver = _mainEditor.getDetailResolver();
-
- Ice.StringHolder toolTipHolder = new Ice.StringHolder();
- Utils.Stringifier stringifier = new Utils.Stringifier()
- {
- public String toString(Object obj)
- {
- java.util.Map.Entry entry = (java.util.Map.Entry)obj;
-
- return Utils.substitute((String)entry.getKey(), detailResolver)
- + "="
- + Utils.substitute((String)entry.getValue(), detailResolver);
- }
- };
-
- _properties.setText(
- Utils.stringify(_propertiesMap.entrySet(), stringifier,
- ", ", toolTipHolder));
- _properties.setToolTipText(toolTipHolder.value);
- }
-
-
+
void append(DefaultFormBuilder builder)
{
builder.append("Description");
@@ -127,11 +103,35 @@ class CommunicatorSubEditor
_description.setOpaque(isEditable);
}
+ private void setPropertiesField()
+ {
+ final Utils.Resolver detailResolver = _mainEditor.getDetailResolver();
+
+ Ice.StringHolder toolTipHolder = new Ice.StringHolder();
+ Utils.Stringifier stringifier = new Utils.Stringifier()
+ {
+ public String toString(Object obj)
+ {
+ java.util.Map.Entry entry = (java.util.Map.Entry)obj;
+
+ return Utils.substitute((String)entry.getKey(), detailResolver)
+ + "="
+ + Utils.substitute((String)entry.getValue(), detailResolver);
+ }
+ };
+
+ _properties.setText(
+ Utils.stringify(_propertiesMap.entrySet(), stringifier,
+ ", ", toolTipHolder));
+ _properties.setToolTipText(toolTipHolder.value);
+ }
+
+
protected Editor _mainEditor;
+
+ private JTextArea _description = new JTextArea(3, 20);
private JTextField _properties = new JTextField(20);
- private JTextArea _description = new JTextArea(3, 20);
-
private java.util.Map _propertiesMap;
private TableDialog _propertiesDialog;
private JButton _propertiesButton = new JButton("...");
diff --git a/java/src/IceGrid/TreeNode/DbEnv.java b/java/src/IceGrid/TreeNode/DbEnv.java
index 66a2da19887..74441e7202a 100755
--- a/java/src/IceGrid/TreeNode/DbEnv.java
+++ b/java/src/IceGrid/TreeNode/DbEnv.java
@@ -10,6 +10,7 @@ package IceGrid.TreeNode;
import IceGrid.DbEnvDescriptor;
import IceGrid.Model;
+import IceGrid.SimpleInternalFrame;
import IceGrid.Utils;
class DbEnv extends Leaf
@@ -19,6 +20,61 @@ class DbEnv extends Leaf
return (DbEnvDescriptor)d.clone();
}
+ //
+ // Actions
+ //
+ public boolean[] getAvailableActions()
+ {
+ boolean[] actions = new boolean[ACTION_COUNT];
+ actions[COPY] = true;
+
+ if(_parent.getAvailableActions()[PASTE])
+ {
+ actions[PASTE] = true;
+ }
+ if(isEditable())
+ {
+ actions[DELETE] = true;
+ }
+
+ if(_resolver != null && !_ephemeral)
+ {
+ actions[SUBSTITUTE_VARS] = true;
+ }
+ return actions;
+ }
+
+ public void copy()
+ {
+ _model.setClipboard(copyDescriptor(_descriptor));
+ if(_parent.getAvailableActions()[PASTE])
+ {
+ _model.getActions()[PASTE].setEnabled(true);
+ }
+ }
+ public void paste()
+ {
+ _parent.paste();
+ }
+
+ public void displayProperties()
+ {
+ SimpleInternalFrame propertiesFrame = _model.getPropertiesFrame();
+
+ propertiesFrame.setTitle("Properties for " + _id);
+ if(_editor == null)
+ {
+ _editor = new DbEnvEditor(_model.getMainFrame());
+ }
+
+ _editor.show(this);
+ propertiesFrame.setContent(_editor.getComponent());
+
+ propertiesFrame.validate();
+ propertiesFrame.repaint();
+ }
+
+
public Object getDescriptor()
{
return _descriptor;
@@ -28,15 +84,68 @@ class DbEnv extends Leaf
{
return copyDescriptor(_descriptor);
}
-
+
+ public Object saveDescriptor()
+ {
+ return copyDescriptor(_descriptor);
+ }
+
+ public void restoreDescriptor(Object savedDescriptor)
+ {
+ DbEnvDescriptor clone = (DbEnvDescriptor)savedDescriptor;
+ _descriptor.name = clone.name;
+ _descriptor.dbHome = clone.dbHome;
+ _descriptor.properties = clone.properties;
+ }
+
+ public boolean destroy()
+ {
+ return _parent == null ? false :
+ ((ListParent)_parent).destroyChild(this);
+ }
+
+ public boolean isEphemeral()
+ {
+ return _ephemeral;
+ }
+
DbEnv(String dbEnvName, DbEnvDescriptor descriptor,
Utils.Resolver resolver, Model model)
{
super(dbEnvName, model);
+ _ephemeral = false;
_descriptor = descriptor;
_resolver = resolver;
}
+ DbEnv(String dbEnvName, DbEnvDescriptor descriptor, Model model)
+ {
+ super(dbEnvName, model);
+ _ephemeral = true;
+ _descriptor = descriptor;
+ }
+
+ Utils.Resolver getResolver()
+ {
+ return _resolver;
+ }
+
+ boolean isEditable()
+ {
+ if(_parent == null)
+ {
+ return false;
+ }
+ else
+ {
+ return ((DbEnvs)_parent).isEditable();
+ }
+
+ }
+
private DbEnvDescriptor _descriptor;
private Utils.Resolver _resolver;
+ private final boolean _ephemeral;
+
+ static private DbEnvEditor _editor;
}
diff --git a/java/src/IceGrid/TreeNode/DbEnvEditor.java b/java/src/IceGrid/TreeNode/DbEnvEditor.java
new file mode 100755
index 00000000000..4cd1a65cb1d
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/DbEnvEditor.java
@@ -0,0 +1,165 @@
+// **********************************************************************
+//
+// 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 java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JButton;
+
+import javax.swing.JFrame;
+import javax.swing.JTextField;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+import IceGrid.DbEnvDescriptor;
+import IceGrid.Model;
+import IceGrid.ObjectDescriptor;
+import IceGrid.TableDialog;
+import IceGrid.Utils;
+
+class DbEnvEditor extends ListElementEditor
+{
+ DbEnvEditor(JFrame parentFrame)
+ {
+ _name.getDocument().addDocumentListener(_updateListener);
+ _dbHome.getDocument().addDocumentListener(_updateListener);
+
+ _properties.setEditable(false);
+
+ //
+ // _propertiesButton
+ //
+ _propertiesDialog = new TableDialog(parentFrame,
+ "Berkeley DB Configuration Properties",
+ "Name",
+ "Value", true);
+
+ Action openPropertiesDialog = new AbstractAction("...")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ java.util.Map result =
+ _propertiesDialog.show(_propertiesMap,
+ getPanel());
+ if(result != null)
+ {
+ updated();
+ _propertiesMap = result;
+ setPropertiesField();
+ }
+ }
+ };
+ _propertiesButton = new JButton(openPropertiesDialog);
+ }
+
+
+ //
+ // From Editor:
+ //
+
+ void writeDescriptor()
+ {
+ DbEnvDescriptor descriptor =
+ (DbEnvDescriptor)getDbEnv().getDescriptor();
+ descriptor.name = _name.getText();
+ descriptor.dbHome = _dbHome.getText();
+ descriptor.properties = Editor.mapToProperties(_propertiesMap);
+ }
+
+ boolean isSimpleUpdate()
+ {
+ DbEnvDescriptor descriptor =
+ (DbEnvDescriptor)getDbEnv().getDescriptor();
+ return descriptor.name.equals(_name.getText());
+ }
+
+ void append(DefaultFormBuilder builder)
+ {
+ builder.append("Name" );
+ builder.append(_name, 3);
+ builder.nextLine();
+
+ builder.append("DB Home" );
+ builder.append(_dbHome, 3);
+ builder.nextLine();
+
+ builder.append("Properties");
+ builder.append(_properties, _propertiesButton);
+ builder.nextLine();
+ }
+
+ void show(DbEnv dbEnv)
+ {
+ detectUpdates(false);
+ setTarget(dbEnv);
+
+ DbEnvDescriptor descriptor = (DbEnvDescriptor)dbEnv.getDescriptor();
+
+ Utils.Resolver resolver = null;
+ if(dbEnv.getModel().substitute())
+ {
+ resolver = dbEnv.getResolver();
+ }
+ boolean isEditable = dbEnv.isEditable() && resolver == null;
+
+ _name.setText(
+ Utils.substitute(descriptor.name, resolver));
+ _name.setEditable(isEditable);
+
+ _dbHome.setText(
+ Utils.substitute(descriptor.dbHome, resolver));
+ _dbHome.setEditable(isEditable);
+
+ _propertiesMap = Editor.propertiesToMap(descriptor.properties);
+ setPropertiesField();
+ _propertiesButton.setEnabled(isEditable);
+
+ _applyButton.setEnabled(dbEnv.isEphemeral());
+ _discardButton.setEnabled(dbEnv.isEphemeral());
+ detectUpdates(true);
+ }
+
+ private DbEnv getDbEnv()
+ {
+ return (DbEnv)_target;
+ }
+
+ private void setPropertiesField()
+ {
+ final Utils.Resolver resolver = getDbEnv().getResolver();
+
+ Ice.StringHolder toolTipHolder = new Ice.StringHolder();
+ Utils.Stringifier stringifier = new Utils.Stringifier()
+ {
+ public String toString(Object obj)
+ {
+ java.util.Map.Entry entry = (java.util.Map.Entry)obj;
+
+ return Utils.substitute((String)entry.getKey(), resolver)
+ + "="
+ + Utils.substitute((String)entry.getValue(), resolver);
+ }
+ };
+
+ _properties.setText(
+ Utils.stringify(_propertiesMap.entrySet(), stringifier,
+ ", ", toolTipHolder));
+ _properties.setToolTipText(toolTipHolder.value);
+ }
+
+ private JTextField _name = new JTextField(20);
+ private JTextField _dbHome = new JTextField(20);
+
+ private JTextField _properties = new JTextField(20);
+ private java.util.Map _propertiesMap;
+ private TableDialog _propertiesDialog;
+ private JButton _propertiesButton = new JButton("...");
+}
diff --git a/java/src/IceGrid/TreeNode/DbEnvs.java b/java/src/IceGrid/TreeNode/DbEnvs.java
index 96d3b08767c..c68690ff85b 100755
--- a/java/src/IceGrid/TreeNode/DbEnvs.java
+++ b/java/src/IceGrid/TreeNode/DbEnvs.java
@@ -8,11 +8,14 @@
// **********************************************************************
package IceGrid.TreeNode;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+
import IceGrid.DbEnvDescriptor;
import IceGrid.Model;
import IceGrid.Utils;
-class DbEnvs extends Parent
+class DbEnvs extends ListParent
{
static public java.util.LinkedList copyDescriptors(java.util.LinkedList list)
{
@@ -25,7 +28,84 @@ class DbEnvs extends Parent
return copy;
}
+ //
+ // Actions
+ //
+ public boolean[] getAvailableActions()
+ {
+ boolean[] actions = new boolean[ACTION_COUNT];
+
+ Object descriptor = _model.getClipboard();
+ if(descriptor != null)
+ {
+ actions[PASTE] = _isEditable &&
+ descriptor instanceof DbEnvDescriptor;
+ }
+
+ actions[NEW_DBENV] = _isEditable;
+ return actions;
+ }
+
+ public JPopupMenu getPopupMenu()
+ {
+ if(_popup == null)
+ {
+ _popup = new PopupMenu(_model);
+ JMenuItem item = new JMenuItem(_model.getActions()[NEW_DBENV]);
+ item.setText("New DbEnv");
+ _popup.add(item);
+ }
+ if(_isEditable)
+ {
+ return _popup;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public void newDbEnv()
+ {
+ DbEnvDescriptor descriptor = new DbEnvDescriptor(
+ "NewDbEnv",
+ "",
+ new java.util.LinkedList());
+
+ newDbEnv(descriptor);
+ }
+ public void paste()
+ {
+ Object descriptor = _model.getClipboard();
+ assert _isEditable &&
+ descriptor instanceof DbEnvDescriptor;
+
+ DbEnvDescriptor d = DbEnv.copyDescriptor(
+ (DbEnvDescriptor)descriptor);
+ d.name = makeNewChildId(d.name);
+ newDbEnv(d);
+ }
+
+ CommonBase addNewChild(Object d) throws UpdateFailedException
+ {
+ System.err.println("Adding new child to " + _id);
+
+ DbEnvDescriptor descriptor = (DbEnvDescriptor)d;
+
+ try
+ {
+ DbEnv dbEnv = createDbEnv(descriptor);
+ addChild(dbEnv, true);
+ return dbEnv;
+ }
+ catch(UpdateFailedException e)
+ {
+ e.addParent(this);
+ throw e;
+ }
+ }
+
DbEnvs(java.util.List descriptors,
boolean isEditable,
Utils.Resolver resolver,
@@ -34,15 +114,45 @@ class DbEnvs extends Parent
{
super("DbEnvs", model);
_isEditable = isEditable;
- java.util.Iterator p = descriptors.iterator();
+ _descriptors = descriptors;
+ _resolver = resolver;
+
+ java.util.Iterator p = _descriptors.iterator();
while(p.hasNext())
{
- DbEnvDescriptor descriptor = (DbEnvDescriptor)p.next();
-
- String dbEnvName = Utils.substitute(descriptor.name, resolver);
- addChild(new DbEnv(dbEnvName, descriptor, resolver, _model));
+ addChild(createDbEnv((DbEnvDescriptor)p.next()));
}
}
- private boolean _isEditable;
+ boolean isEditable()
+ {
+ return _isEditable;
+ }
+
+ private DbEnv createDbEnv(DbEnvDescriptor descriptor)
+ {
+ String dbEnvName = Utils.substitute(descriptor.name, _resolver);
+ return new DbEnv(dbEnvName, descriptor, _resolver, _model);
+ }
+
+ private void newDbEnv(DbEnvDescriptor descriptor)
+ {
+ descriptor.name = makeNewChildId(descriptor.name);
+ DbEnv dbEnv = new DbEnv(descriptor.name, descriptor, _model);
+ try
+ {
+ addChild(dbEnv, true);
+ }
+ catch(UpdateFailedException e)
+ {
+ assert false;
+ }
+ _model.setSelectionPath(dbEnv.getPath());
+
+ }
+
+ private final boolean _isEditable;
+ private Utils.Resolver _resolver;
+
+ static private JPopupMenu _popup;
}
diff --git a/java/src/IceGrid/TreeNode/Editor.java b/java/src/IceGrid/TreeNode/Editor.java
index 864763b8e11..3817142c37e 100755
--- a/java/src/IceGrid/TreeNode/Editor.java
+++ b/java/src/IceGrid/TreeNode/Editor.java
@@ -172,7 +172,14 @@ abstract class Editor
protected void discardUpdate()
{
- _target.getModel().refreshDisplay();
+ if(_target.isEphemeral())
+ {
+ _target.delete();
+ }
+ else
+ {
+ _target.getModel().refreshDisplay();
+ }
}
static java.util.Map propertiesToMap(java.util.List props)
diff --git a/java/src/IceGrid/TreeNode/InstanceParent.java b/java/src/IceGrid/TreeNode/InstanceParent.java
deleted file mode 100755
index 89f80b147a3..00000000000
--- a/java/src/IceGrid/TreeNode/InstanceParent.java
+++ /dev/null
@@ -1,17 +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;
-
-interface InstanceParent
-{
- Object rebuildChild(CommonBase child, java.util.List editables)
- throws UpdateFailedException;
-
- void restoreChild(CommonBase child, Object backup);
-}
diff --git a/java/src/IceGrid/TreeNode/ListElementEditor.java b/java/src/IceGrid/TreeNode/ListElementEditor.java
index 184c458caa8..04667d39b27 100755
--- a/java/src/IceGrid/TreeNode/ListElementEditor.java
+++ b/java/src/IceGrid/TreeNode/ListElementEditor.java
@@ -8,6 +8,8 @@
// **********************************************************************
package IceGrid.TreeNode;
+import javax.swing.JOptionPane;
+
import IceGrid.Model;
abstract class ListElementEditor extends Editor
@@ -34,15 +36,17 @@ abstract class ListElementEditor extends Editor
ListParent parent = (ListParent)_target.getParent();
writeDescriptor();
Object descriptor = _target.getDescriptor();
- parent.addDescriptor(descriptor);
_target.destroy(); // just removes the child
- if(!parent.tryUpdate(descriptor))
+ try
+ {
+ parent.tryAdd(descriptor);
+ }
+ catch(UpdateFailedException e)
{
//
- // Restores old display
+ // Restore ephemeral
//
- parent.removeDescriptor(descriptor);
try
{
parent.addChild(_target, true);
@@ -51,14 +55,23 @@ abstract class ListElementEditor extends Editor
{
assert false;
}
- return;
- }
- else
- {
- _target = parent.findChildWithDescriptor(descriptor);
+
+ JOptionPane.showMessageDialog(
+ model.getMainFrame(),
+ e.toString(),
+ "Apply failed",
+ JOptionPane.ERROR_MESSAGE);
+
model.setSelectionPath(_target.getPath());
- model.showActions(_target);
+ return;
}
+
+ //
+ // Success
+ //
+ _target = parent.findChildWithDescriptor(descriptor);
+ model.setSelectionPath(_target.getPath());
+ model.showActions(_target);
}
else if(isSimpleUpdate())
{
@@ -73,23 +86,29 @@ abstract class ListElementEditor extends Editor
ListParent parent = (ListParent)_target.getParent();
writeDescriptor();
- if(!parent.tryUpdate(_target.getDescriptor()))
+ try
{
- _target.restoreDescriptor(savedDescriptor);
-
- //
- // Everything was restored, user must deal with error
- //
- return;
+ parent.tryUpdate(_target);
}
- else
+ catch(UpdateFailedException e)
{
- _target = parent.findChildWithDescriptor(_target.getDescriptor());
- model.setSelectionPath(_target.getPath());
- model.showActions(_target);
+ _target.restoreDescriptor(savedDescriptor);
+ JOptionPane.showMessageDialog(
+ model.getMainFrame(),
+ e.toString(),
+ "Apply failed",
+ JOptionPane.ERROR_MESSAGE);
+ return;
}
+
+ //
+ // Success
+ //
+ _target = parent.findChildWithDescriptor(_target.getDescriptor());
+ model.setSelectionPath(_target.getPath());
+ model.showActions(_target);
}
-
+
postUpdate();
_target.getEditable().markModified();
diff --git a/java/src/IceGrid/TreeNode/ListParent.java b/java/src/IceGrid/TreeNode/ListParent.java
index b16a5d8ad38..2053edc3e85 100755
--- a/java/src/IceGrid/TreeNode/ListParent.java
+++ b/java/src/IceGrid/TreeNode/ListParent.java
@@ -15,11 +15,6 @@ import IceGrid.Model;
//
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);
@@ -30,12 +25,12 @@ abstract class ListParent extends Parent
this(id, model, false);
}
- void addDescriptor(Object descriptor)
+ protected void addDescriptor(Object descriptor)
{
_descriptors.add(descriptor);
}
- void removeDescriptor(Object descriptor)
+ protected void removeDescriptor(Object descriptor)
{
//
// A straight remove uses equals(), which is not the desired behavior
@@ -52,37 +47,88 @@ abstract class ListParent extends Parent
}
//
- // Try to update, returns true upon success
- // Only the child corresponding to the given descriptor needs to
- // be created or recreated
+ // Try to add this new element
//
- boolean tryUpdate(Object descriptor)
+ void tryAdd(Object descriptor)
+ throws UpdateFailedException
{
+ _descriptors.add(descriptor);
+
+ java.util.List newChildren = new java.util.LinkedList();
java.util.List list = _parent.findAllInstances(this);
-
- //
- // First validate
- //
+ System.err.println("Parent == " + _parent.getId());
+ System.err.println("Found " + list.size() + " instances");
java.util.Iterator p = list.iterator();
while(p.hasNext())
{
ListParent container = (ListParent)p.next();
- if(!container.validate(descriptor))
+
+ try
{
- return false;
+ newChildren.add(container.addNewChild(descriptor));
+ }
+ catch(UpdateFailedException e)
+ {
+ //
+ // Rollback
+ //
+ java.util.Iterator q = newChildren.iterator();
+ p = list.iterator();
+ while(q.hasNext())
+ {
+ container = (ListParent)p.next();
+ container.removeChild((CommonBase)q.next());
+ }
+ removeDescriptor(descriptor);
+ throw e;
+ }
+ }
+ }
+
+ //
+ // Try to update this child
+ //
+ void tryUpdate(CommonBase child)
+ throws UpdateFailedException
+ {
+ java.util.List list = _parent.findAllInstances(this);
+ Object descriptor = child.getDescriptor();
+
+ java.util.List backupList = new java.util.Vector();
+ java.util.List children = new java.util.Vector();
+ java.util.List editables = new java.util.LinkedList();
+
+ java.util.Iterator p = list.iterator();
+ while(p.hasNext())
+ {
+ ListParent parent = (ListParent)p.next();
+ try
+ {
+ child = parent.findChildWithDescriptor(descriptor);
+ backupList.add(parent.rebuildChild(child, editables));
+ children.add(child);
+ }
+ catch(UpdateFailedException e)
+ {
+ for(int i = backupList.size() - 1; i >= 0; --i)
+ {
+ parent = (ListParent)list.get(i);
+ child = (CommonBase)children.get(i);
+ parent.restoreChild(child, backupList.get(i));
+ }
+ throw e;
}
}
//
- // Then applyUpdate
+ // Success
//
- p = list.iterator();
+ p = editables.iterator();
while(p.hasNext())
{
- ListParent container = (ListParent)p.next();
- container.applyUpdate(descriptor);
+ Editable editable = (Editable)p.next();
+ editable.markModified();
}
- return true;
}
@@ -95,7 +141,7 @@ abstract class ListParent extends Parent
}
else
{
- if(isEditable() && _model.canUpdate())
+ if(_model.canUpdate())
{
Object descriptor = child.getDescriptor();
removeDescriptor(descriptor);
@@ -122,6 +168,7 @@ abstract class ListParent extends Parent
}
}
+
protected java.util.List _descriptors;
}
diff --git a/java/src/IceGrid/TreeNode/Node.java b/java/src/IceGrid/TreeNode/Node.java
index 5be88e1afae..4203a1195d5 100755
--- a/java/src/IceGrid/TreeNode/Node.java
+++ b/java/src/IceGrid/TreeNode/Node.java
@@ -31,7 +31,7 @@ import IceGrid.SimpleInternalFrame;
import IceGrid.TemplateDescriptor;
import IceGrid.Utils;
-class Node extends EditableParent implements InstanceParent
+class Node extends EditableParent
{
static public NodeDescriptor
copyDescriptor(NodeDescriptor nd)
@@ -289,7 +289,7 @@ class Node extends EditableParent implements InstanceParent
java.util.Map parameterValues;
}
- public Object rebuildChild(CommonBase child, java.util.List editables)
+ Object rebuildChild(CommonBase child, java.util.List editables)
throws UpdateFailedException
{
ServerBackup backup = new ServerBackup();
@@ -380,7 +380,7 @@ class Node extends EditableParent implements InstanceParent
return backup;
}
- public void restoreChild(CommonBase child, Object backupObject)
+ void restoreChild(CommonBase child, Object backupObject)
{
ServerBackup backup = (ServerBackup)backupObject;
if(backup.removedElements != null)
diff --git a/java/src/IceGrid/TreeNode/Parent.java b/java/src/IceGrid/TreeNode/Parent.java
index 7d411b8e9b4..4be2012b0e5 100755
--- a/java/src/IceGrid/TreeNode/Parent.java
+++ b/java/src/IceGrid/TreeNode/Parent.java
@@ -576,6 +576,46 @@ class Parent extends CommonBaseI
this(id, model, false);
}
+
+ CommonBase addNewChild(Object descriptor)
+ throws UpdateFailedException
+ {
+ assert false;
+ return null;
+ }
+
+ Object rebuildChild(CommonBase child, java.util.List editables)
+ throws UpdateFailedException
+ {
+ Object descriptor = child.getDescriptor();
+ removeChild(child, true);
+ try
+ {
+ addNewChild(descriptor);
+ }
+ catch(UpdateFailedException e)
+ {
+ addChild(child, true);
+ throw e;
+ }
+ return null;
+ }
+
+ void restoreChild(CommonBase child, Object backup)
+ {
+ CommonBase badChild = findChildWithDescriptor(child.getDescriptor());
+ removeChild(badChild, true);
+
+ try
+ {
+ addChild(child, true);
+ }
+ catch(UpdateFailedException e)
+ {
+ assert false; // impossible
+ }
+ }
+
protected void sortChildren(boolean val)
{
_sortChildren = val;
diff --git a/java/src/IceGrid/TreeNode/ServerTemplates.java b/java/src/IceGrid/TreeNode/ServerTemplates.java
index b03e0a61355..c99f024082d 100755
--- a/java/src/IceGrid/TreeNode/ServerTemplates.java
+++ b/java/src/IceGrid/TreeNode/ServerTemplates.java
@@ -9,7 +9,6 @@
package IceGrid.TreeNode;
import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import IceGrid.IceBoxDescriptor;
@@ -169,19 +168,9 @@ class ServerTemplates extends Templates
_model.setSelectionPath(t.getPath());
}
- boolean tryAdd(String newId, TemplateDescriptor descriptor)
+ void tryAdd(String newId, TemplateDescriptor descriptor)
+ throws UpdateFailedException
{
- if(findChild(newId) != null)
- {
- JOptionPane.showMessageDialog(
- _model.getMainFrame(),
- "There is already a server template with the same id.",
- "Duplicate id",
- JOptionPane.INFORMATION_MESSAGE);
- return false;
- }
- _descriptors.put(newId, descriptor);
-
try
{
addChild(new ServerTemplate(true, newId, descriptor,
@@ -190,17 +179,9 @@ class ServerTemplates extends Templates
catch(UpdateFailedException e)
{
e.addParent(this);
-
- JOptionPane.showMessageDialog(
- _model.getMainFrame(),
- e.toString(),
- "Apply failed",
- JOptionPane.ERROR_MESSAGE);
-
- removeDescriptor(newId);
- return false;
+ throw e;
}
- return true;
+ _descriptors.put(newId, descriptor);
}
protected java.util.List findAllTemplateInstances(String templateId)
diff --git a/java/src/IceGrid/TreeNode/Service.java b/java/src/IceGrid/TreeNode/Service.java
index 885d1bd0718..06f3c12608f 100755
--- a/java/src/IceGrid/TreeNode/Service.java
+++ b/java/src/IceGrid/TreeNode/Service.java
@@ -218,8 +218,12 @@ class Service extends Parent
//
// child == _adapters or _dbEnvs
//
- public java.util.List findAllInstances(Object child)
+ public java.util.List findAllInstances(CommonBase child)
{
+ //
+ // Find all instances of this service (in server instances)
+ // and return the list of their adapters or dbEnvs
+ //
assert getIndex(child) != -1;
java.util.List result = new java.util.LinkedList();
@@ -229,21 +233,18 @@ class Service extends Parent
//
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()));
+ Service service = (Service)services.findChildWithDescriptor(_instanceDescriptor);
+ assert service != null;
+ result.addAll(service.findChildrenWithType(child.getClass()));
}
return result;
}
-
-
Service(String name,
String displayString,
ServiceInstanceDescriptor instanceDescriptor,
diff --git a/java/src/IceGrid/TreeNode/ServiceTemplates.java b/java/src/IceGrid/TreeNode/ServiceTemplates.java
index edb2eb48b99..9afa4b8db4f 100755
--- a/java/src/IceGrid/TreeNode/ServiceTemplates.java
+++ b/java/src/IceGrid/TreeNode/ServiceTemplates.java
@@ -13,7 +13,6 @@ import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import IceGrid.Model;
@@ -122,19 +121,9 @@ class ServiceTemplates extends Templates
_model.setSelectionPath(t.getPath());
}
- boolean tryAdd(String newId, TemplateDescriptor descriptor)
+ void tryAdd(String newId, TemplateDescriptor descriptor)
+ throws UpdateFailedException
{
- 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),
@@ -143,17 +132,9 @@ class ServiceTemplates extends Templates
catch(UpdateFailedException e)
{
e.addParent(this);
-
- JOptionPane.showMessageDialog(
- _model.getMainFrame(),
- e.toString(),
- "Apply failed",
- JOptionPane.ERROR_MESSAGE);
-
- removeDescriptor(newId);
- return false;
+ throw e;
}
- return true;
+ _descriptors.put(newId, descriptor);
}
protected java.util.List findAllTemplateInstances(String templateId)
diff --git a/java/src/IceGrid/TreeNode/Services.java b/java/src/IceGrid/TreeNode/Services.java
index 2328da12180..bf3bc068e36 100755
--- a/java/src/IceGrid/TreeNode/Services.java
+++ b/java/src/IceGrid/TreeNode/Services.java
@@ -22,7 +22,7 @@ import IceGrid.ServiceInstanceDescriptor;
import IceGrid.TemplateDescriptor;
import IceGrid.Utils;
-class Services extends ListParent implements InstanceParent
+class Services extends ListParent
{
static public java.util.LinkedList
copyDescriptors(java.util.LinkedList descriptors)
@@ -261,106 +261,6 @@ class Services extends ListParent implements InstanceParent
return _isEditable;
}
- protected boolean validate(Object d)
- {
- //
- // TODO: insufficient: a child adapter could use ${service}
- // as its name and collide with another adapter.
- //
-
- ServiceInstanceDescriptor descriptor = (ServiceInstanceDescriptor)d;
-
- String newName;
- if(descriptor.template.length() > 0)
- {
- TemplateDescriptor templateDescriptor
- = getApplication().findServiceTemplateDescriptor(descriptor.template);
-
- assert templateDescriptor != null;
-
- ServiceDescriptor serviceDescriptor = (ServiceDescriptor)templateDescriptor.descriptor;
- assert serviceDescriptor != null;
-
- if(_resolver != null)
- {
- Utils.Resolver serviceResolver =
- new Utils.Resolver(_resolver,
- descriptor.parameterValues,
- templateDescriptor.parameterDefaults);
- newName = serviceResolver.substitute(serviceDescriptor.name);
- }
- else
- {
- //
- // newName = TemplateName<unsubstituted param 1, ....>
- //
- newName = templateLabel(descriptor.template,
- templateDescriptor.parameters,
- descriptor.parameterValues,
- templateDescriptor.parameterDefaults);
-
- }
- }
- 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)
- {
- addChild(index, service, true);
- }
- else
- {
- addChild(service, true);
- }
- }
- catch(UpdateFailedException e)
- {
- assert false;
- }
- }
-
java.util.List findServiceInstances(String template)
{
java.util.List result = new java.util.LinkedList();
@@ -471,12 +371,26 @@ class Services extends ListParent implements InstanceParent
_model.showActions(_model.getSelectedNode());
}
+
+ CommonBase addNewChild(Object d) throws UpdateFailedException
+ {
+ ServiceInstanceDescriptor descriptor = (ServiceInstanceDescriptor)d;
+
+ try
+ {
+ Service service = createService(descriptor, getApplication());
+ addChild(service, true);
+ return service;
+ }
+ catch(UpdateFailedException e)
+ {
+ e.addParent(this);
+ throw e;
+ }
+ }
- //
- // InstanceParent interface
- //
- public Object rebuildChild(CommonBase child, java.util.List editables)
+ Object rebuildChild(CommonBase child, java.util.List editables)
throws UpdateFailedException
{
int index = getIndex(child);
@@ -524,7 +438,7 @@ class Services extends ListParent implements InstanceParent
return savedParameterValues;
}
- public void restoreChild(CommonBase child, Object backup)
+ void restoreChild(CommonBase child, Object backup)
{
java.util.Map savedParameterValues = (java.util.Map)backup;
diff --git a/java/src/IceGrid/TreeNode/TemplateEditor.java b/java/src/IceGrid/TreeNode/TemplateEditor.java
index 4427cbf6022..c0a15d0fb48 100755
--- a/java/src/IceGrid/TreeNode/TemplateEditor.java
+++ b/java/src/IceGrid/TreeNode/TemplateEditor.java
@@ -13,12 +13,10 @@ import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
+import javax.swing.JOptionPane;
import javax.swing.JFrame;
import javax.swing.JTextField;
-
-import java.util.regex.Pattern;
-
import com.jgoodies.forms.builder.DefaultFormBuilder;
import IceGrid.Model;
@@ -122,8 +120,15 @@ class TemplateEditor extends Editor
Templates parent = (Templates)_target.getParent();
_target.destroy(); // just removes the child
- if(!parent.tryAdd(_template.getText(), descriptor))
+ try
+ {
+ parent.tryAdd(_template.getText(), descriptor);
+ }
+ catch(UpdateFailedException e)
{
+ //
+ // Re-add ephemeral child
+ //
try
{
parent.addChild(_target, true);
@@ -132,15 +137,21 @@ class TemplateEditor extends Editor
{
assert false;
}
+ JOptionPane.showMessageDialog(
+ model.getMainFrame(),
+ e.toString(),
+ "Apply failed",
+ JOptionPane.ERROR_MESSAGE);
return;
}
- else
- {
- _target = parent.findChildWithDescriptor(descriptor);
- model.setSelectionPath(_target.getPath());
- model.showActions(_target);
- _template.setEditable(false);
- }
+
+ //
+ // Success
+ //
+ _target = parent.findChildWithDescriptor(descriptor);
+ model.setSelectionPath(_target.getPath());
+ model.showActions(_target);
+ _template.setEditable(false);
}
else if(isSimpleUpdate())
{
@@ -155,21 +166,32 @@ class TemplateEditor extends Editor
Templates parent = (Templates)_target.getParent();
writeDescriptor();
- if(!parent.tryUpdate(_target))
+ try
+ {
+
+ parent.tryUpdate(_target);
+ }
+ catch(UpdateFailedException e)
{
_target.restoreDescriptor(savedDescriptor);
+ JOptionPane.showMessageDialog(
+ model.getMainFrame(),
+ e.toString(),
+ "Apply failed",
+ JOptionPane.ERROR_MESSAGE);
//
// Everything was restored, user must deal with error
//
return;
}
- else
- {
- _target = parent.findChildWithDescriptor(getDescriptor());
- model.setSelectionPath(_target.getPath());
- model.showActions(_target);
- }
+
+ //
+ // Success
+ //
+ _target = parent.findChildWithDescriptor(getDescriptor());
+ model.setSelectionPath(_target.getPath());
+ model.showActions(_target);
}
_target.getEditable().markModified();
diff --git a/java/src/IceGrid/TreeNode/Templates.java b/java/src/IceGrid/TreeNode/Templates.java
index 2a66376d567..fde01a5c92b 100755
--- a/java/src/IceGrid/TreeNode/Templates.java
+++ b/java/src/IceGrid/TreeNode/Templates.java
@@ -16,7 +16,8 @@ import IceGrid.TemplateDescriptor;
abstract class Templates extends EditableParent
{
- abstract boolean tryAdd(String newId, TemplateDescriptor descriptor);
+ abstract void tryAdd(String newId, TemplateDescriptor descriptor)
+ throws UpdateFailedException;
abstract protected java.util.List findAllTemplateInstances(String templateId);
@@ -25,7 +26,8 @@ abstract class Templates extends EditableParent
super(false, id, model, false);
}
- boolean tryUpdate(CommonBase child)
+ void tryUpdate(CommonBase child)
+ throws UpdateFailedException
{
java.util.List instanceList = findAllTemplateInstances(child.getId());
@@ -38,7 +40,7 @@ abstract class Templates extends EditableParent
while(p.hasNext())
{
CommonBase instance = (CommonBase)p.next();
- InstanceParent parent = (InstanceParent)instance.getParent();
+ Parent parent = (Parent)instance.getParent();
try
{
@@ -48,17 +50,10 @@ abstract class Templates extends EditableParent
{
for(int i = backupList.size() - 1; i >= 0; --i)
{
- parent = (InstanceParent)parentList.get(i);
+ parent = (Parent)parentList.get(i);
parent.restoreChild((CommonBase)instanceList.get(i), backupList.get(i));
}
-
- JOptionPane.showMessageDialog(
- _model.getMainFrame(),
- e.toString(),
- "Apply failed",
- JOptionPane.ERROR_MESSAGE);
-
- return false;
+ throw e;
}
parentList.add(parent);
@@ -70,9 +65,5 @@ abstract class Templates extends EditableParent
Editable editable = (Editable)p.next();
editable.markModified();
}
-
- ((CommonBaseI)child).fireNodeChangedEvent(this);
-
- return true;
}
}