summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2005-09-20 23:46:57 +0000
committerBernard Normier <bernard@zeroc.com>2005-09-20 23:46:57 +0000
commit9ab49898e47f7dbccff8b95d84bfdd2a6fa73db6 (patch)
tree745f5986b4e6b5a1a7436678971fc21f34afc417 /java
parentBug 467. (diff)
downloadice-9ab49898e47f7dbccff8b95d84bfdd2a6fa73db6.tar.bz2
ice-9ab49898e47f7dbccff8b95d84bfdd2a6fa73db6.tar.xz
ice-9ab49898e47f7dbccff8b95d84bfdd2a6fa73db6.zip
It's now possible to edit/add/remove services (but not service instances or
templates)
Diffstat (limited to 'java')
-rwxr-xr-xjava/src/IceGrid/Model.java3
-rwxr-xr-xjava/src/IceGrid/TreeNode/Adapter.java456
-rwxr-xr-xjava/src/IceGrid/TreeNode/AdapterEditor.java897
-rwxr-xr-xjava/src/IceGrid/TreeNode/Adapters.java336
-rwxr-xr-xjava/src/IceGrid/TreeNode/Application.java19
-rwxr-xr-xjava/src/IceGrid/TreeNode/CommonBase.java27
-rwxr-xr-xjava/src/IceGrid/TreeNode/CommonBaseI.java21
-rwxr-xr-xjava/src/IceGrid/TreeNode/CommunicatorEditor.java134
-rwxr-xr-xjava/src/IceGrid/TreeNode/DbEnv.java15
-rwxr-xr-xjava/src/IceGrid/TreeNode/DbEnvs.java12
-rwxr-xr-xjava/src/IceGrid/TreeNode/EditableParent.java2
-rwxr-xr-xjava/src/IceGrid/TreeNode/Editor.java169
-rwxr-xr-xjava/src/IceGrid/TreeNode/Leaf.java5
-rwxr-xr-xjava/src/IceGrid/TreeNode/Node.java51
-rwxr-xr-xjava/src/IceGrid/TreeNode/Nodes.java20
-rwxr-xr-xjava/src/IceGrid/TreeNode/Parent.java60
-rwxr-xr-xjava/src/IceGrid/TreeNode/PropertiesHolder.java24
-rwxr-xr-xjava/src/IceGrid/TreeNode/ReplicatedAdapter.java2
-rwxr-xr-xjava/src/IceGrid/TreeNode/Server.java68
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServerTemplate.java10
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServerTemplates.java10
-rwxr-xr-xjava/src/IceGrid/TreeNode/Service.java215
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServiceEditor.java165
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServiceTemplate.java2
-rwxr-xr-xjava/src/IceGrid/TreeNode/Services.java201
-rwxr-xr-xjava/src/IceGrid/TreeNode/SimpleContainer.java52
-rwxr-xr-xjava/src/IceGrid/TreeNode/TemplateEditor.java377
27 files changed, 2340 insertions, 1013 deletions
diff --git a/java/src/IceGrid/Model.java b/java/src/IceGrid/Model.java
index 6cc73502d10..3138a7ebbe3 100755
--- a/java/src/IceGrid/Model.java
+++ b/java/src/IceGrid/Model.java
@@ -400,7 +400,8 @@ public class Model
{
if(application.isNew())
{
- _sessionKeeper.getSession().addApplication(application.getDescriptor());
+ _sessionKeeper.getSession().addApplication(
+ (ApplicationDescriptor)application.getDescriptor());
application.commit();
}
else
diff --git a/java/src/IceGrid/TreeNode/Adapter.java b/java/src/IceGrid/TreeNode/Adapter.java
index b398dbda649..85fa36bfd5a 100755
--- a/java/src/IceGrid/TreeNode/Adapter.java
+++ b/java/src/IceGrid/TreeNode/Adapter.java
@@ -1,218 +1,238 @@
-// **********************************************************************
-//
-// 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.Component;
-import javax.swing.JTree;
-import javax.swing.tree.DefaultTreeCellRenderer;
-
-import com.jgoodies.uif_lite.panel.SimpleInternalFrame;
-
-import IceGrid.AdapterDescriptor;
-import IceGrid.Model;
-import IceGrid.Utils;
-
-class Adapter extends Leaf
-{
- //
- // Overridden to show tooltip
- //
- public Component getTreeCellRendererComponent(
- JTree tree,
- Object value,
- boolean sel,
- boolean expanded,
- boolean leaf,
- int row,
- boolean hasFocus)
- {
- if(_cellRenderer == null)
- {
- //
- // Initialization
- //
- _cellRenderer = new DefaultTreeCellRenderer();
- }
-
- _cellRenderer.setToolTipText(_toolTip);
- return _cellRenderer.getTreeCellRendererComponent(
- tree, value, sel, expanded, leaf, row, hasFocus);
- }
-
- public void displayProperties()
- {
- SimpleInternalFrame propertiesFrame = _model.getPropertiesFrame();
-
- propertiesFrame.setTitle("Properties for " + _id);
- if(_editor == null)
- {
- _editor = new AdapterEditor(_model.getMainFrame());
- }
-
- _editor.show(this);
- propertiesFrame.setContent(_editor.getComponent());
- propertiesFrame.validate();
- propertiesFrame.repaint();
- }
-
- 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 false;
- }
- }
-
- public void unregister()
- {
- if(_instanceId != null)
- {
- getApplication().unregisterAdapter(_resolver.find("node"),
- _instanceId,
- this);
- }
- }
-
- public Object copy()
- {
- return _descriptor.clone();
- }
-
-
- Adapter(String adapterName, AdapterDescriptor descriptor,
- Utils.Resolver resolver, Application application, 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();
- }
- }
-
- //
- // Fresh new temporary Adapter
- // Never becomes permanent; instead a new non-ephemeral Adapter is
- // created upon a successful "apply"
- //
- Adapter(String name, AdapterDescriptor descriptor,
- Utils.Resolver resolver, Model model)
- {
- super("*" + name, model);
- _resolver = resolver;
- _descriptor = descriptor;
- _ephemeral = true;
- }
-
- void updateProxy(Ice.ObjectPrx proxy)
- {
- assert _resolver != null;
- _proxy = proxy;
- createToolTip();
- fireNodeChangedEvent(this);
- }
-
- AdapterDescriptor getDescriptor()
- {
- return _descriptor;
- }
-
- Utils.Resolver getResolver()
- {
- return _resolver;
- }
-
- boolean isEditable()
- {
- return ((Adapters)_parent).isEditable();
- }
-
- boolean inIceBox()
- {
- return ((Adapters)_parent).inIceBox();
- }
-
- String getEndpoints()
- {
- PropertiesHolder ph = getParent().getParent().getPropertiesHolder();
- assert ph != null;
- return ph.get(_descriptor.name + ".Endpoints");
- }
-
- void setEndpoints(String newName, String newEndpoints)
- {
- PropertiesHolder ph = getParent().getParent().getPropertiesHolder();
- assert ph != null;
- ph.replace(_descriptor.name + ".Endpoints", newName + ".Endpoints",
- newEndpoints);
- }
-
- AdapterInstanceId getInstanceId()
- {
- return _instanceId;
- }
-
- public boolean isEphemeral()
- {
- return _ephemeral;
- }
-
- private void createToolTip()
- {
- if(_proxy == null)
- {
- _toolTip = null;
- }
- else
- {
- _toolTip = "Proxy: " + _model.getCommunicator().proxyToString(_proxy);
- }
- }
-
- private boolean _ephemeral;
- private AdapterDescriptor _descriptor;
- private Utils.Resolver _resolver;
-
- private AdapterInstanceId _instanceId;
- private Ice.ObjectPrx _proxy;
- private String _toolTip;
-
- static private DefaultTreeCellRenderer _cellRenderer;
- static private AdapterEditor _editor;
-}
+// **********************************************************************
+//
+// 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.Component;
+import javax.swing.JTree;
+import javax.swing.tree.DefaultTreeCellRenderer;
+
+import com.jgoodies.uif_lite.panel.SimpleInternalFrame;
+
+import IceGrid.AdapterDescriptor;
+import IceGrid.Model;
+import IceGrid.Utils;
+
+class Adapter extends Leaf
+{
+ //
+ // Overridden to show tooltip
+ //
+ public Component getTreeCellRendererComponent(
+ JTree tree,
+ Object value,
+ boolean sel,
+ boolean expanded,
+ boolean leaf,
+ int row,
+ boolean hasFocus)
+ {
+ if(_cellRenderer == null)
+ {
+ //
+ // Initialization
+ //
+ _cellRenderer = new DefaultTreeCellRenderer();
+ }
+
+ _cellRenderer.setToolTipText(_toolTip);
+ return _cellRenderer.getTreeCellRendererComponent(
+ tree, value, sel, expanded, leaf, row, hasFocus);
+ }
+
+ public void displayProperties()
+ {
+ SimpleInternalFrame propertiesFrame = _model.getPropertiesFrame();
+
+ propertiesFrame.setTitle("Properties for " + _id);
+ if(_editor == null)
+ {
+ _editor = new AdapterEditor(_model.getMainFrame());
+ }
+
+ _editor.show(this);
+ propertiesFrame.setContent(_editor.getComponent());
+ propertiesFrame.validate();
+ propertiesFrame.repaint();
+ }
+
+ 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 false;
+ }
+ }
+
+ public void unregister()
+ {
+ if(_instanceId != null)
+ {
+ getApplication().unregisterAdapter(_resolver.find("node"),
+ _instanceId,
+ this);
+ }
+ }
+
+
+ static public AdapterDescriptor copyDescriptor(AdapterDescriptor d)
+ {
+ return (AdapterDescriptor)d.clone();
+ }
+
+ public Object getDescriptor()
+ {
+ return _descriptor;
+ }
+
+ public Object saveDescriptor()
+ {
+ return copyDescriptor(_descriptor);
+ }
+
+ public void restoreDescriptor(Object savedDescriptor)
+ {
+ AdapterDescriptor ad = (AdapterDescriptor)savedDescriptor;
+
+ _descriptor.name = ad.name;
+ _descriptor.id = ad.id;
+ _descriptor.registerProcess = ad.registerProcess;
+ _descriptor.waitForActivation = ad.waitForActivation;
+ _descriptor.objects = ad.objects;
+ }
+
+ public Object copy()
+ {
+ return copyDescriptor(_descriptor);
+ }
+
+ Adapter(String adapterName, AdapterDescriptor descriptor,
+ Utils.Resolver resolver, Application application, 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();
+ }
+ }
+
+ //
+ // Fresh new temporary Adapter
+ // Never becomes permanent; instead a new non-ephemeral Adapter is
+ // created upon a successful "apply"
+ //
+ Adapter(String name, AdapterDescriptor descriptor, Model model)
+ {
+ super("*" + name, model);
+ _descriptor = descriptor;
+ _ephemeral = true;
+ }
+
+ void updateProxy(Ice.ObjectPrx proxy)
+ {
+ assert _resolver != null;
+ _proxy = proxy;
+ createToolTip();
+ fireNodeChangedEvent(this);
+ }
+
+
+ Utils.Resolver getResolver()
+ {
+ return _resolver;
+ }
+
+ boolean isEditable()
+ {
+ return ((Adapters)_parent).isEditable();
+ }
+
+ boolean inIceBox()
+ {
+ return ((Adapters)_parent).inIceBox();
+ }
+
+ String getEndpoints()
+ {
+ PropertiesHolder ph = getParent().getParent().getPropertiesHolder();
+ assert ph != null;
+ return ph.get(_descriptor.name + ".Endpoints");
+ }
+
+ void setEndpoints(String newName, String newEndpoints)
+ {
+ PropertiesHolder ph = getParent().getParent().getPropertiesHolder();
+ assert ph != null;
+ ph.replace(_descriptor.name + ".Endpoints", newName + ".Endpoints",
+ newEndpoints);
+ }
+
+ AdapterInstanceId getInstanceId()
+ {
+ return _instanceId;
+ }
+
+ public boolean isEphemeral()
+ {
+ return _ephemeral;
+ }
+
+ private void createToolTip()
+ {
+ if(_proxy == null)
+ {
+ _toolTip = null;
+ }
+ else
+ {
+ _toolTip = "Proxy: " + _model.getCommunicator().proxyToString(_proxy);
+ }
+ }
+
+ private boolean _ephemeral;
+ private AdapterDescriptor _descriptor;
+ private Utils.Resolver _resolver;
+
+ private AdapterInstanceId _instanceId;
+ private Ice.ObjectPrx _proxy;
+ private String _toolTip;
+
+ static private DefaultTreeCellRenderer _cellRenderer;
+ static private AdapterEditor _editor;
+}
diff --git a/java/src/IceGrid/TreeNode/AdapterEditor.java b/java/src/IceGrid/TreeNode/AdapterEditor.java
index 9743ca6e4d7..89883f2e683 100755
--- a/java/src/IceGrid/TreeNode/AdapterEditor.java
+++ b/java/src/IceGrid/TreeNode/AdapterEditor.java
@@ -1,511 +1,386 @@
-// **********************************************************************
-//
-// 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.BorderLayout;
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTextField;
-import javax.swing.JTree;
-
-import javax.swing.event.DocumentListener;
-
-import javax.swing.tree.TreePath;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.factories.Borders;
-import com.jgoodies.forms.factories.ButtonBarFactory;
-import com.jgoodies.forms.layout.FormLayout;
-import com.jgoodies.forms.util.LayoutStyle;
-
-import IceGrid.AdapterDescriptor;
-import IceGrid.Model;
-import IceGrid.ObjectDescriptor;
-import IceGrid.TableDialog;
-import IceGrid.Utils;
-
-class AdapterEditor extends Editor
-{
- AdapterEditor(JFrame parentFrame)
- {
- _objects.setEditable(false);
-
- //
- // Create buttons
- //
-
- //
- // _idButton
- //
- AbstractAction gotoReplicatedAdapter = new AbstractAction("->")
- {
- public void actionPerformed(ActionEvent e)
- {
- Object obj = _id.getSelectedItem();
- if(obj != null && _adapter != null)
- {
- ReplicatedAdapter ra = null;
- if(obj instanceof ReplicatedAdapter)
- {
- ra = (ReplicatedAdapter)obj;
- }
- else
- {
- ra = _adapter.getApplication().
- findReplicatedAdapter((String)obj);
- }
- if(ra != null)
- {
- _adapter.getModel().getTree().setSelectionPath
- (ra.getPath());
- }
- }
- }
- };
- gotoReplicatedAdapter.putValue(Action.SHORT_DESCRIPTION,
- "Goto this replicated adapter");
- _idButton = new JButton(gotoReplicatedAdapter);
-
- //
- // _objectsButton
- //
- _objectsDialog = new TableDialog(parentFrame,
- "Registered Objects",
- "Object Identity",
- "Type");
-
- AbstractAction openObjectsDialog = new AbstractAction("...")
- {
- public void actionPerformed(ActionEvent e)
- {
- java.util.Map result = _objectsDialog.show(_objectsMap,
- _panel);
- if(result != null)
- {
- updated();
- _objectsMap = result;
- setObjectsField();
- }
- }
- };
- _objectsButton = new JButton(openObjectsDialog);
-
-
- Action checkRegisterProcess = new AbstractAction("Register Process")
- {
- public void actionPerformed(ActionEvent e)
- {
- updated();
- }
- };
- _registerProcess = new JCheckBox(checkRegisterProcess);
-
- Action checkWaitForActivation =
- new AbstractAction("Wait for Activation")
- {
- public void actionPerformed(ActionEvent e)
- {
- updated();
- }
- };
- _waitForActivation = new JCheckBox(checkWaitForActivation);
-
- //
- // Associate updateListener with various fields
- //
- _name.getDocument().addDocumentListener(_updateListener);
- _endpoints.getDocument().addDocumentListener(_updateListener);
-
- JTextField idTextField = (JTextField)
- _id.getEditor().getEditorComponent();
- idTextField.getDocument().addDocumentListener(_updateListener);
- }
-
-
- JComponent getComponent()
- {
- if(_panel == null)
- {
- //
- // Build everything using JGoodies's DefaultFormBuilder
- //
- FormLayout layout = new FormLayout(
- "right:pref, 3dlu, fill:pref:grow, 3dlu, pref", "");
- DefaultFormBuilder builder = new DefaultFormBuilder(layout);
- builder.setBorder(Borders.DLU2_BORDER);
- builder.setRowGroupingEnabled(true);
-
- builder.setLineGapSize(LayoutStyle.getCurrent().getLinePad());
-
- builder.append("Name" );
- builder.append(_name, 3);
- builder.nextLine();
-
- builder.append("Id", _id );
- builder.append(_idButton);
- builder.nextLine();
-
- builder.append("Endpoints" );
- builder.append(_endpoints, 3);
- builder.nextLine();
-
- builder.append("Registered Objects");
- builder.append(_objects, _objectsButton);
- builder.nextLine();
-
- builder.append("", _registerProcess);
- builder.nextLine();
- builder.append("", _waitForActivation);
- builder.nextLine();
-
- JScrollPane scrollPane =
- new JScrollPane(builder.getPanel(),
- JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
- JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
- scrollPane.setBorder(Borders.DIALOG_BORDER);
-
- _panel = new JPanel(new BorderLayout());
- _panel.add(scrollPane, BorderLayout.CENTER);
-
- JComponent buttonBar =
- ButtonBarFactory.buildRightAlignedBar(_applyButton,
- _discardButton);
- buttonBar.setBorder(Borders.DIALOG_BORDER);
- _panel.add(buttonBar, BorderLayout.SOUTH);
- }
- return _panel;
- }
-
- //
- // Write all fields except name
- //
- void writeDescriptor()
- {
- AdapterDescriptor descriptor = _adapter.getDescriptor();
- descriptor.id = getIdAsString();
- descriptor.registerProcess = _registerProcess.isSelected();
- descriptor.waitForActivation = _waitForActivation.isSelected();
- descriptor.objects = mapToObjectDescriptorSeq(_objectsMap);
- }
-
- void setObjectsField()
- {
- final Utils.Resolver resolver = _adapter.getModel().substitute() ?
- _adapter.getResolver() : null;
-
- 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)
- + " as '"
- + Utils.substitute((String)entry.getValue(), resolver)
- + "'";
- }
- };
-
- _objects.setText(
- Utils.stringify(_objectsMap.entrySet(), stringifier,
- ", ", toolTipHolder));
- _objects.setToolTipText(toolTipHolder.value);
- }
-
- void setId(String adapterId)
- {
- ReplicatedAdapters replicatedAdapters =
- _adapter.getApplication().getReplicatedAdapters();
-
- ReplicatedAdapter replicatedAdapter =
- (ReplicatedAdapter)replicatedAdapters.findChild(adapterId);
-
- if(replicatedAdapter != null)
- {
- _id.setSelectedItem(replicatedAdapter);
- }
- else
- {
- _id.setSelectedItem(adapterId);
- }
- }
-
- String getIdAsString()
- {
- Object obj = _id.getSelectedItem();
- if(obj == null)
- {
- return "";
- }
- else
- {
- if(obj instanceof ReplicatedAdapter)
- {
- ReplicatedAdapter ra = (ReplicatedAdapter)obj;
- return ra.getId();
- }
- else
- {
- return (String)obj;
- }
- }
- }
-
- protected CommonBase getTarget()
- {
- return _adapter;
- }
- protected void applyUpdate()
- {
- if(_adapter.getModel().canUpdate())
- {
- _adapter.getModel().disableDisplay();
-
- try
- {
- AdapterDescriptor descriptor = _adapter.getDescriptor();
- String newName = _name.getText();
-
- if(_adapter.isEphemeral())
- {
- String newResolvedName =
- Utils.substitute(newName, _adapter.getResolver());
- Adapters parent = (Adapters)_adapter.getParent();
-
- descriptor.name = newName;
- writeDescriptor();
- parent.addDescriptor(descriptor);
- _adapter.destroy();
-
- if(!_adapter.getApplication().applyUpdate())
- {
- //
- // Restores old display
- //
- parent = (Adapters)_adapter.getModel()
- .findNewNode(parent.getPath());
- parent.removeDescriptor(descriptor);
- try
- {
- parent.addChild(_adapter, true);
- }
- catch(DuplicateIdException die)
- {
- assert false;
- }
- _adapter.setParent(parent);
- _adapter.getModel().setSelectionPath(
- _adapter.getPath());
- return;
- }
- else
- {
- parent = (Adapters)_adapter.getModel()
- .findNewNode(parent.getPath());
- _adapter = (Adapter)parent.findChild(newResolvedName);
- _adapter.getModel()
- .setSelectionPath(_adapter.getPath());
- }
- }
- else if(descriptor.name.equals(newName))
- {
- writeDescriptor();
- }
- else
- {
- String newResolvedName =
- Utils.substitute(newName, _adapter.getResolver());
-
- //
- // Save to be able to rollback
- //
- AdapterDescriptor oldDescriptor = null;
- oldDescriptor = (AdapterDescriptor)descriptor.clone();
-
- TreePath oldPath = _adapter.getPath();
- Adapters parent = (Adapters)_adapter.getParent();
-
- descriptor.name = newName;
- writeDescriptor();
-
- if(!_adapter.getApplication().applyUpdate())
- {
- //
- // Restore descriptor
- // IMPORTANT: keep the same object!
- //
- descriptor.name = oldDescriptor.name;
- descriptor.id = oldDescriptor.id;
- descriptor.registerProcess =
- oldDescriptor.registerProcess;
- descriptor.waitForActivation =
- oldDescriptor.waitForActivation;
- descriptor.objects = oldDescriptor.objects;
-
- //
- // Need to find new Adapter node!
- //
- _adapter = (Adapter)_adapter.getModel()
- .findNewNode(oldPath);
- _adapter.getModel()
- .setSelectionPath(_adapter.getPath());
- //
- //
- // Everything was restored, user must deal with error
- //
- return;
- }
- else
- {
- parent = (Adapters)_adapter.getModel()
- .findNewNode(parent.getPath());
- _adapter = (Adapter)parent.findChild(newResolvedName);
- _adapter.getModel()
- .setSelectionPath(_adapter.getPath());
- }
- }
-
- //
- // Change enclosing properties afterwards
- //
- _adapter.setEndpoints(newName, _endpoints.getText());
-
- //
- // Mark modified
- //
- _adapter.getEditable().markModified();
-
- _applyButton.setEnabled(false);
- _discardButton.setEnabled(false);
- }
- finally
- {
- _adapter.getModel().enableDisplay();
- }
- }
- //
- // Otherwise, may wait until other user is done!
- //
- }
-
-
- void show(Adapter adapter)
- {
- detectUpdates(false);
-
- _adapter = adapter;
- AdapterDescriptor descriptor = _adapter.getDescriptor();
-
- Utils.Resolver resolver = null;
- if(_adapter.getModel().substitute() && !_adapter.isEphemeral())
- {
- resolver = _adapter.getResolver();
- }
-
- boolean isEditable = _adapter.isEditable() && resolver == null;
- boolean inIceBox = _adapter.inIceBox();
-
- _name.setText(
- Utils.substitute(descriptor.name, resolver));
- _name.setEditable(isEditable && !inIceBox);
-
- //
- // Need to make control editable & enabled before changing it
- //
- _id.setEnabled(true);
- _id.setEditable(true);
-
- ReplicatedAdapters replicatedAdapters =
- adapter.getApplication().getReplicatedAdapters();
- _id.setModel(replicatedAdapters.createComboBoxModel());
-
- String adapterId = Utils.substitute(descriptor.id, resolver);
- setId(adapterId);
-
- _id.setEnabled(isEditable);
- _id.setEditable(isEditable);
-
- _endpoints.setText(
- Utils.substitute(adapter.getEndpoints(), resolver));
- _endpoints.setEditable(isEditable);
-
- //
- // Objects
- //
- _objectsMap = objectDescriptorSeqToMap(descriptor.objects);
- setObjectsField();
- _objectsButton.setEnabled(isEditable);
-
- _registerProcess.setSelected(descriptor.registerProcess);
- _registerProcess.setEnabled(isEditable);
-
- _waitForActivation.setSelected(descriptor.waitForActivation);
- _waitForActivation.setEnabled(isEditable);
-
- _applyButton.setEnabled(_adapter.isEphemeral());
- _discardButton.setEnabled(_adapter.isEphemeral());
- detectUpdates(true);
- }
-
- static java.util.Map objectDescriptorSeqToMap(java.util.List objects)
- {
- java.util.Map result = new java.util.HashMap(objects.size());
- java.util.Iterator p = objects.iterator();
- while(p.hasNext())
- {
- ObjectDescriptor od = (ObjectDescriptor)p.next();
- result.put(Ice.Util.identityToString(od.id), od.type);
- }
- return result;
- }
-
- static java.util.LinkedList mapToObjectDescriptorSeq(java.util.Map map)
- {
- java.util.LinkedList result = new java.util.LinkedList();
- java.util.Iterator p = map.entrySet().iterator();
- while(p.hasNext())
- {
- java.util.Map.Entry entry = (java.util.Map.Entry)p.next();
- Ice.Identity id =
- Ice.Util.stringToIdentity((String)entry.getKey());
- String type = (String)entry.getValue();
- result.add(new ObjectDescriptor(id, type));
- }
- return result;
- }
-
- private JTextField _name = new JTextField(20);
- private JComboBox _id = new JComboBox();
- private JTextField _endpoints = new JTextField(20);
- private JCheckBox _registerProcess;
- private JCheckBox _waitForActivation;
- private JTextField _objects = new JTextField(20);
-
- private java.util.Map _objectsMap;
- private TableDialog _objectsDialog;
- private JButton _objectsButton = new JButton("...");
-
- private JButton _idButton;
-
- private JPanel _panel;
-
- private Adapter _adapter;
-}
+// **********************************************************************
+//
+// 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.BorderLayout;
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
+import javax.swing.JTree;
+
+import javax.swing.event.DocumentListener;
+
+import javax.swing.tree.TreePath;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.factories.Borders;
+import com.jgoodies.forms.factories.ButtonBarFactory;
+import com.jgoodies.forms.layout.FormLayout;
+import com.jgoodies.forms.util.LayoutStyle;
+
+import IceGrid.AdapterDescriptor;
+import IceGrid.Model;
+import IceGrid.ObjectDescriptor;
+import IceGrid.TableDialog;
+import IceGrid.Utils;
+
+class AdapterEditor extends Editor
+{
+ AdapterEditor(JFrame parentFrame)
+ {
+ _objects.setEditable(false);
+
+ //
+ // Create buttons
+ //
+
+ //
+ // _idButton
+ //
+ AbstractAction gotoReplicatedAdapter = new AbstractAction("->")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ Object obj = _id.getSelectedItem();
+ Adapter adapter = getAdapter();
+
+ if(obj != null && adapter != null)
+ {
+ ReplicatedAdapter ra = null;
+ if(obj instanceof ReplicatedAdapter)
+ {
+ ra = (ReplicatedAdapter)obj;
+ }
+ else
+ {
+ ra = adapter.getApplication().
+ findReplicatedAdapter((String)obj);
+ }
+ if(ra != null)
+ {
+ adapter.getModel().getTree().setSelectionPath
+ (ra.getPath());
+ }
+ }
+ }
+ };
+ gotoReplicatedAdapter.putValue(Action.SHORT_DESCRIPTION,
+ "Goto this replicated adapter");
+ _idButton = new JButton(gotoReplicatedAdapter);
+
+ //
+ // _objectsButton
+ //
+ _objectsDialog = new TableDialog(parentFrame,
+ "Registered Objects",
+ "Object Identity",
+ "Type");
+
+ AbstractAction openObjectsDialog = new AbstractAction("...")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ java.util.Map result = _objectsDialog.show(_objectsMap,
+ _panel);
+ if(result != null)
+ {
+ updated();
+ _objectsMap = result;
+ setObjectsField();
+ }
+ }
+ };
+ _objectsButton = new JButton(openObjectsDialog);
+
+
+ Action checkRegisterProcess = new AbstractAction("Register Process")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ updated();
+ }
+ };
+ _registerProcess = new JCheckBox(checkRegisterProcess);
+
+ Action checkWaitForActivation =
+ new AbstractAction("Wait for Activation")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ updated();
+ }
+ };
+ _waitForActivation = new JCheckBox(checkWaitForActivation);
+
+ //
+ // Associate updateListener with various fields
+ //
+ _name.getDocument().addDocumentListener(_updateListener);
+ _endpoints.getDocument().addDocumentListener(_updateListener);
+
+ JTextField idTextField = (JTextField)
+ _id.getEditor().getEditorComponent();
+ idTextField.getDocument().addDocumentListener(_updateListener);
+ }
+
+
+ JComponent getComponent()
+ {
+ if(_panel == null)
+ {
+ //
+ // Build everything using JGoodies's DefaultFormBuilder
+ //
+ FormLayout layout = new FormLayout(
+ "right:pref, 3dlu, fill:pref:grow, 3dlu, pref", "");
+ DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+ builder.setBorder(Borders.DLU2_BORDER);
+ builder.setRowGroupingEnabled(true);
+
+ builder.setLineGapSize(LayoutStyle.getCurrent().getLinePad());
+
+ builder.append("Name" );
+ builder.append(_name, 3);
+ builder.nextLine();
+
+ builder.append("Id", _id );
+ builder.append(_idButton);
+ builder.nextLine();
+
+ builder.append("Endpoints" );
+ builder.append(_endpoints, 3);
+ builder.nextLine();
+
+ builder.append("Registered Objects");
+ builder.append(_objects, _objectsButton);
+ builder.nextLine();
+
+ builder.append("", _registerProcess);
+ builder.nextLine();
+ builder.append("", _waitForActivation);
+ builder.nextLine();
+
+ _panel = buildPanel(builder.getPanel());
+ }
+ return _panel;
+ }
+
+ //
+ // From Editor:
+ //
+
+ void writeDescriptor()
+ {
+ AdapterDescriptor descriptor =
+ (AdapterDescriptor)getAdapter().getDescriptor();
+ descriptor.name = _name.getText();
+ descriptor.id = getIdAsString();
+ descriptor.registerProcess = _registerProcess.isSelected();
+ descriptor.waitForActivation = _waitForActivation.isSelected();
+ descriptor.objects = mapToObjectDescriptorSeq(_objectsMap);
+ }
+
+ boolean isSimpleUpdate()
+ {
+ AdapterDescriptor descriptor =
+ (AdapterDescriptor)getAdapter().getDescriptor();
+ return descriptor.name.equals(_name.getText());
+ }
+
+ void postUpdate()
+ {
+ //
+ // Change enclosing properties after successful update
+ //
+ getAdapter().setEndpoints(_name.getText(), _endpoints.getText());
+ }
+
+
+ void setObjectsField()
+ {
+ Adapter adapter = getAdapter();
+
+ final Utils.Resolver resolver = adapter.getModel().substitute() ?
+ adapter.getResolver() : null;
+
+ 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)
+ + " as '"
+ + Utils.substitute((String)entry.getValue(), resolver)
+ + "'";
+ }
+ };
+
+ _objects.setText(
+ Utils.stringify(_objectsMap.entrySet(), stringifier,
+ ", ", toolTipHolder));
+ _objects.setToolTipText(toolTipHolder.value);
+ }
+
+ void setId(String adapterId)
+ {
+ ReplicatedAdapters replicatedAdapters =
+ getAdapter().getApplication().getReplicatedAdapters();
+
+ ReplicatedAdapter replicatedAdapter =
+ (ReplicatedAdapter)replicatedAdapters.findChild(adapterId);
+
+ if(replicatedAdapter != null)
+ {
+ _id.setSelectedItem(replicatedAdapter);
+ }
+ else
+ {
+ _id.setSelectedItem(adapterId);
+ }
+ }
+
+ String getIdAsString()
+ {
+ Object obj = _id.getSelectedItem();
+ if(obj == null)
+ {
+ return "";
+ }
+ else
+ {
+ if(obj instanceof ReplicatedAdapter)
+ {
+ ReplicatedAdapter ra = (ReplicatedAdapter)obj;
+ return ra.getId();
+ }
+ else
+ {
+ return (String)obj;
+ }
+ }
+ }
+
+ void show(Adapter adapter)
+ {
+ detectUpdates(false);
+ setTarget(adapter);
+
+ AdapterDescriptor descriptor = (AdapterDescriptor)adapter.getDescriptor();
+
+ Utils.Resolver resolver = null;
+ if(adapter.getModel().substitute())
+ {
+ resolver = adapter.getResolver();
+ }
+
+ boolean isEditable = adapter.isEditable() && resolver == null;
+ boolean inIceBox = adapter.inIceBox();
+
+ _name.setText(
+ Utils.substitute(descriptor.name, resolver));
+ _name.setEditable(isEditable && !inIceBox);
+
+ //
+ // Need to make control editable & enabled before changing it
+ //
+ _id.setEnabled(true);
+ _id.setEditable(true);
+
+ ReplicatedAdapters replicatedAdapters =
+ adapter.getApplication().getReplicatedAdapters();
+ _id.setModel(replicatedAdapters.createComboBoxModel());
+
+ String adapterId = Utils.substitute(descriptor.id, resolver);
+ setId(adapterId);
+
+ _id.setEnabled(isEditable);
+ _id.setEditable(isEditable);
+
+ _endpoints.setText(
+ Utils.substitute(adapter.getEndpoints(), resolver));
+ _endpoints.setEditable(isEditable);
+
+ //
+ // Objects
+ //
+ _objectsMap = objectDescriptorSeqToMap(descriptor.objects);
+ setObjectsField();
+ _objectsButton.setEnabled(isEditable);
+
+ _registerProcess.setSelected(descriptor.registerProcess);
+ _registerProcess.setEnabled(isEditable);
+
+ _waitForActivation.setSelected(descriptor.waitForActivation);
+ _waitForActivation.setEnabled(isEditable);
+
+ _applyButton.setEnabled(adapter.isEphemeral());
+ _discardButton.setEnabled(adapter.isEphemeral());
+ detectUpdates(true);
+ }
+
+ Adapter getAdapter()
+ {
+ return (Adapter)_target;
+ }
+
+ static java.util.Map objectDescriptorSeqToMap(java.util.List objects)
+ {
+ java.util.Map result = new java.util.HashMap(objects.size());
+ java.util.Iterator p = objects.iterator();
+ while(p.hasNext())
+ {
+ ObjectDescriptor od = (ObjectDescriptor)p.next();
+ result.put(Ice.Util.identityToString(od.id), od.type);
+ }
+ return result;
+ }
+
+ static java.util.LinkedList mapToObjectDescriptorSeq(java.util.Map map)
+ {
+ java.util.LinkedList result = new java.util.LinkedList();
+ java.util.Iterator p = map.entrySet().iterator();
+ while(p.hasNext())
+ {
+ java.util.Map.Entry entry = (java.util.Map.Entry)p.next();
+ Ice.Identity id =
+ Ice.Util.stringToIdentity((String)entry.getKey());
+ String type = (String)entry.getValue();
+ result.add(new ObjectDescriptor(id, type));
+ }
+ return result;
+ }
+
+ private JTextField _name = new JTextField(20);
+ private JComboBox _id = new JComboBox();
+ private JTextField _endpoints = new JTextField(20);
+ private JCheckBox _registerProcess;
+ private JCheckBox _waitForActivation;
+ private JTextField _objects = new JTextField(20);
+
+ private java.util.Map _objectsMap;
+ private TableDialog _objectsDialog;
+ private JButton _objectsButton = new JButton("...");
+
+ private JButton _idButton;
+
+ private JPanel _panel;
+}
diff --git a/java/src/IceGrid/TreeNode/Adapters.java b/java/src/IceGrid/TreeNode/Adapters.java
index acb19c48cad..3402e29687b 100755
--- a/java/src/IceGrid/TreeNode/Adapters.java
+++ b/java/src/IceGrid/TreeNode/Adapters.java
@@ -1,152 +1,184 @@
-// **********************************************************************
-//
-// 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.AdapterDescriptor;
-import IceGrid.Model;
-import IceGrid.Utils;
-
-
-class Adapters extends Parent
-{
- public void unregister()
- {
- java.util.Iterator p = _children.iterator();
- while(p.hasNext())
- {
- Adapter adapter = (Adapter)p.next();
- adapter.unregister();
- }
- }
-
-
- Adapters(java.util.List descriptors, boolean isEditable,
- boolean inIceBox, Utils.Resolver resolver,
- Application application, Model model)
- throws DuplicateIdException
- {
- super("Adapters", model);
- _descriptors = descriptors;
- _isEditable = isEditable;
- _inIceBox = inIceBox;
- _resolver = resolver;
-
- java.util.Iterator p = _descriptors.iterator();
- while(p.hasNext())
- {
- AdapterDescriptor descriptor = (AdapterDescriptor)p.next();
-
- String adapterName = Utils.substitute(descriptor.name,
- _resolver);
-
- addChild(new Adapter(adapterName, descriptor,
- _resolver, application, _model));
- }
- }
-
- boolean canHaveNewChild()
- {
- return _isEditable && !_inIceBox;
- }
-
- boolean isEditable()
- {
- return _isEditable;
- }
-
- boolean inIceBox()
- {
- return _inIceBox;
- }
-
- void newChild()
- {
- newAdapter(null);
- }
-
- void newAdapter(AdapterDescriptor descriptor)
- {
- //
- // 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);
- }
-
- if(descriptor == null)
- {
- CommonBase parent = getParent();
- String defaultId = (parent instanceof Service || parent instanceof ServiceTemplate) ?
- "${server}.${service}." + name : "${server}." + name;
-
- descriptor = new AdapterDescriptor(
- name,
- defaultId,
- false,
- true,
- new java.util.LinkedList());
- }
- else
- {
- descriptor.name = name;
- }
-
- Adapter adapter = new Adapter(name, descriptor, _resolver, _model);
- try
- {
- addChild(adapter, true);
- }
- catch(DuplicateIdException e)
- {
- assert false;
- }
- adapter.setParent(this);
- _model.setSelectionPath(adapter.getPath());
- }
-
- public void paste(Object descriptor)
- {
- if(canHaveNewChild() && descriptor instanceof AdapterDescriptor)
- {
- AdapterDescriptor d = (AdapterDescriptor)descriptor;
- newAdapter((AdapterDescriptor)d.clone());
- }
- }
-
- void addDescriptor(AdapterDescriptor descriptor)
- {
- _descriptors.add(descriptor);
- }
-
- void removeDescriptor(AdapterDescriptor 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;
- }
- }
- }
-
- private java.util.List _descriptors;
- private Utils.Resolver _resolver;
- private boolean _isEditable;
- private boolean _inIceBox;
-}
+// **********************************************************************
+//
+// 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.JPopupMenu;
+
+import IceGrid.AdapterDescriptor;
+import IceGrid.Model;
+import IceGrid.Utils;
+
+class Adapters extends SimpleContainer
+{
+ static class NewPopupMenu extends JPopupMenu
+ {
+ NewPopupMenu()
+ {
+ _new = new AbstractAction("New adapter")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ _parent.newAdapter(null);
+ }
+ };
+
+ add(_new);
+ }
+
+ void setParent(Adapters parent)
+ {
+ _parent = parent;
+ }
+
+ private Adapters _parent;
+ private Action _new;
+ }
+
+ public JPopupMenu getPopupMenu()
+ {
+ if(canHaveNewChild())
+ {
+ if(_popup == null)
+ {
+ _popup = new NewPopupMenu();
+ }
+ _popup.setParent(this);
+ return _popup;
+ }
+ else
+ {
+ 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)
+ {
+ java.util.LinkedList copy = new java.util.LinkedList();
+ java.util.Iterator p = descriptors.iterator();
+ while(p.hasNext())
+ {
+ copy.add(Adapter.copyDescriptor((AdapterDescriptor)p.next()));
+ }
+ return copy;
+ }
+
+ Adapters(java.util.List descriptors, boolean isEditable,
+ boolean inIceBox, Utils.Resolver resolver,
+ Application application, Model model)
+ throws DuplicateIdException
+ {
+ super("Adapters", model);
+ _descriptors = descriptors;
+ _isEditable = isEditable;
+ _inIceBox = inIceBox;
+ _resolver = resolver;
+
+ java.util.Iterator p = _descriptors.iterator();
+ while(p.hasNext())
+ {
+ AdapterDescriptor descriptor = (AdapterDescriptor)p.next();
+
+ String adapterName = Utils.substitute(descriptor.name, _resolver);
+
+ addChild(new Adapter(adapterName, descriptor,
+ _resolver, application, _model));
+ }
+ }
+
+ boolean isEditable()
+ {
+ return _isEditable;
+ }
+
+ boolean inIceBox()
+ {
+ return _inIceBox;
+ }
+
+ boolean canHaveNewChild()
+ {
+ return _isEditable && !_inIceBox;
+ }
+
+ void newAdapter(AdapterDescriptor descriptor)
+ {
+ //
+ // 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);
+ }
+
+ if(descriptor == null)
+ {
+ CommonBase parent = getParent();
+ String defaultId = (parent instanceof Service ||
+ parent instanceof ServiceTemplate) ?
+ "${server}.${service}." + name : "${server}." + name;
+
+ descriptor = new AdapterDescriptor(
+ name,
+ defaultId,
+ false,
+ true,
+ new java.util.LinkedList());
+ }
+ else
+ {
+ descriptor.name = name;
+ }
+
+ Adapter adapter = new Adapter(name, descriptor, _model);
+ try
+ {
+ addChild(adapter, true);
+ }
+ catch(DuplicateIdException e)
+ {
+ assert false;
+ }
+ adapter.setParent(this);
+ _model.setSelectionPath(adapter.getPath());
+ }
+
+ public void paste(Object descriptor)
+ {
+ if(canHaveNewChild() && descriptor instanceof AdapterDescriptor)
+ {
+ AdapterDescriptor d = (AdapterDescriptor)descriptor;
+ newAdapter(Adapter.copyDescriptor(d));
+ }
+ }
+
+ private Utils.Resolver _resolver;
+ private boolean _isEditable;
+ private boolean _inIceBox;
+
+ static private NewPopupMenu _popup;
+}
diff --git a/java/src/IceGrid/TreeNode/Application.java b/java/src/IceGrid/TreeNode/Application.java
index 54964207531..52a55b38a86 100755
--- a/java/src/IceGrid/TreeNode/Application.java
+++ b/java/src/IceGrid/TreeNode/Application.java
@@ -20,11 +20,6 @@ import javax.swing.JOptionPane;
public class Application extends EditableParent
{
- public ApplicationDescriptor getDescriptor()
- {
- return _descriptor;
- }
-
public ApplicationUpdateDescriptor createUpdateDescriptor()
{
ApplicationUpdateDescriptor update = new ApplicationUpdateDescriptor();
@@ -116,6 +111,10 @@ public class Application extends EditableParent
_origDescription = _descriptor.description;
}
+ public Object getDescriptor()
+ {
+ return _descriptor;
+ }
//
// Builds the application and all its subtrees
@@ -226,6 +225,16 @@ public class Application extends EditableParent
_nodes.update();
}
+ void cascadeDeleteServerInstance(String templateId)
+ {
+ _nodes.cascadeDeleteServerInstance(templateId);
+ }
+
+ void cascadeDeleteServiceInstance(String templateId)
+ {
+ _nodes.cascadeDeleteServiceInstance(templateId);
+ _serverTemplates.cascadeDeleteServiceInstance(templateId);
+ }
void update(ApplicationUpdateDescriptor desc)
throws DuplicateIdException
diff --git a/java/src/IceGrid/TreeNode/CommonBase.java b/java/src/IceGrid/TreeNode/CommonBase.java
index ecd2c824d88..90fa92d1e92 100755
--- a/java/src/IceGrid/TreeNode/CommonBase.java
+++ b/java/src/IceGrid/TreeNode/CommonBase.java
@@ -92,10 +92,33 @@ public interface CommonBase extends TreeCellRenderer
//
Editable getEditable();
+ //
+ // The enclosing Application
+ //
+ Application getApplication();
+
+ //
+ // Gets the associated descriptor
+ //
+ Object getDescriptor();
//
- // Returns a copy of the descriptor underlying the object;
- // null if the object can't be copied
+ // Find child whose descriptor == the given descriptor
+ //
+ CommonBase findChildWithDescriptor(Object descriptor);
+
+ //
+ // Save & restore the descriptor
+ // How much needs to be copied depends on how what the corresponding
+ // editor writes.
+ //
+ Object saveDescriptor();
+ void restoreDescriptor(Object savedDescriptor);
+
+ //
+ // Copy the underlying data (typically descriptor);
+ // this is a _deep_ copy
+ // Objects that are not copyable return null
//
Object copy();
diff --git a/java/src/IceGrid/TreeNode/CommonBaseI.java b/java/src/IceGrid/TreeNode/CommonBaseI.java
index 066c4b15e81..d5259b72f4c 100755
--- a/java/src/IceGrid/TreeNode/CommonBaseI.java
+++ b/java/src/IceGrid/TreeNode/CommonBaseI.java
@@ -140,6 +140,22 @@ abstract class CommonBaseI implements CommonBase
return null;
}
+ public Object getDescriptor()
+ {
+ return null;
+ }
+
+ public Object saveDescriptor()
+ {
+ assert false;
+ return null;
+ }
+
+ public void restoreDescriptor(Object d)
+ {
+ assert false;
+ }
+
public Object copy()
{
return null;
@@ -147,6 +163,9 @@ abstract class CommonBaseI implements CommonBase
public void paste(Object descriptor)
{
+ //
+ // Try my parent
+ //
if(_parent != null)
{
_parent.paste(descriptor);
@@ -240,7 +259,7 @@ abstract class CommonBaseI implements CommonBase
_model = o._model;
}
- Application getApplication()
+ public Application getApplication()
{
if(_path == null || _path.getPathCount() < 2)
{
diff --git a/java/src/IceGrid/TreeNode/CommunicatorEditor.java b/java/src/IceGrid/TreeNode/CommunicatorEditor.java
new file mode 100755
index 00000000000..97fd6caeae9
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/CommunicatorEditor.java
@@ -0,0 +1,134 @@
+// **********************************************************************
+//
+// 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.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.JTextField;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.CellConstraints;
+
+import IceGrid.CommunicatorDescriptor;
+import IceGrid.Model;
+import IceGrid.TableDialog;
+import IceGrid.Utils;
+
+abstract class CommunicatorEditor extends Editor
+{
+ abstract protected Utils.Resolver getResolver();
+
+ CommunicatorEditor(JFrame parentFrame)
+ {
+ _properties.setEditable(false);
+
+ //
+ // _propertiesButton
+ //
+ _propertiesDialog = new TableDialog(parentFrame,
+ "Properties",
+ "Name",
+ "Value");
+
+ Action openPropertiesDialog = new AbstractAction("...")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ java.util.Map result =
+ _propertiesDialog.show(_propertiesMap, _panel);
+ if(result != null)
+ {
+ updated();
+ _propertiesMap = result;
+ setPropertiesField();
+ }
+ }
+ };
+ _propertiesButton = new JButton(openPropertiesDialog);
+
+ _description.getDocument().addDocumentListener(_updateListener);
+ }
+
+ void setPropertiesField()
+ {
+ final Utils.Resolver resolver = _target.getModel().substitute() ?
+ getResolver() : null;
+
+ 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);
+ }
+
+
+ void add(DefaultFormBuilder builder)
+ {
+
+ builder.append("Description");
+ builder.nextLine();
+ builder.append("");
+ builder.nextRow(-2);
+ CellConstraints cc = new CellConstraints();
+ JScrollPane scrollPane = new JScrollPane(_description);
+ builder.add(scrollPane,
+ cc.xywh(builder.getColumn(), builder.getRow(), 3, 3));
+ builder.nextRow(2);
+ builder.nextLine();
+
+ builder.append("Properties");
+ builder.append(_properties, _propertiesButton);
+ builder.nextLine();
+ }
+
+ void writeDescriptor(CommunicatorDescriptor descriptor)
+ {
+ descriptor.properties = mapToProperties(_propertiesMap);
+ descriptor.description = _description.getText();
+ }
+
+ void show(CommunicatorDescriptor descriptor, boolean isEditable)
+ {
+ _propertiesMap = propertiesToMap(descriptor.properties);
+ setPropertiesField();
+ _propertiesButton.setEnabled(isEditable);
+
+ _description.setText(descriptor.description);
+ _description.setEnabled(isEditable);
+ }
+
+ protected JPanel _panel;
+
+ 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 e0993021306..66a2da19887 100755
--- a/java/src/IceGrid/TreeNode/DbEnv.java
+++ b/java/src/IceGrid/TreeNode/DbEnv.java
@@ -14,6 +14,21 @@ import IceGrid.Utils;
class DbEnv extends Leaf
{
+ static public DbEnvDescriptor copyDescriptor(DbEnvDescriptor d)
+ {
+ return (DbEnvDescriptor)d.clone();
+ }
+
+ public Object getDescriptor()
+ {
+ return _descriptor;
+ }
+
+ public Object copyDescriptor()
+ {
+ return copyDescriptor(_descriptor);
+ }
+
DbEnv(String dbEnvName, DbEnvDescriptor descriptor,
Utils.Resolver resolver, Model model)
{
diff --git a/java/src/IceGrid/TreeNode/DbEnvs.java b/java/src/IceGrid/TreeNode/DbEnvs.java
index af53177eae7..edfa339d03c 100755
--- a/java/src/IceGrid/TreeNode/DbEnvs.java
+++ b/java/src/IceGrid/TreeNode/DbEnvs.java
@@ -14,6 +14,18 @@ import IceGrid.Utils;
class DbEnvs extends Parent
{
+ static public java.util.LinkedList copyDescriptors(java.util.LinkedList list)
+ {
+ java.util.LinkedList copy = new java.util.LinkedList();
+ java.util.Iterator p = list.iterator();
+ while(p.hasNext())
+ {
+ copy.add(DbEnv.copyDescriptor((DbEnvDescriptor)p.next()));
+ }
+ return copy;
+ }
+
+
DbEnvs(java.util.List descriptors,
boolean isEditable,
Utils.Resolver resolver,
diff --git a/java/src/IceGrid/TreeNode/EditableParent.java b/java/src/IceGrid/TreeNode/EditableParent.java
index 5c9f8738d53..5a4b9b8e44e 100755
--- a/java/src/IceGrid/TreeNode/EditableParent.java
+++ b/java/src/IceGrid/TreeNode/EditableParent.java
@@ -12,7 +12,7 @@ import IceGrid.Model;
//
// Corresponds to "root" editable descriptors such as Server,
-// Service, ServerTemplate, ServiceTemplate, Node etc.
+// ServerTemplate, ServiceTemplate, Node etc.
//
class EditableParent extends Parent implements Editable
{
diff --git a/java/src/IceGrid/TreeNode/Editor.java b/java/src/IceGrid/TreeNode/Editor.java
index 0350b10df55..9588c9cb619 100755
--- a/java/src/IceGrid/TreeNode/Editor.java
+++ b/java/src/IceGrid/TreeNode/Editor.java
@@ -8,20 +8,37 @@
// **********************************************************************
package IceGrid.TreeNode;
+import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+
+import javax.swing.tree.TreePath;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.factories.Borders;
+import com.jgoodies.forms.factories.ButtonBarFactory;
+
+import IceGrid.Model;
+import IceGrid.PropertyDescriptor;
+
//
// Base class for all editors
//
abstract class Editor
-{
+{
+ abstract void writeDescriptor();
+ abstract boolean isSimpleUpdate();
+ void postUpdate() {}
+
protected Editor()
{
//
@@ -67,6 +84,31 @@ abstract class Editor
};
}
+ protected void setTarget(CommonBase target)
+ {
+ _target = target;
+ }
+
+ protected JPanel buildPanel(JPanel innerPanel)
+ {
+ JScrollPane scrollPane =
+ new JScrollPane(innerPanel,
+ JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+ JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+
+ scrollPane.setBorder(Borders.DIALOG_BORDER);
+
+ JPanel outerPanel = new JPanel(new BorderLayout());
+ outerPanel.add(scrollPane, BorderLayout.CENTER);
+
+ JComponent buttonBar =
+ ButtonBarFactory.buildRightAlignedBar(_applyButton,
+ _discardButton);
+ buttonBar.setBorder(Borders.DIALOG_BORDER);
+ outerPanel.add(buttonBar, BorderLayout.SOUTH);
+ return outerPanel;
+ }
+
protected void updated()
{
if(_detectUpdates)
@@ -81,18 +123,137 @@ abstract class Editor
_detectUpdates = val;
}
- abstract protected CommonBase getTarget();
+ //
+ // Update when parent is a SimpleContainer
+ //
+ protected void applyUpdate()
+ {
+ Model model = _target.getModel();
- abstract protected void applyUpdate();
+ 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()
{
- getTarget().getModel().refreshDisplay();
+ _target.getModel().refreshDisplay();
+ }
+
+ static java.util.Map propertiesToMap(java.util.List props)
+ {
+ java.util.Map result = new java.util.HashMap(props.size());
+ java.util.Iterator p = props.iterator();
+ while(p.hasNext())
+ {
+ PropertyDescriptor pd = (PropertyDescriptor)p.next();
+ result.put(pd.name, pd.value);
+ }
+ return result;
+ }
+
+ static java.util.LinkedList mapToProperties(java.util.Map map)
+ {
+ java.util.LinkedList result = new java.util.LinkedList();
+ java.util.Iterator p = map.entrySet().iterator();
+ while(p.hasNext())
+ {
+ java.util.Map.Entry entry = (java.util.Map.Entry)p.next();
+ String name = (String)entry.getKey();
+ String value = (String)entry.getValue();
+ result.add(new PropertyDescriptor(name, value));
+ }
+ return result;
}
protected JButton _applyButton;
protected JButton _discardButton;
protected DocumentListener _updateListener;
+ protected CommonBase _target;
+
private boolean _detectUpdates = true;
}
diff --git a/java/src/IceGrid/TreeNode/Leaf.java b/java/src/IceGrid/TreeNode/Leaf.java
index eee9f2b7196..77060ec3900 100755
--- a/java/src/IceGrid/TreeNode/Leaf.java
+++ b/java/src/IceGrid/TreeNode/Leaf.java
@@ -41,6 +41,11 @@ class Leaf extends CommonBaseI
return null;
}
+ public CommonBase findChildWithDescriptor(Object d)
+ {
+ return null;
+ }
+
protected Leaf(String id, Model model)
{
super(id, model, false);
diff --git a/java/src/IceGrid/TreeNode/Node.java b/java/src/IceGrid/TreeNode/Node.java
index b4f67e3fa37..e8ef087755d 100755
--- a/java/src/IceGrid/TreeNode/Node.java
+++ b/java/src/IceGrid/TreeNode/Node.java
@@ -552,9 +552,13 @@ class Node extends EditableParent
server.setParent(this);
}
}
- //
- // Otherwise this template-instance will most likely be deleted
- //
+ else
+ {
+ //
+ // The child will be deleted through purgeChildren, and the descriptor
+ // will be deleted (later) through cascadeDeleteServerInstance
+ //
+ }
}
//
@@ -596,6 +600,47 @@ class Node extends EditableParent
purgeChildren(serverIdSet);
}
+ void cascadeDeleteServerInstance(String templateId)
+ {
+ if(_descriptor == null)
+ {
+ //
+ // Nothing to do
+ //
+ return;
+ }
+
+ java.util.Iterator p = _descriptor.serverInstances.iterator();
+ while(p.hasNext())
+ {
+ ServerInstanceDescriptor instanceDescriptor =
+ (ServerInstanceDescriptor)p.next();
+
+ if(instanceDescriptor.template.equals(templateId))
+ {
+ p.remove();
+ }
+ }
+ }
+
+ void cascadeDeleteServiceInstance(String templateId)
+ {
+ if(_descriptor == null)
+ {
+ //
+ // Nothing to do
+ //
+ return;
+ }
+
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ Server server = (Server)p.next();
+ server.cascadeDeleteServiceInstance(templateId);
+ }
+ }
+
private NodeDescriptor _descriptor;
private Utils.Resolver _resolver;
diff --git a/java/src/IceGrid/TreeNode/Nodes.java b/java/src/IceGrid/TreeNode/Nodes.java
index 1531a01bdc5..b6ccbe4772b 100755
--- a/java/src/IceGrid/TreeNode/Nodes.java
+++ b/java/src/IceGrid/TreeNode/Nodes.java
@@ -105,6 +105,26 @@ public class Nodes extends EditableParent
fireStructureChangedEvent(this);
}
+ void cascadeDeleteServerInstance(String templateId)
+ {
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ Node node = (Node)p.next();
+ node.cascadeDeleteServerInstance(templateId);
+ }
+ }
+
+ void cascadeDeleteServiceInstance(String templateId)
+ {
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ Node node = (Node)p.next();
+ node.cascadeDeleteServiceInstance(templateId);
+ }
+ }
+
void update(java.util.List updates, String[] removeNodes)
throws DuplicateIdException
{
diff --git a/java/src/IceGrid/TreeNode/Parent.java b/java/src/IceGrid/TreeNode/Parent.java
index c799078747d..717ea75f047 100755
--- a/java/src/IceGrid/TreeNode/Parent.java
+++ b/java/src/IceGrid/TreeNode/Parent.java
@@ -8,10 +8,6 @@
// **********************************************************************
package IceGrid.TreeNode;
-import java.awt.event.ActionEvent;
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.JPopupMenu;
import javax.swing.tree.TreePath;
import javax.swing.event.TreeModelEvent;
import IceGrid.Model;
@@ -23,31 +19,7 @@ import IceGrid.TreeModelI;
class Parent extends CommonBaseI
{
- static class NewPopupMenu extends JPopupMenu
- {
- NewPopupMenu()
- {
- _new = new AbstractAction("New")
- {
- public void actionPerformed(ActionEvent e)
- {
- _parent.newChild();
- }
- };
-
- add(_new);
- }
-
- void setParent(Parent parent)
- {
- _parent = parent;
- }
-
- protected Parent _parent;
- private Action _new;
- }
-
-
+
//
// Adapts parent to a ComboBoxModel
//
@@ -160,24 +132,20 @@ class Parent extends CommonBaseI
return null;
}
- public JPopupMenu getPopupMenu()
+ public CommonBase findChildWithDescriptor(Object descriptor)
{
- if(canHaveNewChild())
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
{
- if(_popup == null)
+ CommonBase child = (CommonBase)p.next();
+ if(descriptor == child.getDescriptor())
{
- _popup = new NewPopupMenu();
+ return child;
}
- _popup.setParent(this);
- return _popup;
- }
- else
- {
- return null;
}
+ return null;
}
-
void addChild(CommonBase child) throws DuplicateIdException
{
addChild(child, false);
@@ -522,16 +490,6 @@ class Parent extends CommonBaseI
return new ComboBoxModel();
}
- boolean canHaveNewChild()
- {
- return false;
- }
-
- void newChild()
- {
- assert canHaveNewChild();
- }
-
Parent(String id, Model model, boolean root)
{
super(id, model, root);
@@ -559,6 +517,4 @@ class Parent extends CommonBaseI
protected java.util.LinkedList _children = new java.util.LinkedList();
private ChildComparator _childComparator = new ChildComparator();
-
- static private NewPopupMenu _popup;
}
diff --git a/java/src/IceGrid/TreeNode/PropertiesHolder.java b/java/src/IceGrid/TreeNode/PropertiesHolder.java
index 0051a07d376..4e1de9ef5c6 100755
--- a/java/src/IceGrid/TreeNode/PropertiesHolder.java
+++ b/java/src/IceGrid/TreeNode/PropertiesHolder.java
@@ -37,29 +37,21 @@ class PropertiesHolder
void replace(String oldKey, String newKey, String newValue)
{
- boolean needPut = true;
- boolean needRemove = !oldKey.equals(newKey); // don't remove when oldKey == newKey
-
+ //
+ // Each PropertyDescriptor is considered immutable: so always remove + put
+ //
java.util.Iterator p = _descriptor.properties.iterator();
- while(p.hasNext() && (needRemove || needPut))
+ while(p.hasNext())
{
PropertyDescriptor pd = (PropertyDescriptor)p.next();
- if(needRemove && pd.name.equals(oldKey))
+ if(pd.name.equals(oldKey))
{
p.remove();
- needRemove = false;
- }
- if(needPut && pd.name.equals(newKey))
- {
- pd.value = newValue;
- needPut = false;
+ break; // done
}
}
-
- if(needPut)
- {
- _descriptor.properties.add(new PropertyDescriptor(newKey, newValue));
- }
+
+ _descriptor.properties.add(new PropertyDescriptor(newKey, newValue));
}
private CommunicatorDescriptor _descriptor;
}
diff --git a/java/src/IceGrid/TreeNode/ReplicatedAdapter.java b/java/src/IceGrid/TreeNode/ReplicatedAdapter.java
index a9142772610..66a96dac040 100755
--- a/java/src/IceGrid/TreeNode/ReplicatedAdapter.java
+++ b/java/src/IceGrid/TreeNode/ReplicatedAdapter.java
@@ -41,7 +41,7 @@ class ReplicatedAdapter extends EditableLeaf
//
}
- ReplicatedAdapterDescriptor getDescriptor()
+ public Object getDescriptor()
{
return _descriptor;
}
diff --git a/java/src/IceGrid/TreeNode/Server.java b/java/src/IceGrid/TreeNode/Server.java
index a1708e9b262..e885ba7e3ab 100755
--- a/java/src/IceGrid/TreeNode/Server.java
+++ b/java/src/IceGrid/TreeNode/Server.java
@@ -385,6 +385,61 @@ class Server extends EditableParent
return _propertiesHolder;
}
+ static public ServerInstanceDescriptor
+ copyDescriptor(ServerInstanceDescriptor sid)
+ {
+ return (ServerInstanceDescriptor)sid.clone();
+ }
+
+ static public ServerDescriptor
+ copyDescriptor(ServerDescriptor sd)
+ {
+ ServerDescriptor copy = null;
+ try
+ {
+ copy = (ServerDescriptor)sd.clone();
+ }
+ catch(CloneNotSupportedException e)
+ {
+ assert false;
+ }
+ copy.adapters = Adapters.copyDescriptors(copy.adapters);
+ copy.dbEnvs = DbEnvs.copyDescriptors(copy.dbEnvs);
+ // TODO: copy.patchs = Patchs.copyDescriptor(copy.patchs);
+
+ if(copy instanceof IceBoxDescriptor)
+ {
+ IceBoxDescriptor ib = (IceBoxDescriptor)copy;
+ ib.services = Services.copyDescriptors(ib.services);
+ }
+ return copy;
+ }
+
+
+ public Object getDescriptor()
+ {
+ if(_instanceDescriptor != null)
+ {
+ return _instanceDescriptor;
+ }
+ else
+ {
+ return _serverDescriptor;
+ }
+ }
+
+ public Object copy()
+ {
+ if(_instanceDescriptor != null)
+ {
+ return copyDescriptor(_instanceDescriptor);
+ }
+ else
+ {
+ return copyDescriptor(_serverDescriptor);
+ }
+ }
+
//
// Builds the server and all its sub-tree
//
@@ -482,6 +537,14 @@ class Server extends EditableParent
}
}
+ void cascadeDeleteServiceInstance(String templateId)
+ {
+ if(_services != null)
+ {
+ _services.cascadeDeleteServiceInstance(templateId);
+ }
+ }
+
void updateDynamicInfo(ServerState state, int pid)
{
@@ -570,11 +633,6 @@ class Server extends EditableParent
return _instanceDescriptor;
}
- ServerDescriptor getDescriptor()
- {
- return _serverDescriptor;
- }
-
public String toString()
{
if(_instanceDescriptor == null)
diff --git a/java/src/IceGrid/TreeNode/ServerTemplate.java b/java/src/IceGrid/TreeNode/ServerTemplate.java
index 83d3eea5683..103a8c6ca48 100755
--- a/java/src/IceGrid/TreeNode/ServerTemplate.java
+++ b/java/src/IceGrid/TreeNode/ServerTemplate.java
@@ -108,6 +108,14 @@ class ServerTemplate extends EditableParent
_adapters.setParent(this);
}
+ void cascadeDeleteServiceInstance(String templateId)
+ {
+ if(_services != null)
+ {
+ _services.cascadeDeleteServiceInstance(templateId);
+ }
+ }
+
public PropertiesHolder getPropertiesHolder()
{
return _propertiesHolder;
@@ -118,7 +126,7 @@ class ServerTemplate extends EditableParent
return templateLabel(_id, _templateDescriptor.parameters);
}
- public TemplateDescriptor getDescriptor()
+ public Object getDescriptor()
{
return _templateDescriptor;
}
diff --git a/java/src/IceGrid/TreeNode/ServerTemplates.java b/java/src/IceGrid/TreeNode/ServerTemplates.java
index e4d38c0f624..53eb4bede28 100755
--- a/java/src/IceGrid/TreeNode/ServerTemplates.java
+++ b/java/src/IceGrid/TreeNode/ServerTemplates.java
@@ -93,6 +93,16 @@ class ServerTemplates extends EditableParent
purgeChildren(_descriptors.keySet());
fireStructureChangedEvent(this);
}
+
+ void cascadeDeleteServiceInstance(String templateId)
+ {
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ ServerTemplate t = (ServerTemplate)p.next();
+ t.cascadeDeleteServiceInstance(templateId);
+ }
+ }
void update(java.util.Map updates, String[] removeTemplates)
throws DuplicateIdException
diff --git a/java/src/IceGrid/TreeNode/Service.java b/java/src/IceGrid/TreeNode/Service.java
index 3685b3881de..2f70fe3f288 100755
--- a/java/src/IceGrid/TreeNode/Service.java
+++ b/java/src/IceGrid/TreeNode/Service.java
@@ -8,6 +8,8 @@
// **********************************************************************
package IceGrid.TreeNode;
+import com.jgoodies.uif_lite.panel.SimpleInternalFrame;
+
import IceGrid.Model;
import IceGrid.ServiceDescriptor;
import IceGrid.ServiceInstanceDescriptor;
@@ -16,11 +18,170 @@ import IceGrid.Utils;
class Service extends Parent
{
+ static public ServiceInstanceDescriptor
+ copyDescriptor(ServiceInstanceDescriptor instanceDescriptor)
+ {
+ ServiceInstanceDescriptor copy = (ServiceInstanceDescriptor)
+ instanceDescriptor.clone();
+
+ if(copy.descriptor != null)
+ {
+ try
+ {
+ copy.descriptor = (ServiceDescriptor)copy.descriptor.clone();
+ }
+ catch(CloneNotSupportedException e)
+ {
+ assert false;
+ }
+ copy.descriptor.adapters = Adapters.copyDescriptors(copy.descriptor.adapters);
+ copy.descriptor.dbEnvs = DbEnvs.copyDescriptors(copy.descriptor.dbEnvs);
+
+ //
+ // Update to properties is not atomic because of Adapter endpoints
+ // (and possibly other properties set through a PropertiesHolder)
+ //
+ copy.descriptor.properties = (java.util.LinkedList)copy.descriptor.properties.clone();
+ }
+ return copy;
+ }
+
+ public Object getDescriptor()
+ {
+ return _instanceDescriptor;
+ }
+
+ public Object saveDescriptor()
+ {
+ //
+ // Must be a shallow copy
+ //
+ ServiceInstanceDescriptor saved =
+ (ServiceInstanceDescriptor)_instanceDescriptor.clone();
+
+ if(saved.descriptor != null)
+ {
+ try
+ {
+ saved.descriptor = (ServiceDescriptor)saved.descriptor.clone();
+ }
+ catch(CloneNotSupportedException e)
+ {
+ assert false;
+ }
+ }
+ return saved;
+ }
+
+ public void restoreDescriptor(Object savedDescriptor)
+ {
+ ServiceInstanceDescriptor sd = (ServiceInstanceDescriptor)savedDescriptor;
+ _instanceDescriptor.template = sd.template;
+ _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;
+ _instanceDescriptor.descriptor.entry = sd.descriptor.entry;
+ }
+ }
+
+ public Object copy()
+ {
+ return copyDescriptor(_instanceDescriptor);
+ }
+
+ 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;
+ }
+ }
+
+ public void displayProperties()
+ {
+ //
+ // Temporary
+ //
+ if(_instanceDescriptor.descriptor == null)
+ {
+ super.displayProperties();
+ return;
+ }
+
+ SimpleInternalFrame propertiesFrame = _model.getPropertiesFrame();
+ propertiesFrame.setTitle("Properties for " + _id);
+
+ if(_instanceDescriptor.descriptor != null)
+ {
+ if(_editor == null)
+ {
+ _editor = new ServiceEditor(_model.getMainFrame());
+ }
+ _editor.show(this);
+ propertiesFrame.setContent(_editor.getComponent());
+ }
+ else
+ {
+ //
+ // Use instance editor
+ //
+ }
+ propertiesFrame.validate();
+ propertiesFrame.repaint();
+ }
+
+ public String toString()
+ {
+ if(_displayString != null)
+ {
+ return _displayString;
+ }
+ else
+ {
+ return _id;
+ }
+ }
+
+ public PropertiesHolder getPropertiesHolder()
+ {
+ return _propertiesHolder;
+ }
+
+ public void unregister()
+ {
+ if(_adapters != null)
+ {
+ _adapters.unregister();
+ }
+ }
+
Service(String name,
String displayString,
ServiceInstanceDescriptor instanceDescriptor,
ServiceDescriptor serviceDescriptor,
- Editable editable,
+ boolean isEditable,
Utils.Resolver resolver,
Application application,
Model model)
@@ -31,14 +192,17 @@ class Service extends Parent
_instanceDescriptor = instanceDescriptor;
_serviceDescriptor = serviceDescriptor;
_propertiesHolder = new PropertiesHolder(serviceDescriptor);
+ _ephemeral = false;
- _isEditable = editable != null;
_resolver = resolver;
- boolean areChildrenEditable = _instanceDescriptor.template.length() == 0 && editable != null;
+ boolean areChildrenEditable = _instanceDescriptor.template.length() == 0
+ && isEditable;
_adapters = new Adapters(serviceDescriptor.adapters,
- areChildrenEditable, false, resolver, application, _model);
+ areChildrenEditable, false, resolver,
+ application,
+ _model);
addChild(_adapters);
_dbEnvs = new DbEnvs(serviceDescriptor.dbEnvs,
@@ -46,35 +210,50 @@ class Service extends Parent
addChild(_dbEnvs);
}
- public String toString()
+ //
+ // New temporary object
+ //
+ Service(String name,
+ ServiceInstanceDescriptor instanceDescriptor,
+ Model model)
{
- if(_displayString != null)
- {
- return _displayString;
- }
- else
- {
- return _id;
- }
+ super("*" + name, model);
+ _instanceDescriptor = instanceDescriptor;
+ _serviceDescriptor = instanceDescriptor.descriptor;
+ _ephemeral = true;
}
- public PropertiesHolder getPropertiesHolder()
+
+ ServiceDescriptor getServiceDescriptor()
{
- return _propertiesHolder;
+ return _serviceDescriptor;
}
- public void unregister()
+ Utils.Resolver getResolver()
{
- _adapters.unregister();
+ return _resolver;
+ }
+
+ boolean isEditable()
+ {
+ return ((Services)_parent).isEditable();
+ }
+
+ public boolean isEphemeral()
+ {
+ return _ephemeral;
}
private ServiceInstanceDescriptor _instanceDescriptor;
private ServiceDescriptor _serviceDescriptor;
private String _displayString;
- private boolean _isEditable;
+ private boolean _ephemeral;
private Utils.Resolver _resolver;
private Adapters _adapters;
private DbEnvs _dbEnvs;
private PropertiesHolder _propertiesHolder;
+
+ static private ServiceEditor _editor;
+ // static private ServiceInstanceEditor _instanceEditor;
}
diff --git a/java/src/IceGrid/TreeNode/ServiceEditor.java b/java/src/IceGrid/TreeNode/ServiceEditor.java
new file mode 100755
index 00000000000..8d7b6d725d2
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/ServiceEditor.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.BorderLayout;
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
+import javax.swing.JTree;
+
+import javax.swing.event.DocumentListener;
+
+import javax.swing.tree.TreePath;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.factories.Borders;
+import com.jgoodies.forms.factories.ButtonBarFactory;
+import com.jgoodies.forms.layout.FormLayout;
+import com.jgoodies.forms.util.LayoutStyle;
+
+import IceGrid.ServiceDescriptor;
+import IceGrid.ServiceInstanceDescriptor;
+import IceGrid.Model;
+import IceGrid.ObjectDescriptor;
+import IceGrid.TableDialog;
+import IceGrid.Utils;
+
+class ServiceEditor extends CommunicatorEditor
+{
+ ServiceEditor(JFrame parentFrame)
+ {
+ super(parentFrame);
+
+ _name.getDocument().addDocumentListener(_updateListener);
+ _entry.getDocument().addDocumentListener(_updateListener);
+ }
+
+ protected Utils.Resolver getResolver()
+ {
+ if(_target instanceof Service)
+ {
+ Service service = (Service)_target;
+
+ if(service.getModel().substitute())
+ {
+ return service.getResolver();
+ }
+ }
+ return null;
+ }
+
+ ServiceDescriptor getServiceDescriptor()
+ {
+ if(_target instanceof Service)
+ {
+ return ((Service)_target).getServiceDescriptor();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ JComponent getComponent()
+ {
+ if(_panel == null)
+ {
+ //
+ // Build everything using JGoodies's DefaultFormBuilder
+ //
+ FormLayout layout = new FormLayout(
+ "right:pref, 3dlu, fill:pref:grow, 3dlu, pref", "");
+ DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+ builder.setBorder(Borders.DLU2_BORDER);
+ builder.setRowGroupingEnabled(true);
+ builder.setLineGapSize(LayoutStyle.getCurrent().getLinePad());
+
+ builder.append("Name");
+ builder.append(_name, 3);
+ builder.nextLine();
+
+ //
+ // Add Communicator fields
+ //
+ add(builder);
+
+ builder.append("Entry");
+ builder.append(_entry, 3);
+ builder.nextLine();
+
+ _panel = buildPanel(builder.getPanel());
+ }
+ return _panel;
+ }
+
+
+ //
+ // From Editor:
+ //
+ void writeDescriptor()
+ {
+ ServiceDescriptor descriptor = getServiceDescriptor();
+ descriptor.name = _name.getText();
+ descriptor.entry = _entry.getText();
+ }
+
+ boolean isSimpleUpdate()
+ {
+ return getServiceDescriptor().name.equals(_name.getText());
+ }
+
+ void show(Service service)
+ {
+ //
+ // If it's a template instance, it's shown using
+ // ServiceInstanceEditor.show()
+ //
+ assert ((ServiceInstanceDescriptor)service.getDescriptor()).descriptor
+ != null;
+
+ detectUpdates(false);
+ setTarget(service);
+
+ ServiceDescriptor descriptor = service.getServiceDescriptor();
+ Model model = service.getModel();
+
+ Utils.Resolver resolver = getResolver();
+
+ boolean isEditable = service.isEditable() && resolver == null;
+
+ _name.setText(
+ Utils.substitute(descriptor.name, resolver));
+ _name.setEditable(isEditable);
+
+ _entry.setText(
+ Utils.substitute(descriptor.entry, resolver));
+ _entry.setEditable(isEditable);
+
+ show(descriptor, isEditable);
+
+ _applyButton.setEnabled(service.isEphemeral());
+ _discardButton.setEnabled(service.isEphemeral());
+ detectUpdates(true);
+ }
+
+ private JTextField _name = new JTextField(20);
+ private JTextField _entry = new JTextField(20);
+}
diff --git a/java/src/IceGrid/TreeNode/ServiceTemplate.java b/java/src/IceGrid/TreeNode/ServiceTemplate.java
index 176742212ad..023cc6cc501 100755
--- a/java/src/IceGrid/TreeNode/ServiceTemplate.java
+++ b/java/src/IceGrid/TreeNode/ServiceTemplate.java
@@ -64,7 +64,7 @@ class ServiceTemplate extends EditableParent
return templateLabel(_id, _templateDescriptor.parameters);
}
- TemplateDescriptor getDescriptor()
+ public Object getDescriptor()
{
return _templateDescriptor;
}
diff --git a/java/src/IceGrid/TreeNode/Services.java b/java/src/IceGrid/TreeNode/Services.java
index ebf5a2aea2d..2444782eda8 100755
--- a/java/src/IceGrid/TreeNode/Services.java
+++ b/java/src/IceGrid/TreeNode/Services.java
@@ -8,14 +8,100 @@
// **********************************************************************
package IceGrid.TreeNode;
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JPopupMenu;
+
import IceGrid.Model;
import IceGrid.ServiceDescriptor;
import IceGrid.ServiceInstanceDescriptor;
import IceGrid.TemplateDescriptor;
import IceGrid.Utils;
-class Services extends Parent
+class Services extends SimpleContainer
{
+ static class NewPopupMenu extends JPopupMenu
+ {
+ NewPopupMenu()
+ {
+ _newService = new AbstractAction("New service")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ ServiceDescriptor sd =
+ new ServiceDescriptor(new java.util.LinkedList(),
+ new java.util.LinkedList(),
+ new java.util.LinkedList(),
+ "",
+ "NewService",
+ "");
+
+ ServiceInstanceDescriptor descriptor =
+ new ServiceInstanceDescriptor("",
+ new java.util.TreeMap(),
+ sd);
+ _parent.newService(descriptor);
+ }
+ };
+
+ add(_newService);
+
+ _newInstance = new AbstractAction("New template instance")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ ServiceInstanceDescriptor descriptor =
+ new ServiceInstanceDescriptor("",
+ new java.util.TreeMap(),
+ null);
+ _parent.newService(descriptor);
+ }
+ };
+
+ add(_newInstance);
+ }
+
+ void setParent(Services parent)
+ {
+ _parent = parent;
+ }
+
+ private Services _parent;
+ private Action _newService;
+ private Action _newInstance;
+ }
+
+ public JPopupMenu getPopupMenu()
+ {
+ if(_isEditable)
+ {
+ if(_popup == null)
+ {
+ _popup = new NewPopupMenu();
+ }
+ _popup.setParent(this);
+ return _popup;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ static public java.util.LinkedList
+ copyDescriptors(java.util.LinkedList descriptors)
+ {
+ java.util.LinkedList copy = new java.util.LinkedList();
+ java.util.Iterator p = descriptors.iterator();
+ while(p.hasNext())
+ {
+ copy.add(Service.copyDescriptor((ServiceInstanceDescriptor)p.next()));
+ }
+ return copy;
+ }
+
Services(java.util.List descriptors,
Editable editable,
Utils.Resolver resolver, // Null within template
@@ -24,6 +110,7 @@ class Services extends Parent
{
super("Services", application.getModel());
_descriptors = descriptors;
+ _isEditable = (editable != null);
java.util.Iterator p = _descriptors.iterator();
while(p.hasNext())
@@ -41,34 +128,46 @@ class Services extends Parent
TemplateDescriptor templateDescriptor
= application.findServiceTemplateDescriptor(descriptor.template);
- assert templateDescriptor != null;
- serviceDescriptor = (ServiceDescriptor)templateDescriptor.descriptor;
- assert serviceDescriptor != null;
-
- if(resolver != null)
+ if(templateDescriptor == 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());
+ //
+ // We've just removed this template instance;
+ // cascadeDeleteServiceInstance will later remove this descriptor
+ //
+ assert editable != null;
+ editable.markModified();
+ continue;
}
else
{
- //
- // serviceName = TemplateName<unsubstituted param 1, ....>
- //
- serviceName = templateLabel(descriptor.template,
- descriptor.parameterValues.values());
-
+ 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);
@@ -85,7 +184,7 @@ class Services extends Parent
displayString,
descriptor,
serviceDescriptor,
- editable,
+ editable != null,
serviceResolver,
application,
_model));
@@ -102,5 +201,65 @@ class Services extends Parent
}
}
- private java.util.List _descriptors;
+ void newService(ServiceInstanceDescriptor descriptor)
+ {
+ 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);
+ }
+
+ if(descriptor.descriptor != null)
+ {
+ descriptor.descriptor.name = name;
+ }
+
+ Service service = new Service(name, descriptor, _model);
+ try
+ {
+ addChild(service, true);
+ }
+ catch(DuplicateIdException e)
+ {
+ assert false;
+ }
+ service.setParent(this);
+ _model.setSelectionPath(service.getPath());
+ }
+
+ public void paste(Object descriptor)
+ {
+ if(_isEditable && descriptor instanceof ServiceInstanceDescriptor)
+ {
+ ServiceInstanceDescriptor d = (ServiceInstanceDescriptor)descriptor;
+ newService(Service.copyDescriptor(d));
+ }
+ }
+
+
+ void cascadeDeleteServiceInstance(String templateId)
+ {
+ java.util.Iterator p = _descriptors.iterator();
+ while(p.hasNext())
+ {
+ ServiceInstanceDescriptor instanceDescriptor =
+ (ServiceInstanceDescriptor)p.next();
+
+ if(instanceDescriptor.template.equals(templateId))
+ {
+ p.remove();
+ }
+ }
+ }
+
+ boolean isEditable()
+ {
+ return _isEditable;
+ }
+
+ private final boolean _isEditable;
+ static private NewPopupMenu _popup;
}
diff --git a/java/src/IceGrid/TreeNode/SimpleContainer.java b/java/src/IceGrid/TreeNode/SimpleContainer.java
new file mode 100755
index 00000000000..bd2dde0a577
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/SimpleContainer.java
@@ -0,0 +1,52 @@
+// **********************************************************************
+//
+// 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
new file mode 100755
index 00000000000..042af49bef3
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/TemplateEditor.java
@@ -0,0 +1,377 @@
+// **********************************************************************
+//
+// 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.BorderLayout;
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
+import javax.swing.JTree;
+
+import javax.swing.event.DocumentListener;
+
+import javax.swing.tree.TreePath;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.factories.Borders;
+import com.jgoodies.forms.factories.ButtonBarFactory;
+import com.jgoodies.forms.layout.FormLayout;
+import com.jgoodies.forms.util.LayoutStyle;
+
+import IceGrid.AdapterDescriptor;
+import IceGrid.Model;
+import IceGrid.ObjectDescriptor;
+import IceGrid.TableDialog;
+import IceGrid.Utils;
+
+abstract class TemplateEditor extends Editor
+{
+ /*
+
+ TemplateEditor(boolean service)
+ {
+ _templateId.addDocumentListener(_updateListener);
+ _parameters.addDocumentListener(_updateListener);
+
+ if(service)
+ {
+ _subEditor = new ServiceEditor(this);
+ }
+ else
+ {
+ // TODO: ServerEditor
+ }
+ }
+
+ JComponent getComponent()
+ {
+ if(_panel == null)
+ {
+ //
+ // Build everything using JGoodies's DefaultFormBuilder
+ //
+ FormLayout layout = new FormLayout(
+ "right:pref, 3dlu, fill:pref:grow, 3dlu, pref", "");
+
+ DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+ builder.setBorder(Borders.DLU2_BORDER);
+ builder.setRowGroupingEnabled(true);
+
+ builder.setLineGapSize(LayoutStyle.getCurrent().getLinePad());
+
+ builder.append("Template ID");
+ builder.append(_templateId, 3);
+ builder.nextLine();
+ builder.append("Parameters");
+ builder.append(_parameters, 3);
+ builder.nextLine();
+ _subEditor.buildSubPanel(builder);
+
+
+ _panel = buildPanel(builder.getPanel());
+ }
+ return _panel;
+ }
+
+ protected CommonBase getTarget()
+ {
+ return _template;
+ }
+
+ static private java.util.LinkedList stringToSortedParams(String s)
+ {
+ java.util.List params = java.util.Arrays.asList(s.getText.split("\s+"));
+ java.util.Collections.sort(params);
+ return java.util.LinkedList(params);
+ }
+
+ static private String stringify(java.util.List params)
+ {
+ String result = "";
+ java.util.Iterator p = params.iterator();
+ while(p.hasNext())
+ {
+ if(result.equals(""))
+ {
+ result = (String)p.next();
+ }
+ else
+ {
+ result = result + " " + (String)p.next();
+ }
+ }
+ return result;
+ }
+
+ void writeDescriptor(boolean fullUpdate)
+ {
+ TemplateDescriptor descriptor = _template.getDescriptor();
+
+ if(fullUpdate)
+ {
+ descriptor.descriptor = _instanceEditor.getNewDescriptor();
+ }
+ else
+ {
+ _instanceEditor.writeDescriptor();
+ }
+ descriptor.params = stringToSortedParams(_parameters.getText());
+ }
+
+ TemplateDescriptor getNewDescriptor()
+ {
+ return new TemplateDescriptor(
+ _instanceEditor.getNewDescriptor(),
+ stringToSortedParams(_parameters.getText()));
+ }
+
+ private boolean isUpdateSafe()
+ {
+ //
+ // If parameter change => not safe!
+ //
+ if(_origParams.equals(_parameters.getText()))
+ {
+ return _instanceEditor.isUpdateSafe();
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ protected void applyUpdate()
+ {
+ if(_template.getModel().canUpdate())
+ {
+ _template.getModel().disableDisplay();
+
+ String oldId = _template.getId();
+ String newId = _templateId.getText();
+
+ try
+ {
+ TemplateDescriptor descriptor = _template.getDescriptor();
+
+ if(_template.isEphemeral())
+ {
+ Templates parent = (Templates)_template.getParent();
+ writeDescriptor(false);
+
+ if(!parent.addDescriptor(newId, descriptor))
+ {
+ JOptionPane.showMessageDialog(
+ _template.getModel().getMainFrame(),
+ "The id '" + newId + "' is already in use",
+ "Duplicate template id",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ _template.destroy();
+
+ if(!_template.getApplication().applyUpdate())
+ {
+ //
+ // Restores old display
+ //
+ parent = (Templates)_templates.getModel()
+ .findNewNode(parent.getPath());
+ parent.removeDescriptor(newId);
+ try
+ {
+ parent.addChild(_adapter, true);
+ }
+ catch(DuplicateIdException die)
+ {
+ assert false;
+ }
+ _template.setParent(parent);
+ _template.getModel().setSelectionPath(
+ _template.getPath());
+ return;
+ }
+ else
+ {
+ parent = (Templates)_template.getModel()
+ .findNewNode(parent.getPath());
+ _template = (Template)parent.findChild(newId);
+ _template.getModel()
+ .setSelectionPath(_template.getPath());
+ }
+ }
+ else if(oldId.equals(newId))
+ {
+ if(isSafeUpdate())
+ {
+ writeDescriptor(false);
+ }
+ else
+ {
+ //
+ // Full update
+ //
+
+ //
+ // Save to be able to rollback
+ //
+ TemplateDescriptor oldDescriptor = null;
+ try
+ {
+ //
+ // Shallow copy
+ //
+ oldDescriptor = (TemplateDescriptor)descriptor.clone();
+ }
+ catch(CloneNotSupportedException ce)
+ {
+ assert false; // impossible
+ }
+
+ TreePath oldPath = _template.getPath();
+ Templates parent = (Templates)_template.getParent();
+
+ writeDescriptor(true);
+
+ if(!_template.getApplication().applyUpdate())
+ {
+ //
+ // Restore descriptor
+ // IMPORTANT: keep the same object!
+ //
+ descriptor.descriptor = oldDescriptor.descriptor;
+ descriptor.parameters = oldDescriptor.parameters;
+
+ //
+ // Need to find new template node!
+ //
+ _template = (Template)_template.getModel().findNewNode(oldPath);
+ _template.getModel().setSelectionPath(_template.getPath());
+ //
+ //
+ // Everything was restored, user must deal with error
+ //
+ return;
+ }
+ //
+ // Else, no renaming, so proper node already selected
+ //
+ }
+ }
+ else
+ {
+ //
+ // Renaming
+ //
+
+ Templates parent = (Templates)_template.getParent();
+
+ TemplateDescriptor oldDescriptor = descriptor;
+ TemplateDescriptor newDescriptor = getNewDescriptor();
+
+ if(!parent.addDescriptor(newId, newDescriptor))
+ {
+ JOptionPane.showMessageDialog(
+ _template.getModel().getMainFrame(),
+ "The id '" + newId + "' is already in use",
+ "Duplicate template id",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ parent.removeDescriptor(oldId);
+
+ if(!_template.getApplication().applyUpdate())
+ {
+ parent = (Templates)_template.getModel()
+ .findNewNode(parent.getPath());
+
+ parent.addDescriptor(oldId, oldDescriptor);
+
+ //
+ // Need to find new template node!
+ //
+ _template = (Template)_template.getModel().findNewNode(oldPath);
+ _template.getModel().setSelectionPath(_template.getPath());
+ //
+ //
+ // Everything was restored, user must deal with error
+ //
+ return;
+ }
+ else
+ {
+ _instanceEditor.cascadeDelete(oldId);
+
+ parent = (Templates)_template.getModel()
+ .findNewNode(parent.getPath());
+ _template = (Template)parent.findChild(newId);
+ _template.getModel()
+ .setSelectionPath(_template.getPath());
+ }
+ }
+
+ //
+ // Mark modified
+ //
+ _template.markModified();
+
+ _applyButton.setEnabled(false);
+ _discardButton.setEnabled(false);
+ }
+ finally
+ {
+ _template.getModel().enableDisplay();
+ }
+ }
+ //
+ // Otherwise, may wait until other user is done!
+ //
+ }
+
+
+ void show(Template template)
+ {
+ detectUpdates(false);
+
+ _template = template;
+ TemplateDescriptor descriptor = _template.getDescriptor();
+
+ _templateId.setText(_template.getId());
+ _origParams = stringify(_template.parameters);
+ _parameters.setText(_origParams);
+ _instanceEditor.show();
+
+ _applyButton.setEnabled(_template.isEphemeral());
+ _discardButton.setEnabled(_template.isEphemeral());
+ detectUpdates(true);
+ }
+
+ TemplateDescriptor getDescriptor()
+ {
+ return _template.getDescriptor();
+ }
+
+
+ private JTextField _templateId = new JTextField(20);
+ private JTextField _parameters = new JTextField(20);
+
+ private String _origParams;
+
+ private JPanel _panel;
+ private Template _template;
+ */
+}