/* * Copyright 2008-2017 by Emeric Vernat * * This file is part of Java Melody. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.bull.javamelody; import java.awt.BorderLayout; import java.awt.Component; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.table.TableColumn; import net.bull.javamelody.swing.Utilities; import net.bull.javamelody.swing.table.MDefaultTableCellRenderer; import net.bull.javamelody.swing.table.MDoubleTableCellRenderer; import net.bull.javamelody.swing.table.MIntegerTableCellRenderer; import net.bull.javamelody.swing.table.MTable; import net.bull.javamelody.swing.table.MTableScrollPane; /** * Panel du tableau de requêtes dans le détail d'une requête. * @author Emeric Vernat */ class CounterRequestDetailTablePanel extends CounterRequestAbstractPanel { private static final long serialVersionUID = 1L; private final CounterRequest request; @SuppressWarnings("all") private final Map<String, Long> childRequestsExecutions; private final class ChildValueTableCellRenderer extends MIntegerTableCellRenderer { private static final long serialVersionUID = 1L; ChildValueTableCellRenderer() { super(); } @Override public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) { final MTable<CounterRequest> myTable = getTable(); final CounterRequest counterRequest = myTable.getList() .get(myTable.convertRowIndexToModel(row)); final Integer myValue; if (counterRequest.hasChildHits()) { myValue = (Integer) value; } else { myValue = null; } return super.getTableCellRendererComponent(jtable, myValue, isSelected, hasFocus, row, column); } } private final class NameTableCellRenderer extends MDefaultTableCellRenderer { private static final int CHILD_MARGIN = 10; private static final long serialVersionUID = 1L; NameTableCellRenderer() { super(); } @Override public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) { final MTable<CounterRequest> myTable = getTable(); final CounterRequest counterRequest = myTable.getList() .get(myTable.convertRowIndexToModel(row)); final Counter counter = getCounterByRequestId(counterRequest); if (counterRequest.equals(getRequest())) { setIcon(getCounterIcon(counter, 0)); } else { setIcon(getCounterIcon(counter, CHILD_MARGIN)); } return super.getTableCellRendererComponent(jtable, value, isSelected, hasFocus, row, column); } } private final class NbExecutionsTableCellRenderer extends MDoubleTableCellRenderer { private static final long serialVersionUID = 1L; NbExecutionsTableCellRenderer() { super(); } @Override public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) { final MTable<CounterRequest> myTable = getTable(); final CounterRequest counterRequest = myTable.getList() .get(myTable.convertRowIndexToModel(row)); final CounterRequest parentRequest = getRequest(); final Float executionsByRequest; if (counterRequest.equals(parentRequest)) { executionsByRequest = null; } else { final Long nbExecutions = getChildRequestExecutions(counterRequest); executionsByRequest = (float) nbExecutions / parentRequest.getHits(); } return super.getTableCellRendererComponent(jtable, executionsByRequest, isSelected, hasFocus, row, column); } } CounterRequestDetailTablePanel(RemoteCollector remoteCollector, CounterRequest request) { super(remoteCollector); final Map<String, CounterRequest> requestsById = mapAllRequestsById(); this.request = requestsById.get(request.getId()); this.childRequestsExecutions = this.request.getChildRequestsExecutionsByRequestId(); final MTableScrollPane<CounterRequest> scrollPane = createScrollPane(); final List<CounterRequest> requests = new ArrayList<>(); requests.add(this.request); if (!childRequestsExecutions.isEmpty()) { for (final Map.Entry<String, Long> entry : childRequestsExecutions.entrySet()) { final CounterRequest childRequest = requestsById.get(entry.getKey()); if (childRequest != null) { requests.add(childRequest); } } } getTable().setList(requests); Utilities.adjustTableHeight(getTable()); add(scrollPane, BorderLayout.CENTER); final JPanel buttonsPanel = createButtonsPanel(true); buttonsPanel.add(createXmlJsonButton(request)); add(buttonsPanel, BorderLayout.SOUTH); } private MTableScrollPane<CounterRequest> createScrollPane() { final MTable<CounterRequest> table = getTable(); final MTableScrollPane<CounterRequest> tableScrollPane = new MTableScrollPane<>(table); table.addColumn("name", getString("Requete")); table.setColumnCellRenderer("name", new NameTableCellRenderer()); if (!childRequestsExecutions.isEmpty()) { final TableColumn nbExecutionsColumn = new TableColumn(table.getColumnCount()); nbExecutionsColumn.setIdentifier(table.getColumnCount()); nbExecutionsColumn.setHeaderValue(getString("Hits_par_requete")); table.addColumn(nbExecutionsColumn); nbExecutionsColumn.setCellRenderer(new NbExecutionsTableCellRenderer()); } table.addColumn("mean", getString("Temps_moyen")); table.addColumn("maximum", getString("Temps_max")); table.addColumn("standardDeviation", getString("Ecart_type")); table.addColumn("cpuTimeMean", getString("Temps_cpu_moyen")); table.addColumn("systemErrorPercentage", getString("erreur_systeme")); table.setColumnCellRenderer("cpuTimeMean", new MIntegerTableCellRenderer() { private static final long serialVersionUID = 1L; @Override public void setValue(Object value) { final Integer cpuTimeMean = (Integer) value; if (cpuTimeMean >= 0) { super.setValue(cpuTimeMean); } else { super.setValue(null); } } }); final Counter parentCounter = getCounterByRequestId(request); final boolean allChildHitsDisplayed = parentCounter != null && parentCounter.getChildCounterName() != null && request.hasChildHits(); if (allChildHitsDisplayed) { final String childCounterName = parentCounter.getChildCounterName(); table.addColumn("childHitsMean", getFormattedString("hits_fils_moyens", childCounterName)); table.addColumn("childDurationsMean", getFormattedString("temps_fils_moyen", childCounterName)); final ChildValueTableCellRenderer childValueTableCellRenderer = new ChildValueTableCellRenderer(); table.setColumnCellRenderer("childHitsMean", childValueTableCellRenderer); table.setColumnCellRenderer("childDurationsMean", childValueTableCellRenderer); } return tableScrollPane; } private Map<String, CounterRequest> mapAllRequestsById() { final Map<String, CounterRequest> result = new HashMap<>(); for (final Counter counter : getCounters()) { for (final CounterRequest counterRequest : counter.getRequests()) { result.put(counterRequest.getId(), counterRequest); } } return result; } final CounterRequest getRequest() { return request; } final Long getChildRequestExecutions(CounterRequest counterRequest) { return childRequestsExecutions.get(counterRequest.getId()); } }