Mercurial > hg > release > thermostat-0.6
changeset 720:4899326c902d
Move Swing-dependent code into separate bundles: vmclassstat
This commit splits the vmclassstat bundle into core and swing bundles.
Reviewed-by: omajid
Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2012-October/003815.html
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/vmclassstat/core/pom.xml Tue Oct 23 11:23:18 2012 -0400 @@ -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-client-vmclassstat</artifactId> + <groupId>com.redhat.thermostat</groupId> + <version>0.5.0-SNAPSHOT</version> + </parent> + <artifactId>thermostat-client-vmclassstat-core</artifactId> + <packaging>bundle</packaging> + <name>Thermostat Client VmClassStat Core 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.client.classstat.core</Bundle-SymbolicName> + <Export-Package> + com.redhat.thermostat.client.vmclassstat.core, + com.redhat.thermostat.client.vmclassstat.core.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/client/vmclassstat/core/src/main/java/com/redhat/thermostat/client/vmclassstat/core/LocaleResources.java Tue Oct 23 11:23:18 2012 -0400 @@ -0,0 +1,56 @@ +/* + * 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.vmclassstat.core; + +import com.redhat.thermostat.common.locale.Translate; + +public enum LocaleResources { + + VM_INFO_TAB_CLASSES, + VM_CLASSES_TITLE, + VM_CLASSES_CHART_REAL_TIME_LABEL, + VM_CLASSES_CHART_LOADED_CLASSES_LABEL, + + ; + + static final String RESOURCE_BUNDLE = + "com.redhat.thermostat.client.vmclassstat.strings"; + + public static Translate<LocaleResources> createLocalizer() { + return new Translate<>(RESOURCE_BUNDLE, LocaleResources.class); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/vmclassstat/core/src/main/java/com/redhat/thermostat/client/vmclassstat/core/VmClassStatController.java Tue Oct 23 11:23:18 2012 -0400 @@ -0,0 +1,134 @@ +/* + * 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.vmclassstat.core; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import com.redhat.thermostat.client.core.controllers.VmInformationServiceController; +import com.redhat.thermostat.client.core.views.UIComponent; +import com.redhat.thermostat.client.core.views.BasicView.Action; +import com.redhat.thermostat.client.vmclassstat.core.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.VmClassStatDAO; +import com.redhat.thermostat.common.dao.VmRef; +import com.redhat.thermostat.common.locale.Translate; +import com.redhat.thermostat.common.model.DiscreteTimeData; +import com.redhat.thermostat.common.model.VmClassStat; + +public class VmClassStatController implements VmInformationServiceController { + + private static final Translate<LocaleResources> translator = LocaleResources.createLocalizer(); + + private class UpdateChartData implements Runnable { + @Override + public void run() { + long timeStamp = lastSeenTimeStamp; + List<VmClassStat> latestClassStats = dao.getLatestClassStats(ref, timeStamp); + List<DiscreteTimeData<Long>> timeData = new ArrayList<>(); + for (VmClassStat stat : latestClassStats) { + timeData.add(new DiscreteTimeData<Long>(stat.getTimeStamp(), stat.getLoadedClasses())); + timeStamp = Math.max(timeStamp, stat.getTimeStamp()); + } + classesView.addClassCount(timeData); + lastSeenTimeStamp = timeStamp; + } + } + + private final VmClassStatView classesView; + private final VmRef ref; + private final VmClassStatDAO dao; + private final Timer timer; + private final Translate<LocaleResources> t = LocaleResources.createLocalizer(); + + private volatile long lastSeenTimeStamp = Long.MIN_VALUE; + + public VmClassStatController(VmClassStatDAO vmClassStatDao, VmRef ref, VmClassStatViewProvider viewProvider) { + this.ref = ref; + dao = vmClassStatDao; + timer = ApplicationContext.getInstance().getTimerFactory().createTimer(); + + timer.setAction(new UpdateChartData()); + timer.setSchedulingType(SchedulingType.FIXED_RATE); + timer.setTimeUnit(TimeUnit.SECONDS); + timer.setDelay(5); + timer.setInitialDelay(0); + + classesView = viewProvider.createView(); + + classesView.addActionListener(new ActionListener<VmClassStatView.Action>() { + @Override + public void actionPerformed(ActionEvent<Action> actionEvent) { + switch(actionEvent.getActionId()) { + case HIDDEN: + stop(); + break; + case VISIBLE: + start(); + break; + default: + throw new NotImplementedException("unknown action: " + actionEvent.getActionId()); + } + } + }); + } + + private void start() { + timer.start(); + } + + private void stop() { + timer.stop(); + } + + @Override + public String getLocalizedName() { + return t.localize(LocaleResources.VM_INFO_TAB_CLASSES); + } + + @Override + public UIComponent getView() { + return (UIComponent) classesView; + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/vmclassstat/core/src/main/java/com/redhat/thermostat/client/vmclassstat/core/VmClassStatService.java Tue Oct 23 11:23:18 2012 -0400 @@ -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.client.vmclassstat.core; + +import com.redhat.thermostat.client.core.VmFilter; +import com.redhat.thermostat.client.core.VmInformationService; +import com.redhat.thermostat.client.core.controllers.VmInformationServiceController; +import com.redhat.thermostat.client.osgi.service.AlwaysMatchFilter; +import com.redhat.thermostat.common.dao.VmClassStatDAO; +import com.redhat.thermostat.common.dao.VmRef; +import com.redhat.thermostat.common.utils.OSGIUtils; + +public class VmClassStatService implements VmInformationService { + + private VmFilter filter = new AlwaysMatchFilter(); + + private VmClassStatDAO vmClassStatDao; + + public VmClassStatService(VmClassStatDAO vmClassStatDao) { + this.vmClassStatDao = vmClassStatDao; + } + + @Override + public VmInformationServiceController getInformationServiceController(VmRef ref) { + VmClassStatViewProvider viewProvider = OSGIUtils.getInstance().getService(VmClassStatViewProvider.class); + return new VmClassStatController(vmClassStatDao, ref, viewProvider); + } + + @Override + public VmFilter getFilter() { + return filter; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/vmclassstat/core/src/main/java/com/redhat/thermostat/client/vmclassstat/core/VmClassStatView.java Tue Oct 23 11:23:18 2012 -0400 @@ -0,0 +1,51 @@ +/* + * 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.vmclassstat.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.common.model.DiscreteTimeData; + +public abstract class VmClassStatView extends BasicView implements UIComponent { + + public abstract void clearClassCount(); + + public abstract void addClassCount(List<DiscreteTimeData<Long>> data); + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/vmclassstat/core/src/main/java/com/redhat/thermostat/client/vmclassstat/core/VmClassStatViewProvider.java Tue Oct 23 11:23:18 2012 -0400 @@ -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.client.vmclassstat.core; + +import com.redhat.thermostat.client.core.views.ViewProvider; + + +public interface VmClassStatViewProvider extends ViewProvider { + + @Override + public VmClassStatView createView(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/vmclassstat/core/src/main/java/com/redhat/thermostat/client/vmclassstat/core/locale/LocaleResources.java Tue Oct 23 11:23:18 2012 -0400 @@ -0,0 +1,55 @@ +/* + * 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.vmclassstat.core.locale; + +import com.redhat.thermostat.common.locale.Translate; + +public enum LocaleResources { + + VM_LOADED_CLASSES, + VM_CLASSES_CHART_REAL_TIME_LABEL, + VM_CLASSES_CHART_LOADED_CLASSES_LABEL, + VM_INFO_TAB_CLASSES, + RESOURCE_MISSING; + + public static final String RESOURCE_BUNDLE = + "com.redhat.thermostat.client.vmclassstat.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/client/vmclassstat/core/src/main/resources/com/redhat/thermostat/client/vmclassstat/locale/strings.properties Tue Oct 23 11:23:18 2012 -0400 @@ -0,0 +1,5 @@ +RESOURCE_MISSING = Missing translation! +VM_LOADED_CLASSES = Loaded Classes +VM_CLASSES_CHART_REAL_TIME_LABEL = Time +VM_CLASSES_CHART_LOADED_CLASSES_LABEL = Number of loaded classes +VM_INFO_TAB_CLASSES = Classes \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/vmclassstat/core/src/main/resources/com/redhat/thermostat/client/vmclassstat/strings.properties Tue Oct 23 11:23:18 2012 -0400 @@ -0,0 +1,4 @@ +VM_INFO_TAB_CLASSES = Classes +VM_CLASSES_TITLE = Loaded Classes +VM_CLASSES_CHART_REAL_TIME_LABEL = Time +VM_CLASSES_CHART_LOADED_CLASSES_LABEL = Number of loaded classes
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/vmclassstat/core/src/test/java/com/redhat/thermostat/client/vmclassstat/core/LocaleResourcesTest.java Tue Oct 23 11:23:18 2012 -0400 @@ -0,0 +1,70 @@ +/* + * 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.vmclassstat.core; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +import org.junit.Test; + +public class LocaleResourcesTest { + + @Test + public void testLocalizedStringsArePresent() throws IOException { + + String stringsResource = "/" + LocaleResources.RESOURCE_BUNDLE.replace(".", "/") + ".properties"; + + Properties props = new Properties(); + try (InputStream stream = getClass().getResourceAsStream(stringsResource)) { + assertNotNull(stream); + + props.load(stream); + + assertEquals(LocaleResources.values().length, props.values().size()); + for (LocaleResources resource : LocaleResources.values()) { + assertTrue("missing property from resource bound file: " + resource, + props.containsKey(resource.name())); + } + + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/vmclassstat/core/src/test/java/com/redhat/thermostat/client/vmclassstat/core/VmClassStatControllerTest.java Tue Oct 23 11:23:18 2012 -0400 @@ -0,0 +1,107 @@ +/* + * 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.vmclassstat.core; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; + +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.dao.VmClassStatDAO; +import com.redhat.thermostat.common.dao.VmRef; +import com.redhat.thermostat.common.model.VmClassStat; + +public class VmClassStatControllerTest { + + @SuppressWarnings({ "unchecked", "rawtypes" }) // any(List.class) + @Test + public void testChartUpdate() { + + VmClassStat stat1 = new VmClassStat(123, 12345, 1234); + List<VmClassStat> stats = new ArrayList<VmClassStat>(); + stats.add(stat1); + + VmClassStatDAO vmClassStatDAO = mock(VmClassStatDAO.class); + when(vmClassStatDAO.getLatestClassStats(any(VmRef.class), anyInt())).thenReturn(stats).thenReturn(new ArrayList<VmClassStat>()); + + VmRef ref = mock(VmRef.class); + + 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); + + VmClassStatView view = mock(VmClassStatView.class); + ArgumentCaptor<ActionListener> viewArgumentCaptor = ArgumentCaptor.forClass(ActionListener.class); + doNothing().when(view).addActionListener(viewArgumentCaptor.capture()); + + VmClassStatViewProvider viewProvider = mock(VmClassStatViewProvider.class); + when(viewProvider.createView()).thenReturn(view); + + @SuppressWarnings("unused") + VmClassStatController controller = new VmClassStatController(vmClassStatDAO, ref, viewProvider); + + ActionListener<VmClassStatView.Action> l = viewArgumentCaptor.getValue(); + + l.actionPerformed(new ActionEvent<>(view, VmClassStatView.Action.VISIBLE)); + + verify(timer).start(); + timerActionCaptor.getValue().run(); + verify(view).addClassCount(any(List.class)); + + l.actionPerformed(new ActionEvent<>(view, VmClassStatView.Action.HIDDEN)); + + verify(timer).stop(); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/vmclassstat/core/src/test/java/com/redhat/thermostat/client/vmclassstat/core/locale/TranslateTest.java Tue Oct 23 11:23:18 2012 -0400 @@ -0,0 +1,79 @@ +/* + * 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.vmclassstat.core.locale; + +import java.io.IOException; +import java.util.Locale; +import java.util.Properties; + +import junit.framework.Assert; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.redhat.thermostat.common.locale.Translate; + +public class TranslateTest { + + private Locale lang; + + @Before + public void setUp() { + this.lang = Locale.getDefault(); + Locale.setDefault(Locale.US); + } + + @After + public void tearDown() { + Locale.setDefault(lang); + } + + @Test + public void verifyTranslationsAreThere() throws IOException { + + String stringsResource = "/" + LocaleResources.RESOURCE_BUNDLE.replace(".", "/") + ".properties"; + + Properties props = new Properties(); + props.load(getClass().getResourceAsStream(stringsResource)); + + Assert.assertEquals(LocaleResources.values().length, props.values().size()); + Translate<LocaleResources> t = LocaleResources.createLocalizer(); + Assert.assertEquals("Missing translation!", t.localize(LocaleResources.RESOURCE_MISSING)); + Assert.assertEquals("Classes", t.localize(LocaleResources.VM_INFO_TAB_CLASSES)); + } +}
--- a/client/vmclassstat/pom.xml Tue Oct 23 11:22:31 2012 -0400 +++ b/client/vmclassstat/pom.xml Tue Oct 23 11:23:18 2012 -0400 @@ -1,80 +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-client</artifactId> - <groupId>com.redhat.thermostat</groupId> <version>0.5.0-SNAPSHOT</version> </parent> + <artifactId>thermostat-client-vmclassstat</artifactId> - <packaging>bundle</packaging> + <packaging>pom</packaging> + <name>Thermostat Client VmClassStat 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.client.vmclassstat</Private-Package> - <Bundle-Activator>com.redhat.thermostat.client.vmclassstat.Activator</Bundle-Activator> - <Bundle-Vendor>Red Hat, Inc.</Bundle-Vendor> - <Bundle-SymbolicName>com.redhat.thermostat.client.classstat</Bundle-SymbolicName> - <Export-Package> - com.redhat.thermostat.client.vmclassstat.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.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-core</artifactId> - <version>${project.version}</version> - </dependency> - </dependencies> + + <modules> + <module>core</module> + <module>swing</module> + </modules> + </project>
--- a/client/vmclassstat/src/main/java/com/redhat/thermostat/client/vmclassstat/Activator.java Tue Oct 23 11:22:31 2012 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,90 +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.vmclassstat; - -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.VmInformationService; -import com.redhat.thermostat.client.osgi.service.ApplicationService; -import com.redhat.thermostat.common.MultipleServiceTracker; -import com.redhat.thermostat.common.MultipleServiceTracker.Action; -import com.redhat.thermostat.common.dao.VmClassStatDAO; - -public class Activator implements BundleActivator { - - private MultipleServiceTracker classStatTracker; - private ServiceRegistration classStatRegistration; - - @Override - public void start(final BundleContext context) throws Exception { - VmClassStatViewProvider viewProvider = new SwingVmClassStatViewProvider(); - context.registerService(VmClassStatViewProvider.class.getName(), viewProvider, null); - - Class<?>[] deps = new Class<?>[] { - ApplicationService.class, - VmClassStatDAO.class, - }; - - classStatTracker = new MultipleServiceTracker(context, deps, new Action() { - - @Override - public void dependenciesAvailable(Map<String, Object> services) { - VmClassStatDAO dao = (VmClassStatDAO) services.get(VmClassStatDAO.class.getName()); - Objects.requireNonNull(dao); - VmClassStatService service = new VmClassStatService(dao); - classStatRegistration = context.registerService(VmInformationService.class.getName(), service, null); - } - - @Override - public void dependenciesUnavailable() { - classStatRegistration.unregister(); - } - - }); - classStatTracker.open(); - } - - @Override - public void stop(BundleContext context) throws Exception { - classStatTracker.close(); - } -}
--- a/client/vmclassstat/src/main/java/com/redhat/thermostat/client/vmclassstat/LocaleResources.java Tue Oct 23 11:22:31 2012 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +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.vmclassstat; - -import com.redhat.thermostat.common.locale.Translate; - -public enum LocaleResources { - - VM_INFO_TAB_CLASSES, - VM_CLASSES_TITLE, - VM_CLASSES_CHART_REAL_TIME_LABEL, - VM_CLASSES_CHART_LOADED_CLASSES_LABEL, - - ; - - static final String RESOURCE_BUNDLE = - "com.redhat.thermostat.client.vmclassstat.strings"; - - public static Translate<LocaleResources> createLocalizer() { - return new Translate<>(RESOURCE_BUNDLE, LocaleResources.class); - } -}
--- a/client/vmclassstat/src/main/java/com/redhat/thermostat/client/vmclassstat/SwingVmClassStatViewProvider.java Tue Oct 23 11:22:31 2012 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +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.vmclassstat; - - -public class SwingVmClassStatViewProvider implements VmClassStatViewProvider { - - @Override - public VmClassStatView createView() { - return new VmClassStatPanel(); - } -}
--- a/client/vmclassstat/src/main/java/com/redhat/thermostat/client/vmclassstat/VmClassStatController.java Tue Oct 23 11:22:31 2012 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,134 +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.vmclassstat; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import com.redhat.thermostat.client.core.controllers.VmInformationServiceController; -import com.redhat.thermostat.client.core.views.UIComponent; -import com.redhat.thermostat.client.core.views.BasicView.Action; -import com.redhat.thermostat.client.vmclassstat.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.VmClassStatDAO; -import com.redhat.thermostat.common.dao.VmRef; -import com.redhat.thermostat.common.locale.Translate; -import com.redhat.thermostat.common.model.DiscreteTimeData; -import com.redhat.thermostat.common.model.VmClassStat; - -class VmClassStatController implements VmInformationServiceController { - - private static final Translate<LocaleResources> translator = LocaleResources.createLocalizer(); - - private class UpdateChartData implements Runnable { - @Override - public void run() { - long timeStamp = lastSeenTimeStamp; - List<VmClassStat> latestClassStats = dao.getLatestClassStats(ref, timeStamp); - List<DiscreteTimeData<Long>> timeData = new ArrayList<>(); - for (VmClassStat stat : latestClassStats) { - timeData.add(new DiscreteTimeData<Long>(stat.getTimeStamp(), stat.getLoadedClasses())); - timeStamp = Math.max(timeStamp, stat.getTimeStamp()); - } - classesView.addClassCount(timeData); - lastSeenTimeStamp = timeStamp; - } - } - - private final VmClassStatView classesView; - private final VmRef ref; - private final VmClassStatDAO dao; - private final Timer timer; - private final Translate<LocaleResources> t = LocaleResources.createLocalizer(); - - private volatile long lastSeenTimeStamp = Long.MIN_VALUE; - - public VmClassStatController(VmClassStatDAO vmClassStatDao, VmRef ref, VmClassStatViewProvider viewProvider) { - this.ref = ref; - dao = vmClassStatDao; - timer = ApplicationContext.getInstance().getTimerFactory().createTimer(); - - timer.setAction(new UpdateChartData()); - timer.setSchedulingType(SchedulingType.FIXED_RATE); - timer.setTimeUnit(TimeUnit.SECONDS); - timer.setDelay(5); - timer.setInitialDelay(0); - - classesView = viewProvider.createView(); - - classesView.addActionListener(new ActionListener<VmClassStatView.Action>() { - @Override - public void actionPerformed(ActionEvent<Action> actionEvent) { - switch(actionEvent.getActionId()) { - case HIDDEN: - stop(); - break; - case VISIBLE: - start(); - break; - default: - throw new NotImplementedException("unknown action: " + actionEvent.getActionId()); - } - } - }); - } - - private void start() { - timer.start(); - } - - private void stop() { - timer.stop(); - } - - @Override - public String getLocalizedName() { - return t.localize(LocaleResources.VM_INFO_TAB_CLASSES); - } - - @Override - public UIComponent getView() { - return (UIComponent) classesView; - } - -}
--- a/client/vmclassstat/src/main/java/com/redhat/thermostat/client/vmclassstat/VmClassStatPanel.java Tue Oct 23 11:22:31 2012 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,169 +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.vmclassstat; - -import java.awt.BorderLayout; -import java.awt.Component; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JComponent; -import javax.swing.SwingUtilities; - -import org.jfree.chart.ChartFactory; -import org.jfree.chart.JFreeChart; -import org.jfree.chart.axis.NumberAxis; -import org.jfree.chart.axis.NumberTickUnit; -import org.jfree.chart.axis.TickUnits; -import org.jfree.data.RangeType; -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.ui.ComponentVisibleListener; -import com.redhat.thermostat.client.ui.Components; -import com.redhat.thermostat.client.ui.RecentTimeSeriesChartController; -import com.redhat.thermostat.client.ui.RecentTimeSeriesChartPanel; -import com.redhat.thermostat.client.ui.SwingComponent; -import com.redhat.thermostat.client.vmclassstat.locale.LocaleResources; -import com.redhat.thermostat.common.ActionListener; -import com.redhat.thermostat.common.ActionNotifier; -import com.redhat.thermostat.common.locale.Translate; -import com.redhat.thermostat.common.model.DiscreteTimeData; -import com.redhat.thermostat.swing.HeaderPanel; - -public class VmClassStatPanel extends VmClassStatView implements SwingComponent { - - private static final Translate<LocaleResources> t = LocaleResources.createLocalizer(); - - private HeaderPanel visiblePanel; - - private final TimeSeriesCollection dataset = new TimeSeriesCollection(); - - private final ActionNotifier<Action> notifier = new ActionNotifier<Action>(this); - - public VmClassStatPanel() { - visiblePanel = new HeaderPanel(); - // any name works - dataset.addSeries(new TimeSeries("class-stat")); - - visiblePanel.setHeader(t.localize(LocaleResources.VM_LOADED_CLASSES)); - - JFreeChart chart = ChartFactory.createTimeSeriesChart( - null, - t.localize(LocaleResources.VM_CLASSES_CHART_REAL_TIME_LABEL), - t.localize(LocaleResources.VM_CLASSES_CHART_LOADED_CLASSES_LABEL), - dataset, - false, false, false); - - TickUnits tickUnits = new TickUnits(); - tickUnits.add(new NumberTickUnit(1)); - tickUnits.add(new NumberTickUnit(10)); - tickUnits.add(new NumberTickUnit(100)); - tickUnits.add(new NumberTickUnit(1000)); - tickUnits.add(new NumberTickUnit(10000)); - tickUnits.add(new NumberTickUnit(100000)); - tickUnits.add(new NumberTickUnit(1000000)); - - NumberAxis axis = (NumberAxis) chart.getXYPlot().getRangeAxis(); - axis.setStandardTickUnits(tickUnits); - axis.setRangeType(RangeType.POSITIVE); - axis.setAutoRangeMinimumSize(10); - - JComponent chartPanel = new RecentTimeSeriesChartPanel(new RecentTimeSeriesChartController(chart)); - - visiblePanel.setContent(chartPanel); - - 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 addActionListener(ActionListener<Action> listener) { - notifier.addActionListener(listener); - } - - @Override - public void removeActionListener(ActionListener<Action> listener) { - notifier.addActionListener(listener); - } - - @Override - public void addClassCount(List<DiscreteTimeData<Long>> data) { - final List<DiscreteTimeData<Long>> copy = new ArrayList<>(data); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - TimeSeries series = dataset.getSeries(0); - for (DiscreteTimeData<Long> data: copy) { - RegularTimePeriod period = new FixedMillisecond(data.getTimeInMillis()); - if (series.getDataItem(period) == null) { - series.add(period, data.getData(), false); - } - } - series.fireSeriesChanged(); - } - }); - - } - - @Override - public void clearClassCount() { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - TimeSeries series = dataset.getSeries(0); - series.clear(); - } - }); - } - - @Override - public Component getUiComponent() { - return visiblePanel; - } -}
--- a/client/vmclassstat/src/main/java/com/redhat/thermostat/client/vmclassstat/VmClassStatService.java Tue Oct 23 11:22:31 2012 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +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.vmclassstat; - -import com.redhat.thermostat.client.core.VmFilter; -import com.redhat.thermostat.client.core.VmInformationService; -import com.redhat.thermostat.client.core.controllers.VmInformationServiceController; -import com.redhat.thermostat.client.osgi.service.AlwaysMatchFilter; -import com.redhat.thermostat.common.dao.VmClassStatDAO; -import com.redhat.thermostat.common.dao.VmRef; -import com.redhat.thermostat.common.utils.OSGIUtils; - -class VmClassStatService implements VmInformationService { - - private VmFilter filter = new AlwaysMatchFilter(); - - private VmClassStatDAO vmClassStatDao; - - public VmClassStatService(VmClassStatDAO vmClassStatDao) { - this.vmClassStatDao = vmClassStatDao; - } - - @Override - public VmInformationServiceController getInformationServiceController(VmRef ref) { - VmClassStatViewProvider viewProvider = OSGIUtils.getInstance().getService(VmClassStatViewProvider.class); - return new VmClassStatController(vmClassStatDao, ref, viewProvider); - } - - @Override - public VmFilter getFilter() { - return filter; - } -}
--- a/client/vmclassstat/src/main/java/com/redhat/thermostat/client/vmclassstat/VmClassStatView.java Tue Oct 23 11:22:31 2012 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +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.vmclassstat; - -import java.util.List; - -import com.redhat.thermostat.client.core.views.BasicView; -import com.redhat.thermostat.client.core.views.UIComponent; -import com.redhat.thermostat.common.model.DiscreteTimeData; - -public abstract class VmClassStatView extends BasicView implements UIComponent { - - public abstract void clearClassCount(); - - public abstract void addClassCount(List<DiscreteTimeData<Long>> data); - -}
--- a/client/vmclassstat/src/main/java/com/redhat/thermostat/client/vmclassstat/VmClassStatViewProvider.java Tue Oct 23 11:22:31 2012 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +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.vmclassstat; - -import com.redhat.thermostat.client.core.views.ViewProvider; - - -public interface VmClassStatViewProvider extends ViewProvider { - - @Override - public VmClassStatView createView(); -}
--- a/client/vmclassstat/src/main/java/com/redhat/thermostat/client/vmclassstat/locale/LocaleResources.java Tue Oct 23 11:22:31 2012 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +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.vmclassstat.locale; - -import com.redhat.thermostat.common.locale.Translate; - -public enum LocaleResources { - - VM_LOADED_CLASSES, - VM_CLASSES_CHART_REAL_TIME_LABEL, - VM_CLASSES_CHART_LOADED_CLASSES_LABEL, - VM_INFO_TAB_CLASSES, - RESOURCE_MISSING; - - public static final String RESOURCE_BUNDLE = - "com.redhat.thermostat.client.vmclassstat.locale.strings"; - - public static Translate<LocaleResources> createLocalizer() { - return new Translate<>(RESOURCE_BUNDLE, LocaleResources.class); - } -}
--- a/client/vmclassstat/src/main/resources/com/redhat/thermostat/client/vmclassstat/locale/strings.properties Tue Oct 23 11:22:31 2012 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -RESOURCE_MISSING = Missing translation! -VM_LOADED_CLASSES = Loaded Classes -VM_CLASSES_CHART_REAL_TIME_LABEL = Time -VM_CLASSES_CHART_LOADED_CLASSES_LABEL = Number of loaded classes -VM_INFO_TAB_CLASSES = Classes \ No newline at end of file
--- a/client/vmclassstat/src/main/resources/com/redhat/thermostat/client/vmclassstat/strings.properties Tue Oct 23 11:22:31 2012 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -VM_INFO_TAB_CLASSES = Classes -VM_CLASSES_TITLE = Loaded Classes -VM_CLASSES_CHART_REAL_TIME_LABEL = Time -VM_CLASSES_CHART_LOADED_CLASSES_LABEL = Number of loaded classes
--- a/client/vmclassstat/src/test/java/com/redhat/thermostat/client/vmclassstat/ActivatorTest.java Tue Oct 23 11:22:31 2012 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +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.vmclassstat; - -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.VmInformationService; -import com.redhat.thermostat.client.osgi.service.ApplicationService; -import com.redhat.thermostat.common.dao.VmClassStatDAO; -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(); - ApplicationService appService = mock(ApplicationService.class); - VmClassStatDAO daoService = mock(VmClassStatDAO.class); - - context.registerService(ApplicationService.class, appService, null); - context.registerService(VmClassStatDAO.class, daoService, null); - - Activator activator = new Activator(); - - activator.start(context); - - assertTrue(context.isServiceRegistered(VmInformationService.class.getName(), VmClassStatService.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(VmClassStatViewProvider.class.getName(), SwingVmClassStatViewProvider.class)); - assertEquals(1, ctx.getAllServices().size()); - } -}
--- a/client/vmclassstat/src/test/java/com/redhat/thermostat/client/vmclassstat/LocaleResourcesTest.java Tue Oct 23 11:22:31 2012 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +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.vmclassstat; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -import org.junit.Test; - -public class LocaleResourcesTest { - - @Test - public void testLocalizedStringsArePresent() throws IOException { - - String stringsResource = "/" + LocaleResources.RESOURCE_BUNDLE.replace(".", "/") + ".properties"; - - Properties props = new Properties(); - try (InputStream stream = getClass().getResourceAsStream(stringsResource)) { - assertNotNull(stream); - - props.load(stream); - - assertEquals(LocaleResources.values().length, props.values().size()); - for (LocaleResources resource : LocaleResources.values()) { - assertTrue("missing property from resource bound file: " + resource, - props.containsKey(resource.name())); - } - - } - } -}
--- a/client/vmclassstat/src/test/java/com/redhat/thermostat/client/vmclassstat/VmClassStatControllerTest.java Tue Oct 23 11:22:31 2012 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,107 +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.vmclassstat; - -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.util.ArrayList; -import java.util.List; - -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.dao.VmClassStatDAO; -import com.redhat.thermostat.common.dao.VmRef; -import com.redhat.thermostat.common.model.VmClassStat; - -public class VmClassStatControllerTest { - - @SuppressWarnings({ "unchecked", "rawtypes" }) // any(List.class) - @Test - public void testChartUpdate() { - - VmClassStat stat1 = new VmClassStat(123, 12345, 1234); - List<VmClassStat> stats = new ArrayList<VmClassStat>(); - stats.add(stat1); - - VmClassStatDAO vmClassStatDAO = mock(VmClassStatDAO.class); - when(vmClassStatDAO.getLatestClassStats(any(VmRef.class), anyInt())).thenReturn(stats).thenReturn(new ArrayList<VmClassStat>()); - - VmRef ref = mock(VmRef.class); - - 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); - - VmClassStatView view = mock(VmClassStatView.class); - ArgumentCaptor<ActionListener> viewArgumentCaptor = ArgumentCaptor.forClass(ActionListener.class); - doNothing().when(view).addActionListener(viewArgumentCaptor.capture()); - - VmClassStatViewProvider viewProvider = mock(VmClassStatViewProvider.class); - when(viewProvider.createView()).thenReturn(view); - - @SuppressWarnings("unused") - VmClassStatController controller = new VmClassStatController(vmClassStatDAO, ref, viewProvider); - - ActionListener<VmClassStatView.Action> l = viewArgumentCaptor.getValue(); - - l.actionPerformed(new ActionEvent<>(view, VmClassStatView.Action.VISIBLE)); - - verify(timer).start(); - timerActionCaptor.getValue().run(); - verify(view).addClassCount(any(List.class)); - - l.actionPerformed(new ActionEvent<>(view, VmClassStatView.Action.HIDDEN)); - - verify(timer).stop(); - } - -}
--- a/client/vmclassstat/src/test/java/com/redhat/thermostat/client/vmclassstat/VmClassStatPanelTest.java Tue Oct 23 11:22:31 2012 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +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.vmclassstat; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JPanel; - -import net.java.openjdk.cacio.ctc.junit.CacioFESTRunner; - -import org.fest.swing.edt.FailOnThreadViolationRepaintManager; -import org.fest.swing.edt.GuiActionRunner; -import org.fest.swing.edt.GuiTask; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; - -import com.redhat.thermostat.common.model.DiscreteTimeData; - -@RunWith(CacioFESTRunner.class) -public class VmClassStatPanelTest { - - @BeforeClass - public static void setUpOnce() { - FailOnThreadViolationRepaintManager.install(); - } - - @Test - public void testAddDataTwice() { - GuiActionRunner.execute(new GuiTask() { - @Override - protected void executeInEDT() throws Throwable { - VmClassStatPanel panel = new VmClassStatPanel(); - List<DiscreteTimeData<Long>> data = new ArrayList<>(); - panel.addClassCount(data); - int numComponents = ((JPanel)panel.getUiComponent()).getComponentCount(); - assertTrue(numComponents > 0); - panel.addClassCount(data); - assertEquals(numComponents, ((JPanel)panel.getUiComponent()).getComponentCount()); - } - }); - } - -}
--- a/client/vmclassstat/src/test/java/com/redhat/thermostat/client/vmclassstat/locale/TranslateTest.java Tue Oct 23 11:22:31 2012 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +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.vmclassstat.locale; - -import java.io.IOException; -import java.util.Locale; -import java.util.Properties; - -import junit.framework.Assert; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.redhat.thermostat.common.locale.Translate; - -public class TranslateTest { - - private Locale lang; - - @Before - public void setUp() { - this.lang = Locale.getDefault(); - Locale.setDefault(Locale.US); - } - - @After - public void tearDown() { - Locale.setDefault(lang); - } - - @Test - public void verifyTranslationsAreThere() throws IOException { - - String stringsResource = "/" + LocaleResources.RESOURCE_BUNDLE.replace(".", "/") + ".properties"; - - Properties props = new Properties(); - props.load(getClass().getResourceAsStream(stringsResource)); - - Assert.assertEquals(LocaleResources.values().length, props.values().size()); - Translate<LocaleResources> t = LocaleResources.createLocalizer(); - Assert.assertEquals("Missing translation!", t.localize(LocaleResources.RESOURCE_MISSING)); - Assert.assertEquals("Classes", t.localize(LocaleResources.VM_INFO_TAB_CLASSES)); - } -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/vmclassstat/swing/pom.xml Tue Oct 23 11:23:18 2012 -0400 @@ -0,0 +1,82 @@ +<?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-client-vmclassstat</artifactId> + <groupId>com.redhat.thermostat</groupId> + <version>0.5.0-SNAPSHOT</version> + </parent> + <artifactId>thermostat-client-vmclassstat-swing</artifactId> + <packaging>bundle</packaging> + <name>Thermostat Client VmClassStat Swing 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.client.vmclassstat.swing</Private-Package> + <Bundle-Activator>com.redhat.thermostat.client.vmclassstat.swing.Activator</Bundle-Activator> + <Bundle-Vendor>Red Hat, Inc.</Bundle-Vendor> + <Bundle-SymbolicName>com.redhat.thermostat.client.classstat.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-client-vmclassstat-core</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> +</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/vmclassstat/swing/src/main/java/com/redhat/thermostat/client/vmclassstat/swing/Activator.java Tue Oct 23 11:23:18 2012 -0400 @@ -0,0 +1,92 @@ +/* + * 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.vmclassstat.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.VmInformationService; +import com.redhat.thermostat.client.osgi.service.ApplicationService; +import com.redhat.thermostat.client.vmclassstat.core.VmClassStatService; +import com.redhat.thermostat.client.vmclassstat.core.VmClassStatViewProvider; +import com.redhat.thermostat.common.MultipleServiceTracker; +import com.redhat.thermostat.common.MultipleServiceTracker.Action; +import com.redhat.thermostat.common.dao.VmClassStatDAO; + +public class Activator implements BundleActivator { + + private MultipleServiceTracker classStatTracker; + private ServiceRegistration classStatRegistration; + + @Override + public void start(final BundleContext context) throws Exception { + VmClassStatViewProvider viewProvider = new SwingVmClassStatViewProvider(); + context.registerService(VmClassStatViewProvider.class.getName(), viewProvider, null); + + Class<?>[] deps = new Class<?>[] { + ApplicationService.class, + VmClassStatDAO.class, + }; + + classStatTracker = new MultipleServiceTracker(context, deps, new Action() { + + @Override + public void dependenciesAvailable(Map<String, Object> services) { + VmClassStatDAO dao = (VmClassStatDAO) services.get(VmClassStatDAO.class.getName()); + Objects.requireNonNull(dao); + VmClassStatService service = new VmClassStatService(dao); + classStatRegistration = context.registerService(VmInformationService.class.getName(), service, null); + } + + @Override + public void dependenciesUnavailable() { + classStatRegistration.unregister(); + } + + }); + classStatTracker.open(); + } + + @Override + public void stop(BundleContext context) throws Exception { + classStatTracker.close(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/vmclassstat/swing/src/main/java/com/redhat/thermostat/client/vmclassstat/swing/SwingVmClassStatViewProvider.java Tue Oct 23 11:23:18 2012 -0400 @@ -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.client.vmclassstat.swing; + +import com.redhat.thermostat.client.vmclassstat.core.VmClassStatView; +import com.redhat.thermostat.client.vmclassstat.core.VmClassStatViewProvider; + + +public class SwingVmClassStatViewProvider implements VmClassStatViewProvider { + + @Override + public VmClassStatView createView() { + return new VmClassStatPanel(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/vmclassstat/swing/src/main/java/com/redhat/thermostat/client/vmclassstat/swing/VmClassStatPanel.java Tue Oct 23 11:23:18 2012 -0400 @@ -0,0 +1,168 @@ +/* + * 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.vmclassstat.swing; + +import java.awt.Component; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JComponent; +import javax.swing.SwingUtilities; + +import org.jfree.chart.ChartFactory; +import org.jfree.chart.JFreeChart; +import org.jfree.chart.axis.NumberAxis; +import org.jfree.chart.axis.NumberTickUnit; +import org.jfree.chart.axis.TickUnits; +import org.jfree.data.RangeType; +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.HeaderPanel; +import com.redhat.thermostat.client.swing.components.RecentTimeSeriesChartPanel; +import com.redhat.thermostat.client.ui.ComponentVisibleListener; +import com.redhat.thermostat.client.ui.RecentTimeSeriesChartController; +import com.redhat.thermostat.client.vmclassstat.core.VmClassStatView; +import com.redhat.thermostat.client.vmclassstat.core.locale.LocaleResources; +import com.redhat.thermostat.common.ActionListener; +import com.redhat.thermostat.common.ActionNotifier; +import com.redhat.thermostat.common.locale.Translate; +import com.redhat.thermostat.common.model.DiscreteTimeData; + +public class VmClassStatPanel extends VmClassStatView implements SwingComponent { + + private static final Translate<LocaleResources> t = LocaleResources.createLocalizer(); + + private HeaderPanel visiblePanel; + + private final TimeSeriesCollection dataset = new TimeSeriesCollection(); + + private final ActionNotifier<Action> notifier = new ActionNotifier<Action>(this); + + public VmClassStatPanel() { + visiblePanel = new HeaderPanel(); + // any name works + dataset.addSeries(new TimeSeries("class-stat")); + + visiblePanel.setHeader(t.localize(LocaleResources.VM_LOADED_CLASSES)); + + JFreeChart chart = ChartFactory.createTimeSeriesChart( + null, + t.localize(LocaleResources.VM_CLASSES_CHART_REAL_TIME_LABEL), + t.localize(LocaleResources.VM_CLASSES_CHART_LOADED_CLASSES_LABEL), + dataset, + false, false, false); + + TickUnits tickUnits = new TickUnits(); + tickUnits.add(new NumberTickUnit(1)); + tickUnits.add(new NumberTickUnit(10)); + tickUnits.add(new NumberTickUnit(100)); + tickUnits.add(new NumberTickUnit(1000)); + tickUnits.add(new NumberTickUnit(10000)); + tickUnits.add(new NumberTickUnit(100000)); + tickUnits.add(new NumberTickUnit(1000000)); + + NumberAxis axis = (NumberAxis) chart.getXYPlot().getRangeAxis(); + axis.setStandardTickUnits(tickUnits); + axis.setRangeType(RangeType.POSITIVE); + axis.setAutoRangeMinimumSize(10); + + JComponent chartPanel = new RecentTimeSeriesChartPanel(new RecentTimeSeriesChartController(chart)); + + visiblePanel.setContent(chartPanel); + + 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 addActionListener(ActionListener<Action> listener) { + notifier.addActionListener(listener); + } + + @Override + public void removeActionListener(ActionListener<Action> listener) { + notifier.addActionListener(listener); + } + + @Override + public void addClassCount(List<DiscreteTimeData<Long>> data) { + final List<DiscreteTimeData<Long>> copy = new ArrayList<>(data); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + TimeSeries series = dataset.getSeries(0); + for (DiscreteTimeData<Long> data: copy) { + RegularTimePeriod period = new FixedMillisecond(data.getTimeInMillis()); + if (series.getDataItem(period) == null) { + series.add(period, data.getData(), false); + } + } + series.fireSeriesChanged(); + } + }); + + } + + @Override + public void clearClassCount() { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + TimeSeries series = dataset.getSeries(0); + series.clear(); + } + }); + } + + @Override + public Component getUiComponent() { + return visiblePanel; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/vmclassstat/swing/src/test/java/com/redhat/thermostat/client/vmclassstat/swing/ActivatorTest.java Tue Oct 23 11:23:18 2012 -0400 @@ -0,0 +1,101 @@ +/* + * 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.vmclassstat.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.VmInformationService; +import com.redhat.thermostat.client.osgi.service.ApplicationService; +import com.redhat.thermostat.client.vmclassstat.core.VmClassStatService; +import com.redhat.thermostat.client.vmclassstat.core.VmClassStatViewProvider; +import com.redhat.thermostat.common.dao.VmClassStatDAO; +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(); + ApplicationService appService = mock(ApplicationService.class); + VmClassStatDAO daoService = mock(VmClassStatDAO.class); + + context.registerService(ApplicationService.class, appService, null); + context.registerService(VmClassStatDAO.class, daoService, null); + + Activator activator = new Activator(); + + activator.start(context); + + assertTrue(context.isServiceRegistered(VmInformationService.class.getName(), VmClassStatService.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(VmClassStatViewProvider.class.getName(), SwingVmClassStatViewProvider.class)); + assertEquals(1, ctx.getAllServices().size()); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/vmclassstat/swing/src/test/java/com/redhat/thermostat/client/vmclassstat/swing/VmClassStatPanelTest.java Tue Oct 23 11:23:18 2012 -0400 @@ -0,0 +1,82 @@ +/* + * 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.vmclassstat.swing; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JPanel; + +import net.java.openjdk.cacio.ctc.junit.CacioFESTRunner; + +import org.fest.swing.edt.FailOnThreadViolationRepaintManager; +import org.fest.swing.edt.GuiActionRunner; +import org.fest.swing.edt.GuiTask; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; + +import com.redhat.thermostat.common.model.DiscreteTimeData; + +@RunWith(CacioFESTRunner.class) +public class VmClassStatPanelTest { + + @BeforeClass + public static void setUpOnce() { + FailOnThreadViolationRepaintManager.install(); + } + + @Test + public void testAddDataTwice() { + GuiActionRunner.execute(new GuiTask() { + @Override + protected void executeInEDT() throws Throwable { + VmClassStatPanel panel = new VmClassStatPanel(); + List<DiscreteTimeData<Long>> data = new ArrayList<>(); + panel.addClassCount(data); + int numComponents = ((JPanel)panel.getUiComponent()).getComponentCount(); + assertTrue(numComponents > 0); + panel.addClassCount(data); + assertEquals(numComponents, ((JPanel)panel.getUiComponent()).getComponentCount()); + } + }); + } + +}