diff options
author | Bernard Normier <bernard@zeroc.com> | 2005-10-12 18:10:42 +0000 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2005-10-12 18:10:42 +0000 |
commit | f5b93fb960c72cacf5d13b8f1bb678237b72f5ff (patch) | |
tree | 4b63702a50a9247bc2f5ce1cf76e7eabbbe48fb1 /java/src | |
parent | minor edits (diff) | |
download | ice-f5b93fb960c72cacf5d13b8f1bb678237b72f5ff.tar.bz2 ice-f5b93fb960c72cacf5d13b8f1bb678237b72f5ff.tar.xz ice-f5b93fb960c72cacf5d13b8f1bb678237b72f5ff.zip |
DbEnv editor + cleanup
Diffstat (limited to 'java/src')
-rwxr-xr-x | java/src/IceGrid/TreeNode/Adapters.java | 61 | ||||
-rwxr-xr-x | java/src/IceGrid/TreeNode/CommunicatorSubEditor.java | 54 | ||||
-rwxr-xr-x | java/src/IceGrid/TreeNode/DbEnv.java | 111 | ||||
-rwxr-xr-x | java/src/IceGrid/TreeNode/DbEnvEditor.java | 165 | ||||
-rwxr-xr-x | java/src/IceGrid/TreeNode/DbEnvs.java | 124 | ||||
-rwxr-xr-x | java/src/IceGrid/TreeNode/Editor.java | 9 | ||||
-rwxr-xr-x | java/src/IceGrid/TreeNode/InstanceParent.java | 17 | ||||
-rwxr-xr-x | java/src/IceGrid/TreeNode/ListElementEditor.java | 63 | ||||
-rwxr-xr-x | java/src/IceGrid/TreeNode/ListParent.java | 93 | ||||
-rwxr-xr-x | java/src/IceGrid/TreeNode/Node.java | 6 | ||||
-rwxr-xr-x | java/src/IceGrid/TreeNode/Parent.java | 40 | ||||
-rwxr-xr-x | java/src/IceGrid/TreeNode/ServerTemplates.java | 27 | ||||
-rwxr-xr-x | java/src/IceGrid/TreeNode/Service.java | 15 | ||||
-rwxr-xr-x | java/src/IceGrid/TreeNode/ServiceTemplates.java | 27 | ||||
-rwxr-xr-x | java/src/IceGrid/TreeNode/Services.java | 126 | ||||
-rwxr-xr-x | java/src/IceGrid/TreeNode/TemplateEditor.java | 58 | ||||
-rwxr-xr-x | java/src/IceGrid/TreeNode/Templates.java | 23 |
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;
}
}
|