diff options
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/IceGridGUI/Coordinator.java | 21 | ||||
-rw-r--r-- | java/src/IceGridGUI/LiveDeployment/GraphView.java | 186 | ||||
-rw-r--r-- | java/src/IceGridGUI/LiveDeployment/MetricsViewEditor.java | 281 | ||||
-rw-r--r-- | java/src/IceInternal/Util.java | 38 |
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; } |