package com.bagri.tools.vvm.ui; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Comparator; import java.util.List; import java.util.Set; import java.util.TreeSet; import java.util.logging.Logger; import javax.management.openmbean.CompositeData; import javax.management.openmbean.TabularData; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JToggleButton; //import org.jfree.chart.ChartFactory; //import org.jfree.chart.ChartPanel; //import org.jfree.chart.JFreeChart; //import org.jfree.chart.plot.PlotOrientation; //import org.jfree.data.category.CategoryDataset; //import org.netbeans.lib.profiler.ui.charts.BarChart; import com.bagri.tools.vvm.event.ApplicationEvent; import com.bagri.tools.vvm.event.EventBus; import com.bagri.tools.vvm.model.Schema; import com.bagri.tools.vvm.service.SchemaManagementService; import com.bagri.tools.vvm.service.ServiceException; import com.sun.tools.visualvm.charts.ChartFactory; import com.sun.tools.visualvm.charts.SimpleXYChartDescriptor; import com.sun.tools.visualvm.charts.SimpleXYChartSupport; public class SchemaCapacityPanel extends JPanel { private static final Logger LOGGER = Logger.getLogger(SchemaCapacityPanel.class.getName()); private final String schemaName; private final SchemaManagementService schemaService; private final EventBus<ApplicationEvent> eventBus; private int partSize; private JPanel header; private SimpleXYChartSupport chart; //private BarChart chart; public SchemaCapacityPanel(String schemaName, SchemaManagementService schemaService, EventBus<ApplicationEvent> eventBus) { super(new BorderLayout()); this.schemaName = schemaName; this.schemaService = schemaService; this.eventBus = eventBus; createChart(); header = new JPanel(new GridLayout(2, 4)); header.add(new JLabel("Total elements cost:")); header.add(new JLabel("Total content cost:")); header.add(new JLabel("Total results cost:")); JPanel panel = new JPanel(new BorderLayout()); // new GridLayout(1, 3)); JButton refresh = new JButton("Refresh"); refresh.setToolTipText("Reload chart..."); refresh.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { onRefresh(); } }); refresh.setPreferredSize(new Dimension(100, 22)); panel.setBackground(chart.getChart().getBackground()); panel.add(refresh, BorderLayout.EAST); //CENTER); header.add(panel); header.add(new JLabel("Total indices cost:")); header.add(new JLabel("Total documents cost:")); header.add(new JLabel("Overall cost:")); panel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0)); //new BorderLayout()); //new GridLayout(1, 2)); panel.setBackground(chart.getChart().getBackground()); ButtonGroup bGroup = new ButtonGroup(); JToggleButton parts = new JToggleButton("Partitions", true); parts.setPreferredSize(new Dimension(100, 22)); JToggleButton nodes = new JToggleButton("Nodes"); nodes.setPreferredSize(new Dimension(100, 22)); bGroup.add(parts); bGroup.add(nodes); panel.add(parts); //, BorderLayout.EAST); panel.add(nodes); //, BorderLayout.EAST); header.add(panel); header.setPreferredSize(new Dimension(500, 50)); header.setBackground(chart.getChart().getBackground()); add(header, BorderLayout.PAGE_START); add(chart.getChart(), BorderLayout.CENTER); //ChartPanel chartPanel = new ChartPanel(chart); //add(chartPanel, BorderLayout.CENTER); onRefresh(); } private void createChart() { partSize = 0; try { TabularData data = schemaService.getSchemaPartitionStatistics(schemaName); partSize = data.size(); } catch (ServiceException ex) { LOGGER.severe("createChart.error: " + ex.getMessage()); } SimpleXYChartDescriptor descriptor = SimpleXYChartDescriptor.decimal(0, true, partSize); descriptor.addLineFillItems("Elements cost"); descriptor.addLineFillItems("Content cost"); descriptor.addLineFillItems("Results cost"); descriptor.addLineFillItems("Indexes cost"); descriptor.addLineFillItems("Documents cost"); descriptor.setChartTitle("<html><font size='+1'><b>" + schemaName + " Capacity</b></font></html>"); descriptor.setXAxisDescription("partitions"); descriptor.setYAxisDescription("cost (Kb)"); chart = ChartFactory.createSimpleXYChart(descriptor); //chart.setZoomingEnabled(true); //CategoryDataset dataset = null; //chart = ChartFactory.createBarChart( // "Bar Chart Demo", // chart title // "Category", // domain axis label // "Value", // range axis label // dataset, // data // PlotOrientation.VERTICAL, // orientation // true, // include legend // true, // tooltips? // false // URLs? // ); //chart = new BarChart(); } private void onRefresh() { if (partSize > 0) { new CapacityStatsProvider(schemaService, schemaName, header, chart).start(); } } private static class CapacityStatsProvider extends Thread implements Comparator<List<Integer>> { private String schema; private JPanel header; private SimpleXYChartSupport chart; private SchemaManagementService service; private CapacityStatsProvider(SchemaManagementService service, String schema, JPanel header, SimpleXYChartSupport chart) { this.service = service; this.schema = schema; this.header = header; this.chart = chart; } @Override public int compare(List<Integer> o1, List<Integer> o2) { return o1.get(0).compareTo(o2.get(0)); } public void run() { try { Schema s = service.getSchema(schema); if (s != null && s.isActive()) { long totalECost = 0; long totalCCost = 0; long totalRCost = 0; long totalICost = 0; long totalDCost = 0; TabularData data = service.getSchemaPartitionStatistics(schema); Set<List<Integer>> keys = (Set<List<Integer>>) data.keySet(); Set<List<Integer>> sorted = new TreeSet<List<Integer>>(this); sorted.addAll(keys); for (List key: sorted) { Object[] index = key.toArray(); CompositeData cd = data.get(index); int partition = (Integer) cd.get("partition"); long eCost = (Long) cd.get("element cost"); eCost = new java.math.BigDecimal(eCost).movePointLeft(3).longValue(); totalECost += eCost; long cCost = (Long) cd.get("content cost"); cCost = new java.math.BigDecimal(cCost).movePointLeft(3).longValue(); totalCCost += cCost; long rCost = (Long) cd.get("result cost"); rCost = new java.math.BigDecimal(rCost).movePointLeft(3).longValue(); totalRCost += rCost; long iCost = (Long) cd.get("index cost"); iCost = new java.math.BigDecimal(iCost).movePointLeft(3).longValue(); totalICost += iCost; long dCost = (Long) cd.get("document cost"); dCost = new java.math.BigDecimal(dCost).movePointLeft(3).longValue(); totalDCost += dCost; chart.addValues(partition, new long[] {eCost, cCost, rCost, iCost, dCost}); } long overallCost = totalECost + totalCCost + totalRCost + totalICost + totalDCost; Component[] labels = header.getComponents(); ((JLabel) labels[0]).setText("Total elements cost: " + chart.formatDecimal(totalECost)); ((JLabel) labels[1]).setText("Total content cost: " + chart.formatDecimal(totalCCost)); ((JLabel) labels[2]).setText("Total results cost: " + chart.formatDecimal(totalRCost)); ((JLabel) labels[4]).setText("Total indices cost: " + chart.formatDecimal(totalICost)); ((JLabel) labels[5]).setText("Total documents cost: " + chart.formatDecimal(totalDCost)); ((JLabel) labels[6]).setText("Overall cost: " + chart.formatDecimal(overallCost)); } } catch (Exception ex) { LOGGER.severe(ex.getMessage()); } } } }