Mercurial > hg > release > thermostat-0.5
changeset 801:18a8839b9638
Move Host Memory to its bundle
Similar to the Host Overview and CPU commites, this commit moves the Host
Memory controller/view into its own core and swing bundles. The swing
bundle dynamically registers its controller via a
HostInformationService. The HostInformationController now adds subviews
entirely dynamically now.
Reviewed-by: jerboaa
Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2012-November/004256.html
line wrap: on
line diff
--- a/client/core/src/main/java/com/redhat/thermostat/client/core/views/HostMemoryView.java Tue Nov 27 14:47:49 2012 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* - * Copyright 2012 Red Hat, Inc. - * - * This file is part of Thermostat. - * - * Thermostat is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation; either version 2, or (at your - * option) any later version. - * - * Thermostat is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Thermostat; see the file COPYING. If not see - * <http://www.gnu.org/licenses/>. - * - * Linking this code with other modules is making a combined work - * based on this code. Thus, the terms and conditions of the GNU - * General Public License cover the whole combination. - * - * As a special exception, the copyright holders of this code give - * you permission to link this code with independent modules to - * produce an executable, regardless of the license terms of these - * independent modules, and to copy and distribute the resulting - * executable under terms of your choice, provided that you also - * meet, for each linked independent module, the terms and conditions - * of the license of that module. An independent module is a module - * which is not derived from or based on this code. If you modify - * this code, you may extend this exception to your version of the - * library, but you are not obligated to do so. If you do not wish - * to do so, delete this exception statement from your version. - */ - -package com.redhat.thermostat.client.core.views; - -import java.util.List; - -import com.redhat.thermostat.storage.model.DiscreteTimeData; - -public abstract class HostMemoryView extends BasicView implements UIComponent { - - public interface GraphVisibilityChangeListener { - public void show(String tag); - - public void hide(String tag); - } - - public abstract void setTotalMemory(String totalMemory); - - public abstract void addMemoryChart(String tag, String humanReadableName); - - public abstract void removeMemoryChart(String tag); - - public abstract void showMemoryChart(String tag); - - public abstract void hideMemoryChart(String tag); - - public abstract void addMemoryData(String tag, List<DiscreteTimeData<? extends Number>> data); - - public abstract void clearMemoryData(String tag); - - public abstract void addGraphVisibilityListener(GraphVisibilityChangeListener listener); - - public abstract void removeGraphVisibilityListener(GraphVisibilityChangeListener listener); - -}
--- a/client/core/src/main/java/com/redhat/thermostat/client/core/views/HostMemoryViewProvider.java Tue Nov 27 14:47:49 2012 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -/* - * Copyright 2012 Red Hat, Inc. - * - * This file is part of Thermostat. - * - * Thermostat is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation; either version 2, or (at your - * option) any later version. - * - * Thermostat is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Thermostat; see the file COPYING. If not see - * <http://www.gnu.org/licenses/>. - * - * Linking this code with other modules is making a combined work - * based on this code. Thus, the terms and conditions of the GNU - * General Public License cover the whole combination. - * - * As a special exception, the copyright holders of this code give - * you permission to link this code with independent modules to - * produce an executable, regardless of the license terms of these - * independent modules, and to copy and distribute the resulting - * executable under terms of your choice, provided that you also - * meet, for each linked independent module, the terms and conditions - * of the license of that module. An independent module is a module - * which is not derived from or based on this code. If you modify - * this code, you may extend this exception to your version of the - * library, but you are not obligated to do so. If you do not wish - * to do so, delete this exception statement from your version. - */ - -package com.redhat.thermostat.client.core.views; - -public interface HostMemoryViewProvider extends ViewProvider { - - @Override - public HostMemoryView createView(); - -}
--- a/client/core/src/main/java/com/redhat/thermostat/client/locale/LocaleResources.java Tue Nov 27 14:47:49 2012 -0500 +++ b/client/core/src/main/java/com/redhat/thermostat/client/locale/LocaleResources.java Tue Nov 27 14:49:03 2012 -0500 @@ -108,20 +108,8 @@ HOME_PANEL_SECTION_ISSUES, HOME_PANEL_NO_ISSUES, - HOST_INFO_TAB_MEMORY, HOST_INFO_TAB_IO, - HOST_MEMORY_SECTION_OVERVIEW, - HOST_MEMORY_CHART_TITLE, - HOST_MEMORY_CHART_TIME_LABEL, - HOST_MEMORY_CHART_SIZE_LABEL, - HOST_MEMORY_TOTAL, - HOST_MEMORY_FREE, - HOST_MEMORY_USED, - HOST_SWAP_TOTAL, - HOST_SWAP_FREE, - HOST_BUFFERS, - VM_INFO_TAB_OVERVIEW, VM_INFO_TAB_CPU, VM_INFO_TAB_GC,
--- a/client/core/src/main/java/com/redhat/thermostat/client/ui/HostInformationController.java Tue Nov 27 14:47:49 2012 -0500 +++ b/client/core/src/main/java/com/redhat/thermostat/client/ui/HostInformationController.java Tue Nov 27 14:49:03 2012 -0500 @@ -43,31 +43,15 @@ import com.redhat.thermostat.client.core.views.BasicView; import com.redhat.thermostat.client.core.views.HostInformationView; import com.redhat.thermostat.client.core.views.HostInformationViewProvider; -import com.redhat.thermostat.client.core.views.HostMemoryViewProvider; -import com.redhat.thermostat.client.locale.LocaleResources; -import com.redhat.thermostat.common.dao.HostInfoDAO; import com.redhat.thermostat.common.dao.HostRef; -import com.redhat.thermostat.common.dao.MemoryStatDAO; -import com.redhat.thermostat.common.locale.Translate; -import com.redhat.thermostat.common.utils.OSGIUtils; public class HostInformationController { - private static final Translate<LocaleResources> translator = LocaleResources.createLocalizer(); - - private final HostMemoryController memoryController; - private final HostInformationView view; - public HostInformationController(UiFacadeFactory uiFacadeFactory, HostInfoDAO hostInfoDao, MemoryStatDAO memoryStatDao, HostRef ref, HostInformationViewProvider provider) { - OSGIUtils utils = OSGIUtils.getInstance(); - HostMemoryViewProvider hostMemoryProvider = utils.getService(HostMemoryViewProvider.class); - memoryController = new HostMemoryController(hostInfoDao, memoryStatDao, ref, hostMemoryProvider); - + public HostInformationController(UiFacadeFactory uiFacadeFactory, HostRef ref, HostInformationViewProvider provider) { view = provider.createView(); - view.addChildView(translator.localize(LocaleResources.HOST_INFO_TAB_MEMORY), getMemoryController().getView()); - Collection<HostInformationService> hostInfoServices = uiFacadeFactory.getHostInformationServices(); for (HostInformationService hostInfoService : hostInfoServices) { if (hostInfoService.getFilter().matches(ref)) { @@ -78,10 +62,6 @@ } } - public HostMemoryController getMemoryController() { - return memoryController; - } - public BasicView getView() { return view; }
--- a/client/core/src/main/java/com/redhat/thermostat/client/ui/HostMemoryController.java Tue Nov 27 14:47:49 2012 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,183 +0,0 @@ -/* - * Copyright 2012 Red Hat, Inc. - * - * This file is part of Thermostat. - * - * Thermostat is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation; either version 2, or (at your - * option) any later version. - * - * Thermostat is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Thermostat; see the file COPYING. If not see - * <http://www.gnu.org/licenses/>. - * - * Linking this code with other modules is making a combined work - * based on this code. Thus, the terms and conditions of the GNU - * General Public License cover the whole combination. - * - * As a special exception, the copyright holders of this code give - * you permission to link this code with independent modules to - * produce an executable, regardless of the license terms of these - * independent modules, and to copy and distribute the resulting - * executable under terms of your choice, provided that you also - * meet, for each linked independent module, the terms and conditions - * of the license of that module. An independent module is a module - * which is not derived from or based on this code. If you modify - * this code, you may extend this exception to your version of the - * library, but you are not obligated to do so. If you do not wish - * to do so, delete this exception statement from your version. - */ - -package com.redhat.thermostat.client.ui; - -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import com.redhat.thermostat.client.core.views.BasicView; -import com.redhat.thermostat.client.core.views.HostMemoryView; -import com.redhat.thermostat.client.core.views.HostMemoryViewProvider; -import com.redhat.thermostat.client.core.views.BasicView.Action; -import com.redhat.thermostat.client.core.views.HostMemoryView.GraphVisibilityChangeListener; -import com.redhat.thermostat.client.core.views.UIComponent; -import com.redhat.thermostat.client.locale.LocaleResources; -import com.redhat.thermostat.common.ActionEvent; -import com.redhat.thermostat.common.ActionListener; -import com.redhat.thermostat.common.NotImplementedException; -import com.redhat.thermostat.common.Timer; -import com.redhat.thermostat.common.Timer.SchedulingType; -import com.redhat.thermostat.common.appctx.ApplicationContext; -import com.redhat.thermostat.common.dao.HostInfoDAO; -import com.redhat.thermostat.common.dao.HostRef; -import com.redhat.thermostat.common.dao.MemoryStatDAO; -import com.redhat.thermostat.common.locale.Translate; -import com.redhat.thermostat.common.utils.DisplayableValues; -import com.redhat.thermostat.storage.model.DiscreteTimeData; -import com.redhat.thermostat.storage.model.MemoryStat; -import com.redhat.thermostat.storage.model.MemoryType; - -public class HostMemoryController { - - private static final Translate<LocaleResources> translator = LocaleResources.createLocalizer(); - - private final HostMemoryView view; - - private final HostInfoDAO hostInfoDAO; - private final MemoryStatDAO memoryStatDAO; - private final HostRef ref; - - private final Timer backgroundUpdateTimer; - private final GraphVisibilityChangeListener listener = new ShowHideGraph(); - - private long lastSeenTimeStamp = Long.MIN_VALUE; - - public HostMemoryController(HostInfoDAO hostInfoDAO, MemoryStatDAO memoryStatDAO, final HostRef ref, HostMemoryViewProvider provider) { - this.ref = ref; - this.hostInfoDAO = hostInfoDAO; - this.memoryStatDAO = memoryStatDAO; - - view = provider.createView(); - - view.addMemoryChart(MemoryType.MEMORY_TOTAL.name(), translator.localize(LocaleResources.HOST_MEMORY_TOTAL)); - view.addMemoryChart(MemoryType.MEMORY_FREE.name(), translator.localize(LocaleResources.HOST_MEMORY_FREE)); - view.addMemoryChart(MemoryType.MEMORY_USED.name(), translator.localize(LocaleResources.HOST_MEMORY_USED)); - view.addMemoryChart(MemoryType.SWAP_TOTAL.name(), translator.localize(LocaleResources.HOST_SWAP_TOTAL)); - view.addMemoryChart(MemoryType.SWAP_FREE.name(), translator.localize(LocaleResources.HOST_SWAP_FREE)); - view.addMemoryChart(MemoryType.BUFFERS.name(), translator.localize(LocaleResources.HOST_BUFFERS)); - - view.addGraphVisibilityListener(listener); - view.addActionListener(new ActionListener<HostMemoryView.Action>() { - @Override - public void actionPerformed(ActionEvent<Action> actionEvent) { - switch (actionEvent.getActionId()) { - case HIDDEN: - stopBackgroundUpdates(); - break; - case VISIBLE: - startBackgroundUpdates(); - break; - default: - throw new NotImplementedException("action event not handled: " + actionEvent.getActionId()); - } - } - }); - - backgroundUpdateTimer = ApplicationContext.getInstance().getTimerFactory().createTimer(); - backgroundUpdateTimer.setAction(new Runnable() { - @Override - public void run() { - long memorySize = HostMemoryController.this.hostInfoDAO.getHostInfo(ref).getTotalMemory(); - String[] memorySizeParts = DisplayableValues.bytes(memorySize); - view.setTotalMemory(translator.localize(LocaleResources.NUMBER_AND_UNIT, memorySizeParts[0], memorySizeParts[1])); - doMemoryChartUpdate(); - } - }); - backgroundUpdateTimer.setSchedulingType(SchedulingType.FIXED_RATE); - backgroundUpdateTimer.setTimeUnit(TimeUnit.SECONDS); - backgroundUpdateTimer.setInitialDelay(0); - backgroundUpdateTimer.setDelay(5); - } - - private void startBackgroundUpdates() { - for (MemoryType type : MemoryType.values()) { - view.showMemoryChart(type.name()); - } - - backgroundUpdateTimer.start(); - } - - private void stopBackgroundUpdates() { - backgroundUpdateTimer.stop(); - for (MemoryType type : MemoryType.values()) { - view.hideMemoryChart(type.name()); - } - } - - public UIComponent getView() { - return view; - } - - private void doMemoryChartUpdate() { - List<DiscreteTimeData<? extends Number>> memFree = new LinkedList<>(); - List<DiscreteTimeData<? extends Number>> memTotal = new LinkedList<>(); - List<DiscreteTimeData<? extends Number>> memUsed = new LinkedList<>(); - List<DiscreteTimeData<? extends Number>> buf = new LinkedList<>(); - List<DiscreteTimeData<? extends Number>> swapTotal = new LinkedList<>(); - List<DiscreteTimeData<? extends Number>> swapFree = new LinkedList<>(); - - for (MemoryStat stat : memoryStatDAO.getLatestMemoryStats(ref, lastSeenTimeStamp)) { - long timeStamp = stat.getTimeStamp(); - memFree.add(new DiscreteTimeData<Long>(timeStamp, stat.getFree())); - memTotal.add(new DiscreteTimeData<Long>(timeStamp, stat.getTotal())); - memUsed.add(new DiscreteTimeData<Long>(timeStamp, stat.getTotal() - stat.getFree())); - buf.add(new DiscreteTimeData<Long>(timeStamp, stat.getBuffers())); - swapTotal.add(new DiscreteTimeData<Long>(timeStamp, stat.getSwapTotal())); - swapFree.add(new DiscreteTimeData<Long>(timeStamp, stat.getSwapFree())); - lastSeenTimeStamp = Math.max(lastSeenTimeStamp, stat.getTimeStamp()); - } - - view.addMemoryData(MemoryType.MEMORY_FREE.name(), memFree); - view.addMemoryData(MemoryType.MEMORY_TOTAL.name(), memTotal); - view.addMemoryData(MemoryType.MEMORY_USED.name(), memUsed); - view.addMemoryData(MemoryType.BUFFERS.name(), buf); - view.addMemoryData(MemoryType.SWAP_FREE.name(), swapFree); - view.addMemoryData(MemoryType.SWAP_TOTAL.name(), swapTotal); - } - - private class ShowHideGraph implements GraphVisibilityChangeListener { - @Override - public void show(String tag) { - view.showMemoryChart(tag); - } - @Override - public void hide(String tag) { - view.hideMemoryChart(tag); - } - } -}
--- a/client/core/src/main/java/com/redhat/thermostat/client/ui/UiFacadeFactory.java Tue Nov 27 14:47:49 2012 -0500 +++ b/client/core/src/main/java/com/redhat/thermostat/client/ui/UiFacadeFactory.java Tue Nov 27 14:49:03 2012 -0500 @@ -43,7 +43,6 @@ import com.redhat.thermostat.client.osgi.service.VMContextAction; import com.redhat.thermostat.common.dao.HostInfoDAO; import com.redhat.thermostat.common.dao.HostRef; -import com.redhat.thermostat.common.dao.MemoryStatDAO; import com.redhat.thermostat.common.dao.VmCpuStatDAO; import com.redhat.thermostat.common.dao.VmGcStatDAO; import com.redhat.thermostat.common.dao.VmInfoDAO; @@ -53,7 +52,6 @@ public interface UiFacadeFactory { void setHostInfoDao(HostInfoDAO hostInfoDao); - void setMemoryStatDao(MemoryStatDAO memoryStatDAO); void setVmInfoDao(VmInfoDAO vmInfoDAO); void setVmCpuStatDao(VmCpuStatDAO vmCpuStatDAO);
--- a/client/core/src/main/resources/com/redhat/thermostat/client/locale/strings.properties Tue Nov 27 14:47:49 2012 -0500 +++ b/client/core/src/main/resources/com/redhat/thermostat/client/locale/strings.properties Tue Nov 27 14:49:03 2012 -0500 @@ -66,21 +66,8 @@ HOME_PANEL_SECTION_ISSUES = Issues HOME_PANEL_NO_ISSUES = No Issues -HOST_INFO_TAB_MEMORY = Memory HOST_INFO_TAB_IO = IO -HOST_MEMORY_SECTION_OVERVIEW = Memory -HOST_MEMORY_CHART_TITLE = Memory -HOST_MEMORY_CHART_TIME_LABEL = Time -HOST_MEMORY_CHART_SIZE_LABEL = Size ({0}) - -HOST_MEMORY_TOTAL = Total Memory -HOST_MEMORY_FREE = Free Memory -HOST_MEMORY_USED = Used Memory -HOST_SWAP_TOTAL = Total Swap -HOST_SWAP_FREE = Free Swap -HOST_BUFFERS = Buffers - VM_INFO_TAB_OVERVIEW = Overview VM_INFO_TAB_CPU = CPU VM_INFO_TAB_GC = GC
--- a/client/core/src/test/java/com/redhat/thermostat/client/ui/HostMemoryControllerTest.java Tue Nov 27 14:47:49 2012 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,125 +0,0 @@ -/* - * Copyright 2012 Red Hat, Inc. - * - * This file is part of Thermostat. - * - * Thermostat is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation; either version 2, or (at your - * option) any later version. - * - * Thermostat is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Thermostat; see the file COPYING. If not see - * <http://www.gnu.org/licenses/>. - * - * Linking this code with other modules is making a combined work - * based on this code. Thus, the terms and conditions of the GNU - * General Public License cover the whole combination. - * - * As a special exception, the copyright holders of this code give - * you permission to link this code with independent modules to - * produce an executable, regardless of the license terms of these - * independent modules, and to copy and distribute the resulting - * executable under terms of your choice, provided that you also - * meet, for each linked independent module, the terms and conditions - * of the license of that module. An independent module is a module - * which is not derived from or based on this code. If you modify - * this code, you may extend this exception to your version of the - * library, but you are not obligated to do so. If you do not wish - * to do so, delete this exception statement from your version. - */ - -package com.redhat.thermostat.client.ui; - -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyLong; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.util.LinkedList; -import java.util.List; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.ArgumentCaptor; - -import com.redhat.thermostat.client.core.views.HostMemoryView; -import com.redhat.thermostat.client.core.views.HostMemoryViewProvider; -import com.redhat.thermostat.common.ActionEvent; -import com.redhat.thermostat.common.ActionListener; -import com.redhat.thermostat.common.Timer; -import com.redhat.thermostat.common.TimerFactory; -import com.redhat.thermostat.common.appctx.ApplicationContext; -import com.redhat.thermostat.common.appctx.ApplicationContextUtil; -import com.redhat.thermostat.common.dao.HostInfoDAO; -import com.redhat.thermostat.common.dao.HostRef; -import com.redhat.thermostat.common.dao.MemoryStatDAO; -import com.redhat.thermostat.storage.model.HostInfo; -import com.redhat.thermostat.storage.model.MemoryStat; - -public class HostMemoryControllerTest { - - @Before - public void setUp() { - ApplicationContextUtil.resetApplicationContext(); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) // any(List.class) - @Test - public void testUpdate() { - final long TOTAL_MEMORY = 512; - HostInfo hostInfo = new HostInfo("someHost", "someOS", "linux_0.0.1", "lreally_fast_cpu", 2, TOTAL_MEMORY); - HostInfoDAO hostInfoDAO = mock(HostInfoDAO.class); - when(hostInfoDAO.getHostInfo(any(HostRef.class))).thenReturn(hostInfo); - - MemoryStat memoryStat = new MemoryStat(1, 2, 3, 4, 5, 6, 7, 8); - List<MemoryStat> memoryStats = new LinkedList<>(); - memoryStats.add(memoryStat); - MemoryStatDAO memoryStatDAO = mock(MemoryStatDAO.class); - when(memoryStatDAO.getLatestMemoryStats(any(HostRef.class), anyLong())).thenReturn(memoryStats); - - Timer timer = mock(Timer.class); - ArgumentCaptor<Runnable> timerActionCaptor = ArgumentCaptor.forClass(Runnable.class); - doNothing().when(timer).setAction(timerActionCaptor.capture()); - - TimerFactory timerFactory = mock(TimerFactory.class); - when(timerFactory.createTimer()).thenReturn(timer); - ApplicationContext.getInstance().setTimerFactory(timerFactory); - - HostRef ref = mock(HostRef.class); - - HostMemoryView view = mock(HostMemoryView.class); - ArgumentCaptor<ActionListener> viewArgumentCaptor = ArgumentCaptor.forClass(ActionListener.class); - doNothing().when(view).addActionListener(viewArgumentCaptor.capture()); - - HostMemoryViewProvider viewProvider = mock(HostMemoryViewProvider.class); - when(viewProvider.createView()).thenReturn(view); - - @SuppressWarnings("unused") - HostMemoryController controller = new HostMemoryController(hostInfoDAO, memoryStatDAO, ref, viewProvider); - - ActionListener<HostMemoryView.Action> l = viewArgumentCaptor.getValue(); - - l.actionPerformed(new ActionEvent<>(view, HostMemoryView.Action.VISIBLE)); - - verify(timer).start(); - timerActionCaptor.getValue().run(); - - verify(view, times(1)).setTotalMemory(eq(TOTAL_MEMORY + " B")); - verify(view, times(6)).addMemoryData(any(String.class), any(List.class)); - - l.actionPerformed(new ActionEvent<>(view, HostMemoryView.Action.HIDDEN)); - - verify(timer).stop(); - - } -}
--- a/client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/Main.java Tue Nov 27 14:47:49 2012 -0500 +++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/Main.java Tue Nov 27 14:49:03 2012 -0500 @@ -282,7 +282,6 @@ // register the storage, so other services can request it daoFactory.registerDAOsAndStorageAsOSGiServices(); uiFacadeFactory.setHostInfoDao(daoFactory.getHostInfoDAO()); - uiFacadeFactory.setMemoryStatDao(daoFactory.getMemoryStatDAO()); uiFacadeFactory.setVmInfoDao(daoFactory.getVmInfoDAO()); uiFacadeFactory.setVmCpuStatDao(daoFactory.getVmCpuStatDAO());
--- a/client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/UiFacadeFactoryImpl.java Tue Nov 27 14:47:49 2012 -0500 +++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/UiFacadeFactoryImpl.java Tue Nov 27 14:49:03 2012 -0500 @@ -56,7 +56,6 @@ import com.redhat.thermostat.client.ui.VmInformationController; import com.redhat.thermostat.common.dao.HostInfoDAO; import com.redhat.thermostat.common.dao.HostRef; -import com.redhat.thermostat.common.dao.MemoryStatDAO; import com.redhat.thermostat.common.dao.VmCpuStatDAO; import com.redhat.thermostat.common.dao.VmGcStatDAO; import com.redhat.thermostat.common.dao.VmInfoDAO; @@ -75,7 +74,6 @@ private BundleContext context; private HostInfoDAO hostInfoDao; - private MemoryStatDAO memoryStatDao; private VmInfoDAO vmInfoDao; private VmCpuStatDAO vmCpuStatDao; @@ -98,10 +96,6 @@ this.hostInfoDao = hostInfoDao; } - public void setMemoryStatDao(MemoryStatDAO memoryStatDao) { - this.memoryStatDao = memoryStatDao; - } - public void setVmInfoDao(VmInfoDAO vmInfoDao) { this.vmInfoDao = vmInfoDao; } @@ -136,7 +130,7 @@ @Override public HostInformationController getHostController(HostRef ref) { HostInformationViewProvider viewProvider = serviceProvider.getService(HostInformationViewProvider.class); - return new HostInformationController(this, hostInfoDao, memoryStatDao, ref, viewProvider); + return new HostInformationController(this, ref, viewProvider); } @Override
--- a/client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/osgi/ThermostatActivator.java Tue Nov 27 14:47:49 2012 -0500 +++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/osgi/ThermostatActivator.java Tue Nov 27 14:49:03 2012 -0500 @@ -46,7 +46,6 @@ import com.redhat.thermostat.client.core.views.AgentInformationViewProvider; import com.redhat.thermostat.client.core.views.ClientConfigViewProvider; import com.redhat.thermostat.client.core.views.HostInformationViewProvider; -import com.redhat.thermostat.client.core.views.HostMemoryViewProvider; import com.redhat.thermostat.client.core.views.SummaryViewProvider; import com.redhat.thermostat.client.core.views.VmCpuViewProvider; import com.redhat.thermostat.client.core.views.VmGcViewProvider; @@ -60,7 +59,6 @@ import com.redhat.thermostat.client.swing.views.SwingAgentInformationViewProvider; import com.redhat.thermostat.client.swing.views.SwingClientConfigurationViewProvider; import com.redhat.thermostat.client.swing.views.SwingHostInformationViewProvider; -import com.redhat.thermostat.client.swing.views.SwingHostMemoryViewProvider; import com.redhat.thermostat.client.swing.views.SwingSummaryViewProvider; import com.redhat.thermostat.client.swing.views.SwingVmCpuViewProvider; import com.redhat.thermostat.client.swing.views.SwingVmGcViewProvider; @@ -89,8 +87,6 @@ // Host views HostInformationViewProvider infoProvider = new SwingHostInformationViewProvider(); context.registerService(HostInformationViewProvider.class.getName(), infoProvider, null); - HostMemoryViewProvider memoryProvider = new SwingHostMemoryViewProvider(); - context.registerService(HostMemoryViewProvider.class.getName(), memoryProvider, null); // Vm views VmInformationViewProvider vmInfoProvider = new SwingVmInformationViewProvider();
--- a/client/swing/src/main/java/com/redhat/thermostat/client/swing/views/HostMemoryPanel.java Tue Nov 27 14:47:49 2012 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,354 +0,0 @@ -/* - * Copyright 2012 Red Hat, Inc. - * - * This file is part of Thermostat. - * - * Thermostat is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation; either version 2, or (at your - * option) any later version. - * - * Thermostat is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Thermostat; see the file COPYING. If not see - * <http://www.gnu.org/licenses/>. - * - * Linking this code with other modules is making a combined work - * based on this code. Thus, the terms and conditions of the GNU - * General Public License cover the whole combination. - * - * As a special exception, the copyright holders of this code give - * you permission to link this code with independent modules to - * produce an executable, regardless of the license terms of these - * independent modules, and to copy and distribute the resulting - * executable under terms of your choice, provided that you also - * meet, for each linked independent module, the terms and conditions - * of the license of that module. An independent module is a module - * which is not derived from or based on this code. If you modify - * this code, you may extend this exception to your version of the - * library, but you are not obligated to do so. If you do not wish - * to do so, delete this exception statement from your version. - */ - -package com.redhat.thermostat.client.swing.views; - -import java.awt.Color; -import java.awt.Component; -import java.awt.FlowLayout; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.CopyOnWriteArrayList; - -import javax.swing.GroupLayout; -import javax.swing.GroupLayout.Alignment; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.LayoutStyle.ComponentPlacement; -import javax.swing.SwingUtilities; -import javax.swing.text.JTextComponent; - -import org.jfree.chart.ChartFactory; -import org.jfree.chart.JFreeChart; -import org.jfree.chart.axis.NumberAxis; -import org.jfree.chart.renderer.xy.XYItemRenderer; -import org.jfree.data.time.FixedMillisecond; -import org.jfree.data.time.RegularTimePeriod; -import org.jfree.data.time.TimeSeries; -import org.jfree.data.time.TimeSeriesCollection; - -import com.redhat.thermostat.client.core.views.HostMemoryView; -import com.redhat.thermostat.client.locale.LocaleResources; -import com.redhat.thermostat.client.swing.SwingComponent; -import com.redhat.thermostat.client.swing.components.Components; -import com.redhat.thermostat.client.swing.components.RecentTimeSeriesChartPanel; -import com.redhat.thermostat.client.swing.components.ValueField; -import com.redhat.thermostat.client.ui.ChartColors; -import com.redhat.thermostat.client.ui.ComponentVisibleListener; -import com.redhat.thermostat.client.ui.RecentTimeSeriesChartController; -import com.redhat.thermostat.common.ActionListener; -import com.redhat.thermostat.common.locale.Translate; -import com.redhat.thermostat.common.utils.DisplayableValues; -import com.redhat.thermostat.common.utils.DisplayableValues.Scale; -import com.redhat.thermostat.storage.model.DiscreteTimeData; -import com.redhat.thermostat.swing.components.experimental.WrapLayout; - -public class HostMemoryPanel extends HostMemoryView implements SwingComponent { - - private static final Translate<LocaleResources> translator = LocaleResources.createLocalizer(); - - private JPanel visiblePanel; - - private final MemoryCheckboxListener memoryCheckboxListener = new MemoryCheckboxListener(); - - private final JTextComponent totalMemory = new ValueField("${TOTAL_MEMORY}"); - - private final JPanel memoryCheckBoxPanel = new JPanel(new WrapLayout(FlowLayout.LEADING)); - private final CopyOnWriteArrayList<GraphVisibilityChangeListener> listeners = new CopyOnWriteArrayList<>(); - private final TimeSeriesCollection memoryCollection = new TimeSeriesCollection(); - private final Map<String, TimeSeries> dataset = new HashMap<>(); - private final Map<String, JCheckBox> checkBoxes = new HashMap<>(); - private final Map<String, Color> colors = new HashMap<>(); - - private JFreeChart chart; - - public HostMemoryPanel() { - super(); - initializePanel(); - - visiblePanel.addHierarchyListener(new ComponentVisibleListener() { - @Override - public void componentShown(Component component) { - notifier.fireAction(Action.VISIBLE); - } - @Override - public void componentHidden(Component component) { - notifier.fireAction(Action.HIDDEN); - } - }); - } - - @Override - public void setTotalMemory(final String newValue) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - totalMemory.setText(newValue); - } - }); - } - - @Override - public Component getUiComponent() { - return visiblePanel; - } - - @Override - public void addMemoryChart(final String tag, final String humanReadableName) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - int colorIndex = colors.size(); - colors.put(tag, ChartColors.getColor(colorIndex)); - TimeSeries series = new TimeSeries(tag); - dataset.put(tag, series); - JCheckBox newCheckBox = new JCheckBox(createLabelWithLegend(humanReadableName, colors.get(tag))); - newCheckBox.setActionCommand(tag); - newCheckBox.setSelected(true); - newCheckBox.addActionListener(memoryCheckboxListener); - newCheckBox.setOpaque(false); - checkBoxes.put(tag, newCheckBox); - memoryCheckBoxPanel.add(newCheckBox); - - updateColors(); - } - }); - - } - - private String createLabelWithLegend(String text, Color color) { - String hexColor = "#" + Integer.toHexString(color.getRGB() & 0x00ffffff); - return "<html> <font color='" + hexColor + "'>\u2588</font> " + text + "</html>"; - } - - @Override - public void removeMemoryChart(final String tag) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - TimeSeries series = dataset.remove(tag); - memoryCollection.removeSeries(series); - JCheckBox box = checkBoxes.remove(tag); - memoryCheckBoxPanel.remove(box); - - updateColors(); - } - }); - } - - @Override - public void showMemoryChart(final String tag) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - TimeSeries series = dataset.get(tag); - memoryCollection.addSeries(series); - - updateColors(); - } - }); - } - - @Override - public void hideMemoryChart(final String tag) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - TimeSeries series = dataset.get(tag); - memoryCollection.removeSeries(series); - - updateColors(); - } - }); - } - - @Override - public void addMemoryData(final String tag, List<DiscreteTimeData<? extends Number>> data) { - final List<DiscreteTimeData<? extends Number>> copy = new ArrayList<>(data); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - final TimeSeries series = dataset.get(tag); - for (DiscreteTimeData<? extends Number> timeData: copy) { - RegularTimePeriod period = new FixedMillisecond(timeData.getTimeInMillis()); - if (series.getDataItem(period) == null) { - Long sizeInBytes = (Long) timeData.getData(); - Double sizeInMegaBytes = DisplayableValues.Scale.convertTo(Scale.MiB, sizeInBytes); - series.add(new FixedMillisecond(timeData.getTimeInMillis()), sizeInMegaBytes, false); - } - } - series.fireSeriesChanged(); - } - }); - } - - @Override - public void clearMemoryData(final String tag) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - TimeSeries series = dataset.get(tag); - series.clear(); - } - }); - } - - @Override - public void addGraphVisibilityListener(GraphVisibilityChangeListener listener) { - listeners.add(listener); - } - - @Override - public void removeGraphVisibilityListener(GraphVisibilityChangeListener listener) { - listeners.remove(listener); - } - - @Override - public void addActionListener(ActionListener<Action> listener) { - notifier.addActionListener(listener); - } - - @Override - public void removeActionListener(ActionListener<Action> listener) { - notifier.removeActionListener(listener); - } - - private void initializePanel() { - visiblePanel = new JPanel(); - visiblePanel.setOpaque(false); - - chart = createMemoryChart(); - - JPanel chartPanel = new RecentTimeSeriesChartPanel(new RecentTimeSeriesChartController(chart)); - chartPanel.setOpaque(false); - - JLabel lblMemory = Components.header(translator.localize(LocaleResources.HOST_MEMORY_SECTION_OVERVIEW)); - - JLabel totalMemoryLabel = Components.label(translator.localize(LocaleResources.HOST_INFO_MEMORY_TOTAL)); - - memoryCheckBoxPanel.setOpaque(false); - - GroupLayout groupLayout = new GroupLayout(visiblePanel); - groupLayout.setHorizontalGroup( - groupLayout.createParallelGroup(Alignment.LEADING) - .addGroup(groupLayout.createSequentialGroup() - .addContainerGap() - .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) - .addComponent(chartPanel, GroupLayout.DEFAULT_SIZE, 883, Short.MAX_VALUE) - .addGroup(groupLayout.createSequentialGroup() - .addGap(12) - .addComponent(totalMemoryLabel) - .addPreferredGap(ComponentPlacement.RELATED) - .addComponent(totalMemory, GroupLayout.DEFAULT_SIZE, 751, Short.MAX_VALUE)) - .addComponent(lblMemory) - .addComponent(memoryCheckBoxPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE)) - .addContainerGap()) - ); - groupLayout.setVerticalGroup( - groupLayout.createParallelGroup(Alignment.LEADING) - .addGroup(groupLayout.createSequentialGroup() - .addContainerGap() - .addComponent(lblMemory) - .addPreferredGap(ComponentPlacement.RELATED) - .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) - .addComponent(totalMemory, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) - .addComponent(totalMemoryLabel)) - .addPreferredGap(ComponentPlacement.RELATED) - .addComponent(chartPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE) - .addPreferredGap(ComponentPlacement.RELATED) - .addComponent(memoryCheckBoxPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE) - .addContainerGap()) - ); - visiblePanel.setLayout(groupLayout); - } - - private JFreeChart createMemoryChart() { - JFreeChart chart = ChartFactory.createTimeSeriesChart( - translator.localize(LocaleResources.HOST_MEMORY_CHART_TITLE), // Title - translator.localize(LocaleResources.HOST_MEMORY_CHART_TIME_LABEL), // x-axis Label - translator.localize(LocaleResources.HOST_MEMORY_CHART_SIZE_LABEL, Scale.MiB.name()), // y-axis Label - memoryCollection, // Dataset - false, // Show Legend - false, // Use tooltips - false // Configure chart to generate URLs? - ); - - chart.getPlot().setBackgroundPaint( new Color(255,255,255,0) ); - chart.getPlot().setBackgroundImageAlpha(0.0f); - chart.getPlot().setOutlinePaint(new Color(0,0,0,0)); - - NumberAxis rangeAxis = (NumberAxis) chart.getXYPlot().getRangeAxis(); - rangeAxis.setAutoRangeMinimumSize(100); - - return chart; - } - - private void fireShowHideHandlers(boolean show, String tag) { - for (GraphVisibilityChangeListener listener: listeners) { - if (show) { - listener.show(tag); - } else { - listener.hide(tag); - } - } - } - - /** - * Adding or removing series to the series collection may change the order - * of existing items. Plus the paint for the index is now out-of-date. So - * let's walk through all the series and set the right paint for those. - */ - private void updateColors() { - XYItemRenderer itemRenderer = chart.getXYPlot().getRenderer(); - for (int i = 0; i < memoryCollection.getSeriesCount(); i++) { - String tag = (String) memoryCollection.getSeriesKey(i); - Color color = colors.get(tag); - itemRenderer.setSeriesPaint(i, color); - } - } - - private class MemoryCheckboxListener implements java.awt.event.ActionListener { - @Override - public void actionPerformed(java.awt.event.ActionEvent e) { - JCheckBox source = (JCheckBox) e.getSource(); - fireShowHideHandlers(source.isSelected(), source.getActionCommand()); - } - - } -}
--- a/client/swing/src/main/java/com/redhat/thermostat/client/swing/views/SwingHostMemoryViewProvider.java Tue Nov 27 14:47:49 2012 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -/* - * Copyright 2012 Red Hat, Inc. - * - * This file is part of Thermostat. - * - * Thermostat is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation; either version 2, or (at your - * option) any later version. - * - * Thermostat is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Thermostat; see the file COPYING. If not see - * <http://www.gnu.org/licenses/>. - * - * Linking this code with other modules is making a combined work - * based on this code. Thus, the terms and conditions of the GNU - * General Public License cover the whole combination. - * - * As a special exception, the copyright holders of this code give - * you permission to link this code with independent modules to - * produce an executable, regardless of the license terms of these - * independent modules, and to copy and distribute the resulting - * executable under terms of your choice, provided that you also - * meet, for each linked independent module, the terms and conditions - * of the license of that module. An independent module is a module - * which is not derived from or based on this code. If you modify - * this code, you may extend this exception to your version of the - * library, but you are not obligated to do so. If you do not wish - * to do so, delete this exception statement from your version. - */ - -package com.redhat.thermostat.client.swing.views; - -import com.redhat.thermostat.client.core.views.HostMemoryView; -import com.redhat.thermostat.client.core.views.HostMemoryViewProvider; - -public class SwingHostMemoryViewProvider implements HostMemoryViewProvider { - - @Override - public HostMemoryView createView() { - return new HostMemoryPanel(); - } - -}
--- a/client/swing/src/test/java/com/redhat/thermostat/client/swing/internal/osgi/ThermostatActivatorTest.java Tue Nov 27 14:47:49 2012 -0500 +++ b/client/swing/src/test/java/com/redhat/thermostat/client/swing/internal/osgi/ThermostatActivatorTest.java Tue Nov 27 14:49:03 2012 -0500 @@ -44,7 +44,6 @@ import com.redhat.thermostat.client.core.views.AgentInformationViewProvider; import com.redhat.thermostat.client.core.views.ClientConfigViewProvider; import com.redhat.thermostat.client.core.views.HostInformationViewProvider; -import com.redhat.thermostat.client.core.views.HostMemoryViewProvider; import com.redhat.thermostat.client.core.views.SummaryViewProvider; import com.redhat.thermostat.client.core.views.VmCpuViewProvider; import com.redhat.thermostat.client.core.views.VmGcViewProvider; @@ -55,7 +54,6 @@ import com.redhat.thermostat.client.swing.views.SwingAgentInformationViewProvider; import com.redhat.thermostat.client.swing.views.SwingClientConfigurationViewProvider; import com.redhat.thermostat.client.swing.views.SwingHostInformationViewProvider; -import com.redhat.thermostat.client.swing.views.SwingHostMemoryViewProvider; import com.redhat.thermostat.client.swing.views.SwingSummaryViewProvider; import com.redhat.thermostat.client.swing.views.SwingVmCpuViewProvider; import com.redhat.thermostat.client.swing.views.SwingVmGcViewProvider; @@ -76,7 +74,6 @@ assertTrue(ctx.isServiceRegistered(HostDecorator.class.getName(), HostIconDecorator.class)); assertTrue(ctx.isServiceRegistered(SummaryViewProvider.class.getName(), SwingSummaryViewProvider.class)); assertTrue(ctx.isServiceRegistered(HostInformationViewProvider.class.getName(), SwingHostInformationViewProvider.class)); - assertTrue(ctx.isServiceRegistered(HostMemoryViewProvider.class.getName(), SwingHostMemoryViewProvider.class)); assertTrue(ctx.isServiceRegistered(VmInformationViewProvider.class.getName(), SwingVmInformationViewProvider.class)); assertTrue(ctx.isServiceRegistered(VmCpuViewProvider.class.getName(), SwingVmCpuViewProvider.class)); assertTrue(ctx.isServiceRegistered(VmGcViewProvider.class.getName(), SwingVmGcViewProvider.class)); @@ -84,6 +81,6 @@ assertTrue(ctx.isServiceRegistered(AgentInformationViewProvider.class.getName(), SwingAgentInformationViewProvider.class)); assertTrue(ctx.isServiceRegistered(ClientConfigViewProvider.class.getName(), SwingClientConfigurationViewProvider.class)); - assertEquals(10, ctx.getAllServices().size()); + assertEquals(9, ctx.getAllServices().size()); } }
--- a/distribution/config/commands/gui.properties Tue Nov 27 14:47:49 2012 -0500 +++ b/distribution/config/commands/gui.properties Tue Nov 27 14:49:03 2012 -0500 @@ -11,6 +11,8 @@ thermostat-host-overview-client-swing-@project.version@.jar, \ thermostat-host-cpu-client-core-@project.version@.jar, \ thermostat-host-cpu-client-swing-@project.version@.jar, \ + thermostat-host-memory-client-core-@project.version@.jar, \ + thermostat-host-memory-client-swing-@project.version@.jar, \ thermostat-client-heapdumper-core-@project.version@.jar, \ thermostat-client-heapdumper-swing-@project.version@.jar, \ thermostat-killvm-client-swing-@project.version@.jar, \
--- a/distribution/pom.xml Tue Nov 27 14:47:49 2012 -0500 +++ b/distribution/pom.xml Tue Nov 27 14:49:03 2012 -0500 @@ -333,6 +333,16 @@ </dependency> <dependency> <groupId>com.redhat.thermostat</groupId> + <artifactId>thermostat-host-memory-client-core</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>com.redhat.thermostat</groupId> + <artifactId>thermostat-host-memory-client-swing</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>com.redhat.thermostat</groupId> <artifactId>thermostat-client-vmclassstat-swing</artifactId> <version>${project.version}</version> </dependency>
--- a/eclipse/com.redhat.thermostat.client.feature/feature.xml Tue Nov 27 14:47:49 2012 -0500 +++ b/eclipse/com.redhat.thermostat.client.feature/feature.xml Tue Nov 27 14:49:03 2012 -0500 @@ -140,4 +140,11 @@ version="0.0.0" unpack="false"/> + <plugin + id="com.redhat.thermostat.host.memory.client.core" + download-size="0" + install-size="0" + version="0.0.0" + unpack="false"/> + </feature>
--- a/eclipse/com.redhat.thermostat.client.feature/pom.xml Tue Nov 27 14:47:49 2012 -0500 +++ b/eclipse/com.redhat.thermostat.client.feature/pom.xml Tue Nov 27 14:49:03 2012 -0500 @@ -31,6 +31,11 @@ </dependency> <dependency> <groupId>com.redhat.thermostat</groupId> + <artifactId>thermostat-host-memory-client-core</artifactId> + <version>0.5.0-SNAPSHOT</version> + </dependency> + <dependency> + <groupId>com.redhat.thermostat</groupId> <artifactId>thermostat-client-vmclassstat-core</artifactId> <version>0.5.0-SNAPSHOT</version> </dependency>
--- a/eclipse/com.redhat.thermostat.eclipse.chart.common/META-INF/MANIFEST.MF Tue Nov 27 14:47:49 2012 -0500 +++ b/eclipse/com.redhat.thermostat.eclipse.chart.common/META-INF/MANIFEST.MF Tue Nov 27 14:49:03 2012 -0500 @@ -9,6 +9,8 @@ Import-Package: com.redhat.thermostat.client.core.views, com.redhat.thermostat.host.cpu.client.core, com.redhat.thermostat.host.cpu.client.locale, + com.redhat.thermostat.host.memory.client.core, + com.redhat.thermostat.host.memory.client.locale, com.redhat.thermostat.client.locale, com.redhat.thermostat.client.osgi.service, com.redhat.thermostat.client.ui,
--- a/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/Activator.java Tue Nov 27 14:47:49 2012 -0500 +++ b/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/Activator.java Tue Nov 27 14:49:03 2012 -0500 @@ -39,11 +39,11 @@ import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; -import com.redhat.thermostat.client.core.views.HostMemoryViewProvider; import com.redhat.thermostat.client.core.views.VmCpuViewProvider; import com.redhat.thermostat.client.core.views.VmGcViewProvider; import com.redhat.thermostat.common.utils.OSGIUtils; import com.redhat.thermostat.host.cpu.client.core.HostCpuViewProvider; +import com.redhat.thermostat.host.memory.client.core.HostMemoryViewProvider; public class Activator extends AbstractUIPlugin {
--- a/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/HostMemoryViewPart.java Tue Nov 27 14:47:49 2012 -0500 +++ b/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/HostMemoryViewPart.java Tue Nov 27 14:49:03 2012 -0500 @@ -38,14 +38,14 @@ import org.eclipse.swt.widgets.Composite; -import com.redhat.thermostat.client.core.views.HostMemoryViewProvider; -import com.redhat.thermostat.client.ui.HostMemoryController; import com.redhat.thermostat.common.dao.HostInfoDAO; import com.redhat.thermostat.common.dao.HostRef; import com.redhat.thermostat.common.dao.MemoryStatDAO; import com.redhat.thermostat.common.utils.OSGIUtils; import com.redhat.thermostat.eclipse.SWTComponent; import com.redhat.thermostat.eclipse.views.HostRefViewPart; +import com.redhat.thermostat.host.memory.client.core.HostMemoryController; +import com.redhat.thermostat.host.memory.client.core.HostMemoryViewProvider; public class HostMemoryViewPart extends HostRefViewPart {
--- a/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/SWTHostMemoryView.java Tue Nov 27 14:47:49 2012 -0500 +++ b/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/SWTHostMemoryView.java Tue Nov 27 14:49:03 2012 -0500 @@ -67,8 +67,8 @@ import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesCollection; -import com.redhat.thermostat.client.core.views.HostMemoryView; -import com.redhat.thermostat.client.locale.LocaleResources; +import com.redhat.thermostat.host.memory.client.core.HostMemoryView; +import com.redhat.thermostat.host.memory.client.locale.LocaleResources; import com.redhat.thermostat.client.ui.ChartColors; import com.redhat.thermostat.common.locale.Translate; import com.redhat.thermostat.common.utils.DisplayableValues;
--- a/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/SWTHostMemoryViewProvider.java Tue Nov 27 14:47:49 2012 -0500 +++ b/eclipse/com.redhat.thermostat.eclipse.chart.common/src/com/redhat/thermostat/eclipse/chart/common/SWTHostMemoryViewProvider.java Tue Nov 27 14:49:03 2012 -0500 @@ -36,9 +36,9 @@ package com.redhat.thermostat.eclipse.chart.common; -import com.redhat.thermostat.client.core.views.HostMemoryView; -import com.redhat.thermostat.client.core.views.HostMemoryViewProvider; import com.redhat.thermostat.eclipse.SWTViewProvider; +import com.redhat.thermostat.host.memory.client.core.HostMemoryView; +import com.redhat.thermostat.host.memory.client.core.HostMemoryViewProvider; public class SWTHostMemoryViewProvider extends SWTViewProvider implements HostMemoryViewProvider {
--- a/eclipse/com.redhat.thermostat.eclipse.test.ui/META-INF/MANIFEST.MF Tue Nov 27 14:47:49 2012 -0500 +++ b/eclipse/com.redhat.thermostat.eclipse.test.ui/META-INF/MANIFEST.MF Tue Nov 27 14:49:03 2012 -0500 @@ -11,6 +11,7 @@ org.hamcrest;bundle-version="1.1.0" Import-Package: com.redhat.thermostat.client.core.views, com.redhat.thermostat.host.cpu.client.core, + com.redhat.thermostat.host.memory.client.core, com.redhat.thermostat.host.overview.client.core, com.redhat.thermostat.client.osgi.service, com.redhat.thermostat.client.ui,
--- a/eclipse/com.redhat.thermostat.eclipse.test.ui/src/com/redhat/thermostat/eclipse/test/ui/SWTHostMemoryViewTest.java Tue Nov 27 14:47:49 2012 -0500 +++ b/eclipse/com.redhat.thermostat.eclipse.test.ui/src/com/redhat/thermostat/eclipse/test/ui/SWTHostMemoryViewTest.java Tue Nov 27 14:49:03 2012 -0500 @@ -69,11 +69,11 @@ import com.redhat.thermostat.client.core.views.BasicView; import com.redhat.thermostat.client.core.views.BasicView.Action; -import com.redhat.thermostat.client.core.views.HostMemoryView.GraphVisibilityChangeListener; import com.redhat.thermostat.common.ActionEvent; import com.redhat.thermostat.common.ActionListener; import com.redhat.thermostat.eclipse.ThermostatConstants; import com.redhat.thermostat.eclipse.chart.common.SWTHostMemoryView; +import com.redhat.thermostat.host.memory.client.core.HostMemoryView.GraphVisibilityChangeListener; import com.redhat.thermostat.storage.model.DiscreteTimeData; @RunWith(SWTBotJunit4ClassRunner.class)
--- a/eclipse/com.redhat.thermostat.eclipse.test/META-INF/MANIFEST.MF Tue Nov 27 14:47:49 2012 -0500 +++ b/eclipse/com.redhat.thermostat.eclipse.test/META-INF/MANIFEST.MF Tue Nov 27 14:49:03 2012 -0500 @@ -14,6 +14,7 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Import-Package: com.redhat.thermostat.client.core.views, com.redhat.thermostat.host.cpu.client.core, + com.redhat.thermostat.host.memory.client.core, com.redhat.thermostat.host.overview.client.core, com.redhat.thermostat.client.osgi.service, com.redhat.thermostat.client.ui,
--- a/eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/HostMemoryViewPartTest.java Tue Nov 27 14:47:49 2012 -0500 +++ b/eclipse/com.redhat.thermostat.eclipse.test/src/com/redhat/thermostat/eclipse/test/views/HostMemoryViewPartTest.java Tue Nov 27 14:49:03 2012 -0500 @@ -48,9 +48,7 @@ import org.junit.Test; import org.mockito.InOrder; -import com.redhat.thermostat.client.core.views.HostMemoryViewProvider; import com.redhat.thermostat.client.core.views.UIComponent; -import com.redhat.thermostat.client.ui.HostMemoryController; import com.redhat.thermostat.common.dao.HostInfoDAO; import com.redhat.thermostat.common.dao.HostRef; import com.redhat.thermostat.common.dao.MemoryStatDAO; @@ -59,6 +57,8 @@ import com.redhat.thermostat.eclipse.chart.common.SWTHostMemoryView; import com.redhat.thermostat.eclipse.chart.common.SWTHostMemoryViewProvider; import com.redhat.thermostat.eclipse.internal.views.RefViewPart; +import com.redhat.thermostat.host.memory.client.core.HostMemoryController; +import com.redhat.thermostat.host.memory.client.core.HostMemoryViewProvider; public class HostMemoryViewPartTest extends AbstractRefViewPartTest<HostRef> {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/host-memory/client-core/pom.xml Tue Nov 27 14:49:03 2012 -0500 @@ -0,0 +1,66 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <artifactId>thermostat-host-memory</artifactId> + <groupId>com.redhat.thermostat</groupId> + <version>0.5.0-SNAPSHOT</version> + </parent> + <artifactId>thermostat-host-memory-client-core</artifactId> + <packaging>bundle</packaging> + <name>Thermostat Host Memory Core Client plugin</name> + <build> + <plugins> + <plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-bundle-plugin</artifactId> + <extensions>true</extensions> + <configuration> + <instructions> + <Private-Package></Private-Package> + <Bundle-Vendor>Red Hat, Inc.</Bundle-Vendor> + <Bundle-SymbolicName>com.redhat.thermostat.host.memory.client.core</Bundle-SymbolicName> + <Export-Package> + com.redhat.thermostat.host.memory.client.core, + com.redhat.thermostat.host.memory.client.locale + </Export-Package> + <!-- Do not autogenerate uses clauses in Manifests --> + <_nouses>true</_nouses> + </instructions> + </configuration> + </plugin> + </plugins> + </build> + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.core</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.compendium</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>com.redhat.thermostat</groupId> + <artifactId>thermostat-common-core</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>com.redhat.thermostat</groupId> + <artifactId>thermostat-client-core</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> +</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/host-memory/client-core/src/main/java/com/redhat/thermostat/host/memory/client/core/HostMemoryController.java Tue Nov 27 14:49:03 2012 -0500 @@ -0,0 +1,186 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * This file is part of Thermostat. + * + * Thermostat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * Thermostat is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Thermostat; see the file COPYING. If not see + * <http://www.gnu.org/licenses/>. + * + * Linking this code with other modules is making a combined work + * based on this code. Thus, the terms and conditions of the GNU + * General Public License cover the whole combination. + * + * As a special exception, the copyright holders of this code give + * you permission to link this code with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also + * meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module + * which is not derived from or based on this code. If you modify + * this code, you may extend this exception to your version of the + * library, but you are not obligated to do so. If you do not wish + * to do so, delete this exception statement from your version. + */ + +package com.redhat.thermostat.host.memory.client.core; + +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import com.redhat.thermostat.client.core.controllers.HostInformationServiceController; +import com.redhat.thermostat.client.core.views.BasicView.Action; +import com.redhat.thermostat.client.core.views.UIComponent; +import com.redhat.thermostat.common.ActionEvent; +import com.redhat.thermostat.common.ActionListener; +import com.redhat.thermostat.common.NotImplementedException; +import com.redhat.thermostat.common.Timer; +import com.redhat.thermostat.common.Timer.SchedulingType; +import com.redhat.thermostat.common.appctx.ApplicationContext; +import com.redhat.thermostat.common.dao.HostInfoDAO; +import com.redhat.thermostat.common.dao.HostRef; +import com.redhat.thermostat.common.dao.MemoryStatDAO; +import com.redhat.thermostat.common.locale.Translate; +import com.redhat.thermostat.common.utils.DisplayableValues; +import com.redhat.thermostat.host.memory.client.core.HostMemoryView.GraphVisibilityChangeListener; +import com.redhat.thermostat.host.memory.client.locale.LocaleResources; +import com.redhat.thermostat.storage.model.DiscreteTimeData; +import com.redhat.thermostat.storage.model.MemoryStat; +import com.redhat.thermostat.storage.model.MemoryType; + +public class HostMemoryController implements HostInformationServiceController { + + private static final Translate<LocaleResources> translator = LocaleResources.createLocalizer(); + + private final HostMemoryView view; + + private final HostInfoDAO hostInfoDAO; + private final MemoryStatDAO memoryStatDAO; + private final HostRef ref; + + private final Timer backgroundUpdateTimer; + private final GraphVisibilityChangeListener listener = new ShowHideGraph(); + + private long lastSeenTimeStamp = Long.MIN_VALUE; + + public HostMemoryController(HostInfoDAO hostInfoDAO, MemoryStatDAO memoryStatDAO, final HostRef ref, HostMemoryViewProvider provider) { + this.ref = ref; + this.hostInfoDAO = hostInfoDAO; + this.memoryStatDAO = memoryStatDAO; + + view = provider.createView(); + + view.addMemoryChart(MemoryType.MEMORY_TOTAL.name(), translator.localize(LocaleResources.HOST_MEMORY_TOTAL)); + view.addMemoryChart(MemoryType.MEMORY_FREE.name(), translator.localize(LocaleResources.HOST_MEMORY_FREE)); + view.addMemoryChart(MemoryType.MEMORY_USED.name(), translator.localize(LocaleResources.HOST_MEMORY_USED)); + view.addMemoryChart(MemoryType.SWAP_TOTAL.name(), translator.localize(LocaleResources.HOST_SWAP_TOTAL)); + view.addMemoryChart(MemoryType.SWAP_FREE.name(), translator.localize(LocaleResources.HOST_SWAP_FREE)); + view.addMemoryChart(MemoryType.BUFFERS.name(), translator.localize(LocaleResources.HOST_BUFFERS)); + + view.addGraphVisibilityListener(listener); + view.addActionListener(new ActionListener<HostMemoryView.Action>() { + @Override + public void actionPerformed(ActionEvent<Action> actionEvent) { + switch (actionEvent.getActionId()) { + case HIDDEN: + stopBackgroundUpdates(); + break; + case VISIBLE: + startBackgroundUpdates(); + break; + default: + throw new NotImplementedException("action event not handled: " + actionEvent.getActionId()); + } + } + }); + + backgroundUpdateTimer = ApplicationContext.getInstance().getTimerFactory().createTimer(); + backgroundUpdateTimer.setAction(new Runnable() { + @Override + public void run() { + long memorySize = HostMemoryController.this.hostInfoDAO.getHostInfo(ref).getTotalMemory(); + String[] memorySizeParts = DisplayableValues.bytes(memorySize); + view.setTotalMemory(translator.localize(LocaleResources.NUMBER_AND_UNIT, memorySizeParts[0], memorySizeParts[1])); + doMemoryChartUpdate(); + } + }); + backgroundUpdateTimer.setSchedulingType(SchedulingType.FIXED_RATE); + backgroundUpdateTimer.setTimeUnit(TimeUnit.SECONDS); + backgroundUpdateTimer.setInitialDelay(0); + backgroundUpdateTimer.setDelay(5); + } + + private void startBackgroundUpdates() { + for (MemoryType type : MemoryType.values()) { + view.showMemoryChart(type.name()); + } + + backgroundUpdateTimer.start(); + } + + private void stopBackgroundUpdates() { + backgroundUpdateTimer.stop(); + for (MemoryType type : MemoryType.values()) { + view.hideMemoryChart(type.name()); + } + } + + public UIComponent getView() { + return view; + } + + private void doMemoryChartUpdate() { + List<DiscreteTimeData<? extends Number>> memFree = new LinkedList<>(); + List<DiscreteTimeData<? extends Number>> memTotal = new LinkedList<>(); + List<DiscreteTimeData<? extends Number>> memUsed = new LinkedList<>(); + List<DiscreteTimeData<? extends Number>> buf = new LinkedList<>(); + List<DiscreteTimeData<? extends Number>> swapTotal = new LinkedList<>(); + List<DiscreteTimeData<? extends Number>> swapFree = new LinkedList<>(); + + for (MemoryStat stat : memoryStatDAO.getLatestMemoryStats(ref, lastSeenTimeStamp)) { + long timeStamp = stat.getTimeStamp(); + memFree.add(new DiscreteTimeData<Long>(timeStamp, stat.getFree())); + memTotal.add(new DiscreteTimeData<Long>(timeStamp, stat.getTotal())); + memUsed.add(new DiscreteTimeData<Long>(timeStamp, stat.getTotal() - stat.getFree())); + buf.add(new DiscreteTimeData<Long>(timeStamp, stat.getBuffers())); + swapTotal.add(new DiscreteTimeData<Long>(timeStamp, stat.getSwapTotal())); + swapFree.add(new DiscreteTimeData<Long>(timeStamp, stat.getSwapFree())); + lastSeenTimeStamp = Math.max(lastSeenTimeStamp, stat.getTimeStamp()); + } + + view.addMemoryData(MemoryType.MEMORY_FREE.name(), memFree); + view.addMemoryData(MemoryType.MEMORY_TOTAL.name(), memTotal); + view.addMemoryData(MemoryType.MEMORY_USED.name(), memUsed); + view.addMemoryData(MemoryType.BUFFERS.name(), buf); + view.addMemoryData(MemoryType.SWAP_FREE.name(), swapFree); + view.addMemoryData(MemoryType.SWAP_TOTAL.name(), swapTotal); + } + + private class ShowHideGraph implements GraphVisibilityChangeListener { + @Override + public void show(String tag) { + view.showMemoryChart(tag); + } + @Override + public void hide(String tag) { + view.hideMemoryChart(tag); + } + } + + @Override + public String getLocalizedName() { + return translator.localize(LocaleResources.HOST_INFO_TAB_MEMORY); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/host-memory/client-core/src/main/java/com/redhat/thermostat/host/memory/client/core/HostMemoryService.java Tue Nov 27 14:49:03 2012 -0500 @@ -0,0 +1,76 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * This file is part of Thermostat. + * + * Thermostat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * Thermostat is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Thermostat; see the file COPYING. If not see + * <http://www.gnu.org/licenses/>. + * + * Linking this code with other modules is making a combined work + * based on this code. Thus, the terms and conditions of the GNU + * General Public License cover the whole combination. + * + * As a special exception, the copyright holders of this code give + * you permission to link this code with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also + * meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module + * which is not derived from or based on this code. If you modify + * this code, you may extend this exception to your version of the + * library, but you are not obligated to do so. If you do not wish + * to do so, delete this exception statement from your version. + */ + +package com.redhat.thermostat.host.memory.client.core; + +import com.redhat.thermostat.client.core.HostFilter; +import com.redhat.thermostat.client.core.HostInformationService; +import com.redhat.thermostat.client.core.controllers.HostInformationServiceController; +import com.redhat.thermostat.common.dao.HostInfoDAO; +import com.redhat.thermostat.common.dao.HostRef; +import com.redhat.thermostat.common.dao.MemoryStatDAO; +import com.redhat.thermostat.common.utils.OSGIUtils; + +public class HostMemoryService implements HostInformationService { + + private static final HostFilter FILTER = new HostFilter() { + @Override + public boolean matches(HostRef toMatch) { + return true; + } + }; + + private HostInfoDAO hostInfoDAO; + private MemoryStatDAO memoryStatDAO; + + public HostMemoryService(HostInfoDAO hostInfoDAO, MemoryStatDAO memoryStatDAO) { + this.hostInfoDAO = hostInfoDAO; + this.memoryStatDAO = memoryStatDAO; + } + + @Override + public HostFilter getFilter() { + return FILTER; + } + + @Override + public HostInformationServiceController getInformationServiceController( + HostRef ref) { + HostMemoryViewProvider provider = OSGIUtils.getInstance().getService(HostMemoryViewProvider.class); + return new HostMemoryController(hostInfoDAO, memoryStatDAO, ref, provider); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/host-memory/client-core/src/main/java/com/redhat/thermostat/host/memory/client/core/HostMemoryView.java Tue Nov 27 14:49:03 2012 -0500 @@ -0,0 +1,71 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * This file is part of Thermostat. + * + * Thermostat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * Thermostat is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Thermostat; see the file COPYING. If not see + * <http://www.gnu.org/licenses/>. + * + * Linking this code with other modules is making a combined work + * based on this code. Thus, the terms and conditions of the GNU + * General Public License cover the whole combination. + * + * As a special exception, the copyright holders of this code give + * you permission to link this code with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also + * meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module + * which is not derived from or based on this code. If you modify + * this code, you may extend this exception to your version of the + * library, but you are not obligated to do so. If you do not wish + * to do so, delete this exception statement from your version. + */ + +package com.redhat.thermostat.host.memory.client.core; + +import java.util.List; + +import com.redhat.thermostat.client.core.views.BasicView; +import com.redhat.thermostat.client.core.views.UIComponent; +import com.redhat.thermostat.storage.model.DiscreteTimeData; + +public abstract class HostMemoryView extends BasicView implements UIComponent { + + public interface GraphVisibilityChangeListener { + public void show(String tag); + + public void hide(String tag); + } + + public abstract void setTotalMemory(String totalMemory); + + public abstract void addMemoryChart(String tag, String humanReadableName); + + public abstract void removeMemoryChart(String tag); + + public abstract void showMemoryChart(String tag); + + public abstract void hideMemoryChart(String tag); + + public abstract void addMemoryData(String tag, List<DiscreteTimeData<? extends Number>> data); + + public abstract void clearMemoryData(String tag); + + public abstract void addGraphVisibilityListener(GraphVisibilityChangeListener listener); + + public abstract void removeGraphVisibilityListener(GraphVisibilityChangeListener listener); + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/host-memory/client-core/src/main/java/com/redhat/thermostat/host/memory/client/core/HostMemoryViewProvider.java Tue Nov 27 14:49:03 2012 -0500 @@ -0,0 +1,46 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * This file is part of Thermostat. + * + * Thermostat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * Thermostat is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Thermostat; see the file COPYING. If not see + * <http://www.gnu.org/licenses/>. + * + * Linking this code with other modules is making a combined work + * based on this code. Thus, the terms and conditions of the GNU + * General Public License cover the whole combination. + * + * As a special exception, the copyright holders of this code give + * you permission to link this code with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also + * meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module + * which is not derived from or based on this code. If you modify + * this code, you may extend this exception to your version of the + * library, but you are not obligated to do so. If you do not wish + * to do so, delete this exception statement from your version. + */ + +package com.redhat.thermostat.host.memory.client.core; + +import com.redhat.thermostat.client.core.views.ViewProvider; + +public interface HostMemoryViewProvider extends ViewProvider { + + @Override + public HostMemoryView createView(); + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/host-memory/client-core/src/main/java/com/redhat/thermostat/host/memory/client/locale/LocaleResources.java Tue Nov 27 14:49:03 2012 -0500 @@ -0,0 +1,67 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * This file is part of Thermostat. + * + * Thermostat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * Thermostat is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Thermostat; see the file COPYING. If not see + * <http://www.gnu.org/licenses/>. + * + * Linking this code with other modules is making a combined work + * based on this code. Thus, the terms and conditions of the GNU + * General Public License cover the whole combination. + * + * As a special exception, the copyright holders of this code give + * you permission to link this code with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also + * meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module + * which is not derived from or based on this code. If you modify + * this code, you may extend this exception to your version of the + * library, but you are not obligated to do so. If you do not wish + * to do so, delete this exception statement from your version. + */ + +package com.redhat.thermostat.host.memory.client.locale; + +import com.redhat.thermostat.common.locale.Translate; + +public enum LocaleResources { + NUMBER_AND_UNIT, + + HOST_INFO_TAB_MEMORY, + + HOST_INFO_MEMORY_TOTAL, + + HOST_MEMORY_SECTION_OVERVIEW, + HOST_MEMORY_CHART_TITLE, + HOST_MEMORY_CHART_TIME_LABEL, + HOST_MEMORY_CHART_SIZE_LABEL, + + HOST_MEMORY_TOTAL, + HOST_MEMORY_FREE, + HOST_MEMORY_USED, + HOST_SWAP_TOTAL, + HOST_SWAP_FREE, + HOST_BUFFERS, + ; + + static final String RESOURCE_BUNDLE = + "com.redhat.thermostat.host.memory.client.locale.strings"; + + public static Translate<LocaleResources> createLocalizer() { + return new Translate<>(RESOURCE_BUNDLE, LocaleResources.class); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/host-memory/client-core/src/main/resources/com/redhat/thermostat/host/memory/client/locale/strings.properties Tue Nov 27 14:49:03 2012 -0500 @@ -0,0 +1,17 @@ +NUMBER_AND_UNIT = {0} {1} + +HOST_INFO_TAB_MEMORY = Memory + +HOST_INFO_MEMORY_TOTAL = Total Memory + +HOST_MEMORY_SECTION_OVERVIEW = Memory +HOST_MEMORY_CHART_TITLE = Memory +HOST_MEMORY_CHART_TIME_LABEL = Time +HOST_MEMORY_CHART_SIZE_LABEL = Size ({0}) + +HOST_MEMORY_TOTAL = Total Memory +HOST_MEMORY_FREE = Free Memory +HOST_MEMORY_USED = Used Memory +HOST_SWAP_TOTAL = Total Swap +HOST_SWAP_FREE = Free Swap +HOST_BUFFERS = Buffers \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/host-memory/client-core/src/test/java/com/redhat/thermostat/host/memory/client/core/HostMemoryControllerTest.java Tue Nov 27 14:49:03 2012 -0500 @@ -0,0 +1,126 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * This file is part of Thermostat. + * + * Thermostat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * Thermostat is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Thermostat; see the file COPYING. If not see + * <http://www.gnu.org/licenses/>. + * + * Linking this code with other modules is making a combined work + * based on this code. Thus, the terms and conditions of the GNU + * General Public License cover the whole combination. + * + * As a special exception, the copyright holders of this code give + * you permission to link this code with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also + * meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module + * which is not derived from or based on this code. If you modify + * this code, you may extend this exception to your version of the + * library, but you are not obligated to do so. If you do not wish + * to do so, delete this exception statement from your version. + */ + +package com.redhat.thermostat.host.memory.client.core; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyLong; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.LinkedList; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; + +import com.redhat.thermostat.common.ActionEvent; +import com.redhat.thermostat.common.ActionListener; +import com.redhat.thermostat.common.Timer; +import com.redhat.thermostat.common.TimerFactory; +import com.redhat.thermostat.common.appctx.ApplicationContext; +import com.redhat.thermostat.common.appctx.ApplicationContextUtil; +import com.redhat.thermostat.common.dao.HostInfoDAO; +import com.redhat.thermostat.common.dao.HostRef; +import com.redhat.thermostat.common.dao.MemoryStatDAO; +import com.redhat.thermostat.host.memory.client.core.HostMemoryController; +import com.redhat.thermostat.host.memory.client.core.HostMemoryView; +import com.redhat.thermostat.host.memory.client.core.HostMemoryViewProvider; +import com.redhat.thermostat.storage.model.HostInfo; +import com.redhat.thermostat.storage.model.MemoryStat; + +public class HostMemoryControllerTest { + + @Before + public void setUp() { + ApplicationContextUtil.resetApplicationContext(); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) // any(List.class) + @Test + public void testUpdate() { + final long TOTAL_MEMORY = 512; + HostInfo hostInfo = new HostInfo("someHost", "someOS", "linux_0.0.1", "lreally_fast_cpu", 2, TOTAL_MEMORY); + HostInfoDAO hostInfoDAO = mock(HostInfoDAO.class); + when(hostInfoDAO.getHostInfo(any(HostRef.class))).thenReturn(hostInfo); + + MemoryStat memoryStat = new MemoryStat(1, 2, 3, 4, 5, 6, 7, 8); + List<MemoryStat> memoryStats = new LinkedList<>(); + memoryStats.add(memoryStat); + MemoryStatDAO memoryStatDAO = mock(MemoryStatDAO.class); + when(memoryStatDAO.getLatestMemoryStats(any(HostRef.class), anyLong())).thenReturn(memoryStats); + + Timer timer = mock(Timer.class); + ArgumentCaptor<Runnable> timerActionCaptor = ArgumentCaptor.forClass(Runnable.class); + doNothing().when(timer).setAction(timerActionCaptor.capture()); + + TimerFactory timerFactory = mock(TimerFactory.class); + when(timerFactory.createTimer()).thenReturn(timer); + ApplicationContext.getInstance().setTimerFactory(timerFactory); + + HostRef ref = mock(HostRef.class); + + HostMemoryView view = mock(HostMemoryView.class); + ArgumentCaptor<ActionListener> viewArgumentCaptor = ArgumentCaptor.forClass(ActionListener.class); + doNothing().when(view).addActionListener(viewArgumentCaptor.capture()); + + HostMemoryViewProvider viewProvider = mock(HostMemoryViewProvider.class); + when(viewProvider.createView()).thenReturn(view); + + @SuppressWarnings("unused") + HostMemoryController controller = new HostMemoryController(hostInfoDAO, memoryStatDAO, ref, viewProvider); + + ActionListener<HostMemoryView.Action> l = viewArgumentCaptor.getValue(); + + l.actionPerformed(new ActionEvent<>(view, HostMemoryView.Action.VISIBLE)); + + verify(timer).start(); + timerActionCaptor.getValue().run(); + + verify(view, times(1)).setTotalMemory(eq(TOTAL_MEMORY + " B")); + verify(view, times(6)).addMemoryData(any(String.class), any(List.class)); + + l.actionPerformed(new ActionEvent<>(view, HostMemoryView.Action.HIDDEN)); + + verify(timer).stop(); + + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/host-memory/client-swing/pom.xml Tue Nov 27 14:49:03 2012 -0500 @@ -0,0 +1,87 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <artifactId>thermostat-host-memory</artifactId> + <groupId>com.redhat.thermostat</groupId> + <version>0.5.0-SNAPSHOT</version> + </parent> + <artifactId>thermostat-host-memory-client-swing</artifactId> + <packaging>bundle</packaging> + <name>Thermostat Host Memory Swing Client plugin</name> + <build> + <plugins> + <plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-bundle-plugin</artifactId> + <extensions>true</extensions> + <configuration> + <instructions> + <Private-Package>com.redhat.thermostat.host.memory.client.swing</Private-Package> + <Bundle-Activator>com.redhat.thermostat.host.memory.client.swing.Activator</Bundle-Activator> + <Bundle-Vendor>Red Hat, Inc.</Bundle-Vendor> + <Bundle-SymbolicName>com.redhat.thermostat.host.memory.client.swing</Bundle-SymbolicName> + <!-- Do not autogenerate uses clauses in Manifests --> + <_nouses>true</_nouses> + </instructions> + </configuration> + </plugin> + </plugins> + </build> + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.easytesting</groupId> + <artifactId>fest-swing</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>net.java.openjdk.cacio</groupId> + <artifactId>cacio-tta</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.core</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.compendium</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.jfree</groupId> + <artifactId>jfreechart</artifactId> + </dependency> + <dependency> + <groupId>com.redhat.thermostat</groupId> + <artifactId>thermostat-common-core</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>com.redhat.thermostat</groupId> + <artifactId>thermostat-client-swing</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>com.redhat.thermostat</groupId> + <artifactId>thermostat-swing-components</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>com.redhat.thermostat</groupId> + <artifactId>thermostat-host-memory-client-core</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> +</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/host-memory/client-swing/src/main/java/com/redhat/thermostat/host/memory/client/swing/Activator.java Tue Nov 27 14:49:03 2012 -0500 @@ -0,0 +1,96 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * This file is part of Thermostat. + * + * Thermostat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * Thermostat is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Thermostat; see the file COPYING. If not see + * <http://www.gnu.org/licenses/>. + * + * Linking this code with other modules is making a combined work + * based on this code. Thus, the terms and conditions of the GNU + * General Public License cover the whole combination. + * + * As a special exception, the copyright holders of this code give + * you permission to link this code with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also + * meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module + * which is not derived from or based on this code. If you modify + * this code, you may extend this exception to your version of the + * library, but you are not obligated to do so. If you do not wish + * to do so, delete this exception statement from your version. + */ + +package com.redhat.thermostat.host.memory.client.swing; + +import java.util.Map; +import java.util.Objects; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; + +import com.redhat.thermostat.client.core.HostInformationService; +import com.redhat.thermostat.common.MultipleServiceTracker; +import com.redhat.thermostat.common.MultipleServiceTracker.Action; +import com.redhat.thermostat.common.dao.HostInfoDAO; +import com.redhat.thermostat.common.dao.MemoryStatDAO; +import com.redhat.thermostat.host.memory.client.core.HostMemoryService; +import com.redhat.thermostat.host.memory.client.core.HostMemoryViewProvider; + +public class Activator implements BundleActivator { + + private MultipleServiceTracker tracker; + private ServiceRegistration reg; + + @Override + public void start(final BundleContext context) throws Exception { + HostMemoryViewProvider viewProvider = new SwingHostMemoryViewProvider(); + context.registerService(HostMemoryViewProvider.class.getName(), viewProvider, null); + + Class<?>[] deps = new Class<?>[] { + HostInfoDAO.class, + MemoryStatDAO.class, + }; + + tracker = new MultipleServiceTracker(context, deps, new Action() { + + @Override + public void dependenciesAvailable(Map<String, Object> services) { + HostInfoDAO hostInfoDAO = (HostInfoDAO) services.get(HostInfoDAO.class.getName()); + Objects.requireNonNull(hostInfoDAO); + MemoryStatDAO memoryStatDAO = (MemoryStatDAO) services.get(MemoryStatDAO.class.getName()); + Objects.requireNonNull(memoryStatDAO); + HostMemoryService service = new HostMemoryService(hostInfoDAO, memoryStatDAO); + reg = context.registerService(HostInformationService.class.getName(), service, null); + } + + @Override + public void dependenciesUnavailable() { + reg.unregister(); + } + + }); + tracker.open(); + } + + @Override + public void stop(BundleContext context) throws Exception { + tracker.close(); + } + +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/host-memory/client-swing/src/main/java/com/redhat/thermostat/host/memory/client/swing/HostMemoryPanel.java Tue Nov 27 14:49:03 2012 -0500 @@ -0,0 +1,354 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * This file is part of Thermostat. + * + * Thermostat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * Thermostat is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Thermostat; see the file COPYING. If not see + * <http://www.gnu.org/licenses/>. + * + * Linking this code with other modules is making a combined work + * based on this code. Thus, the terms and conditions of the GNU + * General Public License cover the whole combination. + * + * As a special exception, the copyright holders of this code give + * you permission to link this code with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also + * meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module + * which is not derived from or based on this code. If you modify + * this code, you may extend this exception to your version of the + * library, but you are not obligated to do so. If you do not wish + * to do so, delete this exception statement from your version. + */ + +package com.redhat.thermostat.host.memory.client.swing; + +import java.awt.Color; +import java.awt.Component; +import java.awt.FlowLayout; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.SwingUtilities; +import javax.swing.text.JTextComponent; + +import org.jfree.chart.ChartFactory; +import org.jfree.chart.JFreeChart; +import org.jfree.chart.axis.NumberAxis; +import org.jfree.chart.renderer.xy.XYItemRenderer; +import org.jfree.data.time.FixedMillisecond; +import org.jfree.data.time.RegularTimePeriod; +import org.jfree.data.time.TimeSeries; +import org.jfree.data.time.TimeSeriesCollection; + +import com.redhat.thermostat.client.swing.SwingComponent; +import com.redhat.thermostat.client.swing.components.Components; +import com.redhat.thermostat.client.swing.components.RecentTimeSeriesChartPanel; +import com.redhat.thermostat.client.swing.components.ValueField; +import com.redhat.thermostat.client.ui.ChartColors; +import com.redhat.thermostat.client.ui.ComponentVisibleListener; +import com.redhat.thermostat.client.ui.RecentTimeSeriesChartController; +import com.redhat.thermostat.common.ActionListener; +import com.redhat.thermostat.common.locale.Translate; +import com.redhat.thermostat.common.utils.DisplayableValues; +import com.redhat.thermostat.common.utils.DisplayableValues.Scale; +import com.redhat.thermostat.host.memory.client.core.HostMemoryView; +import com.redhat.thermostat.host.memory.client.locale.LocaleResources; +import com.redhat.thermostat.storage.model.DiscreteTimeData; +import com.redhat.thermostat.swing.components.experimental.WrapLayout; + +public class HostMemoryPanel extends HostMemoryView implements SwingComponent { + + private static final Translate<LocaleResources> translator = LocaleResources.createLocalizer(); + + private JPanel visiblePanel; + + private final MemoryCheckboxListener memoryCheckboxListener = new MemoryCheckboxListener(); + + private final JTextComponent totalMemory = new ValueField("${TOTAL_MEMORY}"); + + private final JPanel memoryCheckBoxPanel = new JPanel(new WrapLayout(FlowLayout.LEADING)); + private final CopyOnWriteArrayList<GraphVisibilityChangeListener> listeners = new CopyOnWriteArrayList<>(); + private final TimeSeriesCollection memoryCollection = new TimeSeriesCollection(); + private final Map<String, TimeSeries> dataset = new HashMap<>(); + private final Map<String, JCheckBox> checkBoxes = new HashMap<>(); + private final Map<String, Color> colors = new HashMap<>(); + + private JFreeChart chart; + + public HostMemoryPanel() { + super(); + initializePanel(); + + visiblePanel.addHierarchyListener(new ComponentVisibleListener() { + @Override + public void componentShown(Component component) { + notifier.fireAction(Action.VISIBLE); + } + @Override + public void componentHidden(Component component) { + notifier.fireAction(Action.HIDDEN); + } + }); + } + + @Override + public void setTotalMemory(final String newValue) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + totalMemory.setText(newValue); + } + }); + } + + @Override + public Component getUiComponent() { + return visiblePanel; + } + + @Override + public void addMemoryChart(final String tag, final String humanReadableName) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + int colorIndex = colors.size(); + colors.put(tag, ChartColors.getColor(colorIndex)); + TimeSeries series = new TimeSeries(tag); + dataset.put(tag, series); + JCheckBox newCheckBox = new JCheckBox(createLabelWithLegend(humanReadableName, colors.get(tag))); + newCheckBox.setActionCommand(tag); + newCheckBox.setSelected(true); + newCheckBox.addActionListener(memoryCheckboxListener); + newCheckBox.setOpaque(false); + checkBoxes.put(tag, newCheckBox); + memoryCheckBoxPanel.add(newCheckBox); + + updateColors(); + } + }); + + } + + private String createLabelWithLegend(String text, Color color) { + String hexColor = "#" + Integer.toHexString(color.getRGB() & 0x00ffffff); + return "<html> <font color='" + hexColor + "'>\u2588</font> " + text + "</html>"; + } + + @Override + public void removeMemoryChart(final String tag) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + TimeSeries series = dataset.remove(tag); + memoryCollection.removeSeries(series); + JCheckBox box = checkBoxes.remove(tag); + memoryCheckBoxPanel.remove(box); + + updateColors(); + } + }); + } + + @Override + public void showMemoryChart(final String tag) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + TimeSeries series = dataset.get(tag); + memoryCollection.addSeries(series); + + updateColors(); + } + }); + } + + @Override + public void hideMemoryChart(final String tag) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + TimeSeries series = dataset.get(tag); + memoryCollection.removeSeries(series); + + updateColors(); + } + }); + } + + @Override + public void addMemoryData(final String tag, List<DiscreteTimeData<? extends Number>> data) { + final List<DiscreteTimeData<? extends Number>> copy = new ArrayList<>(data); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + final TimeSeries series = dataset.get(tag); + for (DiscreteTimeData<? extends Number> timeData: copy) { + RegularTimePeriod period = new FixedMillisecond(timeData.getTimeInMillis()); + if (series.getDataItem(period) == null) { + Long sizeInBytes = (Long) timeData.getData(); + Double sizeInMegaBytes = DisplayableValues.Scale.convertTo(Scale.MiB, sizeInBytes); + series.add(new FixedMillisecond(timeData.getTimeInMillis()), sizeInMegaBytes, false); + } + } + series.fireSeriesChanged(); + } + }); + } + + @Override + public void clearMemoryData(final String tag) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + TimeSeries series = dataset.get(tag); + series.clear(); + } + }); + } + + @Override + public void addGraphVisibilityListener(GraphVisibilityChangeListener listener) { + listeners.add(listener); + } + + @Override + public void removeGraphVisibilityListener(GraphVisibilityChangeListener listener) { + listeners.remove(listener); + } + + @Override + public void addActionListener(ActionListener<Action> listener) { + notifier.addActionListener(listener); + } + + @Override + public void removeActionListener(ActionListener<Action> listener) { + notifier.removeActionListener(listener); + } + + private void initializePanel() { + visiblePanel = new JPanel(); + visiblePanel.setOpaque(false); + + chart = createMemoryChart(); + + JPanel chartPanel = new RecentTimeSeriesChartPanel(new RecentTimeSeriesChartController(chart)); + chartPanel.setOpaque(false); + + JLabel lblMemory = Components.header(translator.localize(LocaleResources.HOST_MEMORY_SECTION_OVERVIEW)); + + JLabel totalMemoryLabel = Components.label(translator.localize(LocaleResources.HOST_INFO_MEMORY_TOTAL)); + + memoryCheckBoxPanel.setOpaque(false); + + GroupLayout groupLayout = new GroupLayout(visiblePanel); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(chartPanel, GroupLayout.DEFAULT_SIZE, 883, Short.MAX_VALUE) + .addGroup(groupLayout.createSequentialGroup() + .addGap(12) + .addComponent(totalMemoryLabel) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(totalMemory, GroupLayout.DEFAULT_SIZE, 751, Short.MAX_VALUE)) + .addComponent(lblMemory) + .addComponent(memoryCheckBoxPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblMemory) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(totalMemory, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(totalMemoryLabel)) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(chartPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(memoryCheckBoxPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + ); + visiblePanel.setLayout(groupLayout); + } + + private JFreeChart createMemoryChart() { + JFreeChart chart = ChartFactory.createTimeSeriesChart( + translator.localize(LocaleResources.HOST_MEMORY_CHART_TITLE), // Title + translator.localize(LocaleResources.HOST_MEMORY_CHART_TIME_LABEL), // x-axis Label + translator.localize(LocaleResources.HOST_MEMORY_CHART_SIZE_LABEL, Scale.MiB.name()), // y-axis Label + memoryCollection, // Dataset + false, // Show Legend + false, // Use tooltips + false // Configure chart to generate URLs? + ); + + chart.getPlot().setBackgroundPaint( new Color(255,255,255,0) ); + chart.getPlot().setBackgroundImageAlpha(0.0f); + chart.getPlot().setOutlinePaint(new Color(0,0,0,0)); + + NumberAxis rangeAxis = (NumberAxis) chart.getXYPlot().getRangeAxis(); + rangeAxis.setAutoRangeMinimumSize(100); + + return chart; + } + + private void fireShowHideHandlers(boolean show, String tag) { + for (GraphVisibilityChangeListener listener: listeners) { + if (show) { + listener.show(tag); + } else { + listener.hide(tag); + } + } + } + + /** + * Adding or removing series to the series collection may change the order + * of existing items. Plus the paint for the index is now out-of-date. So + * let's walk through all the series and set the right paint for those. + */ + private void updateColors() { + XYItemRenderer itemRenderer = chart.getXYPlot().getRenderer(); + for (int i = 0; i < memoryCollection.getSeriesCount(); i++) { + String tag = (String) memoryCollection.getSeriesKey(i); + Color color = colors.get(tag); + itemRenderer.setSeriesPaint(i, color); + } + } + + private class MemoryCheckboxListener implements java.awt.event.ActionListener { + @Override + public void actionPerformed(java.awt.event.ActionEvent e) { + JCheckBox source = (JCheckBox) e.getSource(); + fireShowHideHandlers(source.isSelected(), source.getActionCommand()); + } + + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/host-memory/client-swing/src/main/java/com/redhat/thermostat/host/memory/client/swing/SwingHostMemoryViewProvider.java Tue Nov 27 14:49:03 2012 -0500 @@ -0,0 +1,49 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * This file is part of Thermostat. + * + * Thermostat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * Thermostat is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Thermostat; see the file COPYING. If not see + * <http://www.gnu.org/licenses/>. + * + * Linking this code with other modules is making a combined work + * based on this code. Thus, the terms and conditions of the GNU + * General Public License cover the whole combination. + * + * As a special exception, the copyright holders of this code give + * you permission to link this code with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also + * meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module + * which is not derived from or based on this code. If you modify + * this code, you may extend this exception to your version of the + * library, but you are not obligated to do so. If you do not wish + * to do so, delete this exception statement from your version. + */ + +package com.redhat.thermostat.host.memory.client.swing; + +import com.redhat.thermostat.host.memory.client.core.HostMemoryView; +import com.redhat.thermostat.host.memory.client.core.HostMemoryViewProvider; + +public class SwingHostMemoryViewProvider implements HostMemoryViewProvider { + + @Override + public HostMemoryView createView() { + return new HostMemoryPanel(); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/host-memory/client-swing/src/test/java/com/redhat/thermostat/host/memory/client/swing/ActivatorTest.java Tue Nov 27 14:49:03 2012 -0500 @@ -0,0 +1,104 @@ +/* + * Copyright 2012 Red Hat, Inc. + * + * This file is part of Thermostat. + * + * Thermostat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * Thermostat is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Thermostat; see the file COPYING. If not see + * <http://www.gnu.org/licenses/>. + * + * Linking this code with other modules is making a combined work + * based on this code. Thus, the terms and conditions of the GNU + * General Public License cover the whole combination. + * + * As a special exception, the copyright holders of this code give + * you permission to link this code with independent modules to + * produce an executable, regardless of the license terms of these + * independent modules, and to copy and distribute the resulting + * executable under terms of your choice, provided that you also + * meet, for each linked independent module, the terms and conditions + * of the license of that module. An independent module is a module + * which is not derived from or based on this code. If you modify + * this code, you may extend this exception to your version of the + * library, but you are not obligated to do so. If you do not wish + * to do so, delete this exception statement from your version. + */ + +package com.redhat.thermostat.host.memory.client.swing; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; + +import org.junit.Test; + +import com.redhat.thermostat.client.core.HostInformationService; +import com.redhat.thermostat.common.dao.HostInfoDAO; +import com.redhat.thermostat.common.dao.MemoryStatDAO; +import com.redhat.thermostat.host.memory.client.core.HostMemoryService; +import com.redhat.thermostat.host.memory.client.core.HostMemoryViewProvider; +import com.redhat.thermostat.host.memory.client.swing.Activator; +import com.redhat.thermostat.host.memory.client.swing.SwingHostMemoryViewProvider; +import com.redhat.thermostat.test.StubBundleContext; + +public class ActivatorTest { + + @Test + public void verifyActivatorDoesNotRegisterServiceOnMissingDeps() throws Exception { + StubBundleContext context = new StubBundleContext(); + + Activator activator = new Activator(); + + activator.start(context); + + // View provider registers unconditionally + assertEquals(1, context.getAllServices().size()); + assertNotSame(1, context.getServiceListeners().size()); + + activator.stop(context); + + assertEquals(0, context.getServiceListeners().size()); + } + + @Test + public void verifyActivatorRegistersServices() throws Exception { + StubBundleContext context = new StubBundleContext(); + HostInfoDAO hostInfoDAO = mock(HostInfoDAO.class); + MemoryStatDAO memoryStatDAO = mock(MemoryStatDAO.class); + + context.registerService(HostInfoDAO.class, hostInfoDAO, null); + context.registerService(MemoryStatDAO.class, memoryStatDAO, null); + + Activator activator = new Activator(); + + activator.start(context); + + assertTrue(context.isServiceRegistered(HostInformationService.class.getName(), HostMemoryService.class)); + + activator.stop(context); + + assertEquals(0, context.getServiceListeners().size()); + assertEquals(3, context.getAllServices().size()); + } + + @Test + public void verifyStartRegistersViewProvider() throws Exception { + StubBundleContext ctx = new StubBundleContext(); + Activator activator = new Activator(); + activator.start(ctx); + assertTrue(ctx.isServiceRegistered(HostMemoryViewProvider.class.getName(), SwingHostMemoryViewProvider.class)); + assertEquals(1, ctx.getAllServices().size()); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/host-memory/pom.xml Tue Nov 27 14:49:03 2012 -0500 @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + Copyright 2012 Red Hat, Inc. + + This file is part of Thermostat. + + Thermostat is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 2, or (at your + option) any later version. + + Thermostat is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Thermostat; see the file COPYING. If not see + <http://www.gnu.org/licenses />. + + Linking this code with other modules is making a combined work + based on this code. Thus, the terms and conditions of the GNU + General Public License cover the whole combination. + + As a special exception, the copyright holders of this code give + you permission to link this code with independent modules to + produce an executable, regardless of the license terms of these + independent modules, and to copy and distribute the resulting + executable under terms of your choice, provided that you also + meet, for each linked independent module, the terms and conditions + of the license of that module. An independent module is a module + which is not derived from or based on this code. If you modify + this code, you may extend this exception to your version of the + library, but you are not obligated to do so. If you do not wish + to do so, delete this exception statement from your version. + +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>com.redhat.thermostat</groupId> + <artifactId>thermostat</artifactId> + <version>0.5.0-SNAPSHOT</version> + </parent> + + <artifactId>thermostat-host-memory</artifactId> + <packaging>pom</packaging> + + <name>Thermostat Host Memory plugin</name> + + <modules> + <module>client-core</module> + <module>client-swing</module> + </modules> + +</project>