changeset 1603:4c152ea35b79

Make vm-gc tab query less data PR2019 Reviewed-by: omajid Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2014-December/012119.html
author Jie Kang <jkang@redhat.com>
date Mon, 08 Dec 2014 16:26:44 -0500
parents 68dfab57afda
children 673e0738ffbd
files storage/core/src/main/java/com/redhat/thermostat/storage/model/IntervalTimeData.java vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/VmGcView.java vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/internal/VmGcController.java vm-gc/client-core/src/test/java/com/redhat/thermostat/vm/gc/client/core/internal/VmGcControllerTest.java vm-gc/client-swing/src/main/java/com/redhat/thermostat/vm/gc/client/swing/internal/VmGcPanel.java
diffstat 5 files changed, 125 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/storage/core/src/main/java/com/redhat/thermostat/storage/model/IntervalTimeData.java	Mon Dec 08 14:19:36 2014 -0500
+++ b/storage/core/src/main/java/com/redhat/thermostat/storage/model/IntervalTimeData.java	Mon Dec 08 16:26:44 2014 -0500
@@ -36,6 +36,8 @@
 
 package com.redhat.thermostat.storage.model;
 
+import java.util.Objects;
+
 public class IntervalTimeData<T> {
 
     private long start;
@@ -60,5 +62,23 @@
         return data;
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        IntervalTimeData that = (IntervalTimeData) o;
+
+        if (end != that.end) return false;
+        if (start != that.start) return false;
+        if (!Objects.equals(data, that.data)) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(start, end, data);
+    }
 }
 
--- a/vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/VmGcView.java	Mon Dec 08 14:19:36 2014 -0500
+++ b/vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/VmGcView.java	Mon Dec 08 16:26:44 2014 -0500
@@ -37,15 +37,26 @@
 package com.redhat.thermostat.vm.gc.client.core;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
+import com.redhat.thermostat.client.core.experimental.Duration;
 import com.redhat.thermostat.client.core.views.BasicView;
 import com.redhat.thermostat.client.core.views.UIComponent;
+import com.redhat.thermostat.common.ActionListener;
 import com.redhat.thermostat.shared.locale.LocalizedString;
 import com.redhat.thermostat.storage.model.IntervalTimeData;
 import com.redhat.thermostat.vm.gc.common.GcCommonNameMapper.CollectorCommonName;
 
 public abstract class VmGcView extends BasicView implements UIComponent {
 
+    public enum UserAction {
+        USER_CHANGED_TIME_RANGE,
+    }
+
+    public abstract void addUserActionListener(ActionListener<UserAction> listener);
+
+    public abstract void removeUserActionListener(ActionListener<UserAction> listener);
+
     public abstract void addChart(String tag, LocalizedString title, String valueUnit);
 
     public abstract void removeChart(String tag);
@@ -55,5 +66,7 @@
     public abstract void clearData(String tag);
 
     public abstract void setCommonCollectorName(CollectorCommonName commonName);
+
+    public abstract Duration getUserDesiredDuration();
 }
 
--- a/vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/internal/VmGcController.java	Mon Dec 08 14:19:36 2014 -0500
+++ b/vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/internal/VmGcController.java	Mon Dec 08 16:26:44 2014 -0500
@@ -38,6 +38,7 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -47,6 +48,7 @@
 import java.util.concurrent.TimeUnit;
 
 import com.redhat.thermostat.client.core.controllers.InformationServiceController;
+import com.redhat.thermostat.client.core.experimental.Duration;
 import com.redhat.thermostat.client.core.views.BasicView.Action;
 import com.redhat.thermostat.client.core.views.UIComponent;
 import com.redhat.thermostat.common.ActionEvent;
@@ -88,7 +90,7 @@
 
     private final Timer timer;
 
-    private long lastSeenTimeStamp = Long.MIN_VALUE;
+    private long lastSeenTimeStamp;
 
     public VmGcController(ApplicationService appSvc, VmMemoryStatDAO vmMemoryStatDao, VmGcStatDAO vmGcStatDao, VmRef ref, VmGcViewProvider provider) {
         this.ref = ref;
@@ -114,6 +116,24 @@
             }
         });
 
+        view.addUserActionListener(new ActionListener<VmGcView.UserAction>() {
+            @Override
+            public void actionPerformed(ActionEvent<VmGcView.UserAction> actionEvent) {
+                switch (actionEvent.getActionId()) {
+                    case USER_CHANGED_TIME_RANGE:
+                        Duration userDuration = view.getUserDesiredDuration();
+                        lastSeenTimeStamp = System.currentTimeMillis() - userDuration.unit.toMillis(userDuration.value);
+                        doUpdateCollectorData();
+                        break;
+                    default:
+                        throw new AssertionError("Unhandled action type");
+                }
+            }
+        });
+
+        Duration userDuration = view.getUserDesiredDuration(); //Has default of 10 minutes
+        lastSeenTimeStamp = System.currentTimeMillis() - userDuration.unit.toMillis(userDuration.value);
+
         timer.setAction(new Runnable() {
             @Override
             public void run() {
@@ -145,7 +165,7 @@
                 collectorName, generationName);
     }
 
-    private void doUpdateCollectorData() {
+    private synchronized void doUpdateCollectorData() {
         CollectorCommonName commonName = getCommonName();
         view.setCommonCollectorName(commonName);
         
@@ -162,6 +182,7 @@
             }
             if (lastValueSeen.containsKey(collector)) {
                 if (stat.getTimeStamp() <= lastValueSeen.get(collector).getTimeStamp()) {
+                    //FIXME: algorithm does not handle this condition at the moment
                     System.out.println("new gc collector value is older than previous value");
                 }
                 VmGcStat last = lastValueSeen.get(collector);
--- a/vm-gc/client-core/src/test/java/com/redhat/thermostat/vm/gc/client/core/internal/VmGcControllerTest.java	Mon Dec 08 14:19:36 2014 -0500
+++ b/vm-gc/client-core/src/test/java/com/redhat/thermostat/vm/gc/client/core/internal/VmGcControllerTest.java	Mon Dec 08 16:26:44 2014 -0500
@@ -36,6 +36,7 @@
 
 package com.redhat.thermostat.vm.gc.client.core.internal;
 
+import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Matchers.isA;
 import static org.mockito.Matchers.isNotNull;
@@ -54,6 +55,7 @@
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 
+import com.redhat.thermostat.client.core.experimental.Duration;
 import com.redhat.thermostat.common.ActionEvent;
 import com.redhat.thermostat.common.ActionListener;
 import com.redhat.thermostat.common.ApplicationService;
@@ -106,7 +108,7 @@
 
         // Setup DAO
         VmGcStatDAO vmGcStatDAO = mock(VmGcStatDAO.class);
-        when(vmGcStatDAO.getLatestVmGcStats(isA(VmRef.class), eq(Long.MIN_VALUE))).thenReturn(stats);
+        when(vmGcStatDAO.getLatestVmGcStats(isA(VmRef.class), isA(Long.class))).thenReturn(stats);
         VmMemoryStatDAO vmMemoryStatDAO = mock(VmMemoryStatDAO.class);
         when(vmMemoryStatDAO.getLatestMemoryStat(isA(VmRef.class))).thenReturn(memoryStat);
         // the following set should map to Concurrent Collector
@@ -121,6 +123,8 @@
         ArgumentCaptor<ActionListener> viewArgumentCaptor = ArgumentCaptor.forClass(ActionListener.class);
         doNothing().when(view).addActionListener(viewArgumentCaptor.capture());
 
+        when(view.getUserDesiredDuration()).thenReturn(new Duration(1, TimeUnit.MINUTES));
+
         VmGcViewProvider viewProvider = mock(VmGcViewProvider.class);
         when(viewProvider.createView()).thenReturn(view);
 
--- a/vm-gc/client-swing/src/main/java/com/redhat/thermostat/vm/gc/client/swing/internal/VmGcPanel.java	Mon Dec 08 14:19:36 2014 -0500
+++ b/vm-gc/client-swing/src/main/java/com/redhat/thermostat/vm/gc/client/swing/internal/VmGcPanel.java	Mon Dec 08 16:26:44 2014 -0500
@@ -42,10 +42,13 @@
 import java.awt.FlowLayout;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 import javax.swing.BorderFactory;
 import javax.swing.JLabel;
@@ -65,14 +68,17 @@
 import org.jfree.data.RangeType;
 import org.jfree.data.xy.IntervalXYDataset;
 
+import com.redhat.thermostat.client.core.experimental.Duration;
 import com.redhat.thermostat.client.swing.SwingComponent;
 import com.redhat.thermostat.client.swing.components.HeaderPanel;
-import com.redhat.thermostat.client.swing.components.RecentTimeSeriesChartPanel;
 import com.redhat.thermostat.client.swing.components.SectionHeader;
+import com.redhat.thermostat.client.swing.components.experimental.RecentTimeControlPanel;
+import com.redhat.thermostat.client.swing.components.experimental.SingleValueChartPanel;
 import com.redhat.thermostat.client.swing.experimental.ComponentVisibilityNotifier;
 import com.redhat.thermostat.client.ui.RecentTimeSeriesChartController;
 import com.redhat.thermostat.client.ui.SampledDataset;
 import com.redhat.thermostat.common.ActionListener;
+import com.redhat.thermostat.common.ActionNotifier;
 import com.redhat.thermostat.shared.locale.LocalizedString;
 import com.redhat.thermostat.shared.locale.Translate;
 import com.redhat.thermostat.storage.model.IntervalTimeData;
@@ -88,6 +94,9 @@
     private static final Color WHITE = new Color(255,255,255,0);
     private static final Color BLACK = new Color(0,0,0,0);
     private static final float TRANSPARENT = 0.0f;
+
+    private static final int DEFAULT_VALUE = 10;
+    private static final TimeUnit DEFAULT_UNIT = TimeUnit.MINUTES;
     
     private HeaderPanel visiblePanel = new HeaderPanel();
     private JPanel chartPanelContainer = new JPanel();
@@ -95,8 +104,12 @@
     private JLabel gcAlgoLabelDescr;
     private JLabel commonNameLabel;
 
+    private ActionNotifier<UserAction> userActionNotifier = new ActionNotifier<>(this);
+
     private final Map<String, SampledDataset> dataset = new HashMap<>();
+    private final Map<String, List<IntervalTimeData<Double>>> addedData = new HashMap<>();
     private final Map<String, JPanel> subPanels = new HashMap<>();
+    private final Map<String, Duration> subPanelDurations = new HashMap<>();
 
     private final GridBagConstraints gcPanelConstraints;
 
@@ -115,6 +128,16 @@
     }
 
     @Override
+    public void addUserActionListener(ActionListener<UserAction> listener) {
+        userActionNotifier.addActionListener(listener);
+    }
+
+    @Override
+    public void removeUserActionListener(ActionListener<UserAction> listener) {
+        userActionNotifier.removeActionListener(listener);
+    }
+
+    @Override
     public void addActionListener(ActionListener<Action> listener) {
         notifier.addActionListener(listener);
     }
@@ -169,7 +192,7 @@
         return commonPanel;
     }
 
-    private JPanel createCollectorDetailsPanel(IntervalXYDataset collectorData, LocalizedString title, String units) {
+    private JPanel createCollectorDetailsPanel(IntervalXYDataset collectorData, LocalizedString title, String units, final String tag) {
         JPanel detailsPanel = new JPanel();
         detailsPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
         detailsPanel.setLayout(new BorderLayout());
@@ -197,8 +220,10 @@
         chart.getPlot().setBackgroundImageAlpha(TRANSPARENT);
         chart.getPlot().setOutlinePaint(BLACK);
 
-        final RecentTimeSeriesChartPanel chartPanel = new RecentTimeSeriesChartPanel(new RecentTimeSeriesChartController(chart));
-
+        Duration defaultDuration = new Duration(DEFAULT_VALUE, DEFAULT_UNIT);
+        final RecentTimeSeriesChartController chartController = new RecentTimeSeriesChartController(chart);
+        final SingleValueChartPanel chartPanel = new SingleValueChartPanel(chart, defaultDuration);
+        subPanelDurations.put(tag, defaultDuration);
         chart.addProgressListener(new ChartProgressListener() {
 
             @Override
@@ -212,6 +237,16 @@
             }
         });
 
+        chartPanel.addPropertyChangeListener(RecentTimeControlPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() {
+            @Override
+            public void propertyChange(PropertyChangeEvent evt) {
+                VmGcPanel.this.userActionNotifier.fireAction(UserAction.USER_CHANGED_TIME_RANGE);
+                Duration duration = (Duration) evt.getNewValue();
+                subPanelDurations.put(tag, duration);
+                chartController.setTime(duration.value, duration.unit);
+            }
+        });
+
         detailsPanel.add(chartPanel, BorderLayout.CENTER);
 
         return detailsPanel;
@@ -241,7 +276,8 @@
             public void run() {
                 SampledDataset newData = new SampledDataset();
                 dataset.put(tag, newData);
-                JPanel subPanel = createCollectorDetailsPanel(newData, title, units);
+                addedData.put(tag, new ArrayList<IntervalTimeData<Double>>());
+                JPanel subPanel = createCollectorDetailsPanel(newData, title, units, tag);
                 subPanels.put(tag, subPanel);
                 chartPanelContainer.add(subPanel, gcPanelConstraints);
                 gcPanelConstraints.gridy++;
@@ -256,7 +292,9 @@
             @Override
             public void run() {
                 dataset.remove(tag);
+                addedData.remove(tag);
                 JPanel subPanel = subPanels.remove(tag);
+                subPanelDurations.remove(tag);
                 chartPanelContainer.remove(subPanel);
                 gcPanelConstraints.gridy--;
                 containerPanel.revalidate();
@@ -271,8 +309,12 @@
             @Override
             public void run() {
                 SampledDataset series = dataset.get(tag);
+                List<IntervalTimeData<Double>> data = addedData.get(tag);
                 for (IntervalTimeData<Double> timeData: copy) {
-                    series.add(timeData.getStartTimeInMillis(), timeData.getEndTimeInMillis(), timeData.getData());
+                    if (!data.contains(timeData)) {
+                        data.add(timeData);
+                        series.add(timeData.getStartTimeInMillis(), timeData.getEndTimeInMillis(), timeData.getData());
+                    }
                 }
                 series.fireSeriesChanged();
             }
@@ -304,5 +346,21 @@
             });
         }
     }
+
+    @Override
+    public Duration getUserDesiredDuration() {
+        //Return the greatest duration of all controllers
+        long timestamp = 0l;
+        Duration maxDuration = new Duration(10, TimeUnit.MINUTES); //Default of 10 minutes if there are no controllers
+
+        for (Duration duration: subPanelDurations.values()) {
+            long time = duration.unit.toMillis(duration.value);
+            if (time > timestamp) {
+                timestamp = time;
+                maxDuration = duration;
+            }
+        }
+        return maxDuration;
+    }
 }