diff options
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;
+ */
+}
|