/*
* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package net.java.visualvm.modules.glassfish.dataview;
import com.sun.appserv.management.monitor.ServletMonitor;
import com.sun.appserv.management.monitor.statistics.AltServletStats;
import com.sun.tools.visualvm.charts.ChartFactory;
import com.sun.tools.visualvm.charts.SimpleXYChartDescriptor;
import com.sun.tools.visualvm.charts.SimpleXYChartSupport;
import com.sun.tools.visualvm.core.scheduler.Quantum;
import com.sun.tools.visualvm.core.scheduler.ScheduledTask;
import com.sun.tools.visualvm.core.scheduler.Scheduler;
import com.sun.tools.visualvm.core.scheduler.SchedulerTask;
import com.sun.tools.visualvm.core.snapshot.Snapshot;
import com.sun.tools.visualvm.core.ui.DataSourceView;
import com.sun.tools.visualvm.core.ui.DataSourceViewProvider;
import com.sun.tools.visualvm.core.ui.DataSourceViewsManager;
import com.sun.tools.visualvm.core.ui.components.DataViewComponent;
import com.sun.tools.visualvm.uisupport.HTMLTextArea;
import java.lang.reflect.UndeclaredThrowableException;
import net.java.visualvm.modules.glassfish.datasource.GlassFishServlet;
import org.openide.util.ImageUtilities;
import java.awt.BorderLayout;
import java.awt.Image;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JPanel;
/**
*
* @author Jaroslav Bachorik
*/
public class GlassFishServletViewProvider extends DataSourceViewProvider<GlassFishServlet> {
private final static GlassFishServletViewProvider INSTANCE = new GlassFishServletViewProvider();
private final Map<GlassFishServlet, GlassfishServletView> viewMap = new HashMap<GlassFishServlet, GlassFishServletViewProvider.GlassfishServletView>();
//~ Inner Classes ------------------------------------------------------------------------------------------------------------
private static class GlassfishServletView extends DataSourceView {
//~ Static fields/initializers -------------------------------------------------------------------------------------------
private static final Image NODE_ICON = ImageUtilities.loadImage("net/java/visualvm/modules/glassfish/resources/servlet_icon.png",
true);
//~ Instance fields ------------------------------------------------------------------------------------------------------
private SimpleXYChartSupport reqsChart;
private SimpleXYChartSupport timesChart;
private DataViewComponent dvc;
private GlassFishServlet servlet;
private ScheduledTask refreshTask;
//~ Constructors ---------------------------------------------------------------------------------------------------------
public GlassfishServletView(GlassFishServlet servlet) {
super(servlet, servlet.getName(), NODE_ICON, 0, true);
this.servlet = servlet;
HTMLTextArea generalDataArea = new HTMLTextArea();
JPanel chartTimesPanel = new JPanel(new BorderLayout());
chartTimesPanel.setOpaque(false);
SimpleXYChartDescriptor desc = SimpleXYChartDescriptor.decimal(10, false, 500);
desc.addLineItems("Average Time","Maximum Time");
timesChart = ChartFactory.createSimpleXYChart(desc);
chartTimesPanel.add(timesChart.getChart(), BorderLayout.CENTER);
JPanel chartReqsPanel = new JPanel(new BorderLayout());
chartReqsPanel.setOpaque(false);
desc = SimpleXYChartDescriptor.decimal(10, false, 500);
desc.addLineItems("Request Count","Error Count");
reqsChart = ChartFactory.createSimpleXYChart(desc);
chartReqsPanel.add(reqsChart.getChart(), BorderLayout.CENTER);
DataViewComponent.MasterView masterView = new DataViewComponent.MasterView("Overview", null, generalDataArea);
DataViewComponent.MasterViewConfiguration masterConfiguration = new DataViewComponent.MasterViewConfiguration(false);
dvc = new DataViewComponent(masterView, masterConfiguration);
dvc.configureDetailsArea(new DataViewComponent.DetailsAreaConfiguration("Time Profile", true),
DataViewComponent.TOP_LEFT);
dvc.addDetailsView(new DataViewComponent.DetailsView("Time Profile", null, 10, chartTimesPanel, null),
DataViewComponent.TOP_LEFT);
dvc.configureDetailsArea(new DataViewComponent.DetailsAreaConfiguration("Requests", true),
DataViewComponent.BOTTOM_LEFT);
dvc.addDetailsView(new DataViewComponent.DetailsView("Requests", null, 10, chartReqsPanel, null),
DataViewComponent.BOTTOM_LEFT);
refreshTask = Scheduler.sharedInstance().schedule(new SchedulerTask() {
public void onSchedule(long timeStamp) {
try {
refreshData(timeStamp);
} catch (Exception e) {
if (!(e instanceof UndeclaredThrowableException)) {
System.out.println("Error: "+e.getMessage());
e.printStackTrace();
} else {
Scheduler.sharedInstance().unschedule(refreshTask);
refreshTask = null;
}
}
}
}, Quantum.seconds(3));
}
//~ Methods --------------------------------------------------------------------------------------------------------------
@Override
public DataViewComponent createComponent() {
return dvc;
}
private void refreshData(long sampleTime) {
ServletMonitor monitor = servlet.getMonitor();
AltServletStats stats = monitor.getAltServletStats();
timesChart.addValues(sampleTime,
new long[] {
Math.round((double) stats.getProcessingTime().getCount() / (double) stats.getRequestCount()
.getCount()),
stats.getMaxTime().getCount()
});
reqsChart.addValues(sampleTime,
new long[] { stats.getRequestCount().getCount(), stats.getErrorCount().getCount() });
}
}
private GlassFishServletViewProvider() {}
@Override
protected DataSourceView createView(GlassFishServlet servlet) {
return new GlassfishServletView(servlet);
}
@Override
protected boolean supportsViewFor(GlassFishServlet servlet) {
return true;
}
//~ Methods ------------------------------------------------------------------------------------------------------------------
public static void initialize() {
DataSourceViewsManager.sharedInstance().addViewProvider(INSTANCE, GlassFishServlet.class);
}
public static void shutdown() {
DataSourceViewsManager.sharedInstance().removeViewProvider(INSTANCE);
INSTANCE.viewMap.clear();
}
public boolean supportsViewsFor(GlassFishServlet dataSource) {
return true;
}
public void saveViews(GlassFishServlet servlet, Snapshot snapshot) {
// TODO implement later
}
public boolean supportsSaveViewsFor(GlassFishServlet servlet) {
return false;
}
}