/******************************************************************************* * LogDruid : Generate charts and reports using data gathered in log files * Copyright (C) 2016 Frederic Valente (frederic.valente@gmail.com) * * This program 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 3 of the License, or (at your option) any later version. * * This program 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 this program. If not, see http://www.gnu.org/licenses/. *******************************************************************************/ package logdruid.ui.mainpanel; import javax.swing.JPanel; import java.awt.BorderLayout; import javax.swing.JTable; import javax.swing.BoxLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.GridBagLayout; import java.awt.GridBagConstraints; import javax.swing.border.BevelBorder; import javax.swing.plaf.basic.BasicBorders.SplitPaneBorder; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.border.LineBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.Color; import javax.swing.JButton; import java.awt.Insets; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.FlowLayout; import java.text.ParseException; import org.apache.commons.lang3.time.FastDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.Vector; import java.util.regex.Matcher; import java.util.regex.Pattern; import logdruid.data.Preferences; import logdruid.data.Repository; import logdruid.data.Source; import logdruid.data.mine.DataVault; import logdruid.data.mine.MineResultSet; import logdruid.data.record.EventRecording; import logdruid.data.record.MetadataRecording; import logdruid.data.record.Recording; import logdruid.data.record.RecordingItem; import logdruid.data.record.ReportRecording; import logdruid.data.record.StatRecording; //import logdruid.ui.editor.EventRecordingEditor; //import logdruid.ui.editor.MetadataRecordingEditor; //import logdruid.ui.editor.ReportRecordingEditor; //import logdruid.ui.editor.StatRecordingEditor; import logdruid.util.DataMiner; import javax.swing.RowSorter; import javax.swing.SortOrder; import javax.swing.SwingConstants; import javax.swing.JSeparator; import javax.swing.JComboBox; import javax.swing.JScrollPane; import org.apache.log4j.Logger; import javax.swing.JSplitPane; import javax.swing.JCheckBox; public class ReportPanel extends JPanel { private static Logger logger = Logger.getLogger(DataMiner.class.getName()); public static JTable reportList; JPanel jPanelDetail; private ReportPanel thiis = this; boolean DEBUG = false; static Matcher m; static ArrayList records = null; private String[] header; private String[] headerRecords; // 0-> sum of time for success matching of given // recording ; 1-> sum of time for failed // matching ; 2-> count of match attempts, // 3->count of success attempts private Vector<Object[]> data = new Vector<Object[]>(); private Repository repository = null; private JPanel recEditor = null; public MyTableModel2 model; public RecordReportTableModel recordReportTableModel; long[] stats; private JTable reportDetails; private Map<List<Object>, Long> occurenceReportMap; private Map<List<Object>, Double> sumReportMap; private SortedMap<Double,List<Object>> top100ReportMap; private MineResultSet mineResultSet; /** * Create the panel. */ public ReportPanel(final Repository rep, final MineResultSet mineResultSet1) { if (Preferences.getPreference("timings").equals("true") && Preferences.getPreference("matches").equals("true") ) { header = (String[]) new String[] { "name", "regexp", "type", "rows", "success time", "failed time", "match attempt", "success match" }; } else if (Preferences.getPreference("timings").equals("false") && Preferences.getPreference("matches").equals("true") ) { header = (String[]) new String[] { "name", "regexp", "type", "rows", "match attempt", "success match" }; } else if (Preferences.getPreference("timings").equals("true") && Preferences.getPreference("matches").equals("false") ) { header = (String[]) new String[] { "name", "regexp", "type", "rows" ,"success time", "failed time", }; } else { header = (String[]) new String[] { "name", "regexp", "type", "rows" }; } mineResultSet=mineResultSet1; records = rep.getReportRecordings(mineResultSet1,true); Iterator it = records.iterator(); while (it.hasNext()) { Recording record = (Recording) it.next(); logger.debug("Report panel load:"+record.getName()); stats = DataVault.getRecordingStats(record.getName()); if (record.getIsActive() ) { //&& ((Map<Recording, Map<List<Object>, Long>>)(mineResultSet1.getOccurenceReport().values())).get(record).size()>0 logger.debug(record.getName()); if (stats != null) { if (Preferences.getPreference("timings").equals("false") && Preferences.getPreference("matches").equals("true") ) { data.add(new Object[] { record.getName(), record.getRegexp(), record.getType(), record.getIsActive(), stats[2], stats[3] }); } else if (Preferences.getPreference("timings").equals("true") && Preferences.getPreference("matches").equals("false") ) { data.add(new Object[] { record.getName(), record.getRegexp(), record.getType(), record.getIsActive(), stats[0], stats[1]}); } else if (Preferences.getPreference("timings").equals("true") && Preferences.getPreference("matches").equals("true") ) { data.add(new Object[] { record.getName(), record.getRegexp(), record.getType(), record.getIsActive(), stats[0], stats[1], stats[2], stats[3] }); } } else { data.add(new Object[] { record.getName(), record.getRegexp(), record.getType(), record.getIsActive(), 0, 0, 0, 0 }); } } } repository = rep; model = new MyTableModel2(data, header,mineResultSet); JPanel panel_1 = new JPanel(); panel_1.setMinimumSize(new Dimension(0, 150)); GridBagConstraints gbc_panel_1 = new GridBagConstraints(); gbc_panel_1.fill = GridBagConstraints.BOTH; gbc_panel_1.insets = new Insets(5, 0, 5, 5); gbc_panel_1.gridx = 1; gbc_panel_1.gridy = 0; panel_1.setLayout(new BorderLayout(0, 0)); reportList = new JTable(model); reportList.setPreferredScrollableViewportSize(new Dimension(0, 150)); reportList.setFillsViewportHeight(true); // Set up column sizes. initColumnSizes(reportList); reportList.setAutoCreateRowSorter(true); // RowSorter sorter = table.getRowSorter(); // sorter.setSortKeys(Arrays.asList(new RowSorter.SortKey(0, // SortOrder.ASCENDING))); if (model.getRowCount() > 0) { reportList.getRowSorter().toggleSortOrder(2); reportList.getRowSorter().toggleSortOrder(0); } reportList.getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { int selectedRow = ((reportList.getSelectedRow() != -1) ? reportList.convertRowIndexToModel(reportList.getSelectedRow()) : -1); logger.debug("ListSelectionListener - selectedRow: " + selectedRow); ArrayList<List<Object>> data1 = new ArrayList<List<Object>>(); ArrayList<Object[]> rIArrayList = new ArrayList<Object[]>(); if (selectedRow >= 0 ) { if ((((ArrayList<ReportRecording>) repository.getReportRecordings(mineResultSet1, true)).get(selectedRow)).getSubType().equals("histogram")) { Iterator<RecordingItem> rIIte = (((ArrayList<ReportRecording>) repository.getReportRecordings(mineResultSet1, true)).get(selectedRow)).getRecordingItem().iterator(); rIArrayList.add(new Object[] { "Source", String.class }); while (rIIte.hasNext()) { RecordingItem ri = (RecordingItem) rIIte.next(); Class c = String.class; if (ri.isSelected()) { if (ri.getType().equals("string") || ri.getType().equals("stringminimum") || ri.getType().equals("word") || ri.getType().equals("date")) { c = String.class; } else if (ri.getType().equals("long")) { c = Long.class; } else if (ri.getType().equals("double")) { c = double.class; } rIArrayList.add(new Object[] { ri.getName(), c }); } } rIArrayList.add(new Object[] { "count", Long.class }); if (mineResultSet1.getOccurenceReport() != null) { Iterator sourcesIterator=rep.getSources().iterator(); while (sourcesIterator.hasNext()) { Source src=(Source) sourcesIterator.next(); if (src.getActive() && mineResultSet1.getOccurenceReport().containsKey(src)){ occurenceReportMap = mineResultSet1.getOccurenceReport().get(src).get((((ArrayList<ReportRecording>) repository.getReportRecordings(mineResultSet1, true)).get(selectedRow))); if (occurenceReportMap != null) { Iterator<List<Object>> oRMIte = occurenceReportMap.keySet().iterator(); while (oRMIte.hasNext()) { List<Object> obj = new ArrayList<Object>(); List<Object> tempObj=oRMIte.next(); obj.add(src.getSourceName()); obj.addAll(1, tempObj); obj.add(occurenceReportMap.get(tempObj)); data1.add(obj); } // logger.info(""+headerRecords.length // +Arrays.deepToString(headerRecords)); }} } recordReportTableModel = new RecordReportTableModel(data1, rIArrayList); reportDetails = new JTable(recordReportTableModel); } } else if ((((ArrayList<ReportRecording>) repository.getReportRecordings(mineResultSet1, true)).get(selectedRow)).getSubType().equals("top100")) { Iterator<RecordingItem> rIIte = (((ArrayList<ReportRecording>) repository.getReportRecordings(mineResultSet1, true)).get(selectedRow)).getRecordingItem().iterator(); rIArrayList.add(new Object[] { "Source", String.class }); while (rIIte.hasNext()) { RecordingItem ri = (RecordingItem) rIIte.next(); Class c = null; if (ri.isSelected() && ri.getProcessingType().equals("capture")) { if (ri.getType().equals("string") || ri.getType().equals("stringminimum") || ri.getType().equals("word") || ri.getType().equals("date")) { c = String.class; } else if (ri.getType().equals("long")) { c = Long.class; } else if (ri.getType().equals("double")) { c = double.class; } rIArrayList.add(new Object[] { ri.getName(), c }); } } rIArrayList.add(new Object[] { "value", Double.class }); if (mineResultSet1.getTop100Report() != null) { Iterator sourcesIterator=rep.getSources().iterator(); while (sourcesIterator.hasNext()) { Source src=(Source) sourcesIterator.next(); if (src.getActive() && mineResultSet1.getTop100Report().containsKey(src)){ top100ReportMap = mineResultSet1.getTop100Report().get(src).get((((ArrayList<ReportRecording>) repository.getReportRecordings(mineResultSet1, true)).get(selectedRow))); if (top100ReportMap != null) { Iterator<Double> oRMIte = top100ReportMap.keySet().iterator(); while (oRMIte.hasNext()) { List<Object> obj = new ArrayList<Object>(); Double tempObj=oRMIte.next(); obj.add(src.getSourceName()); obj.addAll(1, top100ReportMap.get(tempObj)); obj.add(tempObj); data1.add(obj); } // logger.info(""+headerRecords.length // +Arrays.deepToString(headerRecords)); }} } recordReportTableModel = new RecordReportTableModel(data1, rIArrayList); reportDetails = new JTable(recordReportTableModel); } } else if ((((ArrayList<ReportRecording>) repository.getReportRecordings(mineResultSet1, true)).get(selectedRow)).getSubType().equals("sum")) { Iterator<RecordingItem> rIIte = (((ArrayList<ReportRecording>) repository.getReportRecordings(mineResultSet1, true)).get(selectedRow)).getRecordingItem().iterator(); rIArrayList.add(new Object[] { "Source", String.class }); while (rIIte.hasNext()) { RecordingItem ri = (RecordingItem) rIIte.next(); Class c = null; if (ri.isSelected() && ri.getProcessingType().equals("capture")) { if (ri.getType().equals("string") || ri.getType().equals("stringminimum") || ri.getType().equals("word") || ri.getType().equals("date")) { c = String.class; } else if (ri.getType().equals("long")) { c = Long.class; } else if (ri.getType().equals("double")) { c = double.class; } rIArrayList.add(new Object[] { ri.getName(), c }); } else if (ri.isSelected() && ri.getProcessingType().equals("sum")){ c = Double.class; rIArrayList.add(new Object[] { "sum of "+ ri.getName(), c }); } } if (mineResultSet1.getSumReport() != null) { Iterator sourcesIterator=rep.getSources().iterator(); while (sourcesIterator.hasNext()) { Source src=(Source) sourcesIterator.next(); if (src.getActive() && mineResultSet1.getSumReport().containsKey(src)){ sumReportMap = mineResultSet1.getSumReport().get(src).get((((ArrayList<ReportRecording>) repository.getReportRecordings(mineResultSet1, true)).get(selectedRow))); if (sumReportMap != null) { Iterator<List<Object>> oRMIte = sumReportMap.keySet().iterator(); while (oRMIte.hasNext()) { List<Object> obj = new ArrayList<Object>(); List<Object> tempObj=oRMIte.next(); obj.add(src.getSourceName()); obj.addAll(1, tempObj); obj.add(sumReportMap.get(tempObj)); data1.add(obj); } // logger.info(""+headerRecords.length // +Arrays.deepToString(headerRecords)); }} } recordReportTableModel = new RecordReportTableModel(data1, rIArrayList); reportDetails = new JTable(recordReportTableModel); } } // headerRecords=(String[]) rIArrayList.toArray(new // String[rIArrayList.size()]); // logger.info(""+headerRecords.length +headerRecords); } // logger.info(mineResultSet1.getOccurenceReport().values()); // logger.info(repository.getRecording(ReportRecording.class,selectedRow)); reportDetails.setPreferredScrollableViewportSize(new Dimension(0, 150)); reportDetails.setFillsViewportHeight(true); reportDetails.setAutoCreateRowSorter(true); if (reportDetails.getColumnCount()>1){ reportDetails.getRowSorter().toggleSortOrder(reportDetails.getColumnCount() - 1); reportDetails.getRowSorter().toggleSortOrder(reportDetails.getColumnCount() - 1); } if (reportDetails != null) { jPanelDetail.removeAll(); JScrollPane scrollPane_1 = new JScrollPane(reportDetails); jPanelDetail.add(scrollPane_1, BorderLayout.CENTER); } jPanelDetail.revalidate(); } }); JPanel panel = new JPanel(); FlowLayout flowLayout = (FlowLayout) panel.getLayout(); flowLayout.setAlignment(FlowLayout.LEFT); flowLayout.setVgap(2); flowLayout.setHgap(2); panel_1.add(panel, BorderLayout.SOUTH); JCheckBox chckbxNewCheckBox = new JCheckBox("New check box"); panel.add(chckbxNewCheckBox); setLayout(new BorderLayout(0, 0)); JPanel panel_2 = new JPanel(); add(panel_2, BorderLayout.NORTH); JSplitPane splitPane = new JSplitPane(); splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT); add(splitPane, BorderLayout.CENTER); jPanelDetail = new JPanel(); GridBagConstraints gbc_jPanelDetail = new GridBagConstraints(); gbc_jPanelDetail.insets = new Insets(0, 0, 0, 5); gbc_jPanelDetail.fill = GridBagConstraints.BOTH; gbc_jPanelDetail.gridx = 1; gbc_jPanelDetail.gridy = 4; splitPane.setBottomComponent(jPanelDetail); splitPane.setTopComponent(panel_1); jPanelDetail.setLayout(new BorderLayout(0, 0)); reportDetails = new JTable(); reportDetails.setPreferredScrollableViewportSize(new Dimension(0, 150)); reportDetails.setFillsViewportHeight(true); reportDetails.setAutoCreateRowSorter(true); JScrollPane scrollPane_1 = new JScrollPane(reportDetails); jPanelDetail.add(scrollPane_1, BorderLayout.CENTER); JScrollPane scrollPane = new JScrollPane(reportList); panel_1.add(scrollPane, BorderLayout.CENTER); // scrollPane_1.setViewportView(reportDetails); if (repository.getRecordings(ReportRecording.class,true).size() > 0 && model.getRowCount()>0) { // recEditor = getEditor(repository.getRecording(0)); // jPanelDetail.add(recEditor, BorderLayout.CENTER); reportList.setRowSelectionInterval(0, 0); } jPanelDetail.revalidate(); } private void initColumnSizes(JTable theTable) { MyTableModel2 model = (MyTableModel2) theTable.getModel(); TableColumn column = null; Component comp = null; int headerWidth = 0; int cellWidth = 0; // Object[] longValues = model.longValues; TableCellRenderer headerRenderer = theTable.getTableHeader().getDefaultRenderer(); for (int i = 0; i < 4; i++) { column = theTable.getColumnModel().getColumn(i); comp = headerRenderer.getTableCellRendererComponent(null, column.getHeaderValue(), false, false, 0, 0); headerWidth = comp.getPreferredSize().width; cellWidth = comp.getPreferredSize().width; column.setPreferredWidth(Math.max(headerWidth, cellWidth)); } } public class MyTableModel2 extends AbstractTableModel { private String[] header; private Vector data = new Vector(); private MineResultSet mineResultSet1; public MyTableModel2(Vector<Object[]> data, String[] header,MineResultSet _mineResultSet1) { this.header = header; this.data = data; mineResultSet1=_mineResultSet1; } @Override public int getColumnCount() { if (header == null) { return 0; } else return header.length; } @Override public String getColumnName(int column) { return header[column]; } @Override public int getRowCount() { return repository.getReportRecordings(mineResultSet1, true).size(); //return repository.getRecordings(ReportRecording.class,true).size(); } public void addRow(Object[] obj) { data.add(obj); } public void updateRow(int rowId, Object[] obj) { data.set(rowId, obj); } @Override public Object getValueAt(int row, int column) { if (column == 0) { //return repository.getRecording(ReportRecording.class, row,true).getName(); return ((ArrayList<Recording>)repository.getReportRecordings(mineResultSet1, true)).get(row).getName(); } else if (column == 1) { return (((ArrayList<Recording>) repository.getReportRecordings(mineResultSet1, true)).get(row).getRegexp()); } else if (column == 2) { return (((ArrayList<ReportRecording>) repository.getReportRecordings(mineResultSet1, true)).get(row).getSubType()); } else if (column == 3) { int rows=0; if (mineResultSet.getOccurenceReport() != null) { Iterator sourcesIterator=repository.getSources().iterator(); while (sourcesIterator.hasNext()) { Source src=(Source) sourcesIterator.next(); if (src.getActive() && mineResultSet.getOccurenceReport().containsKey(src)){ if (mineResultSet.getOccurenceReport().get(src).containsKey(((ArrayList<ReportRecording>) repository.getReportRecordings(mineResultSet1, true)).get(row))){ rows=rows+mineResultSet.getOccurenceReport().get(src).get(((ArrayList<ReportRecording>) repository.getReportRecordings(mineResultSet1, true)).get(row)).size(); } }} } if (mineResultSet.getTop100Report() != null) { Iterator sourcesIterator=repository.getSources().iterator(); while (sourcesIterator.hasNext()) { Source src=(Source) sourcesIterator.next(); if (src.getActive() && mineResultSet.getTop100Report().containsKey(src)){ if (mineResultSet.getTop100Report().get(src).containsKey(((ArrayList<ReportRecording>) repository.getReportRecordings(mineResultSet1, true)).get(row))){ rows=rows+mineResultSet.getTop100Report().get(src).get(((ArrayList<ReportRecording>) repository.getReportRecordings(mineResultSet1, true)).get(row)).size(); } }} } if (mineResultSet.getSumReport() != null) { Iterator sourcesIterator=repository.getSources().iterator(); while (sourcesIterator.hasNext()) { Source src=(Source) sourcesIterator.next(); if (src.getActive() && mineResultSet.getSumReport().containsKey(src)){ if (mineResultSet.getSumReport().get(src).containsKey(((ArrayList<ReportRecording>) repository.getReportRecordings(mineResultSet1, true)).get(row))){ rows=rows+mineResultSet.getSumReport().get(src).get(((ArrayList<ReportRecording>) repository.getReportRecordings(mineResultSet1, true)).get(row)).size(); } }} } return (int) rows; } else if (column > 3 && column < 9) { stats = DataVault.getRecordingStats(((ArrayList<Recording>)repository.getReportRecordings(mineResultSet1, true)).get(row).getName()); if (stats != null) { if (Preferences.getPreference("timings").equals("false") && Preferences.getPreference("matches").equals("true") ) { return stats[column - 2]; } else { return stats[column - 4]; } } else return 0; } else return 0; } @Override public void setValueAt(Object value, int row, int column) { if (column == 3) { logger.info("setValueAt calls setActiveRecording"); // .toggleActiveRecording(repository.getRecording(MetadataRecording.class, // row)); fireTableCellUpdated(row, column); // logger.info("control of setValueAt: "+source.isActiveRecordingOnSource(repository.getRecording(MetadataRecording.class, // row))); } else { ((Object[]) data.get(row))[column] = value; // logger.info("setValueAt"+row+","+column); fireTableCellUpdated(row, column); } } /* * JTable uses this method to determine the default renderer/ editor for * each cell. If we didn't implement this method, then the last column * would contain text ("true"/"false"), rather than a check box. */ public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } /* * Don't need to implement this method unless your table's editable. */ public boolean isCellEditable(int row, int col) { // Note that the data/cell address is constant, // no matter where the cell appears onscreen. return false; } } /** * Create the GUI and show it. For thread safety, this method should be * invoked from the event-dispatching thread. * * private static void createAndShowGUI() { // Create and set up the window. * JFrame frame = new JFrame("RecordingEditorTable"); * frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); * * // Create and set up the content pane. ReportPanel newContentPane = new * ReportPanel(null, repository); newContentPane.setOpaque(true); // content * panes must be opaque frame.setContentPane(newContentPane); * * // Display the window. frame.pack(); frame.setVisible(true); } */ /* * public ArrayList<RecordingItem> getRecordingItems() { * ArrayList<RecordingItem> toReturn = new ArrayList<RecordingItem>(); for * (int i = 0; i < data.size(); i++) { // model.getRowCount() * toReturn.add(new RecordingItem((String) model.getValueAt(i, 0),(String) * model.getValueAt(i, 1), (String) model.getValueAt(i, 2), (Boolean) * model.getValueAt(i, 3)); } return toReturn; } */ /* * public void Add() { data.add(new Object[] { " ", "", "long", "", * Boolean.TRUE, "" }); table.repaint(); } */ public void Remove() { data.remove(((reportList.getSelectedRow() != -1) ? reportList.convertRowIndexToModel(reportList.getSelectedRow()) : -1)); repository.deleteRecording(((reportList.getSelectedRow() != -1) ? reportList.convertRowIndexToModel(reportList.getSelectedRow()) : -1)); reportList.repaint(); } public class RecordReportTableModel extends AbstractTableModel { private ArrayList<Object[]> header; private ArrayList<List<Object>> data; public RecordReportTableModel(ArrayList<List<Object>> data1, ArrayList<Object[]> rIArrayList) { this.header = rIArrayList; this.data = data1; } @Override public int getColumnCount() { if (header == null) { return 0; } else return header.size(); } @Override public String getColumnName(int column) { return (String) header.get(column)[0]; } @Override public int getRowCount() { return data.size(); } public void addRow(List<Object> obj) { data.add(obj); } public void updateRow(int rowId, List<Object> obj) { data.set(rowId, obj); } @Override public Object getValueAt(int row, int column) { if (column <= (data.get(row).size())) { // logger.info("row: " + row + ", column "+column +",header.get(column "+header.get(column) ); //" ,col: "+column + "data: " //+data.get(row).get(column)); return ((Class) header.get(column)[1]).cast(data.get(row).get(column)); } else if (column == (data.get(row).size())) { } return ((Class) header.get(column)[1]).cast((Double) 0.0); } /* * JTable uses this method to determine the default renderer/ editor for * each cell. If we didn't implement this method, then the last column * would contain text ("true"/"false"), rather than a check box. */ public Class getColumnClass(int c) { return (Class) header.get(c)[1]; } /* * Don't need to implement this method unless your table's editable. */ public boolean isCellEditable(int row, int col) { return false; } } }