package de.cismet.beanmill;
import com.traxel.lumbermill.ServerMill;
import com.traxel.lumbermill.event.Event;
import com.traxel.lumbermill.event.EventsPanel;
import com.traxel.lumbermill.event.EventsPanelControl;
import com.traxel.lumbermill.event.Table;
import com.traxel.lumbermill.event.TableControl;
import com.traxel.lumbermill.event.XMLEvent;
import com.traxel.lumbermill.filter.Filter;
import com.traxel.lumbermill.filter.FilterSet;
import com.traxel.lumbermill.filter.FilterSetControl;
import com.traxel.lumbermill.filter.FilterSetView;
import com.traxel.lumbermill.filter.FilterView;
import com.traxel.lumbermill.filter.Regex;
import com.traxel.lumbermill.filter.Tree;
import com.traxel.lumbermill.log.Log;
import com.traxel.lumbermill.log.LogActiveStateView;
import com.traxel.lumbermill.log.LogControl;
import org.apache.log4j.Logger;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultListSelectionModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JEditorPane;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.filechooser.FileFilter;
import de.cismet.beanmill.filter.ActiveSelectionFilter;
import de.cismet.beanmill.filter.ListView;
public final class BeanMillPane extends javax.swing.JPanel {
private static final transient Logger LOG = Logger.getLogger(BeanMillPane.class);
private static BeanMillPane instance = null;
private final JTextField txtRegExp;
private final JCheckBox chkSelectionOnly;
private final JButton cmdExport;
private final JButton cmdImport;
private final Regex regexFilter;
private final ActiveSelectionFilter activeSelection;
private final JFileChooser fc;
private final EventsPanelControl eventsPanelControl;
private final Border border;
private final ImageIcon addTab;
private final ImageIcon removeTab;
private final ImageIcon follow;
private final JLabel lblfollow;
private final ServerMill mill;
private boolean deleteFilteredEvents = false;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JSplitPane splMain;
if (LOG.isDebugEnabled()) {
LOG.debug("creating new BeanMillPane using port: " + port);
}
if (LOG.isDebugEnabled()) {
LOG.debug("creating new ServerMill with log: " + getLog());
}
initComponents();
txtRegExp = new JTextField("");
chkSelectionOnly = new JCheckBox("follow active selection");
cmdExport = new JButton("");
cmdImport = new JButton("");
regexFilter = new Regex();
activeSelection = new ActiveSelectionFilter();
fc = new JFileChooser();
eventsPanelControl = new EventsPanelControl();
border = new EmptyBorder(3, 3, 3, 3);
addTab = new ImageIcon(getClass().getResource("/de/cismet/beanmill/res/tabNew.png"));
removeTab = new ImageIcon(getClass().getResource("/de/cismet/beanmill/res/tabEx.png"));
follow = new ImageIcon(getClass().getResource("/de/cismet/beanmill/res/selection.png"));
lblfollow = new JLabel(follow);
instance = this;
mill = new ServerMill(port, getLog());
chkSelectionOnly.setEnabled(false);
getFilterSetControl().getFilterSet().add(regexFilter);
getFilterSetControl().getFilterSet().add(activeSelection);
cmdExport.addActionListener(new ActionListener() {
@Override
final FileFilter ff = new FileFilter() {
@Override
public boolean accept(
final File f) {
return f.getName().toLowerCase().endsWith(".log4j");
}
@Override
return "log4j";
}
};
fc.setFileFilter(ff);
fc.setMultiSelectionEnabled(false);
final int state = fc.showSaveDialog(BeanMillPane.this);
if (JFileChooser.APPROVE_OPTION == state) {
final File file = fc.getSelectedFile();
String name = file.getAbsolutePath();
name = name.toLowerCase();
if (name.endsWith(".log4j")) {
saveEvents(name);
} else {
saveEvents(name + ".log4j");
}
}
}
});
cmdImport.addActionListener(new ActionListener() {
@Override
final FileFilter ff = new FileFilter() {
@Override
public boolean accept(
final File f) {
return f.getName().toLowerCase().endsWith(".log4j");
}
@Override
return "log4j";
}
};
fc.setFileFilter(ff);
fc.setMultiSelectionEnabled(false);
final int state = fc.showOpenDialog(BeanMillPane.this);
if (state == JFileChooser.APPROVE_OPTION) {
final File file = fc.getSelectedFile();
String name = file.getAbsolutePath();
name = name.toLowerCase();
if (name.endsWith(".log4j")) {
loadEvents(name);
} else {
loadEvents(name + ".log4j");
}
}
}
});
getLogActiveStateView().setBorder(border);
getFilterSetView().setBorder(border);
getEventsPanel().setBorder(border);
splMain.setBorder(border);
add(getLogActiveStateView(), BorderLayout.NORTH);
splMain.setLeftComponent(getFilterSetView());
splMain.setRightComponent(getEventsPanel());
getToolBar().add(cmdImport, 0);
getToolBar().add(cmdExport, 1);
final JLabel space = new JLabel();
space.setPreferredSize(new Dimension(10, 1));
getToolBar().add(space, 2);
cmdImport.setIcon(new javax.swing.ImageIcon(getClass().getResource(
"/de/cismet/beanmill/res/import.png")));
cmdImport.setToolTipText("Import Events");
cmdExport.setIcon(new javax.swing.ImageIcon(getClass().getResource(
"/de/cismet/beanmill/res/export.png")));
cmdExport.setToolTipText("Export Events");
cmdExport.setOpaque(false);
cmdImport.setOpaque(false);
final JButton cmdAddTab = new JButton(addTab);
final JButton cmdRemoveTab = new JButton(removeTab);
getToolBar().add(cmdAddTab);
getToolBar().add(cmdRemoveTab);
cmdAddTab.addActionListener(new ActionListener() {
@Override
getFilterSetControl().addTree();
cmdRemoveTab.setEnabled(true);
}
});
cmdRemoveTab.addActionListener(new ActionListener() {
@Override
final FilterSetControl control = getFilterSetControl();
final Filter f = control.getActiveComponent().getFilter();
final FilterSetView view = control.getFilterSetView();
view.removeTabAt(view.getSelectedIndex());
control.getFilterSet().remove(f);
if (control.getActiveComponent() == null) {
cmdRemoveTab.setEnabled(false);
}
}
});
final JCheckBox chkDeleteFilteredEvents = new JCheckBox("delete filtered Events");
chkDeleteFilteredEvents.addActionListener(new ActionListener() {
@Override
setDeleteFilteredEvents(chkDeleteFilteredEvents.isSelected());
getFilterSetControl().getFilterSetView().fireStateChanged();
}
});
getToolBar().add(chkDeleteFilteredEvents);
final JLabel space2 = new JLabel();
space2.setPreferredSize(new Dimension(10, 1));
getToolBar().add(space2, 7);
chkSelectionOnly.addActionListener(new ActionListener() {
@Override
if (chkSelectionOnly.isSelected()
&& !getFilterSetControl().getFilterSet().getFilters().contains(activeSelection)) {
getFilterSetControl().getFilterSet().add(activeSelection);
}
activeSelection.setActive(chkSelectionOnly.isSelected());
}
});
final JPanel panRightToolbarWhole = new JPanel();
final JPanel panRightToolbar = new JPanel();
final JPanel panEmpty = new JPanel();
final JLabel lblregExp = new JLabel("RegExp ");
panRightToolbar.setLayout(new FlowLayout());
lblregExp.setIcon(new javax.swing.ImageIcon(getClass().getResource(
"/de/cismet/beanmill/res/regexp.png")));
lblregExp.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
txtRegExp.setMinimumSize(new Dimension(100, txtRegExp.getMinimumSize().height));
txtRegExp.setPreferredSize(new Dimension(100, txtRegExp.getPreferredSize().height));
panRightToolbarWhole.setLayout(new BorderLayout());
panRightToolbarWhole.add(panEmpty, BorderLayout.CENTER);
panRightToolbarWhole.add(panRightToolbar, BorderLayout.EAST);
panRightToolbar.add(lblfollow);
panRightToolbar.add(chkSelectionOnly);
panRightToolbar.add(lblregExp);
panRightToolbar.add(txtRegExp);
getToolBar().add(panRightToolbarWhole);
txtRegExp.getDocument().addDocumentListener(new DocumentListener() {
@Override
change();
}
@Override
change();
}
@Override
change();
}
regexFilter.setActive(true);
final FilterSet set = getFilterSetControl().getFilterSet();
if (!set.getFilters().contains(regexFilter)) {
set.add(regexFilter);
}
try {
regexFilter.setRegex(txtRegExp.getText());
txtRegExp.setForeground(Color.BLACK);
String regex = ".*" + txtRegExp.getText() + ".*";
regex = regex.replaceAll("(\\.\\*)+", ".*");
txtRegExp.setToolTipText("<html>" + "nice RegExp ;-)<br>"
+ regex + "</html>");
} catch (final Exception e) {
String message = e.getMessage();
message = message.replaceAll("\n", "<br>");
txtRegExp.setToolTipText("<html>" + message + "</html>");
txtRegExp.setForeground(Color.RED);
}
}
});
getEventTable().setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION);
}
return instance;
}
chkSelectionOnly.setEnabled(b);
}
try {
final Event[] allEvents = getLog().toArray();
final Element root = new Element("BeanmillLog");
for (final Event e : allEvents) {
root.addContent(new XMLEvent(e).getXMLElement());
}
final Document doc = new Document(root);
final Format format = Format.getPrettyFormat();
final XMLOutputter serializer = new XMLOutputter(Format.getPrettyFormat());
final File file = new File(filepath);
final FileWriter writer = new FileWriter(file);
serializer.output(doc, writer);
writer.flush();
writer.close();
} catch (final Throwable t) {
LOG.error("could not save events to file: " + filepath, t);
}
}
try {
final SAXBuilder builder = new SAXBuilder(false);
final Document doc = builder.build(new File(filepath));
final Element rootObject = doc.getRootElement();
final List<XMLEvent> v = new ArrayList<XMLEvent>();
final Table model = (Table)getEventTable().getModel();
final List l = rootObject.getChildren();
for (final Object o : l) {
if (o instanceof Element) {
final XMLEvent xmlEvent = new XMLEvent((Element)o);
v.add(xmlEvent);
model.getLog().add(xmlEvent);
}
}
} catch (final Exception e) {
LOG.error("could not load events from file: " + filepath, e);
}
}
final Element r = new Element("BeanmillFilters");
final List fList = getFilterSetControl().getFilterSet().getFilters();
for (int i = 0; i < fList.size(); ++i) {
final Filter f = (Filter)fList.get(i);
if (f instanceof Tree) {
r.addContent(((Tree)f).getXML());
} else if (f instanceof ListView) {
r.addContent(((ListView)f).getXML());
}
}
return r;
}
getFilterSetView().removeAll();
getFilterSetControl().getFilterSet().removeAll();
final List allFilters = rootObject.getChildren();
for (final Object e : allFilters) {
final Element tf = (Element)e;
if (tf.getName().equals("treefilter")) {
final Tree tree = new Tree(tf);
getFilterSetControl().addTree(tree);
tree.setActive(false);
} else if (tf.getName().equals("listfilter")) {
final ListView lv = getFilterSetControl().addListView(tf);
lv.setActive(false);
}
}
getFilterSetView().setSelectedIndex(0);
getFilterSetControl().getActiveComponent().getFilter().setActive(true);
}
public void setSelection(
final String fullPath,
final int from,
final int to) {
activeSelection.setSelection(fullPath, from, to);
}
return getEventsPanel().getEventTable();
}
return getEventsPanel().getEventView();
}
return getLogActiveStateView();
}
return getFilterSetControl().getActiveComponent();
}
return getFilterSetControl().addListView();
}
return getLogControl().getLog();
}
return getTableControl().getLogControl();
}
return getLogControl().getActiveStateView();
}
return eventsPanelControl.getView();
}
return getFilterSetControl().getFilterSetView();
}
return getTableControl().getFilterSetControl();
}
return eventsPanelControl.getTableControl();
}
splMain.setDividerLocation(location);
}
return splMain.getDividerLocation();
}
return deleteFilteredEvents;
}
this.deleteFilteredEvents = deleteFilteredEvents;
}
jPanel1 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
splMain = new javax.swing.JSplitPane();
jPanel1.setLayout(new java.awt.BorderLayout());
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
jLabel1.setText("jLabel1");
jPanel1.add(jLabel1, java.awt.BorderLayout.CENTER);
setLayout(new java.awt.BorderLayout());
add(splMain, java.awt.BorderLayout.CENTER);
}
}