package antLogger.logServer;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
/**
* LogServer -
* Diese Klasse beschreibt die Applikation LogServer. Über sie wird der
* LogViewer geöffnet und geschlossen, sowie der LogWriter und LogReader
* erstellt. Über den StreamCollector werden die messages abgeholt und
* über eine pipe an den LogBuffer weitergereicht. Aus diesem können die
* messages dann vom LogViewer abgeholt werden.
*
* JAVA-Logger antLogger; Projekt der HTA Luzern->Abteilung Informatik->Software Engineering
* Authoren Patrick Bründler, Pascal Mengelt, Andy Wyss, Fabian Heusser
* Teacher: Jörg Hofstetter
* School: hta.fhz.ch, Horw;
* Project Homepage: http://www.w3p.ch/antLogger/
*
*
* LEGAL NOTICE
* THIS PROJECT AND ITS FILES ARE COPYRIGHTED BY THE AUTHORS
* THIS PROJECT CAN BE COPIED, MODIFIED AND DISTRIBUTED
* UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENCE
*
* @author Fabian Heusser
* @author Patrick Bründler
* @author Pascal Mengelt
* @author Andy Wyss
* @version 1.0 $Date$ $Revision$
* @(#) LogServer
*/
class LogServer extends JFrame implements Runnable
{
private Thread thread;
private LogViewer logViewer;
private LogWriter logWriter;
private StreamCollector streamCollector;
private final PipedOutputStream writeEnd = new PipedOutputStream();
private final PipedInputStream readEnd = new PipedInputStream();
private PrintStream printStream = new PrintStream(writeEnd, false);
private InputStreamReader inputStreamReader;
private JTextArea statusTextArea;
private boolean running = true;
private static LogServer logServer;
/*hef*/
private JMenuBar mmMenu = new JMenuBar();
private JMenu fileMenu = new JMenu("File");
private JMenuItem newMenu = new JMenuItem("Open Log Window");
private JMenuItem exitMenu = new JMenuItem("Exit");
private JMenu logMenu = new JMenu("Log");
private JCheckBoxMenuItem showMenu = new JCheckBoxMenuItem("Show incoming Messages",false);
private JCheckBoxMenuItem filterMenu = new JCheckBoxMenuItem("Filter incoming Messages",false);
private JMenuItem clearMenu = new JMenuItem("Clear Log Window");
private String filter = "";
/**
* Constructor
*/
public LogServer()
{
logWriter = new LogWriter();
try
{
readEnd.connect(writeEnd);
}
catch (Exception e)
{
e.printStackTrace();
}
statusTextArea = new JTextArea(10, 40);
JScrollPane textScrollPane = new JScrollPane(statusTextArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
/*hef*/
fileMenu.add(newMenu);
newMenu.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) {showMsgWindow(); }});
fileMenu.add(exitMenu);
exitMenu.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) {System.exit(0); }});
//fileMenu.add(fileMenu);
mmMenu.add(fileMenu);
logMenu.add(showMenu);
showMenu.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) {showMenu.setSelected( showMenu.isSelected() ); }});
logMenu.add(filterMenu);
filterMenu.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
filterMenu.setSelected( filterMenu.isSelected() );
if (filterMenu.isSelected()) {
filter = JOptionPane.showInputDialog(logServer,new String("Es werden nur noch Meldungen angezeigt die folgendes Enthalten:"),"Filter", JOptionPane.QUESTION_MESSAGE );
filterMenu.setText("Filter incoming Messages for " + filter);
} else {filterMenu.setText("Filter incoming Messages (Display)");}
}});
logMenu.add(clearMenu);
clearMenu.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { statusTextArea.setText(""); }});
mmMenu.add(logMenu);
this.setJMenuBar(mmMenu);
getContentPane().add(textScrollPane);
statusTextArea.insert("Versio 0.92\n", 0);
statusTextArea.insert("init antLogger.LogServer.LogServer ...\n", 0);
streamCollector = new StreamCollector(1234);
inputStreamReader = new InputStreamReader(streamCollector.getReadPipe());
thread = new Thread(this);
thread.start();
}
/**
* Überschriebene run-Methode des Threads. Holt die messages beim
* StreamCollector ab und sendet sie weiter an den LogBuffer und an den
* LogWriter.
*/
public void run()
{
String msg = "";
int ch = 0;
boolean newline = false;
try
{
while (running)
{
while (inputStreamReader.ready())
{
ch = inputStreamReader.read();
if (ch == 0x1c)
{
while(!inputStreamReader.ready()){thread.sleep(1);}
ch = inputStreamReader.read();
switch (ch)
{
case 0x11: showMsgWindow(); break;
case 0x12: hideMsgWindow(); break;
}
}
else if (!newline && (ch == 10 || ch == 13))
{
newline = true;
// statusTextArea.insert(" >"+msg+"< \n", 0);
logMsg(msg);
msg = "";
}
else if (newline)
{
newline = false;
if (ch != 10 && ch != 13)
msg += (char)ch;
}
else
{
msg += (char)ch;
}
}
thread.sleep(1);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* Eine message in die pipe schreiben (pipe zum LogBuffer)
* @param msg kompletter message string
*/
public synchronized void sendMsg(String msg)
{
printStream.println(msg);
}
/**
* Das Leseender der pipe abholen
* @return Leseende der pipe
*/
public PipedInputStream getReadPipe()
{
return readEnd;
}
/**
* LogReader mit angegebender Datei erstellen
* @param file zu lesendes file
*/
public void readFile(File file)
{
new LogReader(this, file);
}
/**
* Löscht angebene Datei (wird vom LogWriter ausgeführt)
* @param file zu löschendes file
*/
public void deleteFile(File file)
{
logWriter.deleteFile(file);
}
/**
* Den LogViewer öffnen
*/
private void showMsgWindow()
{
if (logViewer == null)
{
logViewer = new LogViewer(this);
}
}
/**
* Den LogViewer schliessen
*/
public void hideMsgWindow()
{
if (logViewer != null)
{
logViewer.close();
logViewer = null;
}
}
/**
* Maximale logfile-Grösse setzen
* @param maxFileSize maximale logfile-Grösse in Bytes
*/
public void setMaxFileSize(long maxFileSize)
{
logWriter.setMaxFileSize(maxFileSize);
}
/**
* Maximale logfile-Anzahl setzen
* @param maxFiles maximale Anzahl
*/
public void setMaxFiles(int maxFiles)
{
logWriter.setMaxFiles(maxFiles);
}
/**
* Eine message an die pipe und den LogWriter senden
* @param msg kompletter message string