Package ch.rakudave.jnetmap.plugins

Source Code of ch.rakudave.jnetmap.plugins.LogfileNotifier

package ch.rakudave.jnetmap.plugins;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Dialog.ModalityType;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.Date;

import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import com.thoughtworks.xstream.annotations.XStreamOmitField;

import net.xeoh.plugins.base.annotations.PluginImplementation;
import ch.rakudave.jnetmap.model.Map;
import ch.rakudave.jnetmap.model.IF.NetworkIF;
import ch.rakudave.jnetmap.model.device.Device;
import ch.rakudave.jnetmap.model.device.DeviceEvent;
import ch.rakudave.jnetmap.model.device.DeviceEvent.Type;
import ch.rakudave.jnetmap.util.DeviceEventFilter;
import ch.rakudave.jnetmap.util.Icons;
import ch.rakudave.jnetmap.util.Lang;
import ch.rakudave.jnetmap.util.SwingHelper;
import ch.rakudave.jnetmap.util.logging.Logger;
import ch.rakudave.jnetmap.view.preferences.PreferencePanel;


@PluginImplementation
public class LogfileNotifier implements Notifier {
  private String name;
  private DeviceEventFilter filter = new DeviceEventFilter(true, true);
  private File logfile;
  @XStreamOmitField
  private PrintWriter writer;

  @Override
  public void statusChanged(DeviceEvent e, Map m) {
    boolean match = filter.matches(e);
    Logger.debug("Attempting to create log-entry, filtered: " + !match);
    if (!match) return;
    Device d = e.getItem();
    StringBuffer sb = new StringBuffer();
    sb.append(new Date().toString()).append(" [");
    sb.append(m.getFileName()).append("] - ");
    if (Type.INTERFACE_STATUS_CHANGED.equals(e.getType())) {
      NetworkIF nif = (NetworkIF) e.getSubject();
      sb.append(nif.getName()).append(" ");
      sb.append(nif.getAddress()).append(": ");
      sb.append(nif.getStatus().getMessage());
      sb.append(" (").append(d.getName()).append(")");
    } else {
      sb.append(d.getName()).append(": ");
      sb.append(d.getStatus().getMessage());
    }
    if (writer != null) writer.println(sb.toString());
  }
 
  @SuppressWarnings("serial")
  @Override
  public void showPropertiesWindow(final Frame owner, boolean isSetup) {
    final JDialog d = new JDialog(owner, getPluginName() + " - " + name, ModalityType.DOCUMENT_MODAL);
    d.setLayout(new BorderLayout(5, 5));
    final JTextField nameField = new JTextField(name);
    JPanel fileWrapper = new JPanel(new BorderLayout(5, 5));
      fileWrapper.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
      final JLabel label = new JLabel(Lang.get("menu.file"));
      final JTextField file = new JTextField((logfile != null)?logfile.getAbsolutePath():"");
        final Color defaultColor = new Color(file.getForeground().getRGB());
        file.addFocusListener(new FocusListener() {
          @Override public void focusLost(FocusEvent e) {}
          @Override
          public void focusGained(FocusEvent e) {
            label.setForeground(defaultColor);
          }
        });
      JButton browse = new JButton(new AbstractAction(Lang.get("action.browse")) {
        @Override
        public void actionPerformed(ActionEvent e) {
          File f = SwingHelper.saveDialog(owner, null);
          if (f != null) {
            file.setText(f.getAbsolutePath());
          }
        }
      });
      fileWrapper.add(label, BorderLayout.WEST);
      fileWrapper.add(file, BorderLayout.CENTER);
      fileWrapper.add(browse, BorderLayout.EAST);
    JPanel centerWrapper = new JPanel();
      centerWrapper.setLayout(new BoxLayout(centerWrapper, BoxLayout.PAGE_AXIS));
      centerWrapper.add(fileWrapper);
      centerWrapper.add(filter.settingsPanel());
    JPanel bottomRow = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5));
    JButton cancel = new JButton(Lang.get("action.cancel"), Icons.get("cancel"));
    cancel.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        d.dispose();
      }
    });
    JButton ok = new JButton(Lang.get("action.ok"), Icons.get("ok"));
    ok.setPreferredSize(cancel.getPreferredSize());
    ok.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        name = nameField.getText();
        if (!file.getText().isEmpty()) {
          logfile = new File(file.getText());
          if (logfile.canWrite()) {
            try {
            writer = new PrintWriter(new FileOutputStream(logfile, true), true);
            d.dispose();
            } catch (FileNotFoundException e1) {
              Logger.error("Failed to setup LogfileNotifier");
              writer = null;
              file.setText("");
            }
          } else {
            file.setText("");
          }
        }
        label.setForeground(Color.red);
      }
    });
    if (!isSetup) bottomRow.add(cancel);
    bottomRow.add(ok);
    d.add(nameField, BorderLayout.NORTH);
    d.add(centerWrapper, BorderLayout.CENTER);
    d.add(bottomRow, BorderLayout.SOUTH);
    d.pack();
    SwingHelper.centerTo(owner, d);
    d.setVisible(true);
  }

  @Override
  public String getName() {
    return name;
  }

  @Override
  public String getPluginName() {
    return "Logfile Notifier";
  }

  @Override
  public String getAuthor() {
    return "rakudave";
  }

  @Override
  public String getDescription() {
    return "Logs events to a file";
  }

  @Override
  public Icon getIcon() {
    return Icons.get("notes");
  }

  @Override
  public boolean hasSettings() {
    return false;
  }

  @Override
  public PreferencePanel getSettingsPanel() {
    return null;
  }

  @Override
  public Notifier create() {
    return new LogfileNotifier();
  }
}
TOP

Related Classes of ch.rakudave.jnetmap.plugins.LogfileNotifier

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.