summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
Diffstat (limited to 'java/src')
-rwxr-xr-xjava/src/IceGrid/TreeNode/AbstractServerEditor.java22
-rwxr-xr-xjava/src/IceGrid/TreeNode/AdapterEditor.java8
-rwxr-xr-xjava/src/IceGrid/TreeNode/DbEnvEditor.java6
-rwxr-xr-xjava/src/IceGrid/TreeNode/Node.java25
-rwxr-xr-xjava/src/IceGrid/TreeNode/Nodes.java3
-rwxr-xr-xjava/src/IceGrid/TreeNode/ReplicaGroup.java117
-rwxr-xr-xjava/src/IceGrid/TreeNode/ReplicaGroupEditor.java383
-rwxr-xr-xjava/src/IceGrid/TreeNode/ReplicaGroups.java111
8 files changed, 617 insertions, 58 deletions
diff --git a/java/src/IceGrid/TreeNode/AbstractServerEditor.java b/java/src/IceGrid/TreeNode/AbstractServerEditor.java
index daaca3e8eb6..43813792f92 100755
--- a/java/src/IceGrid/TreeNode/AbstractServerEditor.java
+++ b/java/src/IceGrid/TreeNode/AbstractServerEditor.java
@@ -47,7 +47,7 @@ abstract class AbstractServerEditor extends Editor
try
{
- node.tryAdd(instanceDescriptor, serverDescriptor);
+ node.tryAdd(instanceDescriptor, serverDescriptor, true);
}
catch(UpdateFailedException e)
{
@@ -106,18 +106,10 @@ abstract class AbstractServerEditor extends Editor
server.getServerDescriptor();
node.removeChild(server, true);
- if(instanceDescriptor != null)
- {
- node.removeDescriptor(instanceDescriptor);
- }
- else
- {
- node.removeDescriptor(serverDescriptor);
- }
try
{
- node.tryAdd(instanceDescriptor, serverDescriptor);
+ node.tryAdd(instanceDescriptor, serverDescriptor, false);
}
catch(UpdateFailedException e)
{
@@ -125,15 +117,7 @@ abstract class AbstractServerEditor extends Editor
// Restore all
//
server.restoreDescriptor(savedDescriptor);
- if(instanceDescriptor != null)
- {
- node.addDescriptor(instanceDescriptor);
- }
- else
- {
- node.addDescriptor(serverDescriptor);
- }
-
+
try
{
node.addChild(server, true);
diff --git a/java/src/IceGrid/TreeNode/AdapterEditor.java b/java/src/IceGrid/TreeNode/AdapterEditor.java
index 33f713f2498..c30fd52c851 100755
--- a/java/src/IceGrid/TreeNode/AdapterEditor.java
+++ b/java/src/IceGrid/TreeNode/AdapterEditor.java
@@ -128,7 +128,8 @@ class AdapterEditor extends ListElementEditor
//
_name.getDocument().addDocumentListener(_updateListener);
_endpoints.getDocument().addDocumentListener(_updateListener);
-
+ _description.getDocument().addDocumentListener(_updateListener);
+
JTextField idTextField = (JTextField)
_id.getEditor().getEditorComponent();
idTextField.getDocument().addDocumentListener(_updateListener);
@@ -325,7 +326,8 @@ class AdapterEditor extends ListElementEditor
_description.setText(
Utils.substitute(descriptor.description, resolver));
_description.setEditable(isEditable);
-
+ _description.setOpaque(isEditable);
+
//
// Need to make control editable & enabled before changing it
//
@@ -440,8 +442,8 @@ class AdapterEditor extends ListElementEditor
private JTextField _endpoints = new JTextField(20);
private JCheckBox _registerProcess;
private JCheckBox _waitForActivation;
- private JTextField _objects = new JTextField(20);
+ private JTextField _objects = new JTextField(20);
private java.util.Map _objectsMap;
private TableDialog _objectsDialog;
private JButton _objectsButton;
diff --git a/java/src/IceGrid/TreeNode/DbEnvEditor.java b/java/src/IceGrid/TreeNode/DbEnvEditor.java
index df58f9b992f..390d449db8c 100755
--- a/java/src/IceGrid/TreeNode/DbEnvEditor.java
+++ b/java/src/IceGrid/TreeNode/DbEnvEditor.java
@@ -63,11 +63,6 @@ class DbEnvEditor extends ListElementEditor
};
_propertiesButton = new JButton(openPropertiesDialog);
}
-
-
- //
- // From Editor:
- //
void writeDescriptor()
{
@@ -133,6 +128,7 @@ class DbEnvEditor extends ListElementEditor
_description.setText(
Utils.substitute(descriptor.description, resolver));
_description.setEditable(isEditable);
+ _description.setOpaque(isEditable);
_dbHome.setText(
Utils.substitute(descriptor.dbHome, resolver));
diff --git a/java/src/IceGrid/TreeNode/Node.java b/java/src/IceGrid/TreeNode/Node.java
index 4203a1195d5..7d8f7cd0065 100755
--- a/java/src/IceGrid/TreeNode/Node.java
+++ b/java/src/IceGrid/TreeNode/Node.java
@@ -931,19 +931,18 @@ class Node extends EditableParent
void tryAdd(ServerInstanceDescriptor instanceDescriptor,
- ServerDescriptor serverDescriptor) throws UpdateFailedException
+ ServerDescriptor serverDescriptor,
+ boolean addDescriptor) throws UpdateFailedException
{
try
{
if(instanceDescriptor != null)
{
- _descriptor.serverInstances.add(instanceDescriptor);
addChild(createServer(true, instanceDescriptor, getApplication()),
true);
}
else
{
- _descriptor.servers.add(serverDescriptor);
addChild(createServer(true, serverDescriptor, getApplication()),
true);
}
@@ -951,24 +950,22 @@ class Node extends EditableParent
catch(UpdateFailedException e)
{
e.addParent(this);
+ throw e;
+ }
+
+ if(addDescriptor)
+ {
if(instanceDescriptor != null)
{
- removeDescriptor(instanceDescriptor);
+ _descriptor.serverInstances.add(instanceDescriptor);
}
else
{
- removeDescriptor(serverDescriptor);
+ _descriptor.servers.add(serverDescriptor);
}
- throw e;
}
}
-
- void addDescriptor(ServerDescriptor sd)
- {
- _descriptor.servers.add(sd);
- }
-
void removeDescriptor(ServerDescriptor sd)
{
//
@@ -984,10 +981,6 @@ class Node extends EditableParent
}
}
}
- void addDescriptor(ServerInstanceDescriptor sd)
- {
- _descriptor.serverInstances.add(sd);
- }
void removeDescriptor(ServerInstanceDescriptor sd)
{
//
diff --git a/java/src/IceGrid/TreeNode/Nodes.java b/java/src/IceGrid/TreeNode/Nodes.java
index ca390eaab2a..269dca6f8ab 100755
--- a/java/src/IceGrid/TreeNode/Nodes.java
+++ b/java/src/IceGrid/TreeNode/Nodes.java
@@ -320,10 +320,11 @@ public class Nodes extends EditableParent
addChild(node, true);
}
catch(UpdateFailedException e)
- {
+ {
e.addParent(this);
throw e;
}
+ _descriptors.put(nodeName, descriptor);
}
private void newNode(NodeDescriptor descriptor)
diff --git a/java/src/IceGrid/TreeNode/ReplicaGroup.java b/java/src/IceGrid/TreeNode/ReplicaGroup.java
index 2c5432a17c3..56e1fb145de 100755
--- a/java/src/IceGrid/TreeNode/ReplicaGroup.java
+++ b/java/src/IceGrid/TreeNode/ReplicaGroup.java
@@ -8,8 +8,9 @@
// **********************************************************************
package IceGrid.TreeNode;
-import IceGrid.ReplicaGroupDescriptor;
import IceGrid.Model;
+import IceGrid.ReplicaGroupDescriptor;
+import IceGrid.SimpleInternalFrame;
import IceGrid.Utils;
class ReplicaGroup extends EditableLeaf
@@ -20,19 +21,110 @@ class ReplicaGroup extends EditableLeaf
return (ReplicaGroupDescriptor)d.clone();
}
- ReplicaGroup(boolean brandNew,
- ReplicaGroupDescriptor descriptor,
- Model model)
+ //
+ // Actions
+ //
+ public boolean[] getAvailableActions()
{
- //
- // Make the assumption that app variables can't be used in
- // the descriptor.id
- //
+ boolean[] actions = new boolean[ACTION_COUNT];
+ actions[COPY] = true;
+
+ if(_parent.getAvailableActions()[PASTE])
+ {
+ actions[PASTE] = true;
+ }
+ actions[DELETE] = true;
+ return actions;
+ }
+
+ public void copy()
+ {
+ _model.setClipboard(copyDescriptor(_descriptor));
+ _model.getActions()[PASTE].setEnabled(true);
+
+ }
+ public void paste()
+ {
+ _parent.paste();
+ }
+
+ public boolean destroy()
+ {
+ if(_parent == null)
+ {
+ return false;
+ }
+ ReplicaGroups replicaGroups = (ReplicaGroups)_parent;
+
+ if(_ephemeral)
+ {
+ replicaGroups.removeChild(this, true);
+ return true;
+ }
+ else if(_model.canUpdate())
+ {
+ replicaGroups.removeDescriptor(_descriptor);
+ replicaGroups.removeElement(this, true);
+ return true;
+ }
+ return false;
+ }
+
+ public void displayProperties()
+ {
+ SimpleInternalFrame propertiesFrame = _model.getPropertiesFrame();
+
+ propertiesFrame.setTitle("Properties for " + _id);
+ if(_editor == null)
+ {
+ _editor = new ReplicaGroupEditor(_model.getMainFrame());
+ }
+ propertiesFrame.setContent(_editor.getComponent());
+ _editor.show(this);
+
+ propertiesFrame.validate();
+ propertiesFrame.repaint();
+ }
+
+ public Object getDescriptor()
+ {
+ return _descriptor;
+ }
+
+ public Object saveDescriptor()
+ {
+ return _descriptor.clone();
+ }
+ public void restoreDescriptor(Object savedDescriptor)
+ {
+ ReplicaGroupDescriptor clone = (ReplicaGroupDescriptor)savedDescriptor;
+ _descriptor.id = clone.id;
+ _descriptor.objects = clone.objects;
+ _descriptor.loadBalancing = clone.loadBalancing;
+ }
+ public boolean isEphemeral()
+ {
+ return _ephemeral;
+ }
+
+ ReplicaGroup(boolean brandNew,
+ ReplicaGroupDescriptor descriptor,
+ Model model)
+ {
super(brandNew, descriptor.id, model);
+ _ephemeral = false;
rebuild(descriptor);
}
-
+
+ ReplicaGroup(ReplicaGroupDescriptor descriptor,
+ Model model)
+ {
+ super(false, descriptor.id, model);
+ _ephemeral = true;
+ rebuild(descriptor);
+ }
+
void rebuild(ReplicaGroupDescriptor descriptor)
{
_descriptor = descriptor;
@@ -41,10 +133,7 @@ class ReplicaGroup extends EditableLeaf
//
}
- public Object getDescriptor()
- {
- return _descriptor;
- }
-
private ReplicaGroupDescriptor _descriptor;
+ private final boolean _ephemeral;
+ static private ReplicaGroupEditor _editor;
}
diff --git a/java/src/IceGrid/TreeNode/ReplicaGroupEditor.java b/java/src/IceGrid/TreeNode/ReplicaGroupEditor.java
new file mode 100755
index 00000000000..434bec75a85
--- /dev/null
+++ b/java/src/IceGrid/TreeNode/ReplicaGroupEditor.java
@@ -0,0 +1,383 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2005 ZeroC, Inc. All rights reserved.
+//
+// This copy of Ice is licensed to you under the terms described in the
+// ICE_LICENSE file included in this distribution.
+//
+// **********************************************************************
+package IceGrid.TreeNode;
+
+import java.awt.event.ActionEvent;
+import 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.AdaptiveLoadBalancingPolicy;
+import IceGrid.RandomLoadBalancingPolicy;
+import IceGrid.RoundRobinLoadBalancingPolicy;
+
+import IceGrid.Model;
+import IceGrid.ObjectDescriptor;
+import IceGrid.ReplicaGroupDescriptor;
+import IceGrid.TableDialog;
+import IceGrid.Utils;
+
+class ReplicaGroupEditor extends Editor
+{
+ protected void applyUpdate()
+ {
+ ReplicaGroup replicaGroup = getReplicaGroup();
+ Model model = replicaGroup.getModel();
+
+ if(model.canUpdate())
+ {
+ model.disableDisplay();
+
+ try
+ {
+ if(replicaGroup.isEphemeral())
+ {
+ ReplicaGroups replicaGroups = (ReplicaGroups)replicaGroup.getParent();
+ writeDescriptor();
+ ReplicaGroupDescriptor descriptor =
+ (ReplicaGroupDescriptor)replicaGroup.getDescriptor();
+ replicaGroup.destroy(); // just removes the child
+
+ try
+ {
+ replicaGroups.tryAdd(descriptor, true);
+ }
+ catch(UpdateFailedException e)
+ {
+ //
+ // Add back ephemeral child
+ //
+ try
+ {
+ replicaGroups.addChild(replicaGroup, true);
+ }
+ catch(UpdateFailedException die)
+ {
+ assert false;
+ }
+ model.setSelectionPath(replicaGroup.getPath());
+
+ JOptionPane.showMessageDialog(
+ model.getMainFrame(),
+ e.toString(),
+ "Apply failed",
+ JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ //
+ // Success
+ //
+ _target = replicaGroups.findChildWithDescriptor(descriptor);
+ }
+ else if(isSimpleUpdate())
+ {
+ writeDescriptor();
+ _target.getEditable().markModified();
+ }
+ else
+ {
+ //
+ // Save to be able to rollback
+ //
+ Object savedDescriptor = replicaGroup.saveDescriptor();
+ ReplicaGroups replicaGroups = (ReplicaGroups)replicaGroup.getParent();
+ writeDescriptor();
+ ReplicaGroupDescriptor descriptor =
+ (ReplicaGroupDescriptor)replicaGroup.getDescriptor();
+
+ replicaGroups.removeChild(replicaGroup, true);
+ try
+ {
+ replicaGroups.tryAdd(descriptor, false);
+ }
+ catch(UpdateFailedException e)
+ {
+ //
+ // Restore all
+ //
+ replicaGroup.restoreDescriptor(savedDescriptor);
+ try
+ {
+ replicaGroups.addChild(replicaGroup, true);
+ }
+ catch(UpdateFailedException die)
+ {
+ assert false;
+ }
+ model.setSelectionPath(replicaGroup.getPath());
+
+ JOptionPane.showMessageDialog(
+ model.getMainFrame(),
+ e.toString(),
+ "Apply failed",
+ JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ //
+ // Success
+ //
+ replicaGroups.removeElement(replicaGroup.getId()); // replaced by brand new ReplicaGroup
+
+ _target = replicaGroups.findChildWithDescriptor(descriptor);
+ model.setSelectionPath(_target.getPath());
+ model.showActions(_target);
+ }
+
+ _applyButton.setEnabled(false);
+ _discardButton.setEnabled(false);
+ }
+ finally
+ {
+ model.enableDisplay();
+ }
+ }
+ }
+
+ ReplicaGroupEditor(JFrame parentFrame)
+ {
+ _objects.setEditable(false);
+
+ //
+ // _objectsButton
+ //
+ _objectsDialog = new TableDialog(parentFrame,
+ "Registered Objects",
+ "Object Identity",
+ "Type", true);
+
+ Action openObjectsDialog = new AbstractAction("...")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ java.util.Map result = _objectsDialog.show(_objectsMap,
+ _panel);
+ if(result != null)
+ {
+ updated();
+ _objectsMap = result;
+ setObjectsField();
+ }
+ }
+ };
+ _objectsButton = new JButton(openObjectsDialog);
+
+ //
+ // load balancing
+ //
+ _loadBalancing.addItemListener(new ItemListener()
+ {
+ public void itemStateChanged(ItemEvent e)
+ {
+ if(e.getStateChange() == ItemEvent.SELECTED)
+ {
+ updated();
+
+ Object item = e.getItem();
+ _nReplicasLabel.setVisible(item != RETURN_ALL);
+ _nReplicas.setVisible(item != RETURN_ALL);
+
+ _loadSampleLabel.setVisible(item == ADAPTIVE);
+ _loadSample.setVisible(item == ADAPTIVE);
+ }
+ }
+ });
+
+ //
+ // Associate updateListener with various fields
+ //
+ _id.getDocument().addDocumentListener(_updateListener);
+ _description.getDocument().addDocumentListener(_updateListener);
+ _nReplicas.getDocument().addDocumentListener(_updateListener);
+
+ _loadSample.setEditable(true);
+ JTextField loadSampleTextField = (JTextField)
+ _loadSample.getEditor().getEditorComponent();
+ loadSampleTextField.getDocument().addDocumentListener(_updateListener);
+
+ }
+
+ void writeDescriptor()
+ {
+ ReplicaGroupDescriptor descriptor =
+ (ReplicaGroupDescriptor)getReplicaGroup().getDescriptor();
+
+ descriptor.id = _id.getText();
+ // descriptor.description = _description.getText();
+ descriptor.objects = AdapterEditor.mapToObjectDescriptorSeq(_objectsMap);
+
+ Object loadBalancing = _loadBalancing.getSelectedItem();
+ if(loadBalancing == RETURN_ALL)
+ {
+ descriptor.loadBalancing = null;
+ }
+ else if(loadBalancing == RANDOM)
+ {
+ descriptor.loadBalancing = new RandomLoadBalancingPolicy(
+ _nReplicas.getText());
+ }
+ else if(loadBalancing == ROUND_ROBIN)
+ {
+ descriptor.loadBalancing = new RoundRobinLoadBalancingPolicy(
+ _nReplicas.getText());
+ }
+ else if(loadBalancing == ADAPTIVE)
+ {
+ descriptor.loadBalancing = new AdaptiveLoadBalancingPolicy(
+ _nReplicas.getText(),
+ _loadSample.getSelectedItem().toString());
+ }
+ else
+ {
+ assert false;
+ }
+ }
+
+ boolean isSimpleUpdate()
+ {
+ ReplicaGroupDescriptor descriptor =
+ (ReplicaGroupDescriptor)getReplicaGroup().getDescriptor();
+ return descriptor.id.equals(_id.getText());
+ }
+
+ void append(DefaultFormBuilder builder)
+ {
+ builder.append("Replica Group ID" );
+ builder.append(_id, 3);
+ builder.nextLine();
+
+ builder.append("Description");
+ builder.nextLine();
+ builder.append("");
+ builder.nextRow(-2);
+ CellConstraints cc = new CellConstraints();
+ JScrollPane scrollPane = new JScrollPane(_description);
+ builder.add(scrollPane,
+ cc.xywh(builder.getColumn(), builder.getRow(), 3, 3));
+ builder.nextRow(2);
+ builder.nextLine();
+
+ builder.append("Registered Objects");
+ builder.append(_objects, _objectsButton);
+ builder.nextLine();
+
+ builder.append("Load Balancing Policy");
+ builder.append(_loadBalancing, 3);
+ builder.nextLine();
+ _nReplicasLabel = builder.append("How many Adapters?");
+ builder.append(_nReplicas, 3);
+ builder.nextLine();
+ _loadSampleLabel = builder.append("Load Sample");
+ builder.append(_loadSample, 3);
+ builder.nextLine();
+ }
+
+
+ void setObjectsField()
+ {
+ Ice.StringHolder toolTipHolder = new Ice.StringHolder();
+
+ _objects.setText(
+ Utils.stringify(_objectsMap, "=", ", ", toolTipHolder));
+ _objects.setToolTipText(toolTipHolder.value);
+ }
+
+ void show(ReplicaGroup replicaGroup)
+ {
+ detectUpdates(false);
+ setTarget(replicaGroup);
+
+ ReplicaGroupDescriptor descriptor =
+ (ReplicaGroupDescriptor)replicaGroup.getDescriptor();
+
+ _id.setText(descriptor.id);
+ //_description.setText(descriptor.description);
+
+ _objectsMap = AdapterEditor.objectDescriptorSeqToMap(descriptor.objects);
+ setObjectsField();
+
+ if(descriptor.loadBalancing == null)
+ {
+ _loadBalancing.setSelectedItem(RETURN_ALL);
+ _nReplicas.setText("1");
+ _loadSample.setSelectedItem("1");
+ }
+ else if(descriptor.loadBalancing instanceof RandomLoadBalancingPolicy)
+ {
+ _loadBalancing.setSelectedItem(RANDOM);
+ _nReplicas.setText(descriptor.loadBalancing.nReplicas);
+ _loadSample.setSelectedItem("1");
+ }
+ else if(descriptor.loadBalancing instanceof RoundRobinLoadBalancingPolicy)
+ {
+ _loadBalancing.setSelectedItem(ROUND_ROBIN);
+ _nReplicas.setText(descriptor.loadBalancing.nReplicas);
+ _loadSample.setSelectedItem("1");
+ }
+ else if(descriptor.loadBalancing instanceof AdaptiveLoadBalancingPolicy)
+ {
+ _loadBalancing.setSelectedItem(ADAPTIVE);
+ _nReplicas.setText(descriptor.loadBalancing.nReplicas);
+ _loadSample.setSelectedItem(
+ ((AdaptiveLoadBalancingPolicy)descriptor.loadBalancing).loadSample);
+ }
+ else
+ {
+ assert false;
+ }
+
+ _applyButton.setEnabled(replicaGroup.isEphemeral());
+ _discardButton.setEnabled(replicaGroup.isEphemeral());
+ detectUpdates(true);
+ }
+
+ private ReplicaGroup getReplicaGroup()
+ {
+ return (ReplicaGroup)_target;
+ }
+
+ static private String RETURN_ALL = "Return all";
+ static private String RANDOM = "Random";
+ static private String ROUND_ROBIN = "Round-robin";
+ static private String ADAPTIVE = "Adaptive";
+
+ private JTextField _id = new JTextField(20);
+ private JTextArea _description = new JTextArea(3, 20);
+
+ private JComboBox _loadBalancing = new JComboBox(new Object[]
+ {ADAPTIVE, RANDOM, RETURN_ALL, ROUND_ROBIN});
+
+ private JLabel _nReplicasLabel;
+ private JTextField _nReplicas = new JTextField(20);
+
+ private JLabel _loadSampleLabel;
+ private JComboBox _loadSample = new JComboBox(new Object[]
+ {"1", "5", "15"});
+
+ private JTextField _objects = new JTextField(20);
+ private java.util.Map _objectsMap;
+ private TableDialog _objectsDialog;
+ private JButton _objectsButton;
+}
diff --git a/java/src/IceGrid/TreeNode/ReplicaGroups.java b/java/src/IceGrid/TreeNode/ReplicaGroups.java
index 1ef6b629493..daa73b18961 100755
--- a/java/src/IceGrid/TreeNode/ReplicaGroups.java
+++ b/java/src/IceGrid/TreeNode/ReplicaGroups.java
@@ -9,6 +9,8 @@
package IceGrid.TreeNode;
import javax.swing.AbstractListModel;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
import IceGrid.ReplicaGroupDescriptor;
import IceGrid.Model;
@@ -29,6 +31,56 @@ class ReplicaGroups extends EditableParent
return copy;
}
+ //
+ // Actions
+ //
+ public boolean[] getAvailableActions()
+ {
+ boolean[] actions = new boolean[ACTION_COUNT];
+
+ Object descriptor = _model.getClipboard();
+ if(descriptor != null)
+ {
+ actions[PASTE] = descriptor instanceof ReplicaGroupDescriptor;
+ }
+
+ actions[NEW_REPLICA_GROUP] = true;
+ return actions;
+ }
+
+ public JPopupMenu getPopupMenu()
+ {
+ if(_popup == null)
+ {
+ _popup = new PopupMenu(_model);
+ JMenuItem item = new JMenuItem(_model.getActions()[NEW_REPLICA_GROUP]);
+ item.setText("New replica group");
+ _popup.add(item);
+ }
+ return _popup;
+ }
+
+ public void newReplicaGroup()
+ {
+ ReplicaGroupDescriptor descriptor = new
+ ReplicaGroupDescriptor(
+ makeNewChildId("NewReplicaGroup"),
+ null,
+ new java.util.LinkedList());
+
+ newReplicaGroup(descriptor);
+ }
+
+ public void paste()
+ {
+ Object descriptor = _model.getClipboard();
+
+ ReplicaGroupDescriptor d = ReplicaGroup.copyDescriptor(
+ (ReplicaGroupDescriptor)descriptor);
+ d.id = makeNewChildId(d.id);
+ newReplicaGroup(d);
+ }
+
ReplicaGroups(java.util.List descriptors, Model model)
throws UpdateFailedException
{
@@ -101,5 +153,64 @@ class ReplicaGroups extends EditableParent
addChildren((CommonBaseI[])newChildren.toArray(new CommonBaseI[0]));
}
+
+
+ void removeDescriptor(Object descriptor)
+ {
+ //
+ // A straight remove uses equals(), which is not the desired behavior
+ //
+ java.util.Iterator p = _descriptors.iterator();
+ while(p.hasNext())
+ {
+ if(descriptor == p.next())
+ {
+ p.remove();
+ break;
+ }
+ }
+ }
+
+ void tryAdd(ReplicaGroupDescriptor descriptor, boolean addDescriptor)
+ throws UpdateFailedException
+ {
+ try
+ {
+ addChild(createReplicaGroup(true, descriptor), true);
+ }
+ catch(UpdateFailedException e)
+ {
+ e.addParent(this);
+ throw e;
+ }
+
+ if(addDescriptor)
+ {
+ _descriptors.add(descriptor);
+ }
+ }
+
+
+ private ReplicaGroup createReplicaGroup(boolean brandNew,
+ ReplicaGroupDescriptor descriptor)
+ {
+ return new ReplicaGroup(brandNew, descriptor, _model);
+ }
+
+ private void newReplicaGroup(ReplicaGroupDescriptor descriptor)
+ {
+ ReplicaGroup replicaGroup = new ReplicaGroup(descriptor, _model);
+ try
+ {
+ addChild(replicaGroup, true);
+ }
+ catch(UpdateFailedException e)
+ {
+ assert false;
+ }
+ _model.setSelectionPath(replicaGroup.getPath());
+ }
+
private java.util.List _descriptors;
+ static private JPopupMenu _popup;
}