summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
Diffstat (limited to 'java/src')
-rw-r--r--java/src/IceGridGUI/Coordinator.java21
-rw-r--r--java/src/IceGridGUI/LiveDeployment/GraphView.java186
-rw-r--r--java/src/IceGridGUI/LiveDeployment/MetricsViewEditor.java281
-rw-r--r--java/src/IceInternal/Util.java38
4 files changed, 346 insertions, 180 deletions
diff --git a/java/src/IceGridGUI/Coordinator.java b/java/src/IceGridGUI/Coordinator.java
index 03f5dee759d..46051c3de0b 100644
--- a/java/src/IceGridGUI/Coordinator.java
+++ b/java/src/IceGridGUI/Coordinator.java
@@ -2037,7 +2037,7 @@ public class Coordinator
{
public void actionPerformed(ActionEvent e)
{
- _graphViews.add(new GraphView(Coordinator.this));
+ createGraphView();
}
};
_newGraph.setEnabled(false);
@@ -2439,6 +2439,20 @@ public class Coordinator
_mainFrame.getContentPane().add(_mainPane, BorderLayout.CENTER);
}
+ public GraphView createGraphView()
+ {
+ StringBuilder title = new StringBuilder();
+ title.append("Graph");
+ if(_graphViews.size() > 0)
+ {
+ title.append(" - ");
+ title.append(Integer.toString(_graphViews.size()));
+ }
+ GraphView view = new GraphView(Coordinator.this, title.toString());
+ _graphViews.add(view);
+ return view;
+ }
+
public LiveDeploymentPane getLiveDeploymentPane()
{
return _liveDeploymentPane;
@@ -2811,6 +2825,11 @@ public class Coordinator
return _connected;
}
+ public GraphView[] getGraphViews()
+ {
+ return _graphViews.toArray(new GraphView[_graphViews.size()]);
+ }
+
//
// May run in any thread
//
diff --git a/java/src/IceGridGUI/LiveDeployment/GraphView.java b/java/src/IceGridGUI/LiveDeployment/GraphView.java
index 6f11ba3628e..8d9b9567fc5 100644
--- a/java/src/IceGridGUI/LiveDeployment/GraphView.java
+++ b/java/src/IceGridGUI/LiveDeployment/GraphView.java
@@ -9,8 +9,6 @@
package IceGridGUI.LiveDeployment;
-import javafx.scene.*;
-
import java.util.Map;
import java.util.List;
import java.util.HashMap;
@@ -30,14 +28,13 @@ import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
-import java.awt.Font;
+
import java.awt.Frame;
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
-import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
@@ -49,20 +46,15 @@ import javax.swing.border.Border;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultListCellRenderer;
-import javax.swing.border.CompoundBorder;
-import javax.swing.border.EmptyBorder;
-
import javax.swing.event.TableModelEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;
-import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JColorChooser;
-import javax.swing.JCheckBoxMenuItem;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
@@ -73,9 +65,10 @@ import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTable;
+import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.JOptionPane;
-import javax.swing.KeyStroke;
+
import javax.swing.ListCellRenderer;
import javax.swing.SwingUtilities;
import javax.swing.SpinnerNumberModel;
@@ -97,24 +90,16 @@ import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
-import javafx.scene.control.cell.PropertyValueFactory;
-import javafx.scene.control.cell.TextFieldTableCell;
-import javafx.scene.control.Label;
-import javafx.scene.control.ScrollPane;
-import javafx.scene.control.ScrollPane.ScrollBarPolicy;
-import javafx.scene.shape.Line;
-
-import javafx.scene.layout.VBox;
-import javafx.scene.layout.HBox;
-import javafx.scene.layout.Priority;
-import javafx.scene.layout.FlowPane;
-
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.event.EventHandler;
import javafx.scene.input.MouseButton;
-import javafx.scene.control.Tooltip;
+
+import javafx.scene.input.DragEvent;
+import javafx.scene.input.TransferMode;
+import javafx.scene.input.DataFormat;
+import javafx.scene.input.Dragboard;
import javafx.util.StringConverter;
@@ -317,13 +302,13 @@ public class GraphView extends JFrame
private class RefreshThread extends Thread
{
- RefreshThread(long period)
+ RefreshThread(int period)
{
_period = period;
_done = false;
}
- synchronized void setRefreshPeriod(long period)
+ synchronized void setRefreshPeriod(int period)
{
_period = period;
}
@@ -416,17 +401,19 @@ public class GraphView extends JFrame
}, false);
}
- private long _period;
+ private int _period;
private boolean _done = false;
}
- public GraphView(Coordinator coordinator)
+ public GraphView(Coordinator coordinator, String title)
{
_coordinator = coordinator;
_queue = new WorkQueue();
_queue.setDaemon(true);
_queue.start();
+ setTitle(title);
+
_preferences = Preferences.userNodeForPackage(getClass());
//
@@ -451,6 +438,18 @@ public class GraphView extends JFrame
public void actionPerformed(ActionEvent event)
{
//
+ // Set the title
+ //
+ JTextField title = new JTextField(getTitle());
+ JPanel titlePanel;
+ {
+ DefaultFormBuilder builder =
+ new DefaultFormBuilder(new FormLayout("pref,2dlu,pref:grow", "pref"));
+ builder.append("Title:", title);
+ titlePanel = builder.getPanel();
+ }
+
+ //
// SpinnerNumberModel to set a refresh period.
//
// min value is 500 ms == 0.5 seconds
@@ -469,10 +468,10 @@ public class GraphView extends JFrame
// SpinnerNumberModel to set the number of symbols to keep in X axis.
//
// min value is 10
- // max value is 100
+ // max value is 1000
//
SpinnerNumberModel horizontalAxisSymbolCount =
- new SpinnerNumberModel(_horizontaSymbolsCount, 5, 100, 1);
+ new SpinnerNumberModel(_horizontaSymbolsCount, 5, 1000, 1);
//
// JComboBox to select time format used in X Axis
@@ -492,10 +491,10 @@ public class GraphView extends JFrame
FormLayout layout = new FormLayout("fill:pref:grow", "pref");
final DefaultFormBuilder builder = new DefaultFormBuilder(layout);
builder.border(Borders.DIALOG);
- builder.appendSeparator("Refresh Thread");
+ builder.append(titlePanel);
+ builder.nextLine();
builder.append(refreshPanel);
builder.nextLine();
- builder.appendSeparator("Horizontal Axis");
builder.append(xAxisPanel);
if(JOptionPane.showConfirmDialog(GraphView.this, builder.getPanel(), "Graph Preferences",
@@ -504,7 +503,8 @@ public class GraphView extends JFrame
return;
}
- setRefreshPeriod(refreshPeriod.getNumber().longValue());
+ setTitle(title.getText());
+ setRefreshPeriod(refreshPeriod.getNumber().intValue());
setHorizontalSymbolsCount(horizontalAxisSymbolCount.getNumber().intValue());
setDateFormat((String)dateFormats.getSelectedItem());
}
@@ -642,21 +642,23 @@ public class GraphView extends JFrame
_legendTable.setDefaultRenderer(Color.class, new ColorRenderer(true));
_legendTable.setDefaultEditor(Color.class, new ColorEditor());
- setTransferHandler(new TransferHandler());
+
_legendTable.setAutoCreateRowSorter(true);
final JFXPanel fxPanel = new JFXPanel();
-
+ fxPanel.setMinimumSize(new Dimension(0, 200));
//
// Build the split pane, with the chart graph and the legend table.
//
- JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
- splitPane.setTopComponent(fxPanel);
- splitPane.setBottomComponent(new JScrollPane(_legendTable));
- splitPane.setResizeWeight(0.9);
+ _splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
+ _splitPane.setTopComponent(fxPanel);
+ JScrollPane scrollPane = new JScrollPane(_legendTable);
+ scrollPane.setTransferHandler(new TransferHandler());
+ scrollPane.setMinimumSize(new Dimension(0, 50));
+ _splitPane.setBottomComponent(scrollPane);
DefaultFormBuilder builder = new DefaultFormBuilder(new FormLayout("fill:pref:grow", "fill:pref:grow, pref"));
- builder.append(splitPane);
+ builder.append(_splitPane);
builder.nextLine();
JPanel panel = builder.getPanel();
@@ -677,14 +679,53 @@ public class GraphView extends JFrame
_yAxis = new NumberAxis();
_chart = new LineChart<Number, Number>(_xAxis, _yAxis);
-
+ _chart.setCreateSymbols(false);
_xAxis.setLabel("Time (" + getDateFormat() + ")");
_xAxis.setTickLabelFormatter(_timeFormater);
_xAxis.setForceZeroInRange(false);
_chart.setAnimated(true);
_chart.setLegendVisible(false);
- fxPanel.setScene(new Scene(_chart));
+ final Scene scene = new Scene(_chart);
+ scene.setOnDragOver(
+ new EventHandler<DragEvent>()
+ {
+ public void handle(DragEvent event)
+ {
+ Dragboard db = event.getDragboard();
+ if(event.getGestureSource() != scene && db.hasContent(LocalObjectMimeType))
+ {
+ Object object = db.getContent(LocalObjectMimeType);
+ if(object instanceof MetricsViewTransferableData)
+ {
+ event.acceptTransferModes(TransferMode.COPY);
+ }
+ }
+ event.consume();
+ }
+ });
+
+ scene.setOnDragDropped(
+ new EventHandler<DragEvent>()
+ {
+ public void handle(DragEvent event)
+ {
+ boolean success = false;
+ Dragboard db = event.getDragboard();
+ if(event.getGestureSource() != scene && db.hasContent(LocalObjectMimeType))
+ {
+ Object object = db.getContent(LocalObjectMimeType);
+ if(object instanceof MetricsViewTransferableData)
+ {
+ addSeries((MetricsViewTransferableData)object);
+ success = true;
+ }
+ }
+ event.setDropCompleted(success);
+ event.consume();
+ }
+ });
+ fxPanel.setScene(scene);
}
}, true);
@@ -701,18 +742,17 @@ public class GraphView extends JFrame
{
setLocationRelativeTo(_coordinator.getMainFrame());
}
+ _splitPane.setDividerLocation(600);
}
setVisible(true);
- splitPane.setDividerLocation(0.8);
-
//
// Show info dialog if required.
//
if(showInfo())
{
JCheckBox checkbox = new JCheckBox("Do not show this message again.");
- String message = "Drop metrics cells on the table to add them to the graph.";
+ String message = "Drop metrics cells to add them to the graph.";
JOptionPane.showConfirmDialog(this, new Object[]{message, checkbox}, "Information",
JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE);
@@ -743,11 +783,23 @@ public class GraphView extends JFrame
{
Preferences preferences = _preferences.node("GraphView");
Rectangle rect = getBounds();
+
+ for(int i = _columnNames.length -1; i >= 0; --i)
+ {
+ preferences.putInt("colPos" + Integer.toString(i), _legendTable.convertColumnIndexToModel(i));
+ preferences.putInt("colWidth" + Integer.toString(i), _legendTable.getColumnModel().getColumn(i).getWidth());
+ }
+
preferences.putInt("x", rect.x);
preferences.putInt("y", rect.y);
preferences.putInt("width", rect.width);
preferences.putInt("height", rect.height);
preferences.putBoolean("maximized", getExtendedState() == Frame.MAXIMIZED_BOTH);
+ preferences.putInt("splitLocation", _splitPane.getDividerLocation());
+
+ preferences.putInt("refreshPeriod", getRefreshPeriod());
+ preferences.putInt("horizontalSymbolsCount", getHorizontalSymbolsCount());
+ preferences.put("dateFormat", getDateFormat());
}
public boolean loadPreferences()
@@ -765,6 +817,7 @@ public class GraphView extends JFrame
}
Preferences preferences = _preferences.node("GraphView");
+
int x = preferences.getInt("x", 0);
int y = preferences.getInt("y", 0);
int width = preferences.getInt("width", 0);
@@ -774,6 +827,23 @@ public class GraphView extends JFrame
{
setExtendedState(Frame.MAXIMIZED_BOTH);
}
+ _splitPane.setDividerLocation(_preferences.node("GraphView").getInt("splitLocation", 600));
+ for(int i = _columnNames.length -1; i >= 0; --i)
+ {
+ int pos = _legendTable.convertColumnIndexToView(preferences.getInt("columnPos" + Integer.toString(i), i));
+ if(i != pos)
+ {
+ _legendTable.getColumnModel().moveColumn(pos, i);
+ }
+ int columnWidth = preferences.getInt("colWidth" + Integer.toString(i), -1);
+ if(columnWidth != -1)
+ {
+ _legendTable.getColumnModel().getColumn(i).setPreferredWidth(columnWidth);
+ }
+ }
+ setRefreshPeriod(preferences.getInt("refreshPeriod", getRefreshPeriod()));
+ setHorizontalSymbolsCount(preferences.getInt("horizontalSymbolsCount", getHorizontalSymbolsCount()));
+ setDateFormat(preferences.get("dateFormat", getDateFormat()));
return true;
}
@@ -786,7 +856,7 @@ public class GraphView extends JFrame
dispose();
}
- private void addSeries(final MetricsViewTransferableData data)
+ public void addSeries(final MetricsViewTransferableData data)
{
//
// Must run in JavaFX thread.
@@ -938,20 +1008,6 @@ public class GraphView extends JFrame
{
row.series.getData().remove(0);
}
-
- //
- // Set the style so that new created nodes has the right style.
- //
- final String cssClass = getSeriesClass(row.series);
- setNodesStyle(cssClass);
-
- //
- // If the series isn't visible ensure that new created nodes are hidden.
- //
- if(!row.visible)
- {
- setNodesVisible(cssClass, false);
- }
}
catch(java.lang.RuntimeException ex)
{
@@ -969,7 +1025,8 @@ public class GraphView extends JFrame
{
_legendModel.fireTableChanged(
new TableModelEvent(_legendModel, 0, _legendModel.getRowCount() - 1,
- TableModelEvent.ALL_COLUMNS, TableModelEvent.UPDATE));
+ TableModelEvent.ALL_COLUMNS,
+ TableModelEvent.UPDATE));
}
}, false);
}
@@ -995,12 +1052,12 @@ public class GraphView extends JFrame
}
}
- synchronized long getRefreshPeriod()
+ synchronized int getRefreshPeriod()
{
return _refreshPeriod;
}
- synchronized void setRefreshPeriod(long refreshPeriod)
+ synchronized void setRefreshPeriod(int refreshPeriod)
{
_refreshPeriod = refreshPeriod;
if(_refreshThread != null)
@@ -1554,7 +1611,7 @@ public class GraphView extends JFrame
private RefreshThread _refreshThread;
private int _horizontaSymbolsCount = 10;
- private long _refreshPeriod = 5000;
+ private int _refreshPeriod = 5000;
private String[] _dateFormats = new String[]{"HH:mm:ss", "mm:ss"};
private String _dateFormat = _dateFormats[0];
@@ -1597,6 +1654,7 @@ public class GraphView extends JFrame
private final JTable _legendTable;
private final LegendTableModel _legendModel = new LegendTableModel();
+ private JSplitPane _splitPane;
private final Map<String, String> _styles = new HashMap<String, String>();
@@ -1621,5 +1679,7 @@ public class GraphView extends JFrame
1000000000.0d};
private final WorkQueue _queue;
private final Preferences _preferences;
+
+ private final static DataFormat LocalObjectMimeType = new DataFormat("application/x-java-jvm-local-objectref");
}
diff --git a/java/src/IceGridGUI/LiveDeployment/MetricsViewEditor.java b/java/src/IceGridGUI/LiveDeployment/MetricsViewEditor.java
index c9283b178fc..4c039aeb77c 100644
--- a/java/src/IceGridGUI/LiveDeployment/MetricsViewEditor.java
+++ b/java/src/IceGridGUI/LiveDeployment/MetricsViewEditor.java
@@ -10,7 +10,6 @@
package IceGridGUI.LiveDeployment;
import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
@@ -28,7 +27,6 @@ import java.awt.event.WindowEvent;
import java.util.List;
import java.util.ArrayList;
-
import java.util.Map;
import java.util.HashMap;
@@ -51,12 +49,13 @@ import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.SwingConstants;
import javax.swing.JScrollPane;
-import javax.swing.JTextArea;
-import javax.swing.JTextField;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.JTree;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
import javax.swing.table.TableColumnModel;
import javax.swing.table.DefaultTableCellRenderer;
@@ -226,20 +225,7 @@ public class MetricsViewEditor extends Editor
{
public void valueChanged(TreeSelectionEvent e)
{
- TreePath path = null;
- if(e.isAddedPath())
- {
- path = e.getPath();
- }
-
- if(path != null && path.getLastPathComponent() instanceof MetricsView)
- {
- startRefreshThread();
- }
- else
- {
- stopRefreshThread();
- }
+ stopRefreshThread();
}
}
@@ -250,7 +236,7 @@ public class MetricsViewEditor extends Editor
if(_properties == null)
{
_properties = Ice.Util.createProperties();
- _properties.load("resources/metrics.config");
+ _properties.load("metrics.config");
_sectionSort = _properties.getPropertyAsList("IceGridGUI.Metrics");
for(String name : _sectionSort)
{
@@ -515,13 +501,51 @@ public class MetricsViewEditor extends Editor
private static DataFlavor _flavor;
}
- class TransferHandler extends javax.swing.TransferHandler
+ public Map<String, List<MetricsCell>> getSelectedRows(JTable table, boolean numeric)
{
- public TransferHandler()
+ int[] selectedRows = table.getSelectedRows();
+ int[] selectedColumns = table.getSelectedColumns();
+ Map<String, List<MetricsCell>> rows = new HashMap<String, List<MetricsCell>>();
+
+ if(selectedRows.length > 0 && selectedColumns.length > 0)
{
- _info = new MetricsViewInfo(_node);
+ TableModel model = (TableModel)table.getModel();
+
+ int idColumn = table.getColumnModel().getColumnIndex(_properties.getProperty(
+ "IceGridGUI.Metrics." + model.getMetricsName() + ".id.columnName"));
+
+ for(int row : selectedRows)
+ {
+ List<MetricsCell> cells = new ArrayList<MetricsCell>();
+ String id = model.getValueAt(table.convertRowIndexToModel(row), idColumn).toString();
+ for(int col : selectedColumns)
+ {
+ MetricsField field = model.getMetricFields().get(table.convertColumnIndexToModel(col));
+ Class columnClass = field.getColumnClass();
+
+ if(!numeric)
+ {
+ cells.add(new MetricsCell(id, field.createField()));
+ }
+ else if(columnClass.equals(int.class) || columnClass.equals(Integer.class) ||
+ columnClass.equals(long.class) || columnClass.equals(Long.class) ||
+ columnClass.equals(float.class) || columnClass.equals(Float.class) ||
+ columnClass.equals(double.class) || columnClass.equals(Double.class))
+ {
+ cells.add(new MetricsCell(id, field.createField()));
+ }
+ }
+ if(cells.size() > 0)
+ {
+ rows.put(id, cells);
+ }
+ }
}
+ return rows;
+ }
+ class TransferHandler extends javax.swing.TransferHandler
+ {
@Override
public int
getSourceActions(JComponent component)
@@ -534,52 +558,13 @@ public class MetricsViewEditor extends Editor
createTransferable(JComponent component)
{
JTable table = (JTable)component;
- int[] selectedRows = table.getSelectedRows();
- int[] selectedColumns = table.getSelectedColumns();
- if(selectedRows.length > 0 && selectedColumns.length > 0)
+ TableModel model = (TableModel)table.getModel();
+ Map<String, List<MetricsCell>> rows = getSelectedRows(table, true);
+
+ if(rows.size() > 0)
{
- TableModel model = (TableModel)table.getModel();
-
- //
- // Find the identity column.
- //
- int idColumn = 0;
- for(Map.Entry<Integer, MetricsField> fieldEntry : model.getMetricFields().entrySet())
- {
- if(fieldEntry.getValue().getFieldName().equals("id"))
- {
- idColumn = fieldEntry.getKey().intValue();
- break;
- }
- }
-
- Map<String, List<MetricsCell>> rows = new HashMap<String, List<MetricsCell>>();
- for(int row : selectedRows)
- {
- List<MetricsCell> cells = new ArrayList<MetricsCell>();
- String id = model.getValueAt(table.convertRowIndexToModel(row), idColumn).toString();
- for(int col : selectedColumns)
- {
- MetricsField field = model.getMetricFields().get(table.convertColumnIndexToModel(col));
- Class columnClass = field.getColumnClass();
-
- //
- // Just transfer fields with numeric classes.
- //
- if(columnClass.equals(int.class) || columnClass.equals(Integer.class) ||
- columnClass.equals(long.class) || columnClass.equals(Long.class) ||
- columnClass.equals(float.class) || columnClass.equals(Float.class) ||
- columnClass.equals(double.class) || columnClass.equals(Double.class))
- {
- cells.add(new MetricsCell(id, field.createField()));
- }
- }
- if(cells.size() > 0)
- {
- rows.put(id, cells);
- }
- }
- return new Transferable(new MetricsViewTransferableData(_info, model.getMetricsName(), rows));
+ return new Transferable(new MetricsViewTransferableData(
+ new MetricsViewInfo(_node), model.getMetricsName(), rows));
}
else
{
@@ -591,18 +576,17 @@ public class MetricsViewEditor extends Editor
{
// Does nothing as we don't support move action.
}
-
- private MetricsViewInfo _info;
}
public void show(MetricsView node)
{
+ startRefreshThread();
_node = node;
final Map<java.lang.String, IceMX.Metrics[]> data = node.data();
boolean rebuildPanel = false;
- for(Map.Entry<String, IceMX.Metrics[]> entry : data.entrySet())
+ for(final Map.Entry<String, IceMX.Metrics[]> entry : data.entrySet())
{
if(_tables.get(entry.getKey()) != null)
{
@@ -639,7 +623,7 @@ public class MetricsViewEditor extends Editor
continue;
}
- JTable table = new JTable(model);
+ final JTable table = new JTable(model);
table.setDragEnabled(true);
table.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
@@ -647,6 +631,59 @@ public class MetricsViewEditor extends Editor
table.addMouseListener(new ButtonMouseListener(table));
table.setAutoCreateRowSorter(true);
table.setTransferHandler(new TransferHandler());
+ table.addMouseListener(new MouseAdapter()
+ {
+ @Override
+ public void mousePressed(MouseEvent e)
+ {
+ createAndShowMenu(e);
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent e)
+ {
+ createAndShowMenu(e);
+ }
+
+ public void createAndShowMenu(MouseEvent e)
+ {
+ if(e.isPopupTrigger())
+ {
+ JPopupMenu popup = new JPopupMenu();
+ JMenu addToGraph = new JMenu("Add to graph");
+ popup.add(addToGraph);
+ final Map<String, List<MetricsCell>> rows = getSelectedRows(table, true);
+ addToGraph.setEnabled(rows.size() > 0);
+ JMenuItem newGraph = new JMenuItem("New Graph");
+ newGraph.addActionListener(new ActionListener()
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ GraphView view = _node.getCoordinator().createGraphView();
+ view.addSeries(new MetricsViewTransferableData(new MetricsViewInfo(_node),
+ entry.getKey(), rows));
+ }
+ });
+ addToGraph.add(newGraph);
+
+ GraphView[] graphs = _node.getCoordinator().getGraphViews();
+ for(final GraphView view : graphs)
+ {
+ JMenuItem item = new JMenuItem(view.getTitle());
+ addToGraph.add(item);
+ item.addActionListener(new ActionListener()
+ {
+ public void actionPerformed(ActionEvent e)
+ {
+ view.addSeries(new MetricsViewTransferableData(new MetricsViewInfo(_node),
+ entry.getKey(), rows));
+ }
+ });
+ }
+ popup.show(e.getComponent(), e.getX(), e.getY());
+ }
+ }
+ });
for(Map.Entry<Integer, MetricsField> fieldEntry : model.getMetricFields().entrySet())
{
@@ -680,22 +717,46 @@ public class MetricsViewEditor extends Editor
}
TableModel model = (TableModel)table.getModel();
+ Map<String, List<MetricsCell>> rows = getSelectedRows(table, false);
+
model.getDataVector().removeAllElements();
model.fireTableDataChanged();
-
for(IceMX.Metrics m : values)
{
model.addMetrics(m);
}
+
+ int idColumn = table.getColumnModel().getColumnIndex(_properties.getProperty(
+ "IceGridGUI.Metrics." + key + ".id.columnName"));
+ if(rows.size() > 0)
+ {
+ for(int i = table.getRowCount() - 1; i >= 0; --i)
+ {
+ String id = (String)table.getValueAt(i, idColumn);
+ List<MetricsCell> columns = rows.get(id);
+ if(columns != null)
+ {
+ for(MetricsCell cell : columns)
+ {
+ int j = table.getColumnModel().getColumnIndex(cell.getField().getColumnName());
+
+ table.getSelectionModel().addSelectionInterval(i, i);
+ table.getColumnModel().getSelectionModel().addSelectionInterval(j, j);
+ }
+ }
+ }
+ }
}
}
- private static MetricsField createField(MetricsView node, String prefix, String mapName, String name,
+ private static MetricsField createField(MetricsView node, String prefix,
+ String mapName, String name,
Field objectField)
{
String className = _properties.getPropertyWithDefault(
prefix + ".fieldClass",
"IceGridGUI.LiveDeployment.MetricsViewEditor$DeclaredMetricsField");
+
Class<?> cls = IceInternal.Util.findClass(className, null);
if(cls == null)
{
@@ -704,8 +765,8 @@ public class MetricsViewEditor extends Editor
}
try
{
- java.lang.reflect.Constructor<?> ctor = cls.getConstructor(MetricsView.class, String.class, String.class,
- String.class, Field.class);
+ java.lang.reflect.Constructor<?> ctor = cls.getDeclaredConstructor(MetricsView.class, String.class,
+ String.class, String.class, Field.class);
MetricsField field = (MetricsField)ctor.newInstance(node, prefix, mapName, name, objectField);
Map<String, String> properties = _properties.getPropertiesForPrefix(prefix);
for(Map.Entry<String, String> propEntry : properties.entrySet())
@@ -1072,7 +1133,8 @@ public class MetricsViewEditor extends Editor
static public class AverageLifetimeMetricsField extends AbstractField
{
- public AverageLifetimeMetricsField(MetricsView node, String prefix, String metricsName, String fieldName, Field field)
+ public AverageLifetimeMetricsField(MetricsView node, String prefix, String metricsName, String fieldName,
+ Field field)
{
super(node, prefix, metricsName, fieldName, field);
setFormat("#0.000"); // Set the default format
@@ -1093,9 +1155,9 @@ public class MetricsViewEditor extends Editor
return _cellRenderer;
}
- public void setDivisor(String divisor) throws java.lang.NumberFormatException
+ public void setScaleFactor(String scaleFactor) throws java.lang.NumberFormatException
{
- _divisor = Float.parseFloat(divisor);
+ _scaleFactor = Float.parseFloat(scaleFactor);
}
public Object getValue(IceMX.Metrics m)
@@ -1106,24 +1168,25 @@ public class MetricsViewEditor extends Editor
}
else
{
- return (float)(m.totalLifetime / _divisor / (m.total - m.current));
+ return (float)((m.totalLifetime / _scaleFactor) / (m.total - m.current));
}
}
- private float _divisor;
+ private float _scaleFactor = 1.0f;
private String _columnName;
private TableCellRenderer _cellRenderer;
}
- static public class BandwidthDelta
+ static public class DeltaMeasurement
{
- public long bytes;
+ public double value;
public long timestamp;
}
- static public class BandwidthMetricsField extends AbstractField
+ static public class DeltaAverageMetricsField extends AbstractField
{
- public BandwidthMetricsField(MetricsView node, String prefix, String metricsName, String fieldName, Field field)
+ public DeltaAverageMetricsField(MetricsView node, String prefix, String metricsName, String fieldName,
+ Field field)
{
super(node, prefix, metricsName, fieldName, field);
setFormat("#0.000"); // Set the default format
@@ -1136,7 +1199,7 @@ public class MetricsViewEditor extends Editor
public Class getColumnClass()
{
- return Float.class;
+ return Double.class;
}
public TableCellRenderer getCellRenderer()
@@ -1144,25 +1207,48 @@ public class MetricsViewEditor extends Editor
return _cellRenderer;
}
- public void setBytesField(String bytesField)
+ public void setDataField(String dataField)
{
- _bytesField = bytesField;
+ _dataField = dataField;
+ }
+
+ public void setScaleFactor(String scaleFactor) throws java.lang.NumberFormatException
+ {
+ _scaleFactor = Float.parseFloat(scaleFactor);
}
public Object getValue(IceMX.Metrics m)
{
- BandwidthDelta d1 = _deltas.get(m.id);
- BandwidthDelta d2 = new BandwidthDelta();
+ DeltaMeasurement d1 = _deltas.get(m.id);
+ DeltaMeasurement d2 = new DeltaMeasurement();
try
{
- d2.bytes = (Long)m.getClass().getField(_bytesField).get(m);
+ Object v = m.getClass().getField(_dataField).get(m);
+ if(v instanceof Integer)
+ {
+ d2.value = (Integer)v;
+ }
+ else if(v instanceof Long)
+ {
+ d2.value = (Long)v;
+ }
+ else if(v instanceof Float)
+ {
+ d2.value = (Float)v;
+ }
+ else if(v instanceof Double)
+ {
+ d2.value = (Double)v;
+ }
}
catch(NoSuchFieldException ex)
{
+ ex.printStackTrace();
return null;
}
catch(IllegalAccessException ex)
{
+ ex.printStackTrace();
return null;
}
d2.timestamp = System.currentTimeMillis();
@@ -1178,18 +1264,19 @@ public class MetricsViewEditor extends Editor
//
return null;
}
- else if(d2.bytes - d1.bytes == 0 || d2.timestamp - d1.timestamp == 0)
+ else if(d2.value - d1.value == 0 || d2.timestamp - d1.timestamp == 0)
{
return 0.0f;
}
else
{
- return (float)((d2.bytes - d1.bytes) / (float)(d2.timestamp - d1.timestamp) * 1000.0f);
+ return (float)((d2.value - d1.value) / (float)((d2.timestamp - d1.timestamp) / _scaleFactor));
}
}
- private String _bytesField;
- private final Map<String, BandwidthDelta> _deltas = new HashMap<String, BandwidthDelta>();
+ private float _scaleFactor = 1.0f;
+ private String _dataField;
+ private final Map<String, DeltaMeasurement> _deltas = new HashMap<String, DeltaMeasurement>();
private TableCellRenderer _cellRenderer;
}
@@ -1212,7 +1299,7 @@ public class MetricsViewEditor extends Editor
public Object getValue(final IceMX.Metrics m)
{
- JButton button = new JButton("Show Failures (" + Integer.toString(m.failures) + ")");
+ JButton button = new JButton("Show Failures " + Integer.toString(m.failures));
if(m.failures > 0)
{
button.addActionListener(new ActionListener()
@@ -1348,7 +1435,7 @@ public class MetricsViewEditor extends Editor
try
{
final IceMX.Metrics[] objects = (IceMX.Metrics[])m.getClass().getField(getFieldName()).get(m);
- JButton button = new JButton("Show " + getColumnName() + " (" + Integer.toString(objects.length) + ")");
+ JButton button = new JButton("Show " + getColumnName() + " " + Integer.toString(objects.length));
button.setEnabled(objects.length > 0);
if(objects.length > 0)
{
@@ -1369,7 +1456,7 @@ public class MetricsViewEditor extends Editor
catch(NoSuchFieldException ex)
{
}
- MetricsField field = MetricsViewEditor.createField(getMetricsNode(),
+ MetricsField field = MetricsViewEditor.createField(getMetricsNode(),
prefix + "." + name,
getFieldName(), name,
objectField);
diff --git a/java/src/IceInternal/Util.java b/java/src/IceInternal/Util.java
index f4c383e6388..d63ed0ea43e 100644
--- a/java/src/IceInternal/Util.java
+++ b/java/src/IceInternal/Util.java
@@ -96,24 +96,6 @@ public final class Util
}
//
- // Try using the system class loader (which knows about CLASSPATH).
- //
- if(c == null)
- {
- try
- {
- cl = ClassLoader.getSystemClassLoader();
- if(cl != null)
- {
- c = loadClass(className, cl);
- }
- }
- catch(SecurityException ex)
- {
- }
- }
-
- //
// Try using the current thread's class loader.
//
if(c == null)
@@ -132,7 +114,7 @@ public final class Util
}
//
- // Fall back to Class.forName().
+ // Try using Class.forName().
//
try
{
@@ -146,6 +128,24 @@ public final class Util
// Ignore
}
+ //
+ // Fall back to the system class loader (which knows about CLASSPATH).
+ //
+ if(c == null)
+ {
+ try
+ {
+ cl = ClassLoader.getSystemClassLoader();
+ if(cl != null)
+ {
+ c = loadClass(className, cl);
+ }
+ }
+ catch(SecurityException ex)
+ {
+ }
+ }
+
return c;
}