diff options
author | Bernard Normier <bernard@zeroc.com> | 2006-05-04 16:15:21 +0000 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2006-05-04 16:15:21 +0000 |
commit | 87ed29e743f1c53e01878259a2c8ba1b352d3933 (patch) | |
tree | cf7de9d5ef8ac0362839c6122cad9d5217867e7f /java | |
parent | Fixed typo. (diff) | |
download | ice-87ed29e743f1c53e01878259a2c8ba1b352d3933.tar.bz2 ice-87ed29e743f1c53e01878259a2c8ba1b352d3933.tar.xz ice-87ed29e743f1c53e01878259a2c8ba1b352d3933.zip |
Better PropertySets support
Diffstat (limited to 'java')
37 files changed, 2008 insertions, 545 deletions
diff --git a/java/src/IceGridGUI/Application/AbstractServerEditor.java b/java/src/IceGridGUI/Application/AbstractServerEditor.java index 2a57502f978..a1c0f8aeaab 100755 --- a/java/src/IceGridGUI/Application/AbstractServerEditor.java +++ b/java/src/IceGridGUI/Application/AbstractServerEditor.java @@ -67,7 +67,7 @@ abstract class AbstractServerEditor extends Editor //
try
{
- node.insertChild(_target, true);
+ node.insertServer(_target, true);
}
catch(UpdateFailedException die)
{
@@ -117,7 +117,7 @@ abstract class AbstractServerEditor extends Editor ServerDescriptor serverDescriptor =
server.getServerDescriptor();
- node.removeChild(_target);
+ node.removeServer(_target);
try
{
@@ -130,7 +130,7 @@ abstract class AbstractServerEditor extends Editor //
try
{
- node.insertChild(_target, true);
+ node.insertServer(_target, true);
}
catch(UpdateFailedException die)
{
@@ -150,7 +150,8 @@ abstract class AbstractServerEditor extends Editor //
// Success
//
- node.getEditable().removeElement(_target.getId()); // replaced by brand new Server
+ node.getEditable().removeElement(_target.getId(),
+ Server.class); // replaced by brand new Server
if(instanceDescriptor != null)
{
diff --git a/java/src/IceGridGUI/Application/Communicator.java b/java/src/IceGridGUI/Application/Communicator.java index de4633588ad..3ba264079b9 100755 --- a/java/src/IceGridGUI/Application/Communicator.java +++ b/java/src/IceGridGUI/Application/Communicator.java @@ -385,7 +385,8 @@ abstract class Communicator extends TreeNode implements DescriptorHolder Object descriptor = child.getDescriptor();
removeDescriptor(descriptor);
getEnclosingEditable().markModified();
-
+ getRoot().updated();
+
java.util.List list = findInstances(true);
java.util.Iterator p = list.iterator();
while(p.hasNext())
@@ -399,7 +400,7 @@ abstract class Communicator extends TreeNode implements DescriptorHolder void addDescriptor(Object descriptor)
{
- _children.add(descriptor);
+ _descriptors.add(descriptor);
}
void removeDescriptor(Object descriptor)
@@ -407,7 +408,7 @@ abstract class Communicator extends TreeNode implements DescriptorHolder //
// A straight remove uses equals(), which is not the desired behavior
//
- java.util.Iterator p = _adapters.iterator();
+ java.util.Iterator p = _descriptors.iterator();
while(p.hasNext())
{
if(descriptor == p.next())
diff --git a/java/src/IceGridGUI/Application/CommunicatorSubEditor.java b/java/src/IceGridGUI/Application/CommunicatorSubEditor.java index 32429c9e3bb..f024c585106 100755 --- a/java/src/IceGridGUI/Application/CommunicatorSubEditor.java +++ b/java/src/IceGridGUI/Application/CommunicatorSubEditor.java @@ -30,38 +30,34 @@ class CommunicatorSubEditor CommunicatorSubEditor(Editor mainEditor, JFrame parentFrame)
{
_mainEditor = mainEditor;
- _properties.setEditable(false);
- //
- // _propertiesButton
- //
- _propertiesDialog = new TableDialog(parentFrame,
- "Properties",
- "Name",
- "Value", true);
-
- Action openPropertiesDialog = new AbstractAction("...")
+ _description.getDocument().addDocumentListener(
+ _mainEditor.getUpdateListener());
+ _description.setToolTipText("An optional description");
+
+ _propertySets.setEditable(false);
+ _properties = new PropertiesField(mainEditor);
+
+ _propertySetsDialog = new ListDialog(parentFrame,
+ "Property Set References", true);
+
+ Action openPropertySetsDialog = new AbstractAction("...")
{
public void actionPerformed(ActionEvent e)
{
- java.util.Map result =
- _propertiesDialog.show(_propertiesMap,
- _mainEditor.getProperties());
+ java.util.LinkedList result = _propertySetsDialog.show(
+ _propertySetsList, _mainEditor.getProperties());
if(result != null)
{
_mainEditor.updated();
- _propertiesMap = result;
- setPropertiesField();
+ _propertySetsList = result;
+ setPropertySetsField();
}
}
};
- openPropertiesDialog.putValue(Action.SHORT_DESCRIPTION,
- "Edit properties");
- _propertiesButton = new JButton(openPropertiesDialog);
-
- _description.getDocument().addDocumentListener(
- _mainEditor.getUpdateListener());
- _description.setToolTipText("An optional description");
+ openPropertySetsDialog.putValue(Action.SHORT_DESCRIPTION,
+ "Edit property set references");
+ _propertySetsButton = new JButton(openPropertySetsDialog);
}
@@ -77,18 +73,33 @@ class CommunicatorSubEditor cc.xywh(builder.getColumn(), builder.getRow(), 3, 3));
builder.nextRow(2);
builder.nextLine();
+
+ builder.append("Property Sets");
+ builder.append(_propertySets, _propertySetsButton);
+ builder.nextLine();
builder.append("Properties");
- builder.append(_properties, _propertiesButton);
+ builder.nextLine();
+ builder.append("");
+ builder.nextLine();
+ builder.append("");
+
+ builder.nextLine();
+ builder.append("");
+
+ builder.nextRow(-6);
+ scrollPane = new JScrollPane(_properties);
+ builder.add(scrollPane,
+ cc.xywh(builder.getColumn(), builder.getRow(), 3, 7));
+ builder.nextRow(6);
builder.nextLine();
}
void writeDescriptor(CommunicatorDescriptor descriptor)
{
- //
- // TODO: BENOIT: Add support for property set.
- //
- descriptor.propertySet = new PropertySetDescriptor(new String[0], Editor.mapToProperties(_propertiesMap));
+ descriptor.propertySet.references =
+ (String[])_propertySetsList.toArray(new String[0]);
+ descriptor.propertySet.properties = _properties.getProperties();
descriptor.description = _description.getText();
}
@@ -97,12 +108,12 @@ class CommunicatorSubEditor Utils.Resolver detailResolver = _mainEditor.getDetailResolver();
isEditable = isEditable && (detailResolver == null);
- //
- // TODO: BENOIT: Add support for property set.
- //
- _propertiesMap = Editor.propertiesToMap(descriptor.propertySet.properties, detailResolver);
- setPropertiesField();
- _propertiesButton.setEnabled(isEditable);
+ _propertySetsList = java.util.Arrays.asList(descriptor.propertySet.references);
+ setPropertySetsField();
+ _propertySetsButton.setEnabled(isEditable);
+
+ _properties.setProperties(descriptor.propertySet.properties,
+ detailResolver, isEditable);
_description.setText(
Utils.substitute(descriptor.description, detailResolver));
@@ -110,36 +121,42 @@ class CommunicatorSubEditor _description.setOpaque(isEditable);
}
- private void setPropertiesField()
+
+ private void setPropertySetsField()
{
- final Utils.Resolver detailResolver = _mainEditor.getDetailResolver();
-
+ final Utils.Resolver resolver = _mainEditor.getDetailResolver();
+
Ice.StringHolder toolTipHolder = new Ice.StringHolder();
Utils.Stringifier stringifier = new Utils.Stringifier()
{
public String toString(Object obj)
{
- java.util.Map.Entry entry = (java.util.Map.Entry)obj;
-
- return Utils.substitute((String)entry.getKey(), detailResolver)
- + "="
- + Utils.substitute((String)entry.getValue(), detailResolver);
+ return Utils.substitute((String)obj, resolver);
}
};
- _properties.setText(
- Utils.stringify(_propertiesMap.entrySet(), stringifier,
- ", ", toolTipHolder));
- _properties.setToolTipText(toolTipHolder.value);
+ _propertySets.setText(
+ Utils.stringify(_propertySetsList,
+ stringifier, ", ", toolTipHolder));
+
+ String toolTip = "<html>Property Sets";
+
+ if(toolTipHolder.value != null)
+ {
+ toolTip += ":<br>" + toolTipHolder.value;
+ }
+ toolTip += "</html>";
+ _propertySets.setToolTipText(toolTip);
}
-
protected Editor _mainEditor;
private JTextArea _description = new JTextArea(3, 20);
- private JTextField _properties = new JTextField(20);
- private java.util.Map _propertiesMap;
- private TableDialog _propertiesDialog;
- private JButton _propertiesButton = new JButton("...");
+ private JTextField _propertySets = new JTextField(20);
+ private java.util.List _propertySetsList;
+ private ListDialog _propertySetsDialog;
+ private JButton _propertySetsButton;
+
+ private PropertiesField _properties;
}
diff --git a/java/src/IceGridGUI/Application/DbEnvEditor.java b/java/src/IceGridGUI/Application/DbEnvEditor.java index fc3db163a09..7853c0c532e 100755 --- a/java/src/IceGridGUI/Application/DbEnvEditor.java +++ b/java/src/IceGridGUI/Application/DbEnvEditor.java @@ -44,35 +44,7 @@ class DbEnvEditor extends CommunicatorChildEditor + "otherwise, IceGrid does not create this directory"
+ "</html>");
-
- _properties.setEditable(false);
-
- //
- // _propertiesButton
- //
- _propertiesDialog = new TableDialog(parentFrame,
- "Berkeley DB Configuration Properties",
- "Name",
- "Value", true);
-
- Action openPropertiesDialog = new AbstractAction("...")
- {
- public void actionPerformed(ActionEvent e)
- {
- java.util.Map result =
- _propertiesDialog.show(_propertiesMap,
- getProperties());
- if(result != null)
- {
- updated();
- _propertiesMap = result;
- setPropertiesField();
- }
- }
- };
- openPropertiesDialog.putValue(Action.SHORT_DESCRIPTION,
- "Edit properties");
- _propertiesButton = new JButton(openPropertiesDialog);
+ _properties = new PropertiesField(this);
}
void writeDescriptor()
@@ -82,7 +54,7 @@ class DbEnvEditor extends CommunicatorChildEditor descriptor.name = _name.getText();
descriptor.description = _description.getText();
descriptor.dbHome = getDbHomeAsString();
- descriptor.properties = Editor.mapToProperties(_propertiesMap);
+ descriptor.properties = _properties.getProperties();
}
boolean isSimpleUpdate()
@@ -119,7 +91,19 @@ class DbEnvEditor extends CommunicatorChildEditor builder.nextLine();
builder.append("Properties");
- builder.append(_properties, _propertiesButton);
+ builder.nextLine();
+ builder.append("");
+ builder.nextLine();
+ builder.append("");
+
+ builder.nextLine();
+ builder.append("");
+
+ builder.nextRow(-6);
+ scrollPane = new JScrollPane(_properties);
+ builder.add(scrollPane,
+ cc.xywh(builder.getColumn(), builder.getRow(), 3, 7));
+ builder.nextRow(6);
builder.nextLine();
}
@@ -158,9 +142,8 @@ class DbEnvEditor extends CommunicatorChildEditor _dbHome.setEnabled(isEditable);
_dbHome.setEditable(isEditable);
- _propertiesMap = Editor.propertiesToMap(descriptor.properties, resolver);
- setPropertiesField();
- _propertiesButton.setEnabled(isEditable);
+ _properties.setProperties(descriptor.properties,
+ resolver, isEditable);
_applyButton.setEnabled(dbEnv.isEphemeral());
_discardButton.setEnabled(dbEnv.isEphemeral());
@@ -197,49 +180,12 @@ class DbEnvEditor extends CommunicatorChildEditor }
}
-
- private void setPropertiesField()
- {
- final Utils.Resolver resolver = getDbEnv().getResolver();
-
- Ice.StringHolder toolTipHolder = new Ice.StringHolder();
- Utils.Stringifier stringifier = new Utils.Stringifier()
- {
- public String toString(Object obj)
- {
- java.util.Map.Entry entry = (java.util.Map.Entry)obj;
-
- return Utils.substitute((String)entry.getKey(), resolver)
- + "="
- + Utils.substitute((String)entry.getValue(), resolver);
- }
- };
-
- _properties.setText(
- Utils.stringify(_propertiesMap.entrySet(), stringifier,
- ", ", toolTipHolder));
-
- String toolTip = "<html>Properties used to generate a"
- + " DB_CONFIG file in the DB home directory";
- if(toolTipHolder.value != null)
- {
- toolTip += ":<br>" + toolTipHolder.value;
- }
- toolTip += "</html>";
-
- _properties.setToolTipText(toolTip);
- }
-
private JTextField _name = new JTextField(20);
private JTextArea _description = new JTextArea(3, 20);
private JComboBox _dbHome = new JComboBox(new Object[]{NO_DB_HOME});
-
- private JTextField _properties = new JTextField(20);
- private java.util.Map _propertiesMap;
- private TableDialog _propertiesDialog;
- private JButton _propertiesButton = new JButton("...");
-
+ private PropertiesField _properties;
+
static private final Object NO_DB_HOME = new Object()
{
public String toString()
diff --git a/java/src/IceGridGUI/Application/Editable.java b/java/src/IceGridGUI/Application/Editable.java index 79254f75634..34d81355f6e 100755 --- a/java/src/IceGridGUI/Application/Editable.java +++ b/java/src/IceGridGUI/Application/Editable.java @@ -42,14 +42,28 @@ class Editable implements Cloneable _isNew = true;
}
- void removeElement(String id)
+ void removeElement(String id, Class forClass)
{
- _removedElements.add(id);
+ java.util.TreeSet set = (java.util.TreeSet)_removedElements.get(forClass);
+ if(set == null)
+ {
+ set = new java.util.TreeSet();
+ _removedElements.put(forClass, set);
+ }
+ set.add(id);
}
- String[] removedElements()
+ String[] removedElements(Class forClass)
{
- return (String[])_removedElements.toArray(new String[0]);
+ java.util.TreeSet set = (java.util.TreeSet)_removedElements.get(forClass);
+ if(set == null)
+ {
+ return new String[0];
+ }
+ else
+ {
+ return (String[])set.toArray(new String[0]);
+ }
}
Editable save()
@@ -57,7 +71,15 @@ class Editable implements Cloneable try
{
Editable result = (Editable)clone();
- result._removedElements = (java.util.TreeSet)result._removedElements.clone();
+ java.util.HashMap removedElements = new java.util.HashMap();
+ java.util.Iterator p = result._removedElements.entrySet().iterator();
+ while(p.hasNext())
+ {
+ java.util.Map.Entry entry = (java.util.Map.Entry)p.next();
+ Object val = ((java.util.TreeSet)entry.getValue()).clone();
+ removedElements.put(entry.getKey(), val);
+ }
+ result._removedElements = removedElements;
return result;
}
catch(CloneNotSupportedException e)
@@ -76,5 +98,6 @@ class Editable implements Cloneable private boolean _isNew = false;
private boolean _modified = false;
- private java.util.TreeSet _removedElements = new java.util.TreeSet();
+
+ private java.util.HashMap _removedElements = new java.util.HashMap();
}
diff --git a/java/src/IceGridGUI/Application/ListTreeNode.java b/java/src/IceGridGUI/Application/ListTreeNode.java index 7be67779ee1..4b36c3a03a5 100755 --- a/java/src/IceGridGUI/Application/ListTreeNode.java +++ b/java/src/IceGridGUI/Application/ListTreeNode.java @@ -120,59 +120,14 @@ abstract class ListTreeNode extends TreeNode void insertChildren(java.util.List newChildren, boolean fireEvent)
throws UpdateFailedException
{
- TreeNodeBase[] children = (TreeNodeBase[])newChildren.toArray(new TreeNodeBase[0]);
- java.util.Arrays.sort(children, _childComparator);
-
- int[] indices = new int[children.length];
-
- int i = 0;
- boolean checkInsert = true;
- for(int j = 0; j < children.length; ++j)
- {
- String id = children[j].getId();
-
- if(checkInsert)
- {
- while(i < _children.size())
- {
- TreeNodeBase existingChild = (TreeNodeBase)_children.get(i);
- int cmp = id.compareTo(existingChild.getId());
- if(cmp == 0)
- {
- throw new UpdateFailedException(this, id);
- }
- if(cmp < 0)
- {
- break; // while
- }
- i++;
- }
-
- if(i < _children.size())
- {
- // Insert here, and increment i (since children is sorted)
- _children.add(i, children[j]);
- indices[j] = i;
- i++;
- continue; // for
- }
- else
- {
- checkInsert = false;
- }
- }
-
- //
- // Append
- //
- _children.add(children[j]);
- indices[j] = i;
- i++;
- }
+ DefaultTreeModel treeModel = fireEvent ?
+ getRoot().getTreeModel() : null;
- if(fireEvent)
+ String badChildId = insertSortedChildren(newChildren, _children, treeModel);
+
+ if(badChildId != null)
{
- getRoot().getTreeModel().nodesWereInserted(this, indices);
+ throw new UpdateFailedException(this, badChildId);
}
}
@@ -202,18 +157,6 @@ abstract class ListTreeNode extends TreeNode return _editable;
}
- protected String makeNewChildId(String base)
- {
- String id = base;
- int i = 0;
- while(findChild(id) != null)
- {
- id = base + "-" + (++i);
- }
- return id;
- }
-
-
javax.swing.ComboBoxModel createComboBoxModel()
{
return new ComboBoxModel();
diff --git a/java/src/IceGridGUI/Application/Node.java b/java/src/IceGridGUI/Application/Node.java index 9bc7c08a091..8594509039a 100755 --- a/java/src/IceGridGUI/Application/Node.java +++ b/java/src/IceGridGUI/Application/Node.java @@ -9,6 +9,7 @@ package IceGridGUI.Application;
import java.awt.Component;
+import java.util.Enumeration;
import javax.swing.Icon;
import javax.swing.JMenuItem;
@@ -17,19 +18,23 @@ import javax.swing.JPopupMenu; import javax.swing.JTextField;
import javax.swing.JTree;
+import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.DefaultTreeCellRenderer;
import IceGrid.*;
import IceGridGUI.*;
-class Node extends ListTreeNode
+class Node extends TreeNode implements PropertySetParent
{
static public NodeDescriptor
copyDescriptor(NodeDescriptor nd)
{
NodeDescriptor copy = (NodeDescriptor)nd.clone();
+ copy.propertySets = PropertySets.copyDescriptors(copy.propertySets);
+
+
copy.serverInstances = new java.util.LinkedList();
java.util.Iterator p = nd.serverInstances.iterator();
while(p.hasNext())
@@ -48,6 +53,196 @@ class Node extends ListTreeNode return copy;
}
+
+ public Enumeration children()
+ {
+ return new Enumeration()
+ {
+ public boolean hasMoreElements()
+ {
+ if(!_p.hasNext())
+ {
+ if(!_iteratingOverServers)
+ {
+ _p = _servers.iterator();
+ _iteratingOverServers = true;
+ return _p.hasNext();
+ }
+ return false;
+ }
+ return true;
+ }
+
+ public Object nextElement()
+ {
+ return _p.next();
+ }
+
+ private java.util.Iterator _p = _propertySets.iterator();
+ private boolean _iteratingOverServers = false;
+ };
+ }
+
+ public boolean getAllowsChildren()
+ {
+ return true;
+ }
+
+ public javax.swing.tree.TreeNode getChildAt(int childIndex)
+ {
+ if(childIndex < 0)
+ {
+ throw new ArrayIndexOutOfBoundsException(childIndex);
+ }
+ else if(childIndex < _propertySets.size())
+ {
+ return (javax.swing.tree.TreeNode)_propertySets.get(childIndex);
+ }
+ else if(childIndex < (_propertySets.size() + _servers.size()))
+ {
+ return (javax.swing.tree.TreeNode)_servers.get(
+ childIndex - _propertySets.size());
+ }
+ else
+ {
+ throw new ArrayIndexOutOfBoundsException(childIndex);
+ }
+ }
+
+ public int getChildCount()
+ {
+ return _propertySets.size() + _servers.size();
+ }
+
+ public int getIndex(javax.swing.tree.TreeNode node)
+ {
+ if(node instanceof PropertySet)
+ {
+ return _propertySets.indexOf(node);
+ }
+ else
+ {
+ int index = _servers.indexOf(node);
+ if(index != -1)
+ {
+ index += _propertySets.size();
+ }
+ return index;
+ }
+ }
+
+ public boolean isLeaf()
+ {
+ return _propertySets.isEmpty() && _servers.isEmpty();
+ }
+
+ void removeServers(String[] childIds)
+ {
+ removeSortedChildren(childIds, _servers, getRoot().getTreeModel());
+ }
+
+ void removePropertySets(String[] childIds)
+ {
+ removeSortedChildren(childIds, _propertySets, getRoot().getTreeModel());
+ }
+
+ void childrenChanged(java.util.List children)
+ {
+ childrenChanged(children, getRoot().getTreeModel());
+ }
+
+ Server findServer(String id)
+ {
+ return (Server)find(id, _servers);
+ }
+
+ PropertySet findPropertySet(String id)
+ {
+ return (PropertySet)find(id, _propertySets);
+ }
+
+ void insertPropertySets(java.util.List newChildren, boolean fireEvent)
+ throws UpdateFailedException
+ {
+ DefaultTreeModel treeModel = fireEvent ?
+ getRoot().getTreeModel() : null;
+
+ String badChildId = insertSortedChildren(newChildren, _propertySets, treeModel);
+
+ if(badChildId != null)
+ {
+ throw new UpdateFailedException(this, badChildId);
+ }
+ }
+
+
+ void insertServer(TreeNode child, boolean fireEvent)
+ throws UpdateFailedException
+ {
+ DefaultTreeModel treeModel = fireEvent ?
+ getRoot().getTreeModel() : null;
+
+ if(!insertSortedChild(child, _servers, treeModel))
+ {
+ throw new UpdateFailedException(this, child.getId());
+ }
+ }
+
+ void insertServers(java.util.List newChildren, boolean fireEvent)
+ throws UpdateFailedException
+ {
+ DefaultTreeModel treeModel = fireEvent ?
+ getRoot().getTreeModel() : null;
+
+ String badChildId = insertSortedChildren(newChildren, _servers, treeModel);
+
+ if(badChildId != null)
+ {
+ throw new UpdateFailedException(this, badChildId);
+ }
+ }
+
+ void removeServer(TreeNode child)
+ {
+ int index = getIndex(child);
+ _servers.remove(child);
+
+ getRoot().getTreeModel().nodesWereRemoved(this,
+ new int[]{index},
+ new Object[]{child});
+ }
+
+ public void insertPropertySet(PropertySet child, boolean fireEvent)
+ throws UpdateFailedException
+ {
+ DefaultTreeModel treeModel = fireEvent ?
+ getRoot().getTreeModel() : null;
+
+ if(!insertSortedChild(child, _propertySets, treeModel))
+ {
+ throw new UpdateFailedException(this, child.getId());
+ }
+ }
+
+ public void removePropertySet(PropertySet child)
+ {
+ int index = getIndex(child);
+ _propertySets.remove(child);
+
+ getRoot().getTreeModel().nodesWereRemoved(this,
+ new int[]{index},
+ new Object[]{child});
+ }
+
+ public void removeDescriptor(String id)
+ {
+ _descriptor.propertySets.remove(id);
+ }
+
+ public Editable getEditable()
+ {
+ return _editable;
+ }
public boolean[] getAvailableActions()
{
@@ -61,13 +256,15 @@ class Node extends ListTreeNode {
actions[PASTE] = descriptor instanceof NodeDescriptor ||
descriptor instanceof ServerInstanceDescriptor ||
- descriptor instanceof ServerDescriptor;
+ descriptor instanceof ServerDescriptor ||
+ descriptor instanceof PropertySetDescriptor;
}
if(!_ephemeral)
{
actions[SHOW_VARS] = true;
actions[SUBSTITUTE_VARS] = true;
+ actions[NEW_PROPERTY_SET] = true;
actions[NEW_SERVER] = true;
actions[NEW_SERVER_ICEBOX] = true;
actions[NEW_SERVER_FROM_TEMPLATE] = true;
@@ -81,6 +278,8 @@ class Node extends ListTreeNode if(_popup == null)
{
_popup = new JPopupMenu();
+ _popup.add(actions.get(NEW_PROPERTY_SET));
+ _popup.addSeparator();
_popup.add(actions.get(NEW_SERVER));
_popup.add(actions.get(NEW_SERVER_ICEBOX));
_popup.add(actions.get(NEW_SERVER_FROM_TEMPLATE));
@@ -100,6 +299,10 @@ class Node extends ListTreeNode {
((TreeNode)_parent).paste();
}
+ else if(descriptor instanceof PropertySetDescriptor)
+ {
+ newPropertySet(PropertySet.copyDescriptor((PropertySetDescriptor)descriptor));
+ }
else if(descriptor instanceof ServerInstanceDescriptor)
{
newServer(Server.copyDescriptor((ServerInstanceDescriptor)descriptor));
@@ -109,6 +312,13 @@ class Node extends ListTreeNode newServer(Server.copyDescriptor(((ServerDescriptor)descriptor)));
}
}
+
+ public void newPropertySet()
+ {
+ newPropertySet(new PropertySetDescriptor(
+ new String[0], new java.util.LinkedList()));
+ }
+
public void newServer()
{
newServer(Server.newServerDescriptor());
@@ -138,7 +348,7 @@ class Node extends ListTreeNode {
nodes.removeChild(this);
nodes.removeDescriptor(_id);
- nodes.getEditable().removeElement(_id);
+ nodes.getEditable().removeElement(_id, Node.class);
getRoot().updated();
}
}
@@ -226,7 +436,15 @@ class Node extends ListTreeNode }
writeVariables(writer, _descriptor.variables);
- java.util.Iterator p = _children.iterator();
+
+ java.util.Iterator p = _propertySets.iterator();
+ while(p.hasNext())
+ {
+ PropertySet ps = (PropertySet)p.next();
+ ps.write(writer);
+ }
+
+ p = _servers.iterator();
while(p.hasNext())
{
Server server = (Server)p.next();
@@ -247,7 +465,10 @@ class Node extends ListTreeNode //
// Try to rebuild this node;
// returns a backup object if rollback is later necessary
+ // We don't rebuild the property sets since they don't
+ // depend on the variables.
//
+
Backup rebuild(java.util.List editables)
throws UpdateFailedException
{
@@ -262,7 +483,7 @@ class Node extends ListTreeNode _resolver.put("node", _id);
backup.backupList = new java.util.Vector();
- backup.servers = (java.util.LinkedList)_children.clone();
+ backup.servers = (java.util.LinkedList)_servers.clone();
java.util.Iterator p = backup.servers.iterator();
while(p.hasNext())
@@ -288,14 +509,20 @@ class Node extends ListTreeNode _origDescription = _descriptor.description;
_origLoadFactor = _descriptor.loadFactor;
- java.util.Iterator p = _children.iterator();
+ java.util.Iterator p = _propertySets.iterator();
+ while(p.hasNext())
+ {
+ PropertySet ps = (PropertySet)p.next();
+ ps.commit();
+ }
+
+ p = _servers.iterator();
while(p.hasNext())
{
Server server = (Server)p.next();
server.commit();
}
}
-
void restore(Backup backup)
{
@@ -365,7 +592,31 @@ class Node extends ListTreeNode update.name = _id;
//
- // First: servers
+ // First: property sets
+ //
+ if(_editable.isNew())
+ {
+ update.removePropertySets = new String[0];
+ update.propertySets = _descriptor.propertySets;
+ }
+ else
+ {
+ update.removePropertySets = _editable.removedElements(PropertySet.class);
+ update.propertySets = new java.util.HashMap();
+
+ java.util.Iterator p = _propertySets.iterator();
+ while(p.hasNext())
+ {
+ PropertySet ps = (PropertySet)p.next();
+ if(ps.getEditable().isNew() || ps.getEditable().isModified())
+ {
+ update.propertySets.put(ps.getId(), ps.getDescriptor());
+ }
+ }
+ }
+
+ //
+ // Then: servers
//
if(_editable.isNew())
{
@@ -373,13 +624,13 @@ class Node extends ListTreeNode }
else
{
- update.removeServers = _editable.removedElements();
+ update.removeServers = _editable.removedElements(Server.class);
}
update.serverInstances = new java.util.LinkedList();
update.servers = new java.util.LinkedList();
- java.util.Iterator p = _children.iterator();
+ java.util.Iterator p = _servers.iterator();
while(p.hasNext())
{
Server server = (Server)p.next();
@@ -401,7 +652,10 @@ class Node extends ListTreeNode //
// Anything in this update?
//
- if(!_editable.isNew() && !_editable.isModified() && update.removeServers.length == 0
+ if(!_editable.isNew() && !_editable.isModified()
+ && update.removePropertySets.length == 0
+ && update.propertySets.size() == 0
+ && update.removeServers.length == 0
&& update.servers.size() == 0
&& update.serverInstances.size() == 0)
{
@@ -464,8 +718,8 @@ class Node extends ListTreeNode {
Root root = getRoot();
- java.util.Vector newChildren = new java.util.Vector();
- java.util.Vector updatedChildren = new java.util.Vector();
+ java.util.Vector newServers = new java.util.Vector();
+ java.util.Vector updatedServers = new java.util.Vector();
if(update != null)
{
@@ -496,25 +750,65 @@ class Node extends ListTreeNode }
_descriptor.variables.putAll(update.variables);
+
//
- // One big set of removes
+ // Property Sets
//
- removeChildren(update.removeServers);
+ removePropertySets(update.removePropertySets);
+ for(int i = 0; i < update.removePropertySets.length; ++i)
+ {
+ _descriptor.propertySets.remove(update.removePropertySets[i]);
+ }
+ java.util.Vector newPropertySets = new java.util.Vector();
+ java.util.Vector updatedPropertySets = new java.util.Vector();
+
+ java.util.Iterator p = update.propertySets.entrySet().iterator();
+ while(p.hasNext())
+ {
+ java.util.Map.Entry entry = (java.util.Map.Entry)p.next();
+
+ String id = (String)entry.getKey();
+ PropertySetDescriptor psd = (PropertySetDescriptor)entry.getValue();
+
+ //
+ // Lookup named property set
+ //
+ PropertySet ps = findPropertySet(id);
+ if(ps != null)
+ {
+ ps.rebuild(psd);
+ updatedPropertySets.add(ps);
+ }
+ else
+ {
+ ps = new PropertySet(false, this, id, psd);
+ newPropertySets.add(ps);
+ _descriptor.propertySets.put(id, psd);
+ }
+ }
+ childrenChanged(updatedPropertySets);
+ insertPropertySets(newPropertySets, true);
+
+
//
// Update _descriptor
//
for(int i = 0; i < update.removeServers.length; ++i)
{
- _descriptor.serverInstances.remove(update.removeServers[i]);
- _descriptor.servers.remove(update.removeServers[i]);
+ Server server = findServer(update.removeServers[i]);
+ removeDescriptor(server);
}
+
+ //
+ // One big set of removes
+ //
+ removeServers(update.removeServers);
//
// One big set of updates, followed by inserts
//
-
- java.util.Iterator p = update.serverInstances.iterator();
+ p = update.serverInstances.iterator();
while(p.hasNext())
{
ServerInstanceDescriptor instanceDescriptor =
@@ -545,19 +839,21 @@ class Node extends ListTreeNode instanceResolver.put("server", serverId);
//
- // Lookup server
+ // Lookup servers
//
- Server server = (Server)findChild(serverId);
+ Server server = findServer(serverId);
if(server != null)
{
+ removeDescriptor(server);
server.rebuild(instanceResolver, instanceDescriptor, serverDescriptor);
- updatedChildren.add(server);
+ updatedServers.add(server);
+ _descriptor.serverInstances.add(instanceDescriptor);
}
else
{
server = new Server(false, this, serverId, instanceResolver, instanceDescriptor,
serverDescriptor);
- newChildren.add(server);
+ newServers.add(server);
_descriptor.serverInstances.add(instanceDescriptor);
}
@@ -581,18 +877,20 @@ class Node extends ListTreeNode //
// Lookup server
//
- Server server = (Server)findChild(serverId);
+ Server server = findServer(serverId);
if(server != null)
{
+ removeDescriptor(server);
server.rebuild(instanceResolver, null, serverDescriptor);
- updatedChildren.add(server);
+ updatedServers.add(server);
+ _descriptor.servers.add(serverDescriptor);
}
else
{
server = new Server(false, this, serverId, instanceResolver, null,
serverDescriptor);
- newChildren.add(server);
+ newServers.add(server);
_descriptor.servers.add(serverDescriptor);
}
}
@@ -612,7 +910,7 @@ class Node extends ListTreeNode while(q.hasNext())
{
Server server = (Server)q.next();
- if(!updatedChildren.contains(server) && !newChildren.contains(server))
+ if(!updatedServers.contains(server) && !newServers.contains(server))
{
serverSet.add(server);
}
@@ -629,7 +927,7 @@ class Node extends ListTreeNode {
Service service = (Service)q.next();
Server server = (Server)service.getParent().getParent();
- if(!updatedChildren.contains(server) && !newChildren.contains(server))
+ if(!updatedServers.contains(server) && !newServers.contains(server))
{
serverSet.add(server);
}
@@ -675,17 +973,19 @@ class Node extends ListTreeNode assert serverId.equals(server.getId());
server.rebuild(instanceResolver, instanceDescriptor, serverDescriptor);
- updatedChildren.add(server);
+ updatedServers.add(server);
}
- childrenChanged(updatedChildren);
- insertChildren(newChildren, true);
+ childrenChanged(updatedServers);
+ insertServers(newServers, true);
}
Node(boolean brandNew, TreeNode parent, String nodeName, NodeDescriptor descriptor)
throws UpdateFailedException
{
- super(brandNew, parent, nodeName);
+ super(parent, nodeName);
+ _editable = new Editable(brandNew);
+
_ephemeral = false;
_descriptor = descriptor;
@@ -700,15 +1000,28 @@ class Node extends ListTreeNode _resolver.put("node", _id);
//
+ // Property Sets
+ //
+ java.util.Iterator p = _descriptor.propertySets.entrySet().iterator();
+ while(p.hasNext())
+ {
+ java.util.Map.Entry entry = (java.util.Map.Entry)p.next();
+ insertPropertySet(new PropertySet(false, this,
+ (String)entry.getKey(),
+ (PropertySetDescriptor)entry.getValue()),
+ false);
+ }
+
+ //
// Template instances
//
- java.util.Iterator p = _descriptor.serverInstances.iterator();
+ p = _descriptor.serverInstances.iterator();
while(p.hasNext())
{
ServerInstanceDescriptor instanceDescriptor =
(ServerInstanceDescriptor)p.next();
- insertChild(createServer(false, instanceDescriptor), false);
+ insertServer(createServer(false, instanceDescriptor), false);
}
//
@@ -718,37 +1031,22 @@ class Node extends ListTreeNode while(p.hasNext())
{
ServerDescriptor serverDescriptor = (ServerDescriptor)p.next();
- insertChild(createServer(false, serverDescriptor), false);
+ insertServer(createServer(false, serverDescriptor), false);
}
}
Node(TreeNode parent, String nodeName, NodeDescriptor descriptor)
{
- super(false, parent, nodeName);
+ super(parent, nodeName);
+ _editable = new Editable(false);
_ephemeral = true;
_descriptor = descriptor;
}
- void removeInstanceDescriptor(ServerInstanceDescriptor d)
- {
- //
- // A straight remove uses equals(), which is not the desired behavior
- //
- java.util.Iterator p = _descriptor.serverInstances.iterator();
- while(p.hasNext())
- {
- if(d == p.next())
- {
- p.remove();
- break;
- }
- }
- }
-
java.util.List findServerInstances(String template)
{
java.util.List result = new java.util.LinkedList();
- java.util.Iterator p = _children.iterator();
+ java.util.Iterator p = _servers.iterator();
while(p.hasNext())
{
Server server = (Server)p.next();
@@ -769,7 +1067,7 @@ class Node extends ListTreeNode {
java.util.List toRemove = new java.util.LinkedList();
- java.util.Iterator p = _children.iterator();
+ java.util.Iterator p = _servers.iterator();
while(p.hasNext())
{
Server server = (Server)p.next();
@@ -782,22 +1080,22 @@ class Node extends ListTreeNode //
// Remove instance
//
- removeInstanceDescriptor(instanceDescriptor);
- _editable.removeElement(server.getId());
+ removeDescriptor(instanceDescriptor);
+ _editable.removeElement(server.getId(), Server.class);
toRemove.add(server.getId());
}
}
if(toRemove.size() > 0)
{
- removeChildren((String[])toRemove.toArray(new String[0]));
+ removeServers((String[])toRemove.toArray(new String[0]));
}
}
-
+
java.util.List findServiceInstances(String template)
{
java.util.List result = new java.util.LinkedList();
- java.util.Iterator p = _children.iterator();
+ java.util.Iterator p = _servers.iterator();
while(p.hasNext())
{
Server server = (Server)p.next();
@@ -809,7 +1107,7 @@ class Node extends ListTreeNode void removeServiceInstances(String template)
{
- java.util.Iterator p = _children.iterator();
+ java.util.Iterator p = _servers.iterator();
while(p.hasNext())
{
Server server = (Server)p.next();
@@ -823,18 +1121,27 @@ class Node extends ListTreeNode }
+ public void tryAdd(String id, PropertySetDescriptor descriptor)
+ throws UpdateFailedException
+ {
+ insertPropertySet(new PropertySet(true, this, id, descriptor),
+ true);
+ _descriptor.propertySets.put(id, descriptor);
+ }
+
+
void tryAdd(ServerInstanceDescriptor instanceDescriptor,
ServerDescriptor serverDescriptor,
boolean addDescriptor) throws UpdateFailedException
{
if(instanceDescriptor != null)
{
- insertChild(createServer(true, instanceDescriptor),
+ insertServer(createServer(true, instanceDescriptor),
true);
}
else
{
- insertChild(createServer(true, serverDescriptor),
+ insertServer(createServer(true, serverDescriptor),
true);
}
@@ -851,6 +1158,20 @@ class Node extends ListTreeNode }
}
+ void removeDescriptor(Server server)
+ {
+ ServerInstanceDescriptor instanceDescriptor =
+ server.getInstanceDescriptor();
+ if(instanceDescriptor != null)
+ {
+ removeDescriptor(instanceDescriptor);
+ }
+ else
+ {
+ removeDescriptor(server.getServerDescriptor());
+ }
+ }
+
void removeDescriptor(ServerDescriptor sd)
{
//
@@ -866,6 +1187,7 @@ class Node extends ListTreeNode }
}
}
+
void removeDescriptor(ServerInstanceDescriptor sd)
{
//
@@ -882,6 +1204,22 @@ class Node extends ListTreeNode }
}
+ private void newPropertySet(PropertySetDescriptor descriptor)
+ {
+ String id = makeNewChildId("PropertySet");
+
+ PropertySet ps = new PropertySet(this, id, descriptor);
+ try
+ {
+ insertPropertySet(ps, true);
+ }
+ catch(UpdateFailedException e)
+ {
+ assert false;
+ }
+ getRoot().setSelectedNode(ps);
+ }
+
private void newServer(ServerDescriptor descriptor)
{
descriptor.id = makeNewChildId(descriptor.id);
@@ -889,7 +1227,7 @@ class Node extends ListTreeNode Server server = new Server(this, descriptor.id, null, descriptor);
try
{
- insertChild(server, true);
+ insertServer(server, true);
}
catch(UpdateFailedException e)
{
@@ -934,7 +1272,7 @@ class Node extends ListTreeNode Server server = new Server(this, id, descriptor, sd);
try
{
- insertChild(server, true);
+ insertServer(server, true);
}
catch(UpdateFailedException e)
{
@@ -953,6 +1291,11 @@ class Node extends ListTreeNode private final boolean _ephemeral;
private NodeEditor _editor;
+ private java.util.LinkedList _propertySets = new java.util.LinkedList();
+ private java.util.LinkedList _servers = new java.util.LinkedList();
+
+ private Editable _editable;
+
static private DefaultTreeCellRenderer _cellRenderer;
static private JPopupMenu _popup;
}
diff --git a/java/src/IceGridGUI/Application/Nodes.java b/java/src/IceGridGUI/Application/Nodes.java index 95748f2beb8..282fb701027 100755 --- a/java/src/IceGridGUI/Application/Nodes.java +++ b/java/src/IceGridGUI/Application/Nodes.java @@ -221,9 +221,6 @@ class Nodes extends ListTreeNode if(node == null)
{
- //
- // TODO: BENOIT: Add support for property sets
- //
NodeDescriptor nodeDescriptor = new NodeDescriptor(update.variables,
update.serverInstances,
update.servers,
diff --git a/java/src/IceGridGUI/Application/PropertiesField.java b/java/src/IceGridGUI/Application/PropertiesField.java new file mode 100755 index 00000000000..80bad48f157 --- /dev/null +++ b/java/src/IceGridGUI/Application/PropertiesField.java @@ -0,0 +1,185 @@ +// **********************************************************************
+//
+// 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 IceGridGUI.Application;
+
+import IceGrid.*;
+import IceGridGUI.*;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.DefaultCellEditor;
+import javax.swing.JTable;
+import javax.swing.JTextField;
+import javax.swing.KeyStroke;
+import javax.swing.event.TableModelEvent;
+import javax.swing.event.TableModelListener;
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.DefaultTableModel;
+
+
+//
+// A special field used to edit show/edit properties
+//
+
+public class PropertiesField extends JTable
+{
+ public PropertiesField(Editor editor)
+ {
+ _columnNames = new java.util.Vector(2);
+ _columnNames.add("Name");
+ _columnNames.add("Value");
+
+ _editor = editor;
+
+ Action deleteRow = new AbstractAction("Delete selected row(s)")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ if(_editable)
+ {
+ if(isEditing())
+ {
+ getCellEditor().stopCellEditing();
+ }
+
+ for(;;)
+ {
+ int selectedRow = getSelectedRow();
+ if(selectedRow == -1)
+ {
+ break;
+ }
+ else
+ {
+ _model.removeRow(selectedRow);
+ }
+ }
+ }
+ }
+ };
+ getActionMap().put("delete", deleteRow);
+ getInputMap().put(
+ KeyStroke.getKeyStroke("DELETE"), "delete");
+
+
+
+
+ }
+
+
+ public void setProperties(java.util.List properties,
+ Utils.Resolver resolver, boolean editable)
+ {
+ _editable = editable;
+
+ //
+ // Transform list into vector of vectors
+ //
+ java.util.Vector vector = new java.util.Vector(properties.size());
+ java.util.Iterator p = properties.iterator();
+ while(p.hasNext())
+ {
+ PropertyDescriptor pd = (PropertyDescriptor)p.next();
+
+ java.util.Vector row = new java.util.Vector(2);
+ row.add(Utils.substitute(pd.name, resolver));
+ row.add(Utils.substitute(pd.value, resolver));
+ vector.add(row);
+ }
+
+ if(_editable)
+ {
+ java.util.Vector newRow = new java.util.Vector(2);
+ newRow.add("");
+ newRow.add("");
+ vector.add(newRow);
+ }
+
+ _model = new DefaultTableModel(vector, _columnNames)
+ {
+ public boolean isCellEditable(int row, int column)
+ {
+ return _editable;
+ }
+ };
+
+ _model.addTableModelListener(new TableModelListener()
+ {
+ public void tableChanged(TableModelEvent e)
+ {
+ if(_editable)
+ {
+ Object lastKey = _model.getValueAt(
+ _model.getRowCount() - 1 , 0);
+ if(lastKey != null && !lastKey.equals(""))
+ {
+ _model.addRow(new Object[]{"", ""});
+ }
+ _editor.updated();
+ }
+ }
+ });
+ setModel(_model);
+
+ setCellSelectionEnabled(_editable);
+ setOpaque(_editable);
+ setPreferredScrollableViewportSize(getPreferredSize());
+
+ DefaultTableCellRenderer cr = (DefaultTableCellRenderer)
+ getDefaultRenderer(String.class);
+ cr.setOpaque(_editable);
+ }
+
+
+ public java.util.LinkedList getProperties()
+ {
+ if(isEditing())
+ {
+ getCellEditor().stopCellEditing();
+ }
+ java.util.Vector vector = _model.getDataVector();
+
+ java.util.LinkedList result = new java.util.LinkedList();
+
+ java.util.Iterator p = vector.iterator();
+ while(p.hasNext())
+ {
+ java.util.Vector row = (java.util.Vector)p.next();
+
+ //
+ // Eliminate rows with null or empty keys
+ //
+ String key = (String)row.elementAt(0);
+ if(key != null)
+ {
+ key = key.trim();
+ if(!key.equals(""))
+ {
+ String val = (String) row.elementAt(1);
+ if(val == null)
+ {
+ val = "";
+ }
+ result.add(new PropertyDescriptor(key, val));
+ }
+ }
+ }
+ return result;
+ }
+
+ private DefaultTableModel _model;
+ private java.util.Vector _columnNames;
+ private boolean _editable = false;
+
+ private Editor _editor;
+}
+
+
diff --git a/java/src/IceGridGUI/Application/PropertySet.java b/java/src/IceGridGUI/Application/PropertySet.java new file mode 100755 index 00000000000..f564a68e699 --- /dev/null +++ b/java/src/IceGridGUI/Application/PropertySet.java @@ -0,0 +1,179 @@ +// **********************************************************************
+//
+// 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 IceGridGUI.Application;
+
+import java.awt.Component;
+import javax.swing.JTree;
+import javax.swing.tree.DefaultTreeCellRenderer;
+
+import IceGrid.*;
+import IceGridGUI.*;
+
+class PropertySet extends TreeNode
+{
+ static public PropertySetDescriptor
+ copyDescriptor(PropertySetDescriptor d)
+ {
+ PropertySetDescriptor psd = (PropertySetDescriptor)d.clone();
+ psd.properties = (java.util.LinkedList)psd.properties.clone();
+ return psd;
+ }
+
+ public Component getTreeCellRendererComponent(
+ JTree tree,
+ Object value,
+ boolean sel,
+ boolean expanded,
+ boolean leaf,
+ int row,
+ boolean hasFocus)
+ {
+ if(_cellRenderer == null)
+ {
+ _cellRenderer = new DefaultTreeCellRenderer();
+ _cellRenderer.setLeafIcon(
+ Utils.getIcon("/icons/16x16/grid.png"));
+ }
+
+ return _cellRenderer.getTreeCellRendererComponent(
+ tree, value, sel, expanded, leaf, row, hasFocus);
+ }
+
+ //
+ // Actions
+ //
+ public boolean[] getAvailableActions()
+ {
+ boolean[] actions = new boolean[ACTION_COUNT];
+ actions[COPY] = true;
+
+ if(((TreeNode)_parent).getAvailableActions()[PASTE])
+ {
+ actions[PASTE] = true;
+ }
+ actions[DELETE] = true;
+
+ if(!_ephemeral)
+ {
+ actions[SHOW_VARS] = true;
+ actions[SUBSTITUTE_VARS] = true;
+ }
+ return actions;
+ }
+
+ public void copy()
+ {
+ getCoordinator().setClipboard(copyDescriptor(_descriptor));
+ getCoordinator().getActionsForMenu().get(PASTE).setEnabled(true);
+
+ }
+ public void paste()
+ {
+ ((TreeNode)_parent).paste();
+ }
+
+ public void destroy()
+ {
+ PropertySetParent parent = (PropertySetParent)_parent;
+ parent.removePropertySet(this);
+
+ if(!_ephemeral)
+ {
+ parent.removeDescriptor(_id);
+ parent.getEditable().removeElement(_id, PropertySet.class);
+ getRoot().updated();
+ }
+ }
+
+ public Editor getEditor()
+ {
+ if(_editor == null)
+ {
+ _editor = (PropertySetEditor)getRoot().
+ getEditor(PropertySetEditor.class, this);
+ }
+ _editor.show(this);
+ return _editor;
+ }
+
+ protected Editor createEditor()
+ {
+ return new PropertySetEditor(getCoordinator().getMainFrame());
+ }
+
+ public boolean isEphemeral()
+ {
+ return _ephemeral;
+ }
+
+ Object getDescriptor()
+ {
+ return _descriptor;
+ }
+
+ Object saveDescriptor()
+ {
+ return _descriptor.clone();
+ }
+ void restoreDescriptor(Object savedDescriptor)
+ {
+ PropertySetDescriptor clone = (PropertySetDescriptor)savedDescriptor;
+ _descriptor.references = clone.references;
+ _descriptor.properties = clone.properties;
+ }
+
+ void commit()
+ {
+ _editable.commit();
+ }
+
+ Editable getEditable()
+ {
+ return _editable;
+ }
+
+ PropertySet(boolean brandNew,
+ TreeNode parent,
+ String id,
+ PropertySetDescriptor descriptor)
+ {
+ super(parent, id);
+ _ephemeral = false;
+ _editable = new Editable(brandNew);
+ rebuild(descriptor);
+ }
+
+ PropertySet(TreeNode parent, String id, PropertySetDescriptor descriptor)
+ {
+ super(parent, id);
+ _ephemeral = true;
+ _editable = null;
+ rebuild(descriptor);
+ }
+
+ void write(XMLWriter writer) throws java.io.IOException
+ {
+ if(!_ephemeral)
+ {
+ writePropertySet(writer, _id, _descriptor);
+ }
+ }
+
+ void rebuild(PropertySetDescriptor descriptor)
+ {
+ _descriptor = descriptor;
+ }
+
+ private PropertySetDescriptor _descriptor;
+ private final boolean _ephemeral;
+ private final Editable _editable;
+ private PropertySetEditor _editor;
+
+ static private DefaultTreeCellRenderer _cellRenderer;
+}
diff --git a/java/src/IceGridGUI/Application/PropertySetEditor.java b/java/src/IceGridGUI/Application/PropertySetEditor.java new file mode 100755 index 00000000000..70c1b3bdfef --- /dev/null +++ b/java/src/IceGridGUI/Application/PropertySetEditor.java @@ -0,0 +1,267 @@ +
+// **********************************************************************
+//
+// 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 IceGridGUI.Application;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+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.*;
+import IceGridGUI.*;
+
+class PropertySetEditor extends Editor
+{
+ protected void applyUpdate()
+ {
+ PropertySet nps = (PropertySet)_target;
+ Root root = nps.getRoot();
+
+ root.disableSelectionListener();
+ try
+ {
+ PropertySetParent parent = (PropertySetParent)nps.getParent();
+ if(nps.isEphemeral())
+ {
+ writeDescriptor();
+ PropertySetDescriptor descriptor =
+ (PropertySetDescriptor)nps.getDescriptor();
+ nps.destroy(); // just removes the child
+
+ try
+ {
+ parent.tryAdd(_id.getText(), descriptor);
+ }
+ catch(UpdateFailedException e)
+ {
+ //
+ // Add back ephemeral child
+ //
+ try
+ {
+ parent.insertPropertySet(nps, true);
+ }
+ catch(UpdateFailedException die)
+ {
+ assert false;
+ }
+ root.setSelectedNode(_target);
+
+ JOptionPane.showMessageDialog(
+ root.getCoordinator().getMainFrame(),
+ e.toString(),
+ "Apply failed",
+ JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ //
+ // Success
+ //
+ _target = ((TreeNode)parent).findChildWithDescriptor(descriptor);
+ root.updated();
+ root.setSelectedNode(_target);
+ _id.setEditable(false);
+ }
+ else
+ {
+ writeDescriptor();
+ root.updated();
+ nps.getEditable().markModified();
+ }
+
+ root.getCoordinator().getCurrentTab().showNode(_target);
+ _applyButton.setEnabled(false);
+ _discardButton.setEnabled(false);
+ }
+ finally
+ {
+ root.enableSelectionListener();
+ }
+ }
+
+ Utils.Resolver getDetailResolver()
+ {
+ Root root = _target.getRoot();
+
+ if(root.getCoordinator().substitute())
+ {
+ return _target.getResolver();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ PropertySetEditor(JFrame parentFrame)
+ {
+ //
+ // Associate updateListener with various fields
+ //
+ _id.getDocument().addDocumentListener(_updateListener);
+ _id.setToolTipText("The id of this Property Set");
+
+ _propertySets.setEditable(false);
+ _properties = new PropertiesField(this);
+
+ _propertySetsDialog = new ListDialog(parentFrame,
+ "Property Set References", true);
+
+ Action openPropertySetsDialog = new AbstractAction("...")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ java.util.LinkedList result = _propertySetsDialog.show(
+ _propertySetsList, getProperties());
+ if(result != null)
+ {
+ updated();
+ _propertySetsList = result;
+ setPropertySetsField();
+ }
+ }
+ };
+ openPropertySetsDialog.putValue(Action.SHORT_DESCRIPTION,
+ "Edit property set references");
+ _propertySetsButton = new JButton(openPropertySetsDialog);
+ }
+
+ void writeDescriptor()
+ {
+ PropertySetDescriptor descriptor =
+ (PropertySetDescriptor)getPropertySet().getDescriptor();
+
+ descriptor.references =
+ (String[])_propertySetsList.toArray(new String[0]);
+ descriptor.properties = _properties.getProperties();
+ }
+
+ boolean isSimpleUpdate()
+ {
+ return true;
+ }
+
+ protected void appendProperties(DefaultFormBuilder builder)
+ {
+ builder.append("ID" );
+ builder.append(_id, 3);
+ builder.nextLine();
+
+ builder.append("Property Sets");
+ builder.append(_propertySets, _propertySetsButton);
+ builder.nextLine();
+
+ builder.append("Properties");
+ builder.nextLine();
+ builder.append("");
+ builder.nextLine();
+ builder.append("");
+
+ builder.nextLine();
+ builder.append("");
+
+ builder.nextRow(-6);
+ JScrollPane scrollPane = new JScrollPane(_properties);
+ CellConstraints cc = new CellConstraints();
+ builder.add(scrollPane,
+ cc.xywh(builder.getColumn(), builder.getRow(), 3, 7));
+ builder.nextRow(6);
+ builder.nextLine();
+ }
+
+ protected void buildPropertiesPanel()
+ {
+ super.buildPropertiesPanel();
+ _propertiesPanel.setName("Named Property Set");
+ }
+
+ void show(PropertySet nps)
+ {
+ detectUpdates(false);
+ _target = nps;
+
+ Utils.Resolver resolver = getDetailResolver();
+ boolean isEditable = (resolver == null);
+
+ PropertySetDescriptor descriptor =
+ (PropertySetDescriptor)nps.getDescriptor();
+
+ _id.setText(_target.getId());
+ _id.setEditable(_target.isEphemeral());
+
+ _propertySetsList = java.util.Arrays.asList(descriptor.references);
+ setPropertySetsField();
+ _propertySetsButton.setEnabled(isEditable);
+
+ _properties.setProperties(descriptor.properties,
+ getDetailResolver(), isEditable);
+
+ _applyButton.setEnabled(nps.isEphemeral());
+ _discardButton.setEnabled(nps.isEphemeral());
+ detectUpdates(true);
+ }
+
+ private PropertySet getPropertySet()
+ {
+ return (PropertySet)_target;
+ }
+
+ private void setPropertySetsField()
+ {
+ final Utils.Resolver resolver = getDetailResolver();
+
+ Ice.StringHolder toolTipHolder = new Ice.StringHolder();
+ Utils.Stringifier stringifier = new Utils.Stringifier()
+ {
+ public String toString(Object obj)
+ {
+ return Utils.substitute((String)obj, resolver);
+ }
+ };
+
+ _propertySets.setText(
+ Utils.stringify(_propertySetsList,
+ stringifier, ", ", toolTipHolder));
+
+ String toolTip = "<html>Property Sets";
+
+ if(toolTipHolder.value != null)
+ {
+ toolTip += ":<br>" + toolTipHolder.value;
+ }
+ toolTip += "</html>";
+ _propertySets.setToolTipText(toolTip);
+ }
+
+ private JTextField _id = new JTextField(20);
+
+ private JTextField _propertySets = new JTextField(20);
+ private java.util.List _propertySetsList;
+ private ListDialog _propertySetsDialog;
+ private JButton _propertySetsButton;
+
+ private PropertiesField _properties;
+}
diff --git a/java/src/IceGridGUI/Application/PropertySetParent.java b/java/src/IceGridGUI/Application/PropertySetParent.java new file mode 100755 index 00000000000..15df0df9f34 --- /dev/null +++ b/java/src/IceGridGUI/Application/PropertySetParent.java @@ -0,0 +1,27 @@ +// **********************************************************************
+//
+// 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 IceGridGUI.Application;
+
+import IceGrid.*;
+import IceGridGUI.*;
+
+interface PropertySetParent
+{
+ void tryAdd(String id, PropertySetDescriptor descriptor)
+ throws UpdateFailedException;
+
+ void insertPropertySet(PropertySet nps, boolean fireEvent)
+ throws UpdateFailedException;
+
+ void removePropertySet(PropertySet nps);
+
+ void removeDescriptor(String id);
+
+ Editable getEditable();
+}
diff --git a/java/src/IceGridGUI/Application/PropertySets.java b/java/src/IceGridGUI/Application/PropertySets.java new file mode 100755 index 00000000000..bd3d6241e5d --- /dev/null +++ b/java/src/IceGridGUI/Application/PropertySets.java @@ -0,0 +1,218 @@ +// **********************************************************************
+//
+// Copyright (c) 2003-2006 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 IceGridGUI.Application;
+
+import javax.swing.AbstractListModel;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+
+import IceGrid.*;
+import IceGridGUI.*;
+
+class PropertySets extends ListTreeNode implements PropertySetParent
+{
+ static public java.util.HashMap
+ copyDescriptors(java.util.Map descriptors)
+ {
+ java.util.HashMap copy = new java.util.HashMap();
+ java.util.Iterator p = descriptors.entrySet().iterator();
+ while(p.hasNext())
+ {
+ java.util.Map.Entry entry = (java.util.Map.Entry)p.next();
+
+ copy.put(entry.getKey(),
+ PropertySet.copyDescriptor(
+ (PropertySetDescriptor)entry.getValue()));
+ }
+ return copy;
+ }
+
+ //
+ // Actions
+ //
+ public boolean[] getAvailableActions()
+ {
+ boolean[] actions = new boolean[ACTION_COUNT];
+
+ Object descriptor = getCoordinator().getClipboard();
+ if(descriptor != null)
+ {
+ actions[PASTE] = descriptor instanceof PropertySetDescriptor;
+ }
+
+ actions[NEW_PROPERTY_SET] = true;
+ return actions;
+ }
+
+ public JPopupMenu getPopupMenu()
+ {
+ ApplicationActions actions = getCoordinator().getActionsForPopup();
+ if(_popup == null)
+ {
+ _popup = new JPopupMenu();
+ _popup.add(actions.get(NEW_PROPERTY_SET));
+ }
+ actions.setTarget(this);
+ return _popup;
+ }
+
+ public void newPropertySet()
+ {
+ PropertySetDescriptor descriptor = new
+ PropertySetDescriptor(new String[0],
+ new java.util.LinkedList());
+
+ newPropertySet(descriptor);
+ }
+
+ public void paste()
+ {
+ Object descriptor = getCoordinator().getClipboard();
+
+ PropertySetDescriptor d = PropertySet.copyDescriptor(
+ (PropertySetDescriptor)descriptor);
+ newPropertySet(d);
+ }
+
+
+ PropertySets(TreeNode parent, java.util.Map desc)
+ throws UpdateFailedException
+ {
+ super(false, parent, "Property Sets");
+ _descriptors = desc;
+
+ java.util.Iterator p = _descriptors.entrySet().iterator();
+ while(p.hasNext())
+ {
+ java.util.Map.Entry entry = (java.util.Map.Entry)p.next();
+
+ insertChild(new PropertySet(false, this,
+ (String)entry.getKey(),
+ (PropertySetDescriptor)entry.getValue()), false);
+ }
+ }
+
+ void update(java.util.Map updates, String[] removePropertySets)
+ throws UpdateFailedException
+ {
+ //
+ // Note: _descriptors is updated by Root
+ //
+
+ //
+ // One big set of removes
+ //
+ removeChildren(removePropertySets);
+
+ //
+ // One big set of updates, followed by inserts
+ //
+ java.util.Vector newChildren = new java.util.Vector();
+
+ java.util.Iterator p = updates.entrySet().iterator();
+ while(p.hasNext())
+ {
+ java.util.Map.Entry entry = (java.util.Map.Entry)p.next();
+ String id = (String)entry.getKey();
+ PropertySetDescriptor psd = (PropertySetDescriptor)entry.getValue();
+ PropertySet child = (PropertySet)findChild(id);
+ if(child == null)
+ {
+ newChildren.add(
+ new PropertySet(false, this, id, psd));
+ }
+ else
+ {
+ child.rebuild(psd);
+ }
+ }
+ insertChildren(newChildren, true);
+ }
+
+ java.util.Map getUpdates()
+ {
+ java.util.Map updates = new java.util.HashMap();
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ PropertySet ps = (PropertySet)p.next();
+ if(ps.getEditable().isNew() || ps.getEditable().isModified())
+ {
+ updates.put(ps.getId(), ps.getDescriptor());
+ }
+ }
+ return updates;
+ }
+
+ void commit()
+ {
+ _editable.commit();
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ PropertySet ps = (PropertySet)p.next();
+ ps.commit();
+ }
+ }
+
+ Object getDescriptor()
+ {
+ return _descriptors;
+ }
+
+ public void tryAdd(String id, PropertySetDescriptor descriptor)
+ throws UpdateFailedException
+ {
+ insertChild(
+ new PropertySet(true, this, id, descriptor),
+ true);
+
+ _descriptors.put(id, descriptor);
+ }
+
+ public void insertPropertySet(PropertySet nps, boolean fireEvent)
+ throws UpdateFailedException
+ {
+ insertChild(nps, fireEvent);
+ }
+
+ public void removePropertySet(PropertySet nps)
+ {
+ removeChild(nps);
+ }
+
+ public void removeDescriptor(String id)
+ {
+ _descriptors.remove(id);
+ }
+
+ public Editable getEditable()
+ {
+ return super.getEditable();
+ }
+
+ private void newPropertySet(PropertySetDescriptor descriptor)
+ {
+ PropertySet propertySet =
+ new PropertySet(this, makeNewChildId("PropertySet"), descriptor);
+
+ try
+ {
+ insertChild(propertySet, true);
+ }
+ catch(UpdateFailedException e)
+ {
+ assert false;
+ }
+ getRoot().setSelectedNode(propertySet);
+ }
+
+ private java.util.Map _descriptors;
+ static private JPopupMenu _popup;
+}
diff --git a/java/src/IceGridGUI/Application/ReplicaGroup.java b/java/src/IceGridGUI/Application/ReplicaGroup.java index e360ec41bc2..78b06f96032 100755 --- a/java/src/IceGridGUI/Application/ReplicaGroup.java +++ b/java/src/IceGridGUI/Application/ReplicaGroup.java @@ -84,7 +84,8 @@ class ReplicaGroup extends TreeNode if(!_ephemeral)
{
replicaGroups.removeDescriptor(_descriptor);
- replicaGroups.getEditable().removeElement(_id);
+ replicaGroups.getEditable().
+ removeElement(_id, ReplicaGroup.class);
getRoot().updated();
}
}
diff --git a/java/src/IceGridGUI/Application/ReplicaGroupEditor.java b/java/src/IceGridGUI/Application/ReplicaGroupEditor.java index 0926dc07d8c..9a25675d3a3 100755 --- a/java/src/IceGridGUI/Application/ReplicaGroupEditor.java +++ b/java/src/IceGridGUI/Application/ReplicaGroupEditor.java @@ -132,7 +132,11 @@ class ReplicaGroupEditor extends Editor //
// Success
//
- replicaGroups.getEditable().removeElement(replicaGroup.getId()); // replaced by brand new ReplicaGroup
+
+ // replaced by brand new ReplicaGroup
+ replicaGroups.getEditable().
+ removeElement(replicaGroup.getId(), ReplicaGroup.class);
+
_target = replicaGroups.findChildWithDescriptor(descriptor);
root.updated();
root.setSelectedNode(_target);
diff --git a/java/src/IceGridGUI/Application/ReplicaGroups.java b/java/src/IceGridGUI/Application/ReplicaGroups.java index 6250574e0d9..e5689b1bd67 100755 --- a/java/src/IceGridGUI/Application/ReplicaGroups.java +++ b/java/src/IceGridGUI/Application/ReplicaGroups.java @@ -123,14 +123,14 @@ class ReplicaGroups extends ListTreeNode }
}
- void update(java.util.List descriptors, String[] removeAdapters)
+ void update(java.util.List descriptors, String[] removeReplicaGroups)
{
_descriptors = descriptors;
//
// One big set of removes
//
- removeChildren(removeAdapters);
+ removeChildren(removeReplicaGroups);
//
// Updates and inserts
@@ -167,11 +167,12 @@ class ReplicaGroups extends ListTreeNode childrenChanged(updatedChildren);
}
-
Object getDescriptor()
{
return _descriptors;
}
+
+ /*
Object saveDescriptor()
{
assert false;
@@ -181,6 +182,7 @@ class ReplicaGroups extends ListTreeNode {
assert false;
}
+ */
void removeDescriptor(Object descriptor)
{
diff --git a/java/src/IceGridGUI/Application/Root.java b/java/src/IceGridGUI/Application/Root.java index 83bbee3e117..558a56c3a1c 100755 --- a/java/src/IceGridGUI/Application/Root.java +++ b/java/src/IceGridGUI/Application/Root.java @@ -49,6 +49,7 @@ public class Root extends ListTreeNode //
// Impossible
//
+ System.err.println(e.toString());
assert false;
}
}
@@ -88,12 +89,14 @@ public class Root extends ListTreeNode _origDescription = _descriptor.description;
_origDistrib = (DistributionDescriptor)_descriptor.distrib.clone();
+ _propertySets = new PropertySets(this, _descriptor.propertySets);
_replicaGroups = new ReplicaGroups(this, _descriptor.replicaGroups);
_serviceTemplates = new ServiceTemplates(this, _descriptor.serviceTemplates);
_serverTemplates = new ServerTemplates(this, _descriptor.serverTemplates);
_nodes = new Nodes(this, _descriptor.nodes);
_children.add(_nodes);
+ _children.add(_propertySets);
_children.add(_replicaGroups);
_children.add(_serverTemplates);
_children.add(_serviceTemplates);
@@ -108,6 +111,8 @@ public class Root extends ListTreeNode {
ApplicationDescriptor copy = (ApplicationDescriptor)ad.clone();
+ copy.propertySets = PropertySets.copyDescriptors(copy.propertySets);
+
copy.replicaGroups =
ReplicaGroups.copyDescriptors(copy.replicaGroups);
@@ -233,7 +238,7 @@ public class Root extends ListTreeNode if(node != null)
{
target = node;
- Server server = (Server)target.findChild(serverId);
+ Server server = node.findServer(serverId);
if(server != null)
{
target = server;
@@ -281,6 +286,7 @@ public class Root extends ListTreeNode actions[SHOW_VARS] = true;
actions[SUBSTITUTE_VARS] = true;
actions[NEW_NODE] = true;
+ actions[NEW_PROPERTY_SET] = true;
actions[NEW_REPLICA_GROUP] = true;
actions[NEW_TEMPLATE_SERVER] = true;
actions[NEW_TEMPLATE_SERVER_ICEBOX] = true;
@@ -296,6 +302,7 @@ public class Root extends ListTreeNode {
_popup = new JPopupMenu();
_popup.add(actions.get(NEW_NODE));
+ _popup.add(actions.get(NEW_PROPERTY_SET));
_popup.add(actions.get(NEW_REPLICA_GROUP));
_popup.addSeparator();
_popup.add(actions.get(NEW_TEMPLATE_SERVER));
@@ -320,6 +327,10 @@ public class Root extends ListTreeNode {
_nodes.newNode();
}
+ public void newPropertySet()
+ {
+ _propertySets.newPropertySet();
+ }
public void newReplicaGroup()
{
_replicaGroups.newReplicaGroup();
@@ -601,27 +612,38 @@ public class Root extends ListTreeNode }
//
+ // Property sets
+ //
+ update.removePropertySets = _propertySets.getEditable().
+ removedElements(PropertySet.class);
+ update.propertySets = _propertySets.getUpdates();
+
+ //
// Replica Groups
//
- update.removeReplicaGroups = _replicaGroups.getEditable().removedElements();
+ update.removeReplicaGroups = _replicaGroups.getEditable().
+ removedElements(ReplicaGroup.class);
update.replicaGroups = _replicaGroups.getUpdates();
//
// Server Templates
//
- update.removeServerTemplates = _serverTemplates.getEditable().removedElements();
+ update.removeServerTemplates = _serverTemplates.getEditable().
+ removedElements(ServerTemplate.class);
update.serverTemplates = _serverTemplates.getUpdates();
//
// Service Templates
//
- update.removeServiceTemplates = _serviceTemplates.getEditable().removedElements();
+ update.removeServiceTemplates = _serviceTemplates.getEditable().
+ removedElements(ServiceTemplate.class);
update.serviceTemplates =_serviceTemplates.getUpdates();
//
// Nodes
//
- update.removeNodes = _nodes.getEditable().removedElements();
+ update.removeNodes = _nodes.getEditable().
+ removedElements(Node.class);
update.nodes = _nodes.getUpdates();
@@ -629,6 +651,8 @@ public class Root extends ListTreeNode // Return null if nothing changed
//
if(!_editable.isModified() &&
+ update.removePropertySets.length == 0 &&
+ update.propertySets.size() == 0 &&
update.removeReplicaGroups.length == 0 &&
update.replicaGroups.size() == 0 &&
update.removeServerTemplates.length == 0 &&
@@ -660,6 +684,7 @@ public class Root extends ListTreeNode _origDistrib = (DistributionDescriptor)_descriptor.distrib.clone();
_nodes.commit();
+ _propertySets.commit();
_replicaGroups.commit();
_serverTemplates.commit();
_serviceTemplates.commit();
@@ -764,6 +789,17 @@ public class Root extends ListTreeNode }
//
+ // Property Sets
+ //
+ for(int i = 0; i < desc.removePropertySets.length; ++i)
+ {
+ _descriptor.propertySets.remove(desc.removePropertySets[i]);
+ }
+ _descriptor.propertySets.putAll(desc.propertySets);
+ _propertySets.update(desc.propertySets,
+ desc.removePropertySets);
+
+ //
// Replica groups
//
for(int i = 0; i < desc.removeReplicaGroups.length; ++i)
@@ -957,6 +993,7 @@ public class Root extends ListTreeNode _serviceTemplates.write(writer);
_serverTemplates.write(writer);
_replicaGroups.write(writer);
+ _propertySets.write(writer);
_nodes.write(writer);
writer.writeEndTag("application");
@@ -985,6 +1022,7 @@ public class Root extends ListTreeNode _coordinator.getSaveToFileAction().setEnabled(true);
}
+
void rebuild() throws UpdateFailedException
{
Utils.Resolver oldResolver = _resolver;
@@ -1171,6 +1209,7 @@ public class Root extends ListTreeNode private Nodes _nodes;
+ private PropertySets _propertySets;
private ReplicaGroups _replicaGroups;
private ServerTemplates _serverTemplates;
private ServiceTemplates _serviceTemplates;
diff --git a/java/src/IceGridGUI/Application/Server.java b/java/src/IceGridGUI/Application/Server.java index 9cd4f85dbe9..ddf54c910f9 100755 --- a/java/src/IceGridGUI/Application/Server.java +++ b/java/src/IceGridGUI/Application/Server.java @@ -37,13 +37,8 @@ class Server extends Communicator implements TemplateInstance copy.adapters = Adapter.copyDescriptors(copy.adapters);
copy.dbEnvs = DbEnv.copyDescriptors(copy.dbEnvs);
- //
- // Update to properties is not atomic because of Adapter endpoints
- // (and possibly other properties set through a PropertiesHolder)
- //
- copy.propertySet = (PropertySetDescriptor)copy.propertySet.clone();
- copy.propertySet.references = (String[])copy.propertySet.references.clone();
- copy.propertySet.properties = (java.util.LinkedList)copy.propertySet.properties.clone();
+ copy.propertySet = PropertySet.copyDescriptor(copy.propertySet);
+
copy.distrib = (DistributionDescriptor)copy.distrib.clone();
if(copy instanceof IceBoxDescriptor)
@@ -65,8 +60,9 @@ class Server extends Communicator implements TemplateInstance //
// When editing a server or server template, if we update properties,
// we replace the entire field
+ //
+
into.propertySet = from.propertySet;
-
into.description = from.description;
into.id = from.id;
into.exe = from.exe;
@@ -282,7 +278,7 @@ class Server extends Communicator implements TemplateInstance if(_ephemeral)
{
- node.removeChild(this);
+ node.removeServer(this);
}
else
{
@@ -294,8 +290,8 @@ class Server extends Communicator implements TemplateInstance {
node.removeDescriptor(_serverDescriptor);
}
- node.removeChild(this);
- node.getEditable().removeElement(_id);
+ node.removeServer(this);
+ node.getEditable().removeElement(_id, Server.class);
getRoot().updated();
}
}
@@ -335,6 +331,7 @@ class Server extends Communicator implements TemplateInstance _instanceDescriptor.template = copy.template;
_instanceDescriptor.parameterValues = copy.parameterValues;
+ _instanceDescriptor.propertySet = copy.propertySet;
ServerTemplate t = getRoot().findServerTemplate(_instanceDescriptor.template);
_serverDescriptor = (ServerDescriptor)
@@ -458,10 +455,8 @@ class Server extends Communicator implements TemplateInstance }
writeOptions(writer, _serverDescriptor.options);
writeEnvs(writer, _serverDescriptor.envs);
- //
- // TODO: BENOIT: Add refernces
- //
- writeProperties(writer, _serverDescriptor.propertySet.properties);
+
+ writePropertySet(writer, "", _serverDescriptor.propertySet);
writeDistribution(writer, _serverDescriptor.distrib);
_adapters.write(writer);
@@ -479,10 +474,8 @@ class Server extends Communicator implements TemplateInstance writeOptions(writer, _serverDescriptor.options);
writeEnvs(writer, _serverDescriptor.envs);
- //
- // TODO: BENOIT: Add references
- //
- writeProperties(writer, _serverDescriptor.propertySet.properties);
+
+ writePropertySet(writer, "", _serverDescriptor.propertySet);
writeDistribution(writer, _serverDescriptor.distrib);
_adapters.write(writer);
@@ -545,10 +538,10 @@ class Server extends Communicator implements TemplateInstance newServer.getEditable().markModified();
}
- node.removeChild(this);
+ node.removeServer(this);
try
{
- node.insertChild(newServer, true);
+ node.insertServer(newServer, true);
}
catch(UpdateFailedException e)
{
@@ -564,11 +557,11 @@ class Server extends Communicator implements TemplateInstance else
{
newServer.getEditable().markNew();
- node.removeChild(this);
- node.getEditable().removeElement(_id);
+ node.removeServer(this);
+ node.getEditable().removeElement(_id, Server.class);
try
{
- node.insertChild(newServer, true);
+ node.insertServer(newServer, true);
}
catch(UpdateFailedException e)
{
@@ -605,12 +598,12 @@ class Server extends Communicator implements TemplateInstance if(badServer != null)
{
- node.removeChild(badServer);
+ node.removeServer(badServer);
}
try
{
- node.insertChild(this, true);
+ node.insertServer(this, true);
}
catch(UpdateFailedException e)
{
diff --git a/java/src/IceGridGUI/Application/ServerInstanceEditor.java b/java/src/IceGridGUI/Application/ServerInstanceEditor.java index ebb83010249..1cd330a39d9 100755 --- a/java/src/IceGridGUI/Application/ServerInstanceEditor.java +++ b/java/src/IceGridGUI/Application/ServerInstanceEditor.java @@ -15,12 +15,14 @@ import javax.swing.Action; import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
+import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.CellConstraints;
import IceGrid.*;
import IceGridGUI.*;
@@ -36,17 +38,23 @@ class ServerInstanceEditor extends AbstractServerEditor descriptor.parameterValues = _parameterValuesMap;
((Server)_target).setServerDescriptor(
(ServerDescriptor)((TemplateDescriptor)t.getDescriptor()).descriptor);
+
+ descriptor.propertySet.references =
+ (String[])_propertySetsList.toArray(new String[0]);
+ descriptor.propertySet.properties = _properties.getProperties();
}
protected boolean isSimpleUpdate()
{
- return false;
+ ServerInstanceDescriptor descriptor = getDescriptor();
+ ServerTemplate t = (ServerTemplate)_template.getSelectedItem();
+
+ return descriptor.template.equals(t.getId())
+ && descriptor.parameterValues.equals(_parameterValuesMap);
}
ServerInstanceEditor(JFrame parentFrame)
- {
- _subEditor = new ServerSubEditor(this, parentFrame);
-
+ {
_template.setToolTipText("Server template");
_parameterValues.setEditable(false);
@@ -96,6 +104,31 @@ class ServerInstanceEditor extends AbstractServerEditor "Edit parameters");
_parametersButton = new JButton(openParametersDialog);
+
+
+ _propertySets.setEditable(false);
+ _properties = new PropertiesField(this);
+
+ _propertySetsDialog = new ListDialog(parentFrame,
+ "Property Set References", true);
+
+ Action openPropertySetsDialog = new AbstractAction("...")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ java.util.LinkedList result = _propertySetsDialog.show(
+ _propertySetsList, getProperties());
+ if(result != null)
+ {
+ updated();
+ _propertySetsList = result;
+ setPropertySetsField();
+ }
+ }
+ };
+ openPropertySetsDialog.putValue(Action.SHORT_DESCRIPTION,
+ "Edit property set references");
+ _propertySetsButton = new JButton(openPropertySetsDialog);
}
ServerInstanceDescriptor getDescriptor()
@@ -129,18 +162,26 @@ class ServerInstanceEditor extends AbstractServerEditor builder.append(_parametersButton);
builder.nextLine();
- builder.appendSeparator();
+ builder.append("Property Sets");
+ builder.append(_propertySets, _propertySetsButton);
builder.nextLine();
-
- _subEditor.appendProperties(builder);
- }
- Object getSubDescriptor()
- {
- ServerTemplate template = (ServerTemplate)_template.getSelectedItem();
-
- TemplateDescriptor descriptor = (TemplateDescriptor)template.getDescriptor();
- return descriptor.descriptor;
+ builder.append("Properties");
+ builder.nextLine();
+ builder.append("");
+ builder.nextLine();
+ builder.append("");
+
+ builder.nextLine();
+ builder.append("");
+
+ builder.nextRow(-6);
+ JScrollPane scrollPane = new JScrollPane(_properties);
+ CellConstraints cc = new CellConstraints();
+ builder.add(scrollPane,
+ cc.xywh(builder.getColumn(), builder.getRow(), 3, 7));
+ builder.nextRow(6);
+ builder.nextLine();
}
void show(Server server)
@@ -151,7 +192,7 @@ class ServerInstanceEditor extends AbstractServerEditor ServerInstanceDescriptor descriptor = getDescriptor();
Root root = server.getRoot();
boolean isEditable = !root.getCoordinator().substitute();
-
+
//
// Need to make control enabled before changing it
//
@@ -183,11 +224,6 @@ class ServerInstanceEditor extends AbstractServerEditor _parameterValuesMap = makeParameterValues(_parameterValuesMap,
_parameterList);
setParameterValuesField();
-
- //
- // Redisplay details
- //
- _subEditor.show(false);
}
public void intervalAdded(ListDataEvent e)
@@ -205,17 +241,23 @@ class ServerInstanceEditor extends AbstractServerEditor setParameterValuesField();
_parametersButton.setEnabled(isEditable);
- _subEditor.show(false);
+
+ _propertySetsList = java.util.Arrays.asList(descriptor.propertySet.references);
+ setPropertySetsField();
+ _propertySetsButton.setEnabled(isEditable);
+
+ _properties.setProperties(descriptor.propertySet.properties,
+ getDetailResolver(), isEditable);
_applyButton.setEnabled(server.isEphemeral());
_discardButton.setEnabled(server.isEphemeral());
detectUpdates(true);
}
- void setParameterValuesField()
+ private void setParameterValuesField()
{
final Utils.Resolver resolver = _target.getCoordinator().substitute() ?
- ((Node)_target.getParent()).getResolver() : null;
+ ((Node)_target.getParent()).getResolver() : null;
Ice.StringHolder toolTipHolder = new Ice.StringHolder();
Utils.Stringifier stringifier = new Utils.Stringifier()
@@ -240,7 +282,32 @@ class ServerInstanceEditor extends AbstractServerEditor _parameterValues.setToolTipText(toolTipHolder.value);
}
- private ServerSubEditor _subEditor;
+ private void setPropertySetsField()
+ {
+ final Utils.Resolver resolver = getDetailResolver();
+
+ Ice.StringHolder toolTipHolder = new Ice.StringHolder();
+ Utils.Stringifier stringifier = new Utils.Stringifier()
+ {
+ public String toString(Object obj)
+ {
+ return Utils.substitute((String)obj, resolver);
+ }
+ };
+
+ _propertySets.setText(
+ Utils.stringify(_propertySetsList,
+ stringifier, ", ", toolTipHolder));
+
+ String toolTip = "<html>Property Sets";
+
+ if(toolTipHolder.value != null)
+ {
+ toolTip += ":<br>" + toolTipHolder.value;
+ }
+ toolTip += "</html>";
+ _propertySets.setToolTipText(toolTip);
+ }
private JComboBox _template = new JComboBox();
private JButton _templateButton;
@@ -250,5 +317,12 @@ class ServerInstanceEditor extends AbstractServerEditor private java.util.Map _parameterValuesMap;
private ParametersDialog _parametersDialog;
- private JButton _parametersButton;
+ private JButton _parametersButton;
+
+ private JTextField _propertySets = new JTextField(20);
+ private java.util.List _propertySetsList;
+ private ListDialog _propertySetsDialog;
+ private JButton _propertySetsButton;
+
+ private PropertiesField _properties;
}
diff --git a/java/src/IceGridGUI/Application/ServerTemplate.java b/java/src/IceGridGUI/Application/ServerTemplate.java index addabdd722d..862ef22f80d 100755 --- a/java/src/IceGridGUI/Application/ServerTemplate.java +++ b/java/src/IceGridGUI/Application/ServerTemplate.java @@ -160,7 +160,8 @@ class ServerTemplate extends Communicator serverTemplates.removeDescriptor(_id);
getRoot().removeServerInstances(_id);
serverTemplates.removeChild(this);
- serverTemplates.getEditable().removeElement(_id);
+ serverTemplates.getEditable().
+ removeElement(_id, ServerTemplate.class);
getRoot().updated();
}
}
@@ -252,10 +253,8 @@ class ServerTemplate extends Communicator }
Server.writeOptions(writer, descriptor.options);
Server.writeEnvs(writer, descriptor.envs);
- //
- // TODO: BENOIT: add references
- //
- writeProperties(writer, descriptor.propertySet.properties);
+
+ writePropertySet(writer, "", descriptor.propertySet);
writeDistribution(writer, descriptor.distrib);
_adapters.write(writer);
@@ -275,10 +274,8 @@ class ServerTemplate extends Communicator }
Server.writeOptions(writer, descriptor.options);
Server.writeEnvs(writer, descriptor.envs);
- //
- // TODO: BENOIT: Add references
- //
- writeProperties(writer, descriptor.propertySet.properties);
+
+ writePropertySet(writer, "", descriptor.propertySet);
writeDistribution(writer, descriptor.distrib);
_adapters.write(writer);
diff --git a/java/src/IceGridGUI/Application/Service.java b/java/src/IceGridGUI/Application/Service.java index 7a4baa28d21..132d334798e 100755 --- a/java/src/IceGridGUI/Application/Service.java +++ b/java/src/IceGridGUI/Application/Service.java @@ -37,16 +37,7 @@ class Service extends Communicator implements Cloneable, TemplateInstance ServiceDescriptor copy = (ServiceDescriptor)sd.clone();
copy.adapters = Adapter.copyDescriptors(copy.adapters);
copy.dbEnvs = DbEnv.copyDescriptors(copy.dbEnvs);
-
- //
- // Update to properties is not atomic because of Adapter endpoints
- // (and possibly other properties set through a PropertiesHolder)
- //
- //
- // TODO: BENOIT: Add support for property set.
- //
- copy.propertySet = new PropertySetDescriptor(new String[0],
- (java.util.LinkedList)copy.propertySet.properties.clone());
+ copy.propertySet = PropertySet.copyDescriptor(copy.propertySet);
return copy;
}
@@ -175,13 +166,12 @@ class Service extends Communicator implements Cloneable, TemplateInstance ServiceInstanceDescriptor sd = (ServiceInstanceDescriptor)savedDescriptor;
_instanceDescriptor.template = sd.template;
_instanceDescriptor.parameterValues = sd.parameterValues;
+ _instanceDescriptor.propertySet = sd.propertySet;
+
if(_instanceDescriptor.descriptor != null)
{
- //
- // TODO: BENOIT: Add support for property set.
- //
_instanceDescriptor.descriptor.propertySet =
- new PropertySetDescriptor(new String[0], sd.descriptor.propertySet.properties);
+ sd.descriptor.propertySet;
_instanceDescriptor.descriptor.description = sd.descriptor.description;
_instanceDescriptor.descriptor.name = sd.descriptor.name;
@@ -448,10 +438,8 @@ class Service extends Communicator implements Cloneable, TemplateInstance {
writer.writeElement("description", _serviceDescriptor.description);
}
- //
- // TODO: BENOIT: Add support for property set.
- //
- writeProperties(writer, _serviceDescriptor.propertySet.properties);
+
+ writePropertySet(writer, "", _serviceDescriptor.propertySet);
_adapters.write(writer);
_dbEnvs.write(writer);
writer.writeEndTag("service");
diff --git a/java/src/IceGridGUI/Application/ServiceInstanceEditor.java b/java/src/IceGridGUI/Application/ServiceInstanceEditor.java index 3ad638e3378..75f424345b4 100755 --- a/java/src/IceGridGUI/Application/ServiceInstanceEditor.java +++ b/java/src/IceGridGUI/Application/ServiceInstanceEditor.java @@ -15,12 +15,14 @@ import javax.swing.Action; import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
+import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.CellConstraints;
import IceGrid.*;
import IceGridGUI.*;
@@ -29,8 +31,6 @@ class ServiceInstanceEditor extends CommunicatorChildEditor {
ServiceInstanceEditor(JFrame parentFrame)
{
- _subEditor = new ServiceSubEditor(this, parentFrame);
-
_parameterValues.setEditable(false);
//
@@ -78,6 +78,30 @@ class ServiceInstanceEditor extends CommunicatorChildEditor openParametersDialog.putValue(Action.SHORT_DESCRIPTION,
"Edit parameter values");
_parametersButton = new JButton(openParametersDialog);
+
+ _propertySets.setEditable(false);
+ _properties = new PropertiesField(this);
+
+ _propertySetsDialog = new ListDialog(parentFrame,
+ "Property Set References", true);
+
+ Action openPropertySetsDialog = new AbstractAction("...")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ java.util.LinkedList result = _propertySetsDialog.show(
+ _propertySetsList, getProperties());
+ if(result != null)
+ {
+ updated();
+ _propertySetsList = result;
+ setPropertySetsField();
+ }
+ }
+ };
+ openPropertySetsDialog.putValue(Action.SHORT_DESCRIPTION,
+ "Edit property set references");
+ _propertySetsButton = new JButton(openPropertySetsDialog);
}
ServiceInstanceDescriptor getDescriptor()
@@ -106,11 +130,19 @@ class ServiceInstanceEditor extends CommunicatorChildEditor ServiceInstanceDescriptor descriptor = getDescriptor();
descriptor.template = ((ServiceTemplate)_template.getSelectedItem()).getId();
descriptor.parameterValues = _parameterValuesMap;
+
+ descriptor.propertySet.references =
+ (String[])_propertySetsList.toArray(new String[0]);
+ descriptor.propertySet.properties = _properties.getProperties();
}
boolean isSimpleUpdate()
{
- return false;
+ ServiceInstanceDescriptor descriptor = getDescriptor();
+ ServiceTemplate t = (ServiceTemplate)_template.getSelectedItem();
+
+ return descriptor.template.equals(t.getId())
+ && descriptor.parameterValues.equals(_parameterValuesMap);
}
Communicator.ChildList getChildList()
@@ -128,10 +160,26 @@ class ServiceInstanceEditor extends CommunicatorChildEditor builder.append(_parametersButton);
builder.nextLine();
- builder.appendSeparator();
+ builder.append("Property Sets");
+ builder.append(_propertySets, _propertySetsButton);
+ builder.nextLine();
+
+ builder.append("Properties");
+ builder.nextLine();
+ builder.append("");
+ builder.nextLine();
+ builder.append("");
+
+ builder.nextLine();
+ builder.append("");
+
+ builder.nextRow(-6);
+ JScrollPane scrollPane = new JScrollPane(_properties);
+ CellConstraints cc = new CellConstraints();
+ builder.add(scrollPane,
+ cc.xywh(builder.getColumn(), builder.getRow(), 3, 7));
+ builder.nextRow(6);
builder.nextLine();
-
- _subEditor.appendProperties(builder);
}
protected void buildPropertiesPanel()
@@ -141,14 +189,6 @@ class ServiceInstanceEditor extends CommunicatorChildEditor }
- Object getSubDescriptor()
- {
- ServiceTemplate template = (ServiceTemplate)_template.getSelectedItem();
-
- TemplateDescriptor descriptor = (TemplateDescriptor)template.getDescriptor();
- return descriptor.descriptor;
- }
-
void show(Service service)
{
detectUpdates(false);
@@ -198,11 +238,6 @@ class ServiceInstanceEditor extends CommunicatorChildEditor _parameterValuesMap = makeParameterValues(_parameterValuesMap,
_parameterList);
setParameterValuesField();
-
- //
- // Redisplay details
- //
- _subEditor.show(false);
}
public void intervalAdded(ListDataEvent e)
@@ -223,7 +258,12 @@ class ServiceInstanceEditor extends CommunicatorChildEditor setParameterValuesField();
_parametersButton.setEnabled(isEditable);
- _subEditor.show(false);
+ _propertySetsList = java.util.Arrays.asList(descriptor.propertySet.references);
+ setPropertySetsField();
+ _propertySetsButton.setEnabled(isEditable);
+
+ _properties.setProperties(descriptor.propertySet.properties,
+ getDetailResolver(), isEditable);
_applyButton.setEnabled(service.isEphemeral());
_discardButton.setEnabled(service.isEphemeral());
@@ -260,7 +300,32 @@ class ServiceInstanceEditor extends CommunicatorChildEditor _parameterValues.setToolTipText(toolTipHolder.value);
}
- private ServiceSubEditor _subEditor;
+ private void setPropertySetsField()
+ {
+ final Utils.Resolver resolver = getDetailResolver();
+
+ Ice.StringHolder toolTipHolder = new Ice.StringHolder();
+ Utils.Stringifier stringifier = new Utils.Stringifier()
+ {
+ public String toString(Object obj)
+ {
+ return Utils.substitute((String)obj, resolver);
+ }
+ };
+
+ _propertySets.setText(
+ Utils.stringify(_propertySetsList,
+ stringifier, ", ", toolTipHolder));
+
+ String toolTip = "<html>Property Sets";
+
+ if(toolTipHolder.value != null)
+ {
+ toolTip += ":<br>" + toolTipHolder.value;
+ }
+ toolTip += "</html>";
+ _propertySets.setToolTipText(toolTip);
+ }
private JComboBox _template = new JComboBox();
private JButton _templateButton;
@@ -270,5 +335,12 @@ class ServiceInstanceEditor extends CommunicatorChildEditor private java.util.Map _parameterValuesMap;
private ParametersDialog _parametersDialog;
- private JButton _parametersButton;
+ private JButton _parametersButton;
+
+ private JTextField _propertySets = new JTextField(20);
+ private java.util.List _propertySetsList;
+ private ListDialog _propertySetsDialog;
+ private JButton _propertySetsButton;
+
+ private PropertiesField _properties;
}
diff --git a/java/src/IceGridGUI/Application/ServiceTemplate.java b/java/src/IceGridGUI/Application/ServiceTemplate.java index f1c18c788de..deec70eb371 100755 --- a/java/src/IceGridGUI/Application/ServiceTemplate.java +++ b/java/src/IceGridGUI/Application/ServiceTemplate.java @@ -146,10 +146,8 @@ class ServiceTemplate extends Communicator {
writer.writeElement("description", descriptor.description);
}
- //
- // TODO: BENOIT: Add references
- //
- writeProperties(writer, descriptor.propertySet.properties);
+
+ writePropertySet(writer, "", descriptor.propertySet);
_adapters.write(writer);
_dbEnvs.write(writer);
writer.writeEndTag("service");
@@ -205,7 +203,8 @@ class ServiceTemplate extends Communicator serviceTemplates.removeDescriptor(_id);
getRoot().removeServiceInstances(_id);
serviceTemplates.removeChild(this);
- serviceTemplates.getEditable().removeElement(_id);
+ serviceTemplates.getEditable().
+ removeElement(_id, ServiceTemplate.class);
getRoot().updated();
}
}
@@ -251,10 +250,7 @@ class ServiceTemplate extends Communicator ServiceDescriptor sd = (ServiceDescriptor)_templateDescriptor.descriptor;
ServiceDescriptor csd = (ServiceDescriptor)clone.descriptor;
- //
- // TODO: BENOIT: Add references
- //
- sd.propertySet.properties = csd.propertySet.properties;
+ sd.propertySet = csd.propertySet;
sd.description = csd.description;
sd.name = csd.name;
sd.entry = csd.entry;
diff --git a/java/src/IceGridGUI/Application/TemplateEditor.java b/java/src/IceGridGUI/Application/TemplateEditor.java index 2c90345f31f..456e79cd8bc 100755 --- a/java/src/IceGridGUI/Application/TemplateEditor.java +++ b/java/src/IceGridGUI/Application/TemplateEditor.java @@ -135,6 +135,8 @@ class TemplateEditor extends Editor {
assert false;
}
+ root.setSelectedNode(_target);
+
JOptionPane.showMessageDialog(
_target.getCoordinator().getMainFrame(),
e.toString(),
diff --git a/java/src/IceGridGUI/Application/TreeNode.java b/java/src/IceGridGUI/Application/TreeNode.java index 5f854f708f3..74778e0cd7f 100755 --- a/java/src/IceGridGUI/Application/TreeNode.java +++ b/java/src/IceGridGUI/Application/TreeNode.java @@ -79,7 +79,14 @@ public abstract class TreeNode extends TreeNodeBase //
Utils.Resolver getResolver()
{
- return ((TreeNode)_parent).getResolver();
+ if(isEphemeral())
+ {
+ return null;
+ }
+ else
+ {
+ return ((TreeNode)_parent).getResolver();
+ }
}
//
@@ -121,19 +128,33 @@ public abstract class TreeNode extends TreeNodeBase }
}
- static void writeProperties(XMLWriter writer,
- java.util.List properties)
+ static void writePropertySet(XMLWriter writer, String id, PropertySetDescriptor psd)
throws java.io.IOException
{
- java.util.Iterator p = properties.iterator();
+ java.util.List attributes = new java.util.LinkedList();
+ if(id.length() > 0)
+ {
+ attributes.add(createAttribute("id", id));
+ }
+ writer.writeElement("properties", attributes);
+
+ for(int i = 0; i < psd.references.length; ++i)
+ {
+ attributes.clear();
+ attributes.add(createAttribute("refid", psd.references[i]));
+ writer.writeElement("properties", attributes);
+ }
+
+ java.util.Iterator p = psd.properties.iterator();
while(p.hasNext())
{
PropertyDescriptor pd = (PropertyDescriptor)p.next();
- java.util.List attributes = new java.util.LinkedList();
+ attributes.clear();
attributes.add(createAttribute("name", pd.name));
attributes.add(createAttribute("value", pd.value));
writer.writeElement("property", attributes);
}
+ writer.writeEndTag("properties");
}
static void writeDistribution(XMLWriter writer,
@@ -225,27 +246,28 @@ public abstract class TreeNode extends TreeNodeBase public static final int NEW_ADAPTER = 0;
public static final int NEW_DBENV = 1;
public static final int NEW_NODE = 2;
- public static final int NEW_REPLICA_GROUP = 3;
- public static final int NEW_SERVER = 4;
- public static final int NEW_SERVER_ICEBOX = 5;
- public static final int NEW_SERVER_FROM_TEMPLATE = 6;
- public static final int NEW_SERVICE = 7;
- public static final int NEW_SERVICE_FROM_TEMPLATE = 8;
- public static final int NEW_TEMPLATE_SERVER = 9;
- public static final int NEW_TEMPLATE_SERVER_ICEBOX = 10;
- public static final int NEW_TEMPLATE_SERVICE = 11;
+ public static final int NEW_PROPERTY_SET = 3;
+ public static final int NEW_REPLICA_GROUP = 4;
+ public static final int NEW_SERVER = 5;
+ public static final int NEW_SERVER_ICEBOX = 6;
+ public static final int NEW_SERVER_FROM_TEMPLATE = 7;
+ public static final int NEW_SERVICE = 8;
+ public static final int NEW_SERVICE_FROM_TEMPLATE = 9;
+ public static final int NEW_TEMPLATE_SERVER = 10;
+ public static final int NEW_TEMPLATE_SERVER_ICEBOX = 11;
+ public static final int NEW_TEMPLATE_SERVICE = 12;
- public static final int COPY = 12;
- public static final int PASTE = 13;
- public static final int DELETE = 14;
+ public static final int COPY = 13;
+ public static final int PASTE = 14;
+ public static final int DELETE = 15;
- public static final int SHOW_VARS = 15;
- public static final int SUBSTITUTE_VARS = 16;
+ public static final int SHOW_VARS = 16;
+ public static final int SUBSTITUTE_VARS = 17;
- public static final int MOVE_UP = 17;
- public static final int MOVE_DOWN = 18;
+ public static final int MOVE_UP = 18;
+ public static final int MOVE_DOWN = 19;
- static public final int ACTION_COUNT = 19;
+ static public final int ACTION_COUNT = 20;
public boolean[] getAvailableActions()
{
@@ -263,6 +285,10 @@ public abstract class TreeNode extends TreeNodeBase {
assert false;
}
+ public void newPropertySet()
+ {
+ assert false;
+ }
public void newReplicaGroup()
{
assert false;
@@ -323,6 +349,4 @@ public abstract class TreeNode extends TreeNodeBase {
assert false;
}
-
-
}
diff --git a/java/src/IceGridGUI/ApplicationActions.java b/java/src/IceGridGUI/ApplicationActions.java index 5501e9abef0..9fb60634155 100755 --- a/java/src/IceGridGUI/ApplicationActions.java +++ b/java/src/IceGridGUI/ApplicationActions.java @@ -82,6 +82,15 @@ public class ApplicationActions }
};
+ _array[TreeNode.NEW_PROPERTY_SET] = new AbstractAction(
+ popup ? "New property set" : "Property set")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ _target.newPropertySet();
+ }
+ };
+
_array[TreeNode.NEW_REPLICA_GROUP] = new AbstractAction(
popup ? "New replica group" : "Replica group" )
{
diff --git a/java/src/IceGridGUI/LiveDeployment/Adapter.java b/java/src/IceGridGUI/LiveDeployment/Adapter.java index 5add2303c42..046beb29ac4 100755 --- a/java/src/IceGridGUI/LiveDeployment/Adapter.java +++ b/java/src/IceGridGUI/LiveDeployment/Adapter.java @@ -90,10 +90,16 @@ class Adapter extends TreeNode return _currentEndpoints;
}
- String getProperty(String name)
+ java.util.Map getProperties()
{
- Server server = (Server)_parent;
- return server.getProperty(_descriptor.name + "." + name);
+ if(_parent instanceof Server)
+ {
+ return ((Server)_parent).getProperties();
+ }
+ else
+ {
+ return ((Service)_parent).getProperties();
+ }
}
boolean update(AdapterDynamicInfo info)
diff --git a/java/src/IceGridGUI/LiveDeployment/AdapterEditor.java b/java/src/IceGridGUI/LiveDeployment/AdapterEditor.java index 5726c1ab316..25594e7ca6c 100755 --- a/java/src/IceGridGUI/LiveDeployment/AdapterEditor.java +++ b/java/src/IceGridGUI/LiveDeployment/AdapterEditor.java @@ -65,9 +65,13 @@ class AdapterEditor extends Editor _description.setText(resolver.substitute(descriptor.description));
_id.setText(resolver.substitute(descriptor.id));
_replicaGroupId.setText(resolver.substitute(descriptor.replicaGroupId));
- _endpoints.setText(resolver.substitute(adapter.getProperty("Endpoints")));
+
+ java.util.Map properties = adapter.getProperties();
+
+ // getId() returns the name of the adapter!
+ _endpoints.setText(resolver.substitute((String)properties.get(adapter.getId() + ".Endpoints")));
_publishedEndpoints.setText(
- resolver.substitute(adapter.getProperty("PublishedEndpoints")));
+ resolver.substitute((String)properties.get(adapter.getId() + ".PublishedEndpoints")));
_registerProcess.setSelected(descriptor.registerProcess);
_waitForActivation.setSelected(descriptor.waitForActivation);
diff --git a/java/src/IceGridGUI/LiveDeployment/CommunicatorEditor.java b/java/src/IceGridGUI/LiveDeployment/CommunicatorEditor.java index 8931d26009f..ff85e198c45 100755 --- a/java/src/IceGridGUI/LiveDeployment/CommunicatorEditor.java +++ b/java/src/IceGridGUI/LiveDeployment/CommunicatorEditor.java @@ -46,15 +46,12 @@ class CommunicatorEditor extends Editor }
protected void show(CommunicatorDescriptor descriptor,
- ExpandedPropertySet propertySet,
- ExpandedPropertySet instancePropertySet,
+ java.util.Map properties,
Utils.Resolver resolver)
{
_description.setText(resolver.substitute(descriptor.description));
- _propertiesModel.setDataVector(
- propertySetToVector(propertySet, instancePropertySet, resolver),
- _columnNames);
+ _propertiesModel.setDataVector(mapToVector(properties), _columnNames);
DefaultTableCellRenderer cr = (DefaultTableCellRenderer)
_properties.getDefaultRenderer(String.class);
diff --git a/java/src/IceGridGUI/LiveDeployment/Editor.java b/java/src/IceGridGUI/LiveDeployment/Editor.java index d50f7fc6969..d212ac4bf28 100755 --- a/java/src/IceGridGUI/LiveDeployment/Editor.java +++ b/java/src/IceGridGUI/LiveDeployment/Editor.java @@ -13,64 +13,6 @@ import IceGrid.*; public abstract class Editor extends EditorBase
{
- //
- // An expanded property set (i.e. containing other property sets)
- //
- static public class ExpandedPropertySet
- {
- public ExpandedPropertySet[] references;
- public java.util.List properties; // list of PropertyDescriptor
- }
-
- static public java.util.Vector propertySetToVector(
- ExpandedPropertySet propertySet,
- ExpandedPropertySet instancePropertySet, // can be null
- Utils.Resolver resolver)
- {
- java.util.SortedMap toMap = new java.util.TreeMap();
-
- addSet(propertySet, resolver, toMap);
- if(instancePropertySet != null)
- {
- addSet(instancePropertySet, resolver, toMap);
- }
-
- java.util.Vector result = new java.util.Vector(toMap.size());
- java.util.Iterator p = toMap.entrySet().iterator();
- while(p.hasNext())
- {
- java.util.Map.Entry entry = (java.util.Map.Entry)p.next();
- java.util.Vector row = new java.util.Vector(2);
- row.add(entry.getKey());
- row.add(entry.getValue());
- result.add(row);
- }
- return result;
- }
-
-
- static private void addSet(ExpandedPropertySet set, Utils.Resolver resolver,
- java.util.SortedMap toMap)
- {
- for(int i = 0; i < set.references.length; ++i)
- {
- addSet(set.references[i], resolver, toMap);
- }
-
- java.util.Iterator p = set.properties.iterator();
- while(p.hasNext())
- {
- PropertyDescriptor pd = (PropertyDescriptor)p.next();
- String name = (String)pd.name;
- String val = (String)pd.value;
-
- assert resolver != null;
- name = resolver.substitute(pd.name);
- val = resolver.substitute(pd.value);
-
- toMap.put(name, val);
- }
- }
}
diff --git a/java/src/IceGridGUI/LiveDeployment/Node.java b/java/src/IceGridGUI/LiveDeployment/Node.java index 61a2b30956a..aa652a659ee 100755 --- a/java/src/IceGridGUI/LiveDeployment/Node.java +++ b/java/src/IceGridGUI/LiveDeployment/Node.java @@ -175,31 +175,30 @@ class Node extends ListTreeNode {
super(parent, update.name);
- //
- // TODO: BENOIT: Add support for property sets.
- //
NodeDescriptor nodeDesc = new NodeDescriptor(
update.variables,
update.serverInstances,
update.servers,
update.loadFactor.value,
update.description.value,
- new java.util.HashMap());
+ update.propertySets);
appDesc.nodes.put(_id, nodeDesc);
add(appDesc, nodeDesc);
}
- Editor.ExpandedPropertySet expand(PropertySetDescriptor descriptor,
- String applicationName)
+ Utils.ExpandedPropertySet expand(PropertySetDescriptor descriptor,
+ String applicationName, Utils.Resolver resolver)
{
- Editor.ExpandedPropertySet result = new Editor.ExpandedPropertySet();
- result.references = new Editor.ExpandedPropertySet[descriptor.references.length];
+ Utils.ExpandedPropertySet result = new Utils.ExpandedPropertySet();
+ result.references = new Utils.ExpandedPropertySet[descriptor.references.length];
for(int i = 0; i < descriptor.references.length; ++i)
{
result.references[i] = expand(
- findNamedPropertySet(descriptor.references[i], applicationName), applicationName);
+ findNamedPropertySet(resolver.substitute(descriptor.references[i]),
+ applicationName),
+ applicationName, resolver);
}
result.properties = descriptor.properties;
@@ -317,18 +316,7 @@ class Node extends ListTreeNode for(int i = 0; i < update.removeServers.length; ++i)
{
Server server = findServer(update.removeServers[i]);
-
- ServerInstanceDescriptor sid =
- server.getInstanceDescriptor();
- if(sid != null)
- {
- nodeDesc.serverInstances.remove(sid);
- }
- else
- {
- nodeDesc.servers.remove(server.getServerDescriptor());
- }
-
+ removeDescriptor(nodeDesc, server);
int index = getIndex(server);
_children.remove(server);
getRoot().getTreeModel().nodesWereRemoved(this, new int[]{index}, new Object[]{server});
@@ -348,19 +336,22 @@ class Node extends ListTreeNode {
insertServer(server);
freshServers.add(server);
+ nodeDesc.serverInstances.add(desc);
}
else
{
+ removeDescriptor(nodeDesc, oldServer);
oldServer.rebuild(server);
freshServers.add(oldServer);
+ nodeDesc.serverInstances.add(desc);
}
- nodeDesc.serverInstances.add(desc);
}
p = update.servers.iterator();
while(p.hasNext())
{
ServerDescriptor desc = (ServerDescriptor)p.next();
+
Server server = createServer(appDesc, data.resolver, desc);
Server oldServer = findServer(server.getId());
@@ -368,13 +359,15 @@ class Node extends ListTreeNode {
insertServer(server);
freshServers.add(server);
+ nodeDesc.servers.add(desc);
}
else
{
+ removeDescriptor(nodeDesc, oldServer);
oldServer.rebuild(server);
freshServers.add(oldServer);
+ nodeDesc.servers.add(desc);
}
- nodeDesc.servers.add(desc);
}
}
@@ -780,6 +773,54 @@ class Node extends ListTreeNode {
return (Server)find(id, _children);
}
+
+
+ private void removeDescriptor(NodeDescriptor nodeDesc, Server server)
+ {
+ ServerInstanceDescriptor instanceDescriptor =
+ server.getInstanceDescriptor();
+ if(instanceDescriptor != null)
+ {
+ removeDescriptor(nodeDesc, instanceDescriptor);
+ }
+ else
+ {
+ removeDescriptor(nodeDesc, server.getServerDescriptor());
+ }
+ }
+
+ private void removeDescriptor(NodeDescriptor nodeDesc, ServerDescriptor sd)
+ {
+ //
+ // A straight remove uses equals(), which is not the desired behavior
+ //
+ java.util.Iterator p = nodeDesc.servers.iterator();
+ while(p.hasNext())
+ {
+ if(sd == p.next())
+ {
+ p.remove();
+ break;
+ }
+ }
+ }
+
+ private void removeDescriptor(NodeDescriptor nodeDesc, ServerInstanceDescriptor sd)
+ {
+ //
+ // A straight remove uses equals(), which is not the desired behavior
+ //
+ java.util.Iterator p = nodeDesc.serverInstances.iterator();
+ while(p.hasNext())
+ {
+ if(sd == p.next())
+ {
+ p.remove();
+ break;
+ }
+ }
+ }
+
static class ApplicationData
{
diff --git a/java/src/IceGridGUI/LiveDeployment/Server.java b/java/src/IceGridGUI/LiveDeployment/Server.java index 38e64f9b6e7..a65981155d1 100755 --- a/java/src/IceGridGUI/LiveDeployment/Server.java +++ b/java/src/IceGridGUI/LiveDeployment/Server.java @@ -448,7 +448,12 @@ class Server extends ListArrayTreeNode _application = server._application;
_adapters = server._adapters;
_dbEnvs = server._dbEnvs;
+
_services = server._services;
+
+ _childrenArray[0] = _adapters;
+ _childrenArray[1] = _dbEnvs;
+ _childrenArray[2] = _services;
getRoot().getTreeModel().nodeStructureChanged(this);
}
@@ -584,21 +589,22 @@ class Server extends ListArrayTreeNode }
}
- String getProperty(String name)
+ java.util.Map getProperties()
{
- //
- // TODO: BENOIT: Add support for property set.
- //
- java.util.Iterator p = _serverDescriptor.propertySet.properties.iterator();
- while(p.hasNext())
+ Utils.ExpandedPropertySet instancePropertySet = null;
+ Node node = (Node)_parent;
+
+ if(_instanceDescriptor != null)
{
- PropertyDescriptor pd = (PropertyDescriptor)p.next();
- if(pd.name.equals(name))
- {
- return pd.value;
- }
+ instancePropertySet = node.expand(_instanceDescriptor.propertySet,
+ _application.name, _resolver);
}
- return "";
+
+ Utils.ExpandedPropertySet propertySet =
+ node.expand(_serverDescriptor.propertySet,
+ _application.name, _resolver);
+
+ return Utils.propertySetToMap(propertySet, instancePropertySet, _resolver);
}
private void createAdapters()
diff --git a/java/src/IceGridGUI/LiveDeployment/ServerEditor.java b/java/src/IceGridGUI/LiveDeployment/ServerEditor.java index 4564c07c629..494a19f4953 100755 --- a/java/src/IceGridGUI/LiveDeployment/ServerEditor.java +++ b/java/src/IceGridGUI/LiveDeployment/ServerEditor.java @@ -109,22 +109,7 @@ class ServerEditor extends CommunicatorEditor _application.setText(resolver.find("application"));
- Node node = (Node)server.getParent();
-
- ExpandedPropertySet propertySet =
- node.expand(descriptor.propertySet,
- server.getApplication().name);
-
- ExpandedPropertySet instancePropertySet = null;
- ServerInstanceDescriptor instanceDescriptor =
- server.getInstanceDescriptor();
- if(instanceDescriptor != null)
- {
- instancePropertySet = node.expand(instanceDescriptor.propertySet,
- server.getApplication().name);
- }
-
- super.show(descriptor, propertySet, instancePropertySet, resolver);
+ super.show(descriptor, server.getProperties(), resolver);
_exe.setText(resolver.substitute(descriptor.exe));
_pwd.setText(resolver.substitute(descriptor.pwd));
diff --git a/java/src/IceGridGUI/LiveDeployment/Service.java b/java/src/IceGridGUI/LiveDeployment/Service.java index 9c91d22a807..0900a651f32 100755 --- a/java/src/IceGridGUI/LiveDeployment/Service.java +++ b/java/src/IceGridGUI/LiveDeployment/Service.java @@ -125,6 +125,26 @@ class Service extends ListArrayTreeNode return _instanceDescriptor;
}
+ java.util.Map getProperties()
+ {
+ Utils.ExpandedPropertySet instancePropertySet = null;
+ Node node = (Node)_parent.getParent();
+
+ String applicationName = ((Server)_parent).getApplication().name;
+
+ if(_instanceDescriptor != null)
+ {
+ instancePropertySet = node.expand(_instanceDescriptor.propertySet,
+ applicationName, _resolver);
+ }
+
+ Utils.ExpandedPropertySet propertySet =
+ node.expand(_serviceDescriptor.propertySet,
+ applicationName, _resolver);
+
+ return Utils.propertySetToMap(propertySet, instancePropertySet, _resolver);
+ }
+
private void createAdapters()
{
java.util.Iterator p = _serviceDescriptor.adapters.iterator();
diff --git a/java/src/IceGridGUI/LiveDeployment/ServiceEditor.java b/java/src/IceGridGUI/LiveDeployment/ServiceEditor.java index 0d611fd0e7a..802df44cdcb 100755 --- a/java/src/IceGridGUI/LiveDeployment/ServiceEditor.java +++ b/java/src/IceGridGUI/LiveDeployment/ServiceEditor.java @@ -26,22 +26,7 @@ class ServiceEditor extends CommunicatorEditor ServiceDescriptor descriptor = service.getServiceDescriptor();
Utils.Resolver resolver = service.getResolver();
- String application = ((Server)service.getParent()).getApplication().name;
- Node node = (Node)service.getParent().getParent();
-
- ExpandedPropertySet propertySet =
- node.expand(descriptor.propertySet, application);
-
- ExpandedPropertySet instancePropertySet = null;
- ServiceInstanceDescriptor instanceDescriptor =
- service.getInstanceDescriptor();
- if(instanceDescriptor != null)
- {
- instancePropertySet = node.expand(instanceDescriptor.propertySet,
- application);
- }
-
- show(descriptor, propertySet, instancePropertySet, resolver);
+ show(descriptor, service.getProperties(), resolver);
_entry.setText(resolver.substitute(descriptor.entry));
}
diff --git a/java/src/IceGridGUI/TreeNodeBase.java b/java/src/IceGridGUI/TreeNodeBase.java index 5dbed38db6a..4c6f4177acc 100755 --- a/java/src/IceGridGUI/TreeNodeBase.java +++ b/java/src/IceGridGUI/TreeNodeBase.java @@ -137,6 +137,17 @@ public class TreeNodeBase implements javax.swing.tree.TreeNode, TreeCellRenderer return null;
}
+ protected String makeNewChildId(String base)
+ {
+ String id = base;
+ int i = 0;
+ while(findChild(id) != null)
+ {
+ id = base + "-" + (++i);
+ }
+ return id;
+ }
+
protected TreeNodeBase(TreeNodeBase parent, String id)
{
_parent = parent;
@@ -173,7 +184,78 @@ public class TreeNodeBase implements javax.swing.tree.TreeNode, TreeCellRenderer }
return true;
}
-
+
+ protected String insertSortedChildren(java.util.List newChildren,
+ java.util.List intoChildren,
+ DefaultTreeModel treeModel)
+ {
+ TreeNodeBase[] children = (TreeNodeBase[])newChildren.toArray(new TreeNodeBase[0]);
+ java.util.Arrays.sort(children, _childComparator);
+
+ int[] indices = new int[children.length];
+
+ int offset = -1;
+
+ int i = 0;
+ boolean checkInsert = true;
+ for(int j = 0; j < children.length; ++j)
+ {
+ String id = children[j].getId();
+
+ if(checkInsert)
+ {
+ while(i < intoChildren.size())
+ {
+ TreeNodeBase existingChild = (TreeNodeBase)intoChildren.get(i);
+ int cmp = id.compareTo(existingChild.getId());
+ if(cmp == 0)
+ {
+ return id;
+ }
+ if(cmp < 0)
+ {
+ break; // while
+ }
+ i++;
+ }
+
+ if(i < intoChildren.size())
+ {
+ // Insert here, and increment i (since children is sorted)
+ intoChildren.add(i, children[j]);
+ if(offset == -1)
+ {
+ offset = getIndex((TreeNodeBase)intoChildren.get(0));
+ }
+
+ indices[j] = offset + i;
+ i++; continue; // for
+ }
+ else
+ {
+ checkInsert = false;
+ }
+ }
+
+ //
+ // Append
+ //
+ intoChildren.add(children[j]);
+ if(offset == -1)
+ {
+ offset = getIndex((TreeNodeBase)intoChildren.get(0));
+ }
+ indices[j] = offset + i;
+ i++;
+ }
+
+ if(treeModel != null)
+ {
+ treeModel.nodesWereInserted(this, indices);
+ }
+
+ return null;
+ }
protected void removeSortedChildren(String[] childIds,
java.util.List fromChildren,
diff --git a/java/src/IceGridGUI/Utils.java b/java/src/IceGridGUI/Utils.java index b85a54fed22..7b2e5ca3983 100755 --- a/java/src/IceGridGUI/Utils.java +++ b/java/src/IceGridGUI/Utils.java @@ -9,6 +9,7 @@ package IceGridGUI;
import javax.swing.ImageIcon;
+import IceGrid.*;
public class Utils
{
@@ -351,4 +352,50 @@ public class Utils return input;
}
}
+
+ //
+ // An expanded property set (i.e. containing other property sets)
+ //
+ static public class ExpandedPropertySet
+ {
+ public ExpandedPropertySet[] references;
+ public java.util.List properties; // list of PropertyDescriptor
+ }
+
+ static public java.util.Map propertySetToMap(
+ ExpandedPropertySet propertySet,
+ ExpandedPropertySet instancePropertySet, // can be null
+ Resolver resolver)
+ {
+ java.util.SortedMap toMap = new java.util.TreeMap();
+
+ addSet(propertySet, resolver, toMap);
+ if(instancePropertySet != null)
+ {
+ addSet(instancePropertySet, resolver, toMap);
+ }
+ return toMap;
+ }
+
+ static private void addSet(ExpandedPropertySet set, Resolver resolver,
+ java.util.SortedMap toMap)
+ {
+ for(int i = 0; i < set.references.length; ++i)
+ {
+ addSet(set.references[i], resolver, toMap);
+ }
+
+ java.util.Iterator p = set.properties.iterator();
+ while(p.hasNext())
+ {
+ PropertyDescriptor pd = (PropertyDescriptor)p.next();
+ String name = (String)pd.name;
+ String val = (String)pd.value;
+
+ name = substitute(pd.name, resolver);
+ val = substitute(pd.value, resolver);
+
+ toMap.put(name, val);
+ }
+ }
}
|