/******************************************************************************* * 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.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.Iterator; import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; import logdruid.data.Repository; import logdruid.data.Source; import logdruid.data.record.EventRecording; import logdruid.data.record.MetadataRecording; import logdruid.data.record.Recording; import logdruid.data.record.RecordingItem; import logdruid.data.record.StatRecording; import logdruid.ui.editor.EventRecordingEditor; import logdruid.ui.editor.MetadataRecordingEditor; import logdruid.ui.editor.StatRecordingEditor; import logdruid.ui.mainpanel.RecordingList.MyTableModel2; import logdruid.util.DataMiner; 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; public class StatRecordingSelectorPanel extends JPanel { private static Logger logger = Logger.getLogger(StatRecordingSelectorPanel.class.getName()); public static JTable table; JPanel jPanelDetail; boolean DEBUG = false; static Matcher m; static ArrayList records = null; private String[] header = { "name", "regexp", "type", "active" }; private ArrayList<Object[]> data = new ArrayList<Object[]>(); private Repository repository = null; private JPanel recEditor = null; public logdruid.ui.mainpanel.StatRecordingSelectorPanel.MyTableModel model; private Source source; /** * Create the panel. */ public StatRecordingSelectorPanel(final Repository rep, Source src) { repository = rep; source = src; records = rep.getRecordings(StatRecording.class,true); // Collections.sort(records); Iterator it = records.iterator(); while (it.hasNext()) { Recording record = (Recording) it.next(); data.add(new Object[] { record.getName(), record.getRegexp(), record.getType(), src.isActiveRecordingOnSource(record) }); } model = new logdruid.ui.mainpanel.StatRecordingSelectorPanel.MyTableModel(data, header); StatRecordingSelectorPanel thiis = this; logger.debug("source is " + ((source == null) ? "null" : src.getSourceName())); setLayout(new BorderLayout(0, 0)); JPanel panel_1 = new JPanel(); panel_1.setLayout(new BorderLayout(0, 0)); table = new JTable(model); JScrollPane scrollPane = new JScrollPane(table); panel_1.add(scrollPane, BorderLayout.CENTER); table.setPreferredScrollableViewportSize(new Dimension(0, 150)); table.setFillsViewportHeight(true); table.setAutoCreateRowSorter(true); // Set up column sizes. initColumnSizes(table); JSplitPane splitPane = new JSplitPane(); splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT); add(splitPane); jPanelDetail = new JPanel(); splitPane.setBottomComponent(jPanelDetail); splitPane.setTopComponent(panel_1); jPanelDetail.setLayout(new BorderLayout(0, 0)); table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { int selectedRow = ((table.getSelectedRow() != -1) ? table.convertRowIndexToModel(table.getSelectedRow()) : -1); logger.debug("ListSelectionListener - selectedRow: " + selectedRow); if (selectedRow >= 0) { if (jPanelDetail != null) { logger.debug("ListSelectionListener - valueChanged"); jPanelDetail.removeAll(); recEditor = getEditor(repository.getRecording(StatRecording.class, selectedRow,true)); if (recEditor != null) { jPanelDetail.add(recEditor, BorderLayout.CENTER); } jPanelDetail.revalidate(); } } } }); if (repository.getRecordings(StatRecording.class,true).size() > 0) { recEditor = getEditor(repository.getRecording(StatRecording.class,0,true)); jPanelDetail.add(recEditor, BorderLayout.CENTER); table.setRowSelectionInterval(0, 0); } if (model.getRowCount()>0){ table.getRowSorter().toggleSortOrder(0); table.setRowSelectionInterval(0, 0); } } private JPanel getEditor(Recording rec) { return new StatRecordingEditor(this,repository, rec.getExampleLine(), rec.getRegexp(), ((StatRecording) rec)); } /* public void reloadTable() { int selectedRow = ((table.getSelectedRow() != -1) ? table.convertRowIndexToModel(table.getSelectedRow()) : -1); records = repository.getRecordings(StatRecording.class); logger.debug("reloadTable - nb records : " + records.size()); // Collections.sort(records); Iterator it = records.iterator(); int count = 0; data.clear(); // this.repaint(); logger.debug("reloadTable - 1"); while (it.hasNext()) { Recording record = (Recording) it.next(); data.add(new Object[] { record.getName(), record.getRegexp(), record.getType(), record.getIsActive() }); logger.debug(count + record.getName() + record.getRegexp() + record.getIsActive()); } // model.fireTableDataChanged(); logger.debug("reloadTable - 2"); // this.repaint(); table.repaint(); logger.debug("reloadTable - 3"); this.revalidate(); } */ private void initColumnSizes(JTable theTable) { TableColumn column = null; Component comp = null; int headerWidth = 0; int cellWidth = 0; 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 MyTableModel extends AbstractTableModel { private String[] header; private ArrayList<Object[]> data; public MyTableModel(ArrayList<Object[]> data, String[] header) { this.header = header; this.data = data; } @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.getRecordings(StatRecording.class,true).size(); } @Override public Object getValueAt(int row, int column) { if (column == 0 ) { return repository.getRecording(StatRecording.class,row,true).getName(); } else if (column == 1 ) { return repository.getRecording(StatRecording.class,row,true).getRegexp(); } else if (column == 2 ) { return repository.getRecording(StatRecording.class,row,true).getType(); } else if (column == 3 ) { logger.debug("getvalueat name" + ((StatRecording) repository.getRecording(StatRecording.class, row,true)).getName()); logger.debug("getvalueat is active" + source.isActiveRecordingOnSource(repository.getRecording(StatRecording.class, row,true))); return source.isActiveRecordingOnSource(repository.getRecording(StatRecording.class, row,true)); } else return 0; } public void addRow(Object[] obj) { data.add(obj); // table.repaint(); } public void updateRow(int rowId, Object[] obj) { data.set(rowId, obj); // table.repaint(); } @Override public void setValueAt(Object value, int row, int column) { if (column == 3 && source != null) { logger.debug("setValueAt calls setActiveRecording"); source.toggleActiveRecording(repository.getRecording(StatRecording.class, row,true)); fireTableCellUpdated(row, column); // logger.debug("control of setValueAt: "+source.isActiveRecordingOnSource(repository.getRecording(MetadataRecording.class, // row))); } else { ((Object[]) data.get(row))[column] = value; fireTableCellUpdated(row, column); } table.repaint(); } /* * @Override public void setValueAt(Object value, int row, int column) { * data.get(row)[column] = value; 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 matt&er where the cell appears onscreen. if (col > 2) { return true; } else { return false; } } } public void Add() { data.add(new Object[] { "", ".*", "long", Boolean.FALSE }); table.repaint(); } /* * public void Remove() { * data.remove(((table.getSelectedRow()!=-1)?table.convertRowIndexToModel * (table.getSelectedRow()):-1)); table.repaint(); } */ public void Remove() { data.remove(((table.getSelectedRow() != -1) ? table.convertRowIndexToModel(table.getSelectedRow()) : -1)); repository.deleteRecording(((table.getSelectedRow() != -1) ? table.convertRowIndexToModel(table.getSelectedRow()) : -1)); table.repaint(); } }