summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernard Normier <bernard@zeroc.com>2005-09-09 03:02:53 +0000
committerBernard Normier <bernard@zeroc.com>2005-09-09 03:02:53 +0000
commit357aa0d72c8a2f676fa5566fb6f5fe4faabcffc9 (patch)
tree9707946f26ea39a50e74a3c14e37c38122a3a1a9
parentfixed another ubg. (diff)
downloadice-357aa0d72c8a2f676fa5566fb6f5fe4faabcffc9.tar.bz2
ice-357aa0d72c8a2f676fa5566fb6f5fe4faabcffc9.tar.xz
ice-357aa0d72c8a2f676fa5566fb6f5fe4faabcffc9.zip
First saving support
-rwxr-xr-xjava/src/IceGrid/AdminGUI.java283
-rwxr-xr-xjava/src/IceGrid/MainPane.java5
-rwxr-xr-xjava/src/IceGrid/Model.java733
-rwxr-xr-xjava/src/IceGrid/RegistryObserverI.java39
-rwxr-xr-xjava/src/IceGrid/SessionKeeper.java147
-rwxr-xr-xjava/src/IceGrid/TableDialog.java224
-rwxr-xr-xjava/src/IceGrid/TreeNode/Adapter.java491
-rwxr-xr-xjava/src/IceGrid/TreeNode/Adapters.java97
-rwxr-xr-xjava/src/IceGrid/TreeNode/Application.java131
-rwxr-xr-xjava/src/IceGrid/TreeNode/CommonBase.java8
-rwxr-xr-xjava/src/IceGrid/TreeNode/Editable.java2
-rwxr-xr-xjava/src/IceGrid/TreeNode/EditableLeaf.java15
-rwxr-xr-xjava/src/IceGrid/TreeNode/EditableParent.java72
-rwxr-xr-xjava/src/IceGrid/TreeNode/Leaf.java5
-rwxr-xr-xjava/src/IceGrid/TreeNode/Node.java98
-rwxr-xr-xjava/src/IceGrid/TreeNode/Nodes.java16
-rwxr-xr-xjava/src/IceGrid/TreeNode/Parent.java8
-rwxr-xr-xjava/src/IceGrid/TreeNode/PropertiesHolder.java33
-rwxr-xr-xjava/src/IceGrid/TreeNode/ReplicatedAdapter.java5
-rwxr-xr-xjava/src/IceGrid/TreeNode/ReplicatedAdapters.java16
-rwxr-xr-xjava/src/IceGrid/TreeNode/Root.java12
-rwxr-xr-xjava/src/IceGrid/TreeNode/Server.java14
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServerTemplate.java7
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServerTemplates.java14
-rwxr-xr-xjava/src/IceGrid/TreeNode/Service.java2
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServiceTemplate.java11
-rwxr-xr-xjava/src/IceGrid/TreeNode/ServiceTemplates.java14
27 files changed, 1885 insertions, 617 deletions
diff --git a/java/src/IceGrid/AdminGUI.java b/java/src/IceGrid/AdminGUI.java
index 6cd9dd845d8..b00f2f549b8 100755
--- a/java/src/IceGrid/AdminGUI.java
+++ b/java/src/IceGrid/AdminGUI.java
@@ -8,27 +8,22 @@
// **********************************************************************
package IceGrid;
-import javax.swing.*;
-import javax.swing.border.EmptyBorder;
-
-import java.awt.BorderLayout;
-import java.awt.Frame;
-import java.awt.Rectangle;
-import java.awt.Container;
-import java.awt.Component;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
-import java.awt.event.ActionEvent;
-import java.awt.event.ItemEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ItemListener;
-import com.jgoodies.looks.Options;
-import com.jgoodies.looks.HeaderStyle;
-import com.jgoodies.looks.BorderStyle;
+
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+
+import javax.swing.border.EmptyBorder;
+import java.awt.BorderLayout;
+
import com.jgoodies.looks.plastic.PlasticLookAndFeel;
import java.util.prefs.Preferences;
-import java.util.prefs.BackingStoreException;
public class AdminGUI extends JFrame
{
@@ -45,7 +40,6 @@ public class AdminGUI extends JFrame
JLabel copyright = new JLabel("Copyright \u00A9 2005 ZeroC, Inc.");
copyright.setHorizontalAlignment(SwingConstants.RIGHT);
add(copyright, BorderLayout.LINE_END);
-
}
public void setText(String text)
@@ -70,96 +64,24 @@ public class AdminGUI extends JFrame
AdminGUI(String[] args)
{
super("IceGrid Admin");
- setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setIconImage(Utils.getIcon("/icons/grid.png").getImage());
+ _model = new Model(this, args, Preferences.userNodeForPackage(getClass()),
+ new StatusBarI());
+
+ setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
- exit(0);
+ _model.exit(0);
}
});
- _communicator = Ice.Util.initialize(args);
- _model = new Model(_communicator, new StatusBarI());
-
initComponents();
-
- // Sizing / placement
- //
- if(!loadWindowPrefs())
- {
- setLocation(100, 100);
- pack();
- }
+ _model.showMainFrame();
- //
- // Display the window.
- //
- setVisible(true);
- _sessionKeeper = new SessionKeeper(this, _model, _prefs);
- _sessionKeeper.createSession(true);
-
- }
-
- private void exit(int status)
- {
- storeWindowPrefs();
- if(_communicator != null)
- {
- try
- {
- _communicator.destroy();
- }
- catch(Ice.LocalException e)
- {
- //
- // TODO: log exception
- //
- }
- }
-
- dispose();
- Runtime.getRuntime().exit(status);
- }
-
- private void storeWindowPrefs()
- {
- Preferences windowPrefs = _prefs.node("Window");
- Rectangle rect = getBounds();
- windowPrefs.putInt("x", rect.x);
- windowPrefs.putInt("y", rect.y);
- windowPrefs.putInt("width", rect.width);
- windowPrefs.putInt("height", rect.height);
- windowPrefs.putBoolean("maximized", getExtendedState() == Frame.MAXIMIZED_BOTH);
- }
-
- private boolean loadWindowPrefs()
- {
- try
- {
- if(!_prefs.nodeExists("Window"))
- {
- return false;
- }
- }
- catch(BackingStoreException e)
- {
- return false;
- }
-
- Preferences windowPrefs = _prefs.node("Window");
- int x = windowPrefs.getInt("x", 0);
- int y = windowPrefs.getInt("y", 0);
- int width = windowPrefs.getInt("width", 0);
- int height = windowPrefs.getInt("height", 0);
- setBounds(new Rectangle(x, y, width, height));
- if(windowPrefs.getBoolean("maximized", false))
- {
- setExtendedState(Frame.MAXIMIZED_BOTH);
- }
- return true;
+ _model.getSessionKeeper().createSession(true);
}
private void initComponents()
@@ -170,166 +92,15 @@ public class AdminGUI extends JFrame
getContentPane().add(new MainPane(_model), BorderLayout.CENTER);
//
- // Menu bar
+ // Menu bar and Tool bar
//
- JMenuBar menuBar = new JMenuBar();
- menuBar.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
- menuBar.putClientProperty(PlasticLookAndFeel.BORDER_STYLE_KEY, BorderStyle.SEPARATOR);
-
- JMenu fileMenu = new JMenu("File");
- fileMenu.setMnemonic(java.awt.event.KeyEvent.VK_F);
- menuBar.add(fileMenu);
-
- JMenu editMenu = new JMenu("Edit");
- editMenu.setMnemonic(java.awt.event.KeyEvent.VK_E);
- menuBar.add(editMenu);
-
- JMenu helpMenu = new JMenu("Help");
- helpMenu.setMnemonic(java.awt.event.KeyEvent.VK_H);
- menuBar.add(helpMenu);
-
- setJMenuBar(menuBar);
-
- //
- // Tool bar
- //
- JToolBar toolBar = new JToolBar();
- toolBar.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
- toolBar.putClientProperty(PlasticLookAndFeel.BORDER_STYLE_KEY, BorderStyle.SEPARATOR);
-
- toolBar.setFloatable(false);
- toolBar.putClientProperty("JToolBar.isRollover", Boolean.TRUE);
- getContentPane().add(toolBar, BorderLayout.PAGE_START);
+ setJMenuBar(_model.createMenuBar());
+ getContentPane().add(_model.createToolBar(), BorderLayout.PAGE_START);
//
// Status bar
//
getContentPane().add((StatusBarI)_model.getStatusBar(), BorderLayout.PAGE_END);
-
- //
- // Actions
- // actions that can be enabled/disabled are fields
- //
-
- Action connectAction = new AbstractAction("Connect...", Utils.getIcon("/icons/connect.gif"))
- {
- public void actionPerformed(ActionEvent e)
- {
- _sessionKeeper.createSession(false);
- }
- };
- connectAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl N"));
- fileMenu.add(connectAction);
- fileMenu.addSeparator();
- toolBar.add(connectAction);
- toolBar.addSeparator();
-
- _saveAction = new AbstractAction("Save", Utils.getIcon("/icons/save_edit.gif"))
- {
- public void actionPerformed(ActionEvent e)
- {
- // TODO: implement
- }
- };
- _saveAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl S"));
- _saveAction.setEnabled(false);
- fileMenu.add(_saveAction);
- toolBar.add(_saveAction);
-
- _discardAction = new AbstractAction("Discard all updates...",
- Utils.getIcon("/icons/undo_edit.gif"))
- {
- public void actionPerformed(ActionEvent e)
- {
- // TODO: implement
- }
- };
- _discardAction.setEnabled(false);
- fileMenu.add(_discardAction);
- fileMenu.addSeparator();
- toolBar.add(_discardAction);
- toolBar.addSeparator();
-
- final Action exitAction = new AbstractAction("Exit")
- {
- public void actionPerformed(ActionEvent e)
- {
- exit(0);
- }
- };
- exitAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("alt F4"));
- fileMenu.add(exitAction);
-
- Action cutAction = new AbstractAction("Cut", Utils.getIcon("/icons/cut_edit.gif"))
- {
- public void actionPerformed(ActionEvent e)
- {
- // TODO: implement
- }
- };
- cutAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl X"));
- editMenu.add(cutAction);
- toolBar.add(cutAction);
-
- Action copyAction = new AbstractAction("Copy", Utils.getIcon("/icons/copy_edit.gif"))
- {
- public void actionPerformed(ActionEvent e)
- {
- // TODO: implement
- }
- };
- copyAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl C"));
- editMenu.add(copyAction);
- toolBar.add(copyAction);
-
- _pasteAction = new AbstractAction("Paste", Utils.getIcon("/icons/paste_edit.gif"))
- {
- public void actionPerformed(ActionEvent e)
- {
- // TODO: implement
- }
- };
- _pasteAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl V"));
- _pasteAction.setEnabled(false);
- editMenu.add(_pasteAction);
- editMenu.addSeparator();
- toolBar.add(_pasteAction);
- toolBar.addSeparator();
-
- Action deleteAction = new AbstractAction("Delete", Utils.getIcon("/icons/delete_edit.gif"))
- {
- public void actionPerformed(ActionEvent e)
- {
- // TODO: implement
- }
- };
- deleteAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("DELETE"));
- editMenu.add(deleteAction);
- toolBar.add(deleteAction);
-
- toolBar.addSeparator();
- Action substituteVarAction = new AbstractAction("${}")
- {
- public void actionPerformed(ActionEvent e)
- {
- _model.toggleSubstitute();
- }
- };
-
- substituteVarAction.putValue(Action.SHORT_DESCRIPTION,
- "Substitute variables and parameters in servers' properties");
-
- toolBar.add(new JToggleButton(substituteVarAction));
-
-
- Action aboutAction = new AbstractAction("About...")
- {
- public void actionPerformed(ActionEvent e)
- {
- // TODO: implement
- }
- };
- helpMenu.add(aboutAction);
}
private static void createAndShowGUI(String[] args) {
@@ -349,19 +120,7 @@ public class AdminGUI extends JFrame
}
- private Action _saveAction;
- private Action _discardAction;
- private Action _pasteAction;
-
- private Preferences _prefs = Preferences.userNodeForPackage(getClass());
-
- private Ice.Communicator _communicator;
- private int _invocationTimeout = 10000;
- private int _observerTimeout = 10000;
-
- private SessionKeeper _sessionKeeper;
private Model _model;
-
}
diff --git a/java/src/IceGrid/MainPane.java b/java/src/IceGrid/MainPane.java
index 278b062387b..fc595418bc9 100755
--- a/java/src/IceGrid/MainPane.java
+++ b/java/src/IceGrid/MainPane.java
@@ -86,7 +86,10 @@ public class MainPane extends JSplitPane
if(path != null)
{
CommonBase node = (CommonBase)path.getLastPathComponent();
- node.displayProperties();
+ if(node.getModel().displayEnabled())
+ {
+ node.displayProperties();
+ }
}
}
}
diff --git a/java/src/IceGrid/Model.java b/java/src/IceGrid/Model.java
index 3d65c14348d..aadc05cb090 100755
--- a/java/src/IceGrid/Model.java
+++ b/java/src/IceGrid/Model.java
@@ -9,81 +9,53 @@
package IceGrid;
import java.util.prefs.Preferences;
+import java.util.prefs.BackingStoreException;
-import java.awt.Component;
import java.awt.Cursor;
-import javax.swing.tree.TreeModel;
+import java.awt.Frame;
+import java.awt.Rectangle;
+import java.awt.Container;
+import java.awt.Component;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ItemEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemListener;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JFrame;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
+import javax.swing.JToggleButton;
+import javax.swing.JToolBar;
import javax.swing.JTree;
+import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
+
+import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
-import IceGrid.TreeNode.Root;
+import com.jgoodies.looks.Options;
+import com.jgoodies.looks.HeaderStyle;
+import com.jgoodies.looks.BorderStyle;
+import com.jgoodies.looks.plastic.PlasticLookAndFeel;
+
import com.jgoodies.uif_lite.panel.SimpleInternalFrame;
+import IceGrid.TreeNode.Application;
+import IceGrid.TreeNode.CommonBase;
+import IceGrid.TreeNode.Root;
+
+
+
//
-// Where all the data are kept
+// The class that holds all the data and more!
//
public class Model
{
- //
- //
- // root
- // |
- // -- $application
- // |
- // -- server templates
- // | |
- // | -- $server template
- // | |
- // | -- adapters
- // | | |
- // | | -- $adapter
- // | |
- // | -- databases
- // | | |
- // | | -- $database
- // | |
- // | -- services (only for IceBox servers)
- // | |
- // | -- $service instance
- // | |
- // | -- adapters, databases (see above)
- // |
- // -- service templates
- // | |
- // | -- $service template
- // | |
- // | -- adapters
- // | | |
- // | | -- $adapter
- // | |
- // | -- databases
- // | |
- // | -- $database
- // |
- // |
- // -- nodes
- // |
- // -- $node
- // |
- // -- $instance
- // |
- // -- adapters
- // | |
- // | -- $adapter
- // |
- // -- databases
- // | |
- // | -- $database
- // |
- // -- services (only for IceBox servers)
- // |
- // -- $service
- // |
- // -- adapters, databases (see above)
-
public static class ConnectInfo
{
ConnectInfo(Preferences connectionPrefs,
@@ -132,14 +104,70 @@ public class Model
private Preferences _connectionPrefs;
}
-
+ class MenuBar extends JMenuBar
+ {
+ MenuBar()
+ {
+ putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
+ putClientProperty(PlasticLookAndFeel.BORDER_STYLE_KEY, BorderStyle.SEPARATOR);
+
+ JMenu fileMenu = new JMenu("File");
+ fileMenu.setMnemonic(java.awt.event.KeyEvent.VK_F);
+ add(fileMenu);
+
+ JMenu editMenu = new JMenu("Edit");
+ editMenu.setMnemonic(java.awt.event.KeyEvent.VK_E);
+ add(editMenu);
+
+ JMenu helpMenu = new JMenu("Help");
+ helpMenu.setMnemonic(java.awt.event.KeyEvent.VK_H);
+ add(helpMenu);
+
+ fileMenu.add(_connect);
+ fileMenu.addSeparator();
+ fileMenu.add(_save);
+ fileMenu.add(_discard);
+ fileMenu.addSeparator();
+ fileMenu.add(_exit);
+
+ editMenu.add(_cut);
+ editMenu.add(_copy);
+ editMenu.add(_paste);
+ editMenu.addSeparator();
+ editMenu.add(_delete);
+
+ helpMenu.add(_about);
+ }
+ }
+
+ class ToolBar extends JToolBar
+ {
+ ToolBar()
+ {
+ putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
+ putClientProperty(PlasticLookAndFeel.BORDER_STYLE_KEY, BorderStyle.SEPARATOR);
+ setFloatable(false);
+ putClientProperty("JToolBar.isRollover", Boolean.TRUE);
+
+ add(_connect);
+ addSeparator();
+ add(_save);
+ add(_discard);
+ addSeparator();
+ add(_cut);
+ add(_copy);
+ add(_paste);
+ addSeparator();
+ add(_delete);
+ addSeparator();
+ add(new JToggleButton(_substituteVar));
+ }
+ }
//
// All Model's methods run in the UI thread
//
-
-
public Ice.Communicator getCommunicator()
{
return _communicator;
@@ -169,32 +197,308 @@ public class Model
_root.init(applications);
}
- void applicationAdded(ApplicationDescriptor desc)
+ void applicationAdded(int serial, ApplicationDescriptor desc)
{
- _root.applicationAdded(desc);
+ if(proceedWithUpdate(serial))
+ {
+ _root.applicationAdded(desc);
+ _statusBar.setText("Connected; application '"
+ + desc.name + "' added (" + serial + ")");
+
+ checkWriteSerial();
+ }
}
- void applicationRemoved(String name)
+ void applicationRemoved(int serial, String name)
{
- _root.applicationRemoved(name);
+ if(proceedWithUpdate(serial))
+ {
+ _root.applicationRemoved(name);
+ _statusBar.setText("Connected; application '"
+ + name + "' removed (" + serial + ")");
+ checkWriteSerial();
+ }
}
- void applicationUpdated(ApplicationUpdateDescriptor desc)
+ void applicationUpdated(int serial, ApplicationUpdateDescriptor desc)
{
- _root.applicationUpdated(desc);
+ if(proceedWithUpdate(serial))
+ {
+ TreePath path = null;
+ CommonBase currentNode = (CommonBase)_tree.getLastSelectedPathComponent();
+ if(currentNode != null)
+ {
+ path = currentNode.getPath();
+ }
+ _root.applicationUpdated(desc);
+ _statusBar.setText("Connected; application '"
+ + desc.name + "' updated (" + serial + ")");
+ checkWriteSerial();
+ restore(path);
+ }
}
- boolean updateSerial(int serial)
+ boolean proceedWithUpdate(int serial)
{
- if(serial == _latestSerial + 1)
+ if(serial <= _latestSerial)
{
+ //
+ // Ignore old messages
+ //
+ return false;
+ }
+ else if(serial == _latestSerial + 1)
+ {
+ boolean doIt = (_latestSerial == -1 || _writeSerial == -1 ||
+ _writeSerial > _latestSerial);
+
+ if(_writeSerial == _latestSerial)
+ {
+ _writeSerial = serial;
+ }
_latestSerial = serial;
- return true;
+ return doIt;
}
else
{
+ _sessionKeeper.sessionLost(
+ "Received message from registry out of order");
+ return false;
+ }
+ }
+
+ private void checkWriteSerial()
+ {
+ if(_writeSerial != -1 && _writeSerial == _latestSerial)
+ {
+ updateInProgress();
+ }
+ }
+
+ public CommonBase findNewNode(TreePath path)
+ {
+ CommonBase node = _root;
+ for(int i = 1; i < path.getPathCount(); ++i)
+ {
+ CommonBase child = node.findChild(((CommonBase)path.getPathComponent(i)).getId());
+ if(child == null)
+ {
+ break;
+ }
+ else
+ {
+ node = child;
+ }
+ }
+ return node;
+ }
+
+ public void setSelectionPath(TreePath path)
+ {
+ _tree.setSelectionPath(path);
+ }
+
+ public void refreshDisplay()
+ {
+ CommonBase currentNode = (CommonBase)_tree.getLastSelectedPathComponent();
+ if(currentNode != null)
+ {
+ currentNode.displayProperties();
+ }
+ }
+
+ public boolean displayEnabled()
+ {
+ return _displayEnabled;
+ }
+
+ public void enableDisplay()
+ {
+ _displayEnabled = true;
+ }
+
+ public void disableDisplay()
+ {
+ _displayEnabled = false;
+ }
+
+ private void restore(TreePath path)
+ {
+ if(path != null)
+ {
+ CommonBase newNode = findNewNode(path);
+ _tree.setSelectionPath(newNode.getPath());
+ newNode.displayProperties();
+ }
+ }
+
+ public boolean canUpdate()
+ {
+ if(_writeSerial == _latestSerial)
+ {
+ return true;
+ }
+
+ try
+ {
+ _writeSerial = _sessionKeeper.getSession().startUpdate();
+ }
+ catch(AccessDeniedException e)
+ {
+ _writeSerial = -1;
+ accessDenied(e);
+ return false;
+ }
+
+ if(_writeSerial > _latestSerial)
+ {
+ //
+ // Warn user that his updates were lost
+ //
+ JOptionPane.showMessageDialog(
+ _mainFrame,
+ "Your view was not up-to-date;"
+ + " you now have exclusive write-access to the registry, however your previous changes were lost.",
+ "Concurrent update",
+ JOptionPane.WARNING_MESSAGE);
+ _mainFrame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
return false;
}
+ else
+ {
+ updateInProgress();
+ return true;
+ }
+ }
+
+ private void accessDenied(AccessDeniedException e)
+ {
+ JOptionPane.showMessageDialog(
+ _mainFrame,
+ "Another session (username = " + e.lockUserId + ") has exclusive write access to the registry",
+ "Access Denied",
+ JOptionPane.ERROR_MESSAGE);
+
+ }
+
+ private boolean saveUpdates()
+ {
+ assert _writeSerial == _latestSerial;
+ _mainFrame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+
+ try
+ {
+ for(int i = 0; i < _root.getChildCount(); ++i)
+ {
+ Application application = (Application)_root.getChildAt(i);
+
+ try
+ {
+ if(application.isNew())
+ {
+ _sessionKeeper.getSession().addApplication(application.getDescriptor());
+ application.commit();
+ }
+ else
+ {
+ ApplicationUpdateDescriptor updateDescriptor =
+ application.createUpdateDescriptor();
+ if(updateDescriptor != null)
+ {
+ _sessionKeeper.getSession().updateApplication(updateDescriptor);
+ application.commit();
+ }
+ }
+
+ //
+ // Will ignore these updates
+ //
+ _latestSerial++;
+ _writeSerial = _latestSerial;
+ }
+ catch(AccessDeniedException e)
+ {
+ // Very unlikely
+ accessDenied(e);
+ return false;
+ }
+ catch(ApplicationNotExistException e)
+ {
+ // Most likely an IceGrid bug, so no need to optimize!
+ //
+ JOptionPane.showMessageDialog(
+ _mainFrame,
+ "Can't update Application " + e.name + ": it does not exist!",
+ "Application does not exist",
+ JOptionPane.ERROR_MESSAGE);
+ return false;
+ }
+ catch(DeploymentException e)
+ {
+ JOptionPane.showMessageDialog(
+ _mainFrame,
+ "Application " + application.getId() + ": "+ e.reason,
+ "Deployment Exception",
+ JOptionPane.ERROR_MESSAGE);
+ return false;
+ }
+ }
+
+ //
+ // Update completed entirely
+ //
+ try
+ {
+ _sessionKeeper.getSession().finishUpdate();
+ }
+ catch(AccessDeniedException e)
+ {
+ //
+ // Very unlikely; we still consider the update a success.
+ //
+ accessDenied(e);
+ }
+
+ _writeSerial = -1;
+ _save.setEnabled(false);
+ _discard.setEnabled(false);
+ _statusBar.setText("Saving complete");
+ return true;
+
+ }
+ finally
+ {
+ _mainFrame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+ }
+ }
+
+ private void discardUpdates(boolean showDialog)
+ {
+ assert _writeSerial == _latestSerial;
+ //
+ // Reestablish session, since we don't keep the old data around
+ //
+ _mainFrame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+
+ try
+ {
+ _sessionKeeper.reconnect(showDialog);
+ _save.setEnabled(false);
+ _discard.setEnabled(false);
+ }
+ finally
+ {
+ _mainFrame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+ }
+ }
+
+
+ private void updateInProgress()
+ {
+ _statusBar.setText("Update in progress");
+ _mainFrame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+ _save.setEnabled(true);
+ _discard.setEnabled(true);
}
@@ -230,6 +534,7 @@ public class Model
void sessionLost()
{
_latestSerial = -1;
+ _writeSerial = -1;
_root.clear();
_sessionManager = null;
_admin = null;
@@ -253,12 +558,12 @@ public class Model
{
sessionLost();
parent.setCursor(oldCursor);
- JOptionPane.showMessageDialog(
- parent,
- "The locator proxy is invalid: " + e.toString(),
- "Invalid locator proxy",
- JOptionPane.ERROR_MESSAGE);
- return false;
+ JOptionPane.showMessageDialog(
+ parent,
+ "The locator proxy is invalid: " + e.toString(),
+ "Invalid locator proxy",
+ JOptionPane.ERROR_MESSAGE);
+ return false;
}
@@ -294,12 +599,12 @@ public class Model
{
sessionLost();
parent.setCursor(oldCursor);
- JOptionPane.showMessageDialog(
- parent,
- "The admin identity is invalid: " + e.toString(),
- "Invalid admin identity",
- JOptionPane.ERROR_MESSAGE);
- return false;
+ JOptionPane.showMessageDialog(
+ parent,
+ "The admin identity is invalid: " + e.toString(),
+ "Invalid admin identity",
+ JOptionPane.ERROR_MESSAGE);
+ return false;
}
return true;
@@ -318,11 +623,16 @@ public class Model
void toggleSubstitute()
{
_substitute = !_substitute;
- //
- // TODO: need to send a notification to redisplay current properties
- //
+
+ CommonBase node = (CommonBase)_tree.getLastSelectedPathComponent();
+ if(node != null)
+ {
+ node.displayProperties();
+ }
}
+
+
public boolean substitute()
{
return _substitute;
@@ -363,17 +673,240 @@ public class Model
return _propertiesFrame;
}
- Model(Ice.Communicator communicator, StatusBar statusBar)
+ public JFrame getMainFrame()
{
- _communicator = communicator;
+ return _mainFrame;
+ }
+
+
+ Model(JFrame mainFrame, String[] args, Preferences prefs, StatusBar statusBar)
+ {
+ _mainFrame = mainFrame;
+ _communicator = Ice.Util.initialize(args);
+ _prefs = prefs;
_statusBar = statusBar;
_root = new Root(this);
_treeModel = new TreeModelI(_root);
+
+ //
+ // Actions
+ //
+ _connect = new AbstractAction("Connect...", Utils.getIcon("/icons/connect.gif"))
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ if(_latestSerial != -1 && _latestSerial == _writeSerial)
+ {
+ int saveFirst = JOptionPane.showConfirmDialog(
+ _mainFrame,
+ "Do you want to save your updates?",
+ "Save Confirmation",
+ JOptionPane.YES_NO_CANCEL_OPTION);
+ switch(saveFirst)
+ {
+ case JOptionPane.YES_OPTION:
+ if(saveUpdates())
+ {
+ _sessionKeeper.createSession(false);
+ }
+ break;
+ case JOptionPane.NO_OPTION:
+ discardUpdates(true);
+ break;
+ case JOptionPane.CANCEL_OPTION:
+ break;
+ default:
+ assert false;
+ }
+ }
+ else
+ {
+ _sessionKeeper.createSession(false);
+ }
+ }
+ };
+ _connect.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl N"));
+
+ _save = new AbstractAction("Save", Utils.getIcon("/icons/save_edit.gif"))
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ saveUpdates();
+ }
+ };
+ _save.setEnabled(false);
+
+ _discard = new AbstractAction("Discard all updates...",
+ Utils.getIcon("/icons/undo_edit.gif"))
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ discardUpdates(false);
+ }
+ };
+ _discard.setEnabled(false);
+
+ _exit = new AbstractAction("Exit")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ exit(0);
+ }
+ };
+ _exit.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("alt F4"));
+
+
+ _cut = new AbstractAction("Cut", Utils.getIcon("/icons/cut_edit.gif"))
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ // TODO: implement
+ }
+ };
+ _cut.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl X"));
+
+
+ _copy = new AbstractAction("Copy", Utils.getIcon("/icons/copy_edit.gif"))
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ // TODO: implement
+ }
+ };
+ _copy.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl C"));
+
+ _paste = new AbstractAction("Paste", Utils.getIcon("/icons/paste_edit.gif"))
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ // TODO: implement
+ }
+ };
+ _paste.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl V"));
+ _paste.setEnabled(false);
+
+ _delete = new AbstractAction("Delete", Utils.getIcon("/icons/delete_edit.gif"))
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ // TODO: implement
+ }
+ };
+ _delete.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("DELETE"));
+
+ _substituteVar = new AbstractAction("${}")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ toggleSubstitute();
+ }
+ };
+
+ _substituteVar.putValue(Action.SHORT_DESCRIPTION,
+ "Substitute variables and parameters in servers' properties");
+
+ _about = new AbstractAction("About...")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ // TODO: implement
+ }
+ };
}
+ void showMainFrame()
+ {
+ if(!loadWindowPrefs())
+ {
+ _mainFrame.setLocation(100, 100);
+ _mainFrame.pack();
+ }
+ _mainFrame.setVisible(true);
+ }
+
+ void exit(int status)
+ {
+ storeWindowPrefs();
+ try
+ {
+ _communicator.destroy();
+ }
+ catch(Ice.LocalException e)
+ {
+ // TODO: log error
+ }
+ _mainFrame.dispose();
+ Runtime.getRuntime().exit(status);
+ }
+
+
+ private boolean loadWindowPrefs()
+ {
+ try
+ {
+ if(!_prefs.nodeExists("Window"))
+ {
+ return false;
+ }
+ }
+ catch(BackingStoreException e)
+ {
+ return false;
+ }
+
+ Preferences windowPrefs = _prefs.node("Window");
+ int x = windowPrefs.getInt("x", 0);
+ int y = windowPrefs.getInt("y", 0);
+ int width = windowPrefs.getInt("width", 0);
+ int height = windowPrefs.getInt("height", 0);
+ _mainFrame.setBounds(new Rectangle(x, y, width, height));
+ if(windowPrefs.getBoolean("maximized", false))
+ {
+ _mainFrame.setExtendedState(Frame.MAXIMIZED_BOTH);
+ }
+ return true;
+ }
+
+ private void storeWindowPrefs()
+ {
+ Preferences windowPrefs = _prefs.node("Window");
+ Rectangle rect = _mainFrame.getBounds();
+ windowPrefs.putInt("x", rect.x);
+ windowPrefs.putInt("y", rect.y);
+ windowPrefs.putInt("width", rect.width);
+ windowPrefs.putInt("height", rect.height);
+ windowPrefs.putBoolean("maximized",
+ _mainFrame.getExtendedState() == Frame.MAXIMIZED_BOTH);
+ }
+
+
+ SessionKeeper getSessionKeeper()
+ {
+ if(_sessionKeeper == null)
+ {
+ _sessionKeeper = new SessionKeeper(this);
+ }
+ return _sessionKeeper;
+ }
+
+ JToolBar createToolBar()
+ {
+ return new ToolBar();
+ }
+
+ JMenuBar createMenuBar()
+ {
+ return new MenuBar();
+ }
+
+ Preferences getPrefs()
+ {
+ return _prefs;
+ }
private Ice.Communicator _communicator;
+ private Preferences _prefs;
private StatusBar _statusBar;
private SessionManagerPrx _sessionManager;
private AdminPrx _admin;
@@ -382,10 +915,30 @@ public class Model
private TreeModelI _treeModel;
private int _latestSerial = -1;
+ private int _writeSerial = -1;
private JTree _tree;
private boolean _substitute = false;
+
+ private boolean _displayEnabled = true;
private SimpleInternalFrame _propertiesFrame;
+
+ private JFrame _mainFrame;
+ private SessionKeeper _sessionKeeper;
+
+ //
+ // Actions
+ //
+ private Action _connect;
+ private Action _save;
+ private Action _discard;
+ private Action _exit;
+ private Action _cut;
+ private Action _copy;
+ private Action _paste;
+ private Action _delete;
+ private Action _about;
+ private Action _substituteVar;
}
diff --git a/java/src/IceGrid/RegistryObserverI.java b/java/src/IceGrid/RegistryObserverI.java
index 0fc7c1b6625..dfd0b8e8355 100755
--- a/java/src/IceGrid/RegistryObserverI.java
+++ b/java/src/IceGrid/RegistryObserverI.java
@@ -13,9 +13,8 @@ import javax.swing.SwingUtilities;
class RegistryObserverI extends _RegistryObserverDisp
{
- RegistryObserverI(SessionKeeper sessionKeeper, Model model)
+ RegistryObserverI(Model model)
{
- _sessionKeeper = sessionKeeper;
_model = model;
}
@@ -75,17 +74,7 @@ class RegistryObserverI extends _RegistryObserverDisp
{
public void run()
{
- if(_model.updateSerial(serial))
- {
- _model.applicationAdded(desc);
- _model.getStatusBar().setText("Connected; application '"
- + desc.name + "' added (" + serial + ")");
- }
- else
- {
- _sessionKeeper.sessionLost(
- "Received application update (new application) out of sequence");
- }
+ _model.applicationAdded(serial, desc);
}
});
}
@@ -97,17 +86,7 @@ class RegistryObserverI extends _RegistryObserverDisp
{
public void run()
{
- if(_model.updateSerial(serial))
- {
- _model.applicationRemoved(name);
- _model.getStatusBar().setText("Connected; application '"
- + name + "' removed (" + serial + ")");
- }
- else
- {
- _sessionKeeper.sessionLost(
- "Received application update (application removed) out of sequence");
- }
+ _model.applicationRemoved(serial, name);
}
});
}
@@ -119,22 +98,12 @@ class RegistryObserverI extends _RegistryObserverDisp
{
public void run()
{
- if(_model.updateSerial(serial))
- {
- _model.applicationUpdated(desc);
- _model.getStatusBar().setText("Connected; application '"
- + desc.name + "' updated (" + serial + ")");
- }
- else
- {
- _sessionKeeper.sessionLost("Received application update out of sequence");
- }
+ _model.applicationUpdated(serial, desc);
}
});
}
- private SessionKeeper _sessionKeeper;
private Model _model;
private boolean _initialized = false;
diff --git a/java/src/IceGrid/SessionKeeper.java b/java/src/IceGrid/SessionKeeper.java
index c8f636eaeff..b9768cbb0ca 100755
--- a/java/src/IceGrid/SessionKeeper.java
+++ b/java/src/IceGrid/SessionKeeper.java
@@ -37,7 +37,7 @@ class SessionKeeper
{
ConnectDialog()
{
- super(_parent, "New Connection - IceGrid Admin", true);
+ super(_model.getMainFrame(), "New Connection - IceGrid Admin", true);
setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
_locatorProxy = new JTextField(30);
@@ -67,16 +67,16 @@ class SessionKeeper
{
public void actionPerformed(ActionEvent e)
{
- _info.locatorProxy = _locatorProxy.getText();
- _info.username = _username.getText();
- _info.password = _password.getPassword();
- _info.useGlacier = _useGlacier.isSelected();
- _info.autoconnect = _autoconnect.isSelected();
- _info.adminIdentity = _adminIdentity.getText();
- _info.sessionManagerIdentity
+ _connectInfo.locatorProxy = _locatorProxy.getText();
+ _connectInfo.username = _username.getText();
+ _connectInfo.password = _password.getPassword();
+ _connectInfo.useGlacier = _useGlacier.isSelected();
+ _connectInfo.autoconnect = _autoconnect.isSelected();
+ _connectInfo.adminIdentity = _adminIdentity.getText();
+ _connectInfo.sessionManagerIdentity
= _sessionManagerIdentity.getText();
- if(doConnect(ConnectDialog.this, _info))
+ if(doConnect(ConnectDialog.this))
{
setVisible(false);
}
@@ -139,23 +139,22 @@ class SessionKeeper
setResizable(false);
}
- boolean showDialog(Model.ConnectInfo info)
+ boolean showDialog()
{
if(isVisible() == false)
{
- _info = info;
- _locatorProxy.setText(_info.locatorProxy);
- _username.setText(_info.username);
- _adminIdentity.setText(_info.adminIdentity);
- _sessionManagerIdentity.setText(_info.sessionManagerIdentity);
-
- _useGlacier.setSelected(_info.useGlacier);
- _autoconnect.setSelected(_info.autoconnect);
- _autoconnect.setEnabled(!info.useGlacier);
- _passwordLabel.setEnabled(info.useGlacier);
- _password.setEnabled(info.useGlacier);
-
- setLocationRelativeTo(_parent);
+ _locatorProxy.setText(_connectInfo.locatorProxy);
+ _username.setText(_connectInfo.username);
+ _adminIdentity.setText(_connectInfo.adminIdentity);
+ _sessionManagerIdentity.setText(_connectInfo.sessionManagerIdentity);
+
+ _useGlacier.setSelected(_connectInfo.useGlacier);
+ _autoconnect.setSelected(_connectInfo.autoconnect);
+ _autoconnect.setEnabled(!_connectInfo.useGlacier);
+ _passwordLabel.setEnabled(_connectInfo.useGlacier);
+ _password.setEnabled(_connectInfo.useGlacier);
+
+ setLocationRelativeTo(_model.getMainFrame());
setVisible(true);
return true;
}
@@ -168,8 +167,6 @@ class SessionKeeper
}
}
- private Model.ConnectInfo _info;
-
private JTextField _locatorProxy;
private JTextField _username;
private JLabel _passwordLabel;
@@ -207,7 +204,8 @@ class SessionKeeper
{
public void run()
{
- sessionLost("Failed to contact the IceGrid registry: " + e.toString());
+ sessionLost("Failed to contact the IceGrid registry: "
+ + e.toString());
}
});
}
@@ -240,13 +238,11 @@ class SessionKeeper
}
- SessionKeeper(Frame parent, Model model,
- Preferences prefs)
+ SessionKeeper(Model model)
{
- _parent = parent;
- _connectDialog = new ConnectDialog();
_model = model;
- _connectionPrefs = prefs.node("Connection");
+ _connectDialog = new ConnectDialog();
+ _connectionPrefs = model.getPrefs().node("Connection");
}
//
@@ -254,13 +250,13 @@ class SessionKeeper
//
void createSession(boolean autoconnectEnabled)
{
- Model.ConnectInfo connectInfo = new Model.ConnectInfo(_connectionPrefs,
- _model.getCommunicator());
+ _connectInfo = new Model.ConnectInfo(_connectionPrefs,
+ _model.getCommunicator());
boolean openDialog = true;
- if(autoconnectEnabled && !connectInfo.useGlacier &&
- connectInfo.autoconnect)
+ if(autoconnectEnabled && !_connectInfo.useGlacier &&
+ _connectInfo.autoconnect)
{
- openDialog = !doConnect(_parent, connectInfo);
+ openDialog = !doConnect(_model.getMainFrame());
}
if(openDialog)
{
@@ -268,48 +264,33 @@ class SessionKeeper
// When the user presses OK on the connect dialog, doConnect
// is called
//
- _connectDialog.showDialog(connectInfo);
+ _connectDialog.showDialog();
}
}
//
// Runs in UI thread
//
- private boolean doConnect(Component parent, Model.ConnectInfo info)
+ void reconnect(boolean showDialog)
{
- if(_session != null)
+ destroyObservers();
+ releaseSession();
+ _model.sessionLost();
+
+ if(showDialog || !doConnect(_model.getMainFrame()))
{
- //
- // First take care of previous session!
- //
-
- if(_model.updated())
- {
- boolean saveFirst = true; // TODO: add real dialog!
-
- if(saveFirst)
- {
- boolean saved = _model.save();
- if(!saved)
- {
- //
- // dismiss Connect dialog
- //
- return true;
- }
- }
- }
-
- //
- // Discard session
- //
- destroyObservers();
- releaseSession();
- _model.sessionLost();
+ _connectDialog.showDialog();
}
+ }
+
+ //
+ // Runs in UI thread
+ //
+ private boolean doConnect(Component parent)
+ {
+ assert _session == null;
Cursor oldCursor = parent.getCursor();
-
try
{
parent.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
@@ -320,7 +301,7 @@ class SessionKeeper
// Establish session
//
- if(info.useGlacier)
+ if(_connectInfo.useGlacier)
{
//
// Not yet implemented
@@ -329,14 +310,15 @@ class SessionKeeper
}
else
{
- if(!_model.setConnectInfo(info, parent, oldCursor))
+ if(!_model.setConnectInfo(_connectInfo, parent, oldCursor))
{
return false;
}
try
{
- _session = _model.getSessionManager().createLocalSession(info.username);
+ _session = _model.getSessionManager().
+ createLocalSession(_connectInfo.username);
}
catch(Ice.LocalException e)
{
@@ -382,7 +364,7 @@ class SessionKeeper
return false;
}
- info.save();
+ _connectInfo.save();
}
finally
{
@@ -403,7 +385,7 @@ class SessionKeeper
_model.sessionLost();
JOptionPane.showMessageDialog(
- _parent,
+ _model.getMainFrame(),
message,
"Session lost",
JOptionPane.ERROR_MESSAGE);
@@ -428,13 +410,26 @@ class SessionKeeper
try
{
_thread.join();
+ break;
}
catch(InterruptedException e)
{
}
- break;
}
_thread = null;
+
+ try
+ {
+ //
+ // TODO: add timeout
+ //
+ _session.destroy();
+ }
+ catch(Ice.LocalException e)
+ {
+ // Ignored
+ }
+
_session = null;
_model.getStatusBar().setText("Not connected");
}
@@ -463,8 +458,7 @@ class SessionKeeper
_nodeObserverIdentity.name = uuid;
_nodeObserverIdentity.category = "nodeObserver";
- RegistryObserverI registryObserverServant = new RegistryObserverI(
- this, _model);
+ RegistryObserverI registryObserverServant = new RegistryObserverI(_model);
RegistryObserverPrx registryObserver =
RegistryObserverPrxHelper.uncheckedCast(
@@ -521,9 +515,8 @@ class SessionKeeper
return _session;
}
-
- private Frame _parent;
private ConnectDialog _connectDialog;
+ private Model.ConnectInfo _connectInfo;
private Model _model;
private Preferences _connectionPrefs;
diff --git a/java/src/IceGrid/TableDialog.java b/java/src/IceGrid/TableDialog.java
new file mode 100755
index 00000000000..9b685c18605
--- /dev/null
+++ b/java/src/IceGrid/TableDialog.java
@@ -0,0 +1,224 @@
+// **********************************************************************
+//
+// 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;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Frame;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableModel;
+
+import com.jgoodies.forms.factories.Borders;
+import com.jgoodies.forms.factories.ButtonBarFactory;
+
+//
+// A simple two-column table dialog, to edit properties and properties-like
+// maps.
+//
+
+public class TableDialog extends JDialog
+{
+ class PopupListener extends MouseAdapter
+ {
+ public void mousePressed(MouseEvent e)
+ {
+ maybeShowPopup(e);
+ }
+
+ public void mouseReleased(MouseEvent e)
+ {
+ maybeShowPopup(e);
+ }
+
+ private void maybeShowPopup(MouseEvent e)
+ {
+ if (e.isPopupTrigger())
+ {
+ _popup.show( e.getX(), e.getY());
+ }
+ }
+ }
+
+ class PopupMenu extends JPopupMenu
+ {
+ PopupMenu()
+ {
+ _addRow = new AbstractAction("Add a new row")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ java.util.Vector newRow = null;
+ _model.addRow(newRow);
+ }
+ };
+
+ _deleteRow = new AbstractAction("Delete selected row(s)")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ for(;;)
+ {
+ int selectedRow = _table.getSelectedRow();
+ if(selectedRow == -1)
+ {
+ break;
+ }
+ else
+ {
+ _model.removeRow(selectedRow);
+ }
+ }
+ }
+ };
+
+ add(_addRow);
+ add(_deleteRow);
+ }
+
+ void show(int x, int y)
+ {
+ _deleteRow.setEnabled(_table.getSelectedRowCount() > 0);
+ show(_table, x, y);
+ }
+
+ private Action _addRow;
+ private Action _deleteRow;
+ }
+
+ public TableDialog(Frame parentFrame, String title, String heading0, String heading1)
+ {
+ super(parentFrame, title, true);
+ setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
+
+ _columnNames = new java.util.Vector(2);
+ _columnNames.add(heading0);
+ _columnNames.add(heading1);
+
+ _table = new JTable();
+ PopupListener popupListener = new PopupListener();
+ _table.addMouseListener(popupListener);
+
+ Action ok = new AbstractAction("OK")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ _cancelled = false;
+ setVisible(false);
+ }
+ };
+ JButton okButton = new JButton(ok);
+
+ Action cancel = new AbstractAction("Cancel")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ setVisible(false);
+ }
+ };
+ JButton cancelButton = new JButton(cancel);
+
+ JScrollPane scrollPane = new JScrollPane(_table);
+ scrollPane.addMouseListener(popupListener);
+ scrollPane.setBorder(Borders.DIALOG_BORDER);
+
+ getContentPane().add(scrollPane, BorderLayout.CENTER);
+ JPanel buttonBar = ButtonBarFactory.buildOKCancelBar(okButton, cancelButton);
+ buttonBar.setBorder(Borders.DIALOG_BORDER);
+
+ getContentPane().add(buttonBar, BorderLayout.SOUTH);
+ pack();
+ }
+
+ //
+ // Returns null when cancel is pressed
+ //
+ public java.util.Map show(java.util.Map map, JComponent onComponent)
+ {
+ _cancelled = true;
+
+ //
+ // Transform map into vector of vectors
+ //
+ java.util.Vector vector = new java.util.Vector(map.size());
+ java.util.Iterator p = map.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());
+ vector.add(row);
+ }
+ if(vector.size() == 0)
+ {
+ vector.add(new java.util.Vector(2));
+ }
+
+ _model = new DefaultTableModel(vector, _columnNames);
+ _table.setModel(_model);
+
+ setLocationRelativeTo(onComponent);
+ setVisible(true);
+
+ if(_cancelled)
+ {
+ return null;
+ }
+ else
+ {
+ if(_table.isEditing())
+ {
+ _table.getCellEditor().stopCellEditing();
+ }
+ vector = _model.getDataVector();
+
+ //
+ // Transform vector into new Map
+ //
+ java.util.Map result = new java.util.HashMap(vector.size());
+ 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.length() > 0)
+ {
+ result.put(key, row.elementAt(1));
+ }
+ }
+ return result;
+ }
+ }
+
+ private boolean _cancelled;
+ private JTable _table;
+ private DefaultTableModel _model;
+ private java.util.Vector _columnNames;
+ private PopupMenu _popup = new PopupMenu();
+}
+
+
+
diff --git a/java/src/IceGrid/TreeNode/Adapter.java b/java/src/IceGrid/TreeNode/Adapter.java
index 37d0ed5a032..80632b4b2c1 100755
--- a/java/src/IceGrid/TreeNode/Adapter.java
+++ b/java/src/IceGrid/TreeNode/Adapter.java
@@ -8,8 +8,11 @@
// **********************************************************************
package IceGrid.TreeNode;
+import java.awt.BorderLayout;
import java.awt.Component;
+import java.awt.Cursor;
import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
import javax.swing.AbstractAction;
import javax.swing.Action;
@@ -17,13 +20,23 @@ import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
+
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.event.ListDataEvent;
+import javax.swing.event.ListDataListener;
+
import javax.swing.tree.DefaultTreeCellRenderer;
+import javax.swing.tree.TreePath;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.factories.Borders;
+import com.jgoodies.forms.factories.ButtonBarFactory;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.util.LayoutStyle;
import com.jgoodies.uif_lite.panel.SimpleInternalFrame;
@@ -31,47 +44,271 @@ import com.jgoodies.uif_lite.panel.SimpleInternalFrame;
import IceGrid.AdapterDescriptor;
import IceGrid.Model;
import IceGrid.ObjectDescriptor;
+import IceGrid.TableDialog;
import IceGrid.Utils;
class Adapter extends Leaf
{
static class Editor
{
- JComponent getComponent()
+ Editor(JFrame parentFrame)
{
- if(_scrollPane == null)
- {
- //
- // gotoReplicatedAdapter action
- //
- AbstractAction gotoReplicatedAdapter = new AbstractAction("->")
+ _objects.setEditable(false);
+
+ //
+ // Create buttons
+ //
+
+ //
+ // _idButton
+ //
+ AbstractAction gotoReplicatedAdapter = new AbstractAction("->")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ Object obj = _id.getSelectedItem();
+ if(obj != null && _adapter != null)
+ {
+ ReplicatedAdapter ra = null;
+ if(obj instanceof ReplicatedAdapter)
+ {
+ ra = (ReplicatedAdapter)obj;
+ }
+ else
+ {
+ ra = _adapter.getApplication().
+ findReplicatedAdapter((String)obj);
+ }
+ if(ra != null)
+ {
+ _adapter.getModel().getTree().setSelectionPath
+ (ra.getPath());
+ }
+ }
+ }
+ };
+ gotoReplicatedAdapter.putValue(Action.SHORT_DESCRIPTION, "Goto this replicated adapter");
+ _idButton = new JButton(gotoReplicatedAdapter);
+
+ //
+ // _objectsButton
+ //
+ _objectsDialog = new TableDialog(parentFrame, "Registered Objects",
+ "Object Identity", "Type");
+
+ AbstractAction openObjectsDialog = new AbstractAction("...")
+ {
+ public void actionPerformed(ActionEvent e)
{
- public void actionPerformed(ActionEvent e)
+ java.util.Map result = _objectsDialog.show(_objectsMap, _panel);
+ if(result != null)
{
- Object obj = _id.getSelectedItem();
- if(obj != null && _adapter != null)
+ updated();
+ _objectsMap = result;
+ setObjectsField();
+ }
+ }
+ };
+ _objectsButton = new JButton(openObjectsDialog);
+
+
+ //
+ // _applyButton
+ //
+ AbstractAction apply = new AbstractAction("Apply")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ if(_adapter.getModel().canUpdate())
+ {
+ _adapter.getModel().getMainFrame().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+ _adapter.getModel().disableDisplay();
+
+ try
{
- ReplicatedAdapter ra = null;
- if(obj instanceof ReplicatedAdapter)
+ AdapterDescriptor descriptor = _adapter.getDescriptor();
+
+ //
+ // Did the name change?
+ //
+ String newName = _name.getText();
+
+ if(_adapter.isNew())
{
- ra = (ReplicatedAdapter)obj;
+ String newResolvedName = Utils.substitute(newName, _adapter.getResolver());
+ Adapters parent = (Adapters)_adapter.getParent();
+
+ descriptor.name = newName;
+ writeDescriptor();
+ parent.addDescriptor(descriptor);
+
+ if(!_adapter.getApplication().applyUpdate())
+ {
+ parent = (Adapters)_adapter.getModel().findNewNode(parent.getPath());
+ parent.popDescriptor();
+ _adapter.getModel().setSelectionPath(parent.getPath());
+ _adapter.setParent(parent);
+ return;
+ }
+ else
+ {
+ parent = (Adapters)_adapter.getModel().findNewNode(parent.getPath());
+ _adapter = (Adapter)parent.findChild(newResolvedName);
+ _adapter.getModel().setSelectionPath(_adapter.getPath());
+ }
}
- else
+ else if(descriptor.name.equals(newName))
{
- ra = _adapter.getApplication().
- findReplicatedAdapter((String)obj);
+ writeDescriptor();
}
- if(ra != null)
+ else
{
- _adapter.getModel().getTree().setSelectionPath
- (ra.getPath());
+ String newResolvedName = Utils.substitute(newName, _adapter.getResolver());
+
+ //
+ // Save to be able to rollback
+ //
+ AdapterDescriptor oldDescriptor = null;
+ try
+ {
+ oldDescriptor = (AdapterDescriptor)descriptor.clone();
+ }
+ catch(CloneNotSupportedException ce)
+ {
+ assert false; // impossible
+ }
+
+ TreePath oldPath = _adapter.getPath();
+ Adapters parent = (Adapters)_adapter.getParent();
+
+ descriptor.name = newName;
+ writeDescriptor();
+
+ if(!_adapter.getApplication().applyUpdate())
+ {
+ //
+ // Restore descriptor
+ // IMPORTANT: keep the same object!
+ //
+ descriptor.name = oldDescriptor.name;
+ descriptor.id = oldDescriptor.id;
+ descriptor.registerProcess = oldDescriptor.registerProcess;
+ descriptor.waitForActivation = oldDescriptor.waitForActivation;
+ descriptor.objects = oldDescriptor.objects;
+
+ //
+ // Need to find new Adapter node!
+ //
+ _adapter = (Adapter)_adapter.getModel().findNewNode(oldPath);
+ _adapter.getModel().setSelectionPath(_adapter.getPath());
+ //
+ //
+ // Everything was restored, user must deal with error
+ //
+ return;
+ }
+ else
+ {
+ parent = (Adapters)_adapter.getModel().findNewNode(parent.getPath());
+ _adapter = (Adapter)parent.findChild(newResolvedName);
+ _adapter.getModel().setSelectionPath(_adapter.getPath());
+ }
}
+
+ //
+ // Change enclosing properties afterwards
+ //
+ _adapter.setEndpoints(newName, _endpoints.getText());
+
+ //
+ // Mark modified
+ //
+ _adapter.getEditable().markModified();
+
+ _applyButton.setEnabled(false);
+ _discardButton.setEnabled(false);
+ }
+ finally
+ {
+ _adapter.getModel().enableDisplay();
+ _adapter.getModel().getMainFrame().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
- };
- gotoReplicatedAdapter.putValue(Action.SHORT_DESCRIPTION, "Goto this replicated adapter");
+ //
+ // Otherwise, may wait until other user is done!
+ //
+ }
+ };
+ _applyButton = new JButton(apply);
+
+
+ //
+ // _discardButton
+ //
+ AbstractAction discard = new AbstractAction("Discard")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ //
+ // Redisplay everything
+ //
+ _adapter.getModel().refreshDisplay();
+ }
+ };
+ _discardButton = new JButton(discard);
+ //
+ // Detect updates
+ //
+ DocumentListener updateListener = new DocumentListener()
+ {
+ public void changedUpdate(DocumentEvent e)
+ {
+ updated();
+ }
+
+ public void insertUpdate(DocumentEvent e)
+ {
+ updated();
+ }
+
+ public void removeUpdate(DocumentEvent e)
+ {
+ updated();
+ }
+ };
+ _name.getDocument().addDocumentListener(updateListener);
+ _endpoints.getDocument().addDocumentListener(updateListener);
+
+ JTextField idTextField = (JTextField)_id.getEditor().getEditorComponent();
+ idTextField.getDocument().addDocumentListener(updateListener);
+
+
+ Action checkRegisterProcess = new AbstractAction("Register Process")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ updated();
+ }
+ };
+ _registerProcess = new JCheckBox(checkRegisterProcess);
+
+ Action checkWaitForActivation = new AbstractAction("Wait for Activation")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ updated();
+ }
+ };
+ _waitForActivation = new JCheckBox(checkWaitForActivation);
+ }
+
+
+ JComponent getComponent()
+ {
+ if(_panel == null)
+ {
//
// Build everything using JGoodies's DefaultFormBuilder
//
@@ -87,7 +324,6 @@ class Adapter extends Leaf
builder.append(_name, 3);
builder.nextLine();
- _idButton = new JButton(gotoReplicatedAdapter);
builder.append("Id", _id );
builder.append(_idButton);
builder.nextLine();
@@ -105,25 +341,97 @@ class Adapter extends Leaf
builder.append("", _waitForActivation);
builder.nextLine();
- _scrollPane = new JScrollPane(builder.getPanel(),
- JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
- JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
- _scrollPane.setBorder(Borders.DIALOG_BORDER);
+ JScrollPane scrollPane = new JScrollPane(builder.getPanel(),
+ JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+ JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+ scrollPane.setBorder(Borders.DIALOG_BORDER);
+
+ _panel = new JPanel(new BorderLayout());
+ _panel.add(scrollPane, BorderLayout.CENTER);
+
+ JComponent buttonBar = ButtonBarFactory.buildRightAlignedBar(_applyButton,
+ _discardButton);
+ buttonBar.setBorder(Borders.DIALOG_BORDER);
+ _panel.add(buttonBar, BorderLayout.SOUTH);
}
- return _scrollPane;
+ return _panel;
+ }
+
+ void updated()
+ {
+ if(_detectUpdates)
+ {
+ _applyButton.setEnabled(true);
+ _discardButton.setEnabled(true);
+ }
+ }
+
+ //
+ // Write all fields except name
+ //
+ void writeDescriptor()
+ {
+ AdapterDescriptor descriptor = _adapter.getDescriptor();
+ Object obj = _id.getSelectedItem();
+ if(obj == null)
+ {
+ descriptor.id = "";
+ }
+ else
+ {
+ if(obj instanceof ReplicatedAdapter)
+ {
+ ReplicatedAdapter ra = (ReplicatedAdapter)obj;
+ descriptor.id = ra.getId();
+ }
+ else
+ {
+ descriptor.id = (String)obj;
+ }
+ }
+
+ descriptor.registerProcess = _registerProcess.isSelected();
+ descriptor.waitForActivation = _waitForActivation.isSelected();
+ descriptor.objects = mapToObjectDescriptorSeq(_objectsMap);
+ }
+
+ void setObjectsField()
+ {
+ final Utils.Resolver resolver = _adapter.getModel().substitute() ? _adapter.getResolver() : null;
+
+ Ice.StringHolder toolTipHolder = new Ice.StringHolder();
+ Utils.Stringifier stringifier = new Utils.Stringifier()
+ {
+ public String toString(Object obj)
+ {
+ java.util.Map.Entry entry = (java.util.Map.Entry)obj;
+
+ return Utils.substitute((String)entry.getKey(), resolver)
+ + " as '"
+ + Utils.substitute((String)entry.getValue(), resolver)
+ + "'";
+ }
+ };
+
+ _objects.setText(
+ Utils.stringify(_objectsMap.entrySet(), stringifier,
+ ", ", toolTipHolder));
+ _objects.setToolTipText(toolTipHolder.value);
}
void show(Adapter adapter)
{
+ _detectUpdates = false;
+
_adapter = adapter;
- AdapterDescriptor descriptor = adapter.getDescriptor();
+ AdapterDescriptor descriptor = _adapter.getDescriptor();
- final Utils.Resolver resolver = adapter.getModel().substitute() ? adapter.getResolver() : null;
- boolean editable = adapter.isEditable() && resolver == null;
+ Utils.Resolver resolver = adapter.getModel().substitute() ? adapter.getResolver() : null;
+ boolean isEditable = adapter.isEditable() && resolver == null;
_name.setText(
Utils.substitute(descriptor.name, resolver));
- _name.setEditable(editable);
+ _name.setEditable(isEditable);
//
// Need to make control editable & enabled before changing it
@@ -147,56 +455,80 @@ class Adapter extends Leaf
{
_id.setSelectedItem(adapterId);
}
- _id.setEnabled(editable);
- _id.setEditable(editable);
+
+ _id.setEnabled(isEditable);
+ _id.setEditable(isEditable);
_endpoints.setText(
Utils.substitute(adapter.getEndpoints(), resolver));
- _endpoints.setEditable(editable);
+ _endpoints.setEditable(isEditable);
- Ice.StringHolder toolTipHolder = new Ice.StringHolder();
-
- Utils.Stringifier stringifier = new Utils.Stringifier()
- {
- public String toString(Object obj)
- {
- ObjectDescriptor od = (ObjectDescriptor)obj;
- Ice.Identity sid =
- sid = new Ice.Identity(
- Utils.substitute(od.id.name, resolver),
- Utils.substitute(od.id.category, resolver));
- return Ice.Util.identityToString(sid)
- + " as '"
- + Utils.substitute(od.type, resolver)
- + "'";
- }
- };
-
- _objects.setText(
- Utils.stringify(descriptor.objects, stringifier,
- ", ", toolTipHolder));
- _objects.setToolTipText(toolTipHolder.value);
- _objects.setEditable(false);
+ //
+ // Objects
+ //
+ _objectsMap = objectDescriptorSeqToMap(descriptor.objects);
+ setObjectsField();
+ _objectsButton.setEnabled(isEditable);
_registerProcess.setSelected(descriptor.registerProcess);
- _registerProcess.setEnabled(editable);
+ _registerProcess.setEnabled(isEditable);
_waitForActivation.setSelected(descriptor.waitForActivation);
- _waitForActivation.setEnabled(editable);
-
+ _waitForActivation.setEnabled(isEditable);
+
+ _applyButton.setEnabled(_adapter.isNew());
+ _discardButton.setEnabled(_adapter.isNew());
+ _detectUpdates = true;
+
}
+ static java.util.Map objectDescriptorSeqToMap(java.util.List objects)
+ {
+ java.util.Map result = new java.util.HashMap(objects.size());
+ java.util.Iterator p = objects.iterator();
+ while(p.hasNext())
+ {
+ ObjectDescriptor od = (ObjectDescriptor)p.next();
+ result.put(Ice.Util.identityToString(od.id), od.type);
+ }
+ return result;
+ }
+
+ static java.util.LinkedList mapToObjectDescriptorSeq(java.util.Map map)
+ {
+ java.util.LinkedList result = new java.util.LinkedList();
+ java.util.Iterator p = map.entrySet().iterator();
+ while(p.hasNext())
+ {
+ java.util.Map.Entry entry = (java.util.Map.Entry)p.next();
+ Ice.Identity id = Ice.Util.stringToIdentity((String)entry.getKey());
+ String type = (String)entry.getValue();
+ result.add(new ObjectDescriptor(id, type));
+ }
+ return result;
+ }
+
+
+ private boolean _detectUpdates;
+
private JTextField _name = new JTextField(20);
private JComboBox _id = new JComboBox();
private JTextField _endpoints = new JTextField(20);
- private JCheckBox _registerProcess = new JCheckBox("Register Process");
- private JCheckBox _waitForActivation = new JCheckBox("Wait for Activation");
+ private JCheckBox _registerProcess;
+ private JCheckBox _waitForActivation;
private JTextField _objects = new JTextField(20);
+ private java.util.Map _objectsMap;
+
private JButton _objectsButton = new JButton("...");
private JButton _idButton;
+
+ private JButton _applyButton;
+ private JButton _discardButton;
+
+ private TableDialog _objectsDialog;
+ private JPanel _panel;
private Adapter _adapter;
- private JScrollPane _scrollPane;
}
@@ -225,11 +557,11 @@ class Adapter extends Leaf
public void displayProperties()
{
SimpleInternalFrame propertiesFrame = _model.getPropertiesFrame();
-
+
propertiesFrame.setTitle("Properties for " + _id);
if(_editor == null)
{
- _editor = new Editor();
+ _editor = new Editor(_model.getMainFrame());
}
_editor.show(this);
@@ -243,6 +575,7 @@ class Adapter extends Leaf
Utils.Resolver resolver, Application application, Model model)
{
super(adapterName, model);
+ _brandNew = false;
_descriptor = descriptor;
_resolver = resolver;
@@ -263,6 +596,23 @@ class Adapter extends Leaf
}
}
+ //
+ // Fresh new temporary Adapter
+ //
+ Adapter(String name, Utils.Resolver resolver, Model model)
+ {
+ super(name, model);
+ _resolver = resolver;
+ _brandNew = true;
+ _descriptor = new AdapterDescriptor();
+ _descriptor.name = name;
+ _descriptor.id = "";
+ _descriptor.registerProcess = false;
+ _descriptor.waitForActivation = true;
+ _descriptor.objects = new java.util.LinkedList();
+ }
+
+
public void unregister()
{
if(_instanceId != null)
@@ -303,11 +653,12 @@ class Adapter extends Leaf
return ph.get(_descriptor.name + ".Endpoints");
}
- void setEndpoints(String newEndpoints)
+ void setEndpoints(String newName, String newEndpoints)
{
PropertiesHolder ph = getParent().getParent().getPropertiesHolder();
assert ph != null;
- ph.put(_descriptor.name + ".Endpoints", newEndpoints);
+ ph.replace(_descriptor.name + ".Endpoints", newName + ".Endpoints",
+ newEndpoints);
}
AdapterInstanceId getInstanceId()
@@ -315,6 +666,11 @@ class Adapter extends Leaf
return _instanceId;
}
+ boolean isNew()
+ {
+ return _brandNew;
+ }
+
private void createToolTip()
{
if(_proxy == null)
@@ -327,6 +683,7 @@ class Adapter extends Leaf
}
}
+ private boolean _brandNew;
private AdapterDescriptor _descriptor;
private Utils.Resolver _resolver;
private boolean _isEditable;
diff --git a/java/src/IceGrid/TreeNode/Adapters.java b/java/src/IceGrid/TreeNode/Adapters.java
index 0bc6d57eb28..977fd3cf122 100755
--- a/java/src/IceGrid/TreeNode/Adapters.java
+++ b/java/src/IceGrid/TreeNode/Adapters.java
@@ -8,47 +8,124 @@
// **********************************************************************
package IceGrid.TreeNode;
+import java.awt.event.ActionEvent;
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JPopupMenu;
+
import IceGrid.AdapterDescriptor;
import IceGrid.Model;
import IceGrid.Utils;
class Adapters extends Parent
{
+ static class PopupMenu extends JPopupMenu
+ {
+ PopupMenu()
+ {
+ _new = new AbstractAction("New")
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ _adapters.newAdapter();
+ }
+ };
+
+ add(_new);
+ }
+
+ void setAdapters(Adapters adapters)
+ {
+ _adapters = adapters;
+ }
+
+ private Adapters _adapters;
+ private Action _new;
+ }
+
+ public JPopupMenu getPopupMenu()
+ {
+ if(_isEditable)
+ {
+ if(_popup == null)
+ {
+ _popup = new PopupMenu();
+ }
+ _popup.setAdapters(this);
+ return _popup;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public void unregister()
+ {
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ Adapter adapter = (Adapter)p.next();
+ adapter.unregister();
+ }
+ }
+
+
Adapters(java.util.List descriptors, boolean isEditable,
Utils.Resolver resolver, Application application,
Model model)
throws DuplicateIdException
{
super("Adapters", model);
+ _descriptors = descriptors;
_isEditable = isEditable;
+ _resolver = resolver;
+ _popup = new PopupMenu();
- java.util.Iterator p = descriptors.iterator();
+ java.util.Iterator p = _descriptors.iterator();
while(p.hasNext())
{
AdapterDescriptor descriptor = (AdapterDescriptor)p.next();
String adapterName = Utils.substitute(descriptor.name,
- resolver);
+ _resolver);
addChild(new Adapter(adapterName, descriptor,
- resolver, application, _model));
+ _resolver, application, _model));
}
}
- public void unregister()
+ boolean isEditable()
{
- java.util.Iterator p = _children.iterator();
- while(p.hasNext())
+ return _isEditable;
+ }
+
+ void newAdapter()
+ {
+ String name = "NewAdapter";
+ int i = 0;
+ while(findChild(name) != null)
{
- Adapter adapter = (Adapter)p.next();
- adapter.unregister();
+ name = "NewAdapter-" + (++i);
}
+ Adapter adapter = new Adapter(name, _resolver, _model);
+ adapter.setParent(this);
+ _model.setSelectionPath(getPath());
+ adapter.displayProperties();
}
- boolean isEditable()
+ void addDescriptor(AdapterDescriptor descriptor)
{
- return _isEditable;
+ _descriptors.add(descriptor);
+ }
+
+ void popDescriptor()
+ {
+ _descriptors.remove(_descriptors.size() - 1);
}
+ private java.util.List _descriptors;
+ private Utils.Resolver _resolver;
private boolean _isEditable;
+ static private PopupMenu _popup;
}
diff --git a/java/src/IceGrid/TreeNode/Application.java b/java/src/IceGrid/TreeNode/Application.java
index 76ca587b55b..ac029e705a0 100755
--- a/java/src/IceGrid/TreeNode/Application.java
+++ b/java/src/IceGrid/TreeNode/Application.java
@@ -16,16 +16,118 @@ import IceGrid.ServerDynamicInfo;
import IceGrid.ServerState;
import IceGrid.TemplateDescriptor;
-class Application extends EditableParent
+import javax.swing.JOptionPane;
+
+public class Application extends EditableParent
{
+ public ApplicationDescriptor getDescriptor()
+ {
+ return _descriptor;
+ }
+
+ public ApplicationUpdateDescriptor createUpdateDescriptor()
+ {
+ ApplicationUpdateDescriptor update = new ApplicationUpdateDescriptor();
+ update.name = _descriptor.name;
+ if(isModified())
+ {
+ //
+ // Diff description
+ //
+ if(!_descriptor.description.equals(_origDescription))
+ {
+ update.description.value = _descriptor.description;
+ }
+
+ //
+ // Diff variables
+ //
+ update.variables = (java.util.TreeMap)_descriptor.variables.clone();
+ java.util.List removeVariables = new java.util.LinkedList();
+
+ java.util.Iterator p = _origVariables.entrySet().iterator();
+ while(p.hasNext())
+ {
+ java.util.Map.Entry entry = (java.util.Map.Entry)p.next();
+ Object key = entry.getKey();
+ Object newValue = update.variables.get(key);
+ if(newValue == null)
+ {
+ removeVariables.add(key);
+ }
+ else
+ {
+ Object value = entry.getValue();
+ if(newValue.equals(value))
+ {
+ update.variables.remove(key);
+ }
+ }
+ }
+ update.removeVariables = (String[])removeVariables.toArray(new String[0]);
+ }
+ else
+ {
+ update.variables = new java.util.TreeMap();
+ update.removeVariables = new String[0];
+ }
+
+ //
+ // Patch TODO: implement
+ //
+ update.patchs = new java.util.HashMap();
+ update.removePatchs = new String[0];
+
+ //
+ // Replicated Adapters
+ //
+ update.removeReplicatedAdapters = _replicatedAdapters.removedElements();
+ update.replicatedAdapters = new java.util.LinkedList();
+ _replicatedAdapters.getUpdates(update.replicatedAdapters);
+
+ //
+ // Server Templates
+ //
+ update.removeServerTemplates = _serverTemplates.removedElements();
+ update.serverTemplates = new java.util.HashMap();
+ _serverTemplates.getUpdates(update.serverTemplates);
+
+ //
+ // Service Templates
+ //
+ update.removeServiceTemplates = _serviceTemplates.removedElements();
+ update.serviceTemplates = new java.util.HashMap();
+ _serviceTemplates.getUpdates(update.serviceTemplates);
+
+ //
+ // Nodes
+ //
+ update.removeNodes = _nodes.removedElements();
+ update.nodes = new java.util.LinkedList();
+ _nodes.getUpdates(update.nodes);
+
+ return update;
+ }
+
+ public void commit()
+ {
+ super.commit();
+ _origVariables = (java.util.Map)_descriptor.variables.clone();
+ _origDescription = _descriptor.description;
+ }
+
+
//
// Builds the application and all its subtrees
//
- Application(ApplicationDescriptor descriptor, Model model)
+ Application(boolean brandNew, ApplicationDescriptor descriptor, Model model)
throws DuplicateIdException
{
- super(false, descriptor.name, model);
+ super(brandNew, descriptor.name, model);
_descriptor = descriptor;
+ _origVariables = (java.util.Map)_descriptor.variables.clone();
+ _origDescription = _descriptor.description;
+
_replicatedAdapters = new ReplicatedAdapters(_descriptor.replicatedAdapters,
_model);
@@ -52,6 +154,8 @@ class Application extends EditableParent
// So we'll have to be carefull to properly recover the "old" descriptor.
//
_descriptor = o._descriptor;
+ _origVariables = o._origVariables;
+ _origDescription = o._origDescription;
try
{
@@ -79,8 +183,6 @@ class Application extends EditableParent
//
boolean applyUpdate()
{
- // TODO: hourglass
-
Application copy = new Application(this);
try
@@ -89,22 +191,23 @@ class Application extends EditableParent
}
catch(DuplicateIdException e)
{
- // TODO: error message to the user
-
+ JOptionPane.showMessageDialog(
+ _model.getMainFrame(),
+ e.toString(),
+ "Duplicate id error",
+ JOptionPane.ERROR_MESSAGE);
_model.getRoot().restore(copy);
return false;
}
-
-
return true;
}
void update() throws DuplicateIdException
{
_replicatedAdapters.update();
- _serverTemplates.update();
_serviceTemplates.update();
+ _serverTemplates.update();
_nodes.update();
}
@@ -441,6 +544,14 @@ class Application extends EditableParent
private java.util.Map _nodeServerMap = new java.util.HashMap();
//
+ // Keeps original version (as deep copies) to be able to build
+ // ApplicationUpdateDescriptor
+ //
+ private java.util.Map _origVariables;
+ private String _origDescription;
+
+
+ //
// Children
//
private ReplicatedAdapters _replicatedAdapters;
diff --git a/java/src/IceGrid/TreeNode/CommonBase.java b/java/src/IceGrid/TreeNode/CommonBase.java
index b52afa78f2d..7a910a3deaf 100755
--- a/java/src/IceGrid/TreeNode/CommonBase.java
+++ b/java/src/IceGrid/TreeNode/CommonBase.java
@@ -28,6 +28,8 @@ public interface CommonBase extends TreeCellRenderer
int getIndex(Object child);
boolean isLeaf();
+ CommonBase findChild(String id);
+
//
// Unique within the scope of each parent
//
@@ -41,6 +43,12 @@ public interface CommonBase extends TreeCellRenderer
//
void unregister();
+
+ //
+ // Destroys this node, no-op when destruction not allowed
+ //
+ // void remove();
+
//
// Set this node as a parent, and recursively update
// the path of all children.
diff --git a/java/src/IceGrid/TreeNode/Editable.java b/java/src/IceGrid/TreeNode/Editable.java
index 45661b342cc..2dd828fcdb9 100755
--- a/java/src/IceGrid/TreeNode/Editable.java
+++ b/java/src/IceGrid/TreeNode/Editable.java
@@ -13,8 +13,10 @@ import IceGrid.Model;
interface Editable
{
+ boolean isNew();
boolean isModified();
void markModified();
+ void commit();
}
diff --git a/java/src/IceGrid/TreeNode/EditableLeaf.java b/java/src/IceGrid/TreeNode/EditableLeaf.java
index 7511c9e0ac8..013fb6f9ec4 100755
--- a/java/src/IceGrid/TreeNode/EditableLeaf.java
+++ b/java/src/IceGrid/TreeNode/EditableLeaf.java
@@ -11,6 +11,11 @@ import IceGrid.Model;
class EditableLeaf extends Leaf implements Editable
{
+ public boolean isNew()
+ {
+ return _isNew;
+ }
+
public boolean isModified()
{
return _modified;
@@ -25,19 +30,27 @@ class EditableLeaf extends Leaf implements Editable
{
return this;
}
+
+ public void commit()
+ {
+ _isNew = false;
+ _modified = false;
+ }
protected EditableLeaf(boolean brandNew, String id, Model model)
{
super(id, model);
- _modified = brandNew;
+ _isNew = brandNew;
}
protected EditableLeaf(EditableLeaf o)
{
super(o);
_modified = o._modified;
+ _isNew = o._isNew;
}
+ private boolean _isNew;
private boolean _modified;
}
diff --git a/java/src/IceGrid/TreeNode/EditableParent.java b/java/src/IceGrid/TreeNode/EditableParent.java
index b0b379dbe9a..5c9f8738d53 100755
--- a/java/src/IceGrid/TreeNode/EditableParent.java
+++ b/java/src/IceGrid/TreeNode/EditableParent.java
@@ -16,38 +16,42 @@ import IceGrid.Model;
//
class EditableParent extends Parent implements Editable
{
- EditableParent(boolean brandNew, String id, Model model, boolean root)
+ public boolean isNew()
{
- super(id, model, root);
- _modified = brandNew;
+ return _isNew;
}
- EditableParent(boolean brandNew, String id, Model model)
+ public boolean isModified()
{
- this(brandNew, id, model, false);
+ return _modified;
}
- EditableParent(EditableParent o, boolean copyChildren)
+ public void markModified()
{
- super(o, copyChildren);
- _modified = o._modified;
- _removedElements = (java.util.TreeSet)o._removedElements.clone();
+ _modified = true;
}
-
- EditableParent(EditableParent o)
+ public Editable getEditable()
{
- this(o, false);
+ return this;
}
- public boolean isModified()
+ public void commit()
{
- return _modified;
- }
+ _isNew = false;
+ _modified = false;
+ _removedElements.clear();
- public void markModified()
- {
- _modified = true;
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ Object child = p.next();
+ if(child instanceof Editable)
+ {
+ Editable editable = (Editable)child;
+ editable.commit();
+ }
+ }
}
void removeElement(CommonBase child)
@@ -69,17 +73,37 @@ class EditableParent extends Parent implements Editable
}
}
- java.util.Set removedElements()
+ String[] removedElements()
{
- return _removedElements;
+ return (String[])_removedElements.toArray(new String[0]);
}
- public Editable getEditable()
+ protected EditableParent(boolean brandNew, String id, Model model, boolean root)
{
- return this;
+ super(id, model, root);
+ _isNew = brandNew;
}
-
- private boolean _modified;
+
+ protected EditableParent(boolean brandNew, String id, Model model)
+ {
+ this(brandNew, id, model, false);
+ }
+
+ protected EditableParent(EditableParent o, boolean copyChildren)
+ {
+ super(o, copyChildren);
+ _modified = o._modified;
+ _isNew = o._isNew;
+ _removedElements = (java.util.TreeSet)o._removedElements.clone();
+ }
+
+ protected EditableParent(EditableParent o)
+ {
+ this(o, false);
+ }
+
+ private boolean _isNew = false;
+ private boolean _modified = false;
private java.util.TreeSet _removedElements = new java.util.TreeSet();
}
diff --git a/java/src/IceGrid/TreeNode/Leaf.java b/java/src/IceGrid/TreeNode/Leaf.java
index c85ba343f00..eee9f2b7196 100755
--- a/java/src/IceGrid/TreeNode/Leaf.java
+++ b/java/src/IceGrid/TreeNode/Leaf.java
@@ -35,6 +35,11 @@ class Leaf extends CommonBaseI
{
return true;
}
+
+ public CommonBase findChild(String id)
+ {
+ return null;
+ }
protected Leaf(String id, Model model)
{
diff --git a/java/src/IceGrid/TreeNode/Node.java b/java/src/IceGrid/TreeNode/Node.java
index 7468f558d2e..d6a9f9022e5 100755
--- a/java/src/IceGrid/TreeNode/Node.java
+++ b/java/src/IceGrid/TreeNode/Node.java
@@ -122,6 +122,85 @@ class Node extends EditableParent
}
}
+
+ NodeUpdateDescriptor getUpdate()
+ {
+ if(!isNew() && !isModified())
+ {
+ return null;
+ }
+
+ NodeUpdateDescriptor update = new NodeUpdateDescriptor();
+ update.name = _id;
+
+ if(isNew())
+ {
+ update.variables = _descriptor.variables;
+ update.removeVariables = new String[0];
+ }
+ else
+ {
+ //
+ // Diff variables (TODO: avoid duplication with same code in Application)
+ //
+ update.variables = (java.util.TreeMap)_descriptor.variables.clone();
+ java.util.List removeVariables = new java.util.LinkedList();
+
+ java.util.Iterator p = _origVariables.entrySet().iterator();
+ while(p.hasNext())
+ {
+ java.util.Map.Entry entry = (java.util.Map.Entry)p.next();
+ Object key = entry.getKey();
+ Object newValue = update.variables.get(key);
+ if(newValue == null)
+ {
+ removeVariables.add(key);
+ }
+ else
+ {
+ Object value = entry.getValue();
+ if(newValue.equals(value))
+ {
+ update.variables.remove(key);
+ }
+ }
+ }
+ update.removeVariables = (String[])removeVariables.toArray(new String[0]);
+ }
+
+ if(isNew())
+ {
+ update.removeServers = new String[0];
+ }
+ else
+ {
+ update.removeServers = removedElements();
+ }
+
+ update.serverInstances = new java.util.LinkedList();
+ update.servers = new java.util.LinkedList();
+
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ Server server = (Server)p.next();
+ if(isNew() || server.isModified() || server.isNew())
+ {
+ ServerInstanceDescriptor instanceDescriptor = server.getInstanceDescriptor();
+ if(instanceDescriptor != null)
+ {
+ update.serverInstances.add(instanceDescriptor);
+ }
+ else
+ {
+ update.servers.add(server.getDescriptor());
+ }
+ }
+ }
+ return update;
+ }
+
+
NodeDescriptor update(NodeUpdateDescriptor update, Application application)
throws DuplicateIdException
{
@@ -264,6 +343,15 @@ class Node extends EditableParent
return null;
}
+ public void commit()
+ {
+ super.commit();
+ if(_descriptor != null)
+ {
+ _origVariables = (java.util.Map)_descriptor.variables.clone();
+ }
+ }
+
Node(String nodeName, Model model)
{
super(false, nodeName, model);
@@ -282,6 +370,7 @@ class Node extends EditableParent
super(o);
_descriptor = o._descriptor;
_resolver = o._resolver;
+ _origVariables = o._origVariables;
_up = o._up;
//
@@ -307,6 +396,8 @@ class Node extends EditableParent
{
assert _descriptor == null;
_descriptor = descriptor;
+ _origVariables = (java.util.Map)_descriptor.variables.clone();
+
_resolver = new Utils.Resolver(new java.util.Map[]
{_descriptor.variables, application.getVariables()});
@@ -380,7 +471,7 @@ class Node extends EditableParent
if(fireEvent)
{
- fireNodeChangedEvent(this);
+ fireStructureChangedEvent(this);
}
}
@@ -456,7 +547,7 @@ class Node extends EditableParent
//
server = new Server(true, serverId, instanceResolver, instanceDescriptor,
serverDescriptor, application);
- addChild(server);
+ addChild(server, true);
server.setParent(this);
}
}
@@ -502,12 +593,13 @@ class Node extends EditableParent
}
purgeChildren(serverIdSet);
-
}
private NodeDescriptor _descriptor;
private Utils.Resolver _resolver;
+ private java.util.Map _origVariables;
+
private boolean _up = false;
static private DefaultTreeCellRenderer _cellRenderer;
diff --git a/java/src/IceGrid/TreeNode/Nodes.java b/java/src/IceGrid/TreeNode/Nodes.java
index 3e17eae7bbc..a98e9d923af 100755
--- a/java/src/IceGrid/TreeNode/Nodes.java
+++ b/java/src/IceGrid/TreeNode/Nodes.java
@@ -64,7 +64,7 @@ public class Nodes extends EditableParent
{
try
{
- addChild(new Server((Server)p.next()));
+ addChild(new Node((Node)p.next()));
}
catch(DuplicateIdException e)
{
@@ -73,6 +73,19 @@ public class Nodes extends EditableParent
}
}
+ void getUpdates(java.util.LinkedList updates)
+ {
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ Node node = (Node)p.next();
+ if(node.isNew() || node.isModified())
+ {
+ updates.add(node.getUpdate());
+ }
+ }
+ }
+
void update() throws DuplicateIdException
{
java.util.Iterator p = _descriptors.entrySet().iterator();
@@ -89,6 +102,7 @@ public class Nodes extends EditableParent
}
}
purgeChildren(_descriptors.keySet());
+ fireStructureChangedEvent(this);
}
void update(java.util.List updates, String[] removeNodes)
diff --git a/java/src/IceGrid/TreeNode/Parent.java b/java/src/IceGrid/TreeNode/Parent.java
index 6abb9aebc09..6eaf05d1b33 100755
--- a/java/src/IceGrid/TreeNode/Parent.java
+++ b/java/src/IceGrid/TreeNode/Parent.java
@@ -43,8 +43,6 @@ class Parent extends CommonBaseI
public void setSelectedItem(Object obj)
{
- System.err.println("setSelectedItem");
-
_selectedItem = obj;
fireContentsChanged(this, -1, -1);
}
@@ -120,7 +118,7 @@ class Parent extends CommonBaseI
}
}
- CommonBase findChild(String id)
+ public CommonBase findChild(String id)
{
java.util.Iterator p = _children.iterator();
while(p.hasNext())
@@ -484,10 +482,10 @@ class Parent extends CommonBaseI
super(o);
if(copyChildren)
{
- _children = o._children;
+ _children = (java.util.LinkedList)o._children.clone();
}
}
- protected java.util.List _children = new java.util.LinkedList();
+ protected java.util.LinkedList _children = new java.util.LinkedList();
private ChildComparator _childComparator = new ChildComparator();
}
diff --git a/java/src/IceGrid/TreeNode/PropertiesHolder.java b/java/src/IceGrid/TreeNode/PropertiesHolder.java
index a41a656226b..0051a07d376 100755
--- a/java/src/IceGrid/TreeNode/PropertiesHolder.java
+++ b/java/src/IceGrid/TreeNode/PropertiesHolder.java
@@ -14,13 +14,11 @@ import IceGrid.PropertyDescriptor;
class PropertiesHolder
{
- PropertiesHolder(CommunicatorDescriptor descriptor,
- Editable editable)
+ PropertiesHolder(CommunicatorDescriptor descriptor)
{
assert descriptor != null;
_descriptor = descriptor;
- _editable = editable;
}
String get(String key)
@@ -37,24 +35,31 @@ class PropertiesHolder
return null;
}
- void put(String key, String value)
+ void replace(String oldKey, String newKey, String newValue)
{
- assert _editable != null;
-
+ boolean needPut = true;
+ boolean needRemove = !oldKey.equals(newKey); // don't remove when oldKey == newKey
+
java.util.Iterator p = _descriptor.properties.iterator();
- while(p.hasNext())
+ while(p.hasNext() && (needRemove || needPut))
{
PropertyDescriptor pd = (PropertyDescriptor)p.next();
- if(pd.name.equals(key))
+ if(needRemove && pd.name.equals(oldKey))
+ {
+ p.remove();
+ needRemove = false;
+ }
+ if(needPut && pd.name.equals(newKey))
{
- pd.value = value;
- return;
+ pd.value = newValue;
+ needPut = false;
}
}
- _descriptor.properties.add(new PropertyDescriptor(key, value));
- _editable.markModified();
- }
+ if(needPut)
+ {
+ _descriptor.properties.add(new PropertyDescriptor(newKey, newValue));
+ }
+ }
private CommunicatorDescriptor _descriptor;
- private Editable _editable;
}
diff --git a/java/src/IceGrid/TreeNode/ReplicatedAdapter.java b/java/src/IceGrid/TreeNode/ReplicatedAdapter.java
index da406916c74..a9142772610 100755
--- a/java/src/IceGrid/TreeNode/ReplicatedAdapter.java
+++ b/java/src/IceGrid/TreeNode/ReplicatedAdapter.java
@@ -41,5 +41,10 @@ class ReplicatedAdapter extends EditableLeaf
//
}
+ ReplicatedAdapterDescriptor getDescriptor()
+ {
+ return _descriptor;
+ }
+
private ReplicatedAdapterDescriptor _descriptor;
}
diff --git a/java/src/IceGrid/TreeNode/ReplicatedAdapters.java b/java/src/IceGrid/TreeNode/ReplicatedAdapters.java
index 4b0063e3962..827158ca53e 100755
--- a/java/src/IceGrid/TreeNode/ReplicatedAdapters.java
+++ b/java/src/IceGrid/TreeNode/ReplicatedAdapters.java
@@ -36,6 +36,7 @@ class ReplicatedAdapters extends EditableParent
throws DuplicateIdException
{
super(o);
+ _descriptors = o._descriptors;
java.util.Iterator p = o._children.iterator();
while(p.hasNext())
{
@@ -44,6 +45,20 @@ class ReplicatedAdapters extends EditableParent
}
}
+ void getUpdates(java.util.List updates)
+ {
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ ReplicatedAdapter ra = (ReplicatedAdapter)p.next();
+ if(ra.isNew() || ra.isModified())
+ {
+ updates.add(ra.getDescriptor());
+ }
+ }
+ }
+
+
void update() throws DuplicateIdException
{
java.util.Set keepSet = new java.util.HashSet();
@@ -60,6 +75,7 @@ class ReplicatedAdapters extends EditableParent
ra.rebuild(descriptor);
}
purgeChildren(keepSet);
+ fireStructureChangedEvent(this);
}
diff --git a/java/src/IceGrid/TreeNode/Root.java b/java/src/IceGrid/TreeNode/Root.java
index 1a5e8a970cd..5aad57b5880 100755
--- a/java/src/IceGrid/TreeNode/Root.java
+++ b/java/src/IceGrid/TreeNode/Root.java
@@ -18,7 +18,7 @@ import IceGrid.ServerState;
import IceGrid.TreeModelI;
-public class Root extends EditableParent
+public class Root extends Parent
{
static class DynamicInfo
{
@@ -36,7 +36,7 @@ public class Root extends EditableParent
public Root(Model model)
{
- super(false, "Applications", model, true);
+ super("Applications", model, true);
}
public void init(java.util.List descriptors)
@@ -49,7 +49,7 @@ public class Root extends EditableParent
ApplicationDescriptor descriptor = (ApplicationDescriptor)p.next();
try
{
- Application child = new Application(descriptor, _model);
+ Application child = new Application(false, descriptor, _model);
addChild(child);
child.setParent(this);
}
@@ -78,7 +78,7 @@ public class Root extends EditableParent
{
try
{
- Application child = new Application(desc, _model);
+ Application child = new Application(false, desc, _model);
child.setParent(this);
addChild(child, true);
}
@@ -217,13 +217,11 @@ public class Root extends EditableParent
void restore(Application copy)
{
- //
- // TODO: fire event or not?
- //
removeChild(copy.getId(), true);
try
{
addChild(copy, true);
+ copy.setParent(this);
}
catch(DuplicateIdException e)
{
diff --git a/java/src/IceGrid/TreeNode/Server.java b/java/src/IceGrid/TreeNode/Server.java
index 34ce428b1e6..554265b2a7a 100755
--- a/java/src/IceGrid/TreeNode/Server.java
+++ b/java/src/IceGrid/TreeNode/Server.java
@@ -415,7 +415,7 @@ class Server extends EditableParent
_instanceDescriptor = o._instanceDescriptor;
_serverDescriptor = o._serverDescriptor;
- Utils.Resolver _resolver = o._resolver;
+ _resolver = o._resolver;
_services = o._services;
_adapters = o._adapters;
@@ -437,8 +437,7 @@ class Server extends EditableParent
clearChildren();
boolean isEditable = (instanceDescriptor == null);
- _propertiesHolder = new PropertiesHolder(serverDescriptor,
- isEditable ? this : null);
+ _propertiesHolder = new PropertiesHolder(serverDescriptor);
if(serverDescriptor instanceof IceBoxDescriptor)
{
@@ -494,7 +493,7 @@ class Server extends EditableParent
_stateIconIndex = _state.value() + 1;
//
- // Change the node representation in all views
+ // Change the node representation
//
fireNodeChangedEvent(this);
}
@@ -565,10 +564,15 @@ class Server extends EditableParent
return _state;
}
- ServerInstanceDescriptor getDescriptor()
+ ServerInstanceDescriptor getInstanceDescriptor()
{
return _instanceDescriptor;
}
+
+ ServerDescriptor getDescriptor()
+ {
+ return _serverDescriptor;
+ }
public String toString()
{
diff --git a/java/src/IceGrid/TreeNode/ServerTemplate.java b/java/src/IceGrid/TreeNode/ServerTemplate.java
index 98852037241..96ea6281de1 100755
--- a/java/src/IceGrid/TreeNode/ServerTemplate.java
+++ b/java/src/IceGrid/TreeNode/ServerTemplate.java
@@ -64,14 +64,14 @@ class ServerTemplate extends EditableParent
_dbEnvs = o._dbEnvs;
_adapters = o._adapters;
- _propertiesHolder = new PropertiesHolder(_templateDescriptor.descriptor, this);
+ _propertiesHolder = o._propertiesHolder;
}
void rebuild(TemplateDescriptor descriptor, Application application)
throws DuplicateIdException
{
_templateDescriptor = descriptor;
- _propertiesHolder = new PropertiesHolder(_templateDescriptor.descriptor, this);
+ _propertiesHolder = new PropertiesHolder(_templateDescriptor.descriptor);
clearChildren();
//
@@ -86,6 +86,7 @@ class ServerTemplate extends EditableParent
_services = new Services(_iceBoxDescriptor.services, this, null,
application);
addChild(_services);
+ _services.setParent(this);
assert _templateDescriptor.descriptor.dbEnvs.size() == 0;
_dbEnvs = null;
@@ -98,11 +99,13 @@ class ServerTemplate extends EditableParent
_dbEnvs = new DbEnvs(_templateDescriptor.descriptor.dbEnvs, true,
null, _model);
addChild(_dbEnvs);
+ _dbEnvs.setParent(this);
}
_adapters = new Adapters(_templateDescriptor.descriptor.adapters, true,
null, null, _model);
addChild(_adapters);
+ _adapters.setParent(this);
}
public PropertiesHolder getPropertiesHolder()
diff --git a/java/src/IceGrid/TreeNode/ServerTemplates.java b/java/src/IceGrid/TreeNode/ServerTemplates.java
index 42e000950fe..e4d38c0f624 100755
--- a/java/src/IceGrid/TreeNode/ServerTemplates.java
+++ b/java/src/IceGrid/TreeNode/ServerTemplates.java
@@ -54,6 +54,19 @@ class ServerTemplates extends EditableParent
}
}
+ void getUpdates(java.util.Map updates)
+ {
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ ServerTemplate t = (ServerTemplate)p.next();
+ if(t.isNew() || t.isModified())
+ {
+ updates.put(t.getId(), t.getDescriptor());
+ }
+ }
+ }
+
void update() throws DuplicateIdException
{
//
@@ -78,6 +91,7 @@ class ServerTemplates extends EditableParent
}
}
purgeChildren(_descriptors.keySet());
+ fireStructureChangedEvent(this);
}
void update(java.util.Map updates, String[] removeTemplates)
diff --git a/java/src/IceGrid/TreeNode/Service.java b/java/src/IceGrid/TreeNode/Service.java
index 07e99d1f534..bc43180f1c9 100755
--- a/java/src/IceGrid/TreeNode/Service.java
+++ b/java/src/IceGrid/TreeNode/Service.java
@@ -30,7 +30,7 @@ class Service extends Parent
_displayString = displayString;
_instanceDescriptor = instanceDescriptor;
_serviceDescriptor = serviceDescriptor;
- _propertiesHolder = new PropertiesHolder(serviceDescriptor, editable);
+ _propertiesHolder = new PropertiesHolder(serviceDescriptor);
_isEditable = editable != null;
_resolver = resolver;
diff --git a/java/src/IceGrid/TreeNode/ServiceTemplate.java b/java/src/IceGrid/TreeNode/ServiceTemplate.java
index 7cee10443ca..677644d038e 100755
--- a/java/src/IceGrid/TreeNode/ServiceTemplate.java
+++ b/java/src/IceGrid/TreeNode/ServiceTemplate.java
@@ -27,7 +27,7 @@ class ServiceTemplate extends EditableParent
_templateDescriptor = o._templateDescriptor;
_adapters = o._adapters;
_dbEnvs = o._dbEnvs;
- _propertiesHolder = new PropertiesHolder(_templateDescriptor.descriptor, this);
+ _propertiesHolder = o._propertiesHolder;
}
@@ -35,7 +35,7 @@ class ServiceTemplate extends EditableParent
throws DuplicateIdException
{
_templateDescriptor = descriptor;
- _propertiesHolder = new PropertiesHolder(_templateDescriptor.descriptor, this);
+ _propertiesHolder = new PropertiesHolder(_templateDescriptor.descriptor);
clearChildren();
//
@@ -46,10 +46,12 @@ class ServiceTemplate extends EditableParent
_adapters = new Adapters(_templateDescriptor.descriptor.adapters, true,
null, null, _model);
addChild(_adapters);
+ _adapters.setParent(this);
_dbEnvs = new DbEnvs(_templateDescriptor.descriptor.dbEnvs, true,
null, _model);
addChild(_dbEnvs);
+ _dbEnvs.setParent(this);
}
public PropertiesHolder getPropertiesHolder()
@@ -62,6 +64,11 @@ class ServiceTemplate extends EditableParent
return templateLabel(_id, _templateDescriptor.parameters);
}
+ TemplateDescriptor getDescriptor()
+ {
+ return _templateDescriptor;
+ }
+
private TemplateDescriptor _templateDescriptor;
private Adapters _adapters;
private DbEnvs _dbEnvs;
diff --git a/java/src/IceGrid/TreeNode/ServiceTemplates.java b/java/src/IceGrid/TreeNode/ServiceTemplates.java
index 04e772bd081..5a41b5a1842 100755
--- a/java/src/IceGrid/TreeNode/ServiceTemplates.java
+++ b/java/src/IceGrid/TreeNode/ServiceTemplates.java
@@ -53,6 +53,19 @@ class ServiceTemplates extends EditableParent
}
}
+ void getUpdates(java.util.Map updates)
+ {
+ java.util.Iterator p = _children.iterator();
+ while(p.hasNext())
+ {
+ ServiceTemplate t = (ServiceTemplate)p.next();
+ if(t.isNew() || t.isModified())
+ {
+ updates.put(t.getId(), t.getDescriptor());
+ }
+ }
+ }
+
void update() throws DuplicateIdException
{
//
@@ -74,6 +87,7 @@ class ServiceTemplates extends EditableParent
}
}
purgeChildren(_descriptors.keySet());
+ fireStructureChangedEvent(this);
}