001package jmri.jmrit.logix;
002
003import java.io.BufferedWriter;
004import java.io.File;
005import java.io.FileNotFoundException;
006import java.io.FileOutputStream;
007import java.io.IOException;
008import java.io.OutputStreamWriter;
009import java.text.SimpleDateFormat;
010import java.util.Date;
011import javax.swing.JFileChooser;
012import javax.swing.JOptionPane;
013import jmri.util.FileUtil;
014import jmri.util.swing.TextFilter;
015import org.slf4j.Logger;
016import org.slf4j.LoggerFactory;
017
018class OpSessionLog {
019
020    private static final String OP_SESSION_LOG_ERROR = "Op session log error {}";
021    static BufferedWriter _outBuff;
022
023    private OpSessionLog() {
024    }
025
026    public static synchronized boolean makeLogFile(java.awt.Component parent) {
027
028        JFileChooser fileChooser = new JFileChooser(FileUtil.getUserFilesPath());
029        fileChooser.setDialogTitle(Bundle.getMessage("logSession"));
030        fileChooser.setFileFilter(new TextFilter());
031        int retVal = fileChooser.showDialog(parent, Bundle.getMessage("logFile"));
032        if (retVal != JFileChooser.APPROVE_OPTION) {
033            return false;
034        }
035
036        File file = fileChooser.getSelectedFile();
037        String fileName = file.getAbsolutePath();
038        String fileNameLC = fileName.toLowerCase();
039        if (!fileNameLC.endsWith(".txt")) {
040            fileName = fileName + ".txt";
041            file = new File(fileName);
042        }
043        // check for possible overwrite
044        if (file.exists()) {
045            if (JOptionPane.showConfirmDialog(parent,
046                    Bundle.getMessage("overWritefile", fileName), Bundle.getMessage("QuestionTitle"),
047                    JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE) != JOptionPane.OK_OPTION) {
048                return false;
049            }
050        }
051
052        try {
053            _outBuff = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
054            writeHeader(fileName);
055        } catch (FileNotFoundException fnfe) {
056            JOptionPane.showMessageDialog(parent, fnfe.getMessage(),
057                    Bundle.getMessage("WarningTitle"), JOptionPane.WARNING_MESSAGE);
058            return false;
059        }
060        return true;
061    }
062
063    private static void writeHeader(String fileName) {
064        if (_outBuff==null) {
065            return;
066        }
067        try {
068            _outBuff.newLine();
069            _outBuff.append("\t\t\t");
070            _outBuff.append(fileName);
071            _outBuff.newLine();
072            _outBuff.append("\t\t\t");
073            SimpleDateFormat dateFormatter = new SimpleDateFormat("EEEE, MMMM d, yyyy");
074            _outBuff.append(dateFormatter.format(new Date()));
075            _outBuff.newLine();
076            _outBuff.newLine();
077            writeLn(Bundle.getMessage("startLog"));
078        } catch (IOException ioe) {
079            log.error(OP_SESSION_LOG_ERROR,ioe.getMessage());
080        }
081    }
082
083    public static synchronized void writeLn(String text) {
084        if (_outBuff==null) {
085            return;
086        }
087        try {
088            SimpleDateFormat dateFormatter = new SimpleDateFormat("  hh:mm:ss a   ");
089            _outBuff.append(dateFormatter.format(new Date()));
090            _outBuff.append(text);
091            _outBuff.newLine();
092        } catch (IOException ioe) {
093            log.error(OP_SESSION_LOG_ERROR,ioe.getMessage());
094        }
095    }
096
097    public static synchronized void flush() {
098        if (_outBuff==null) {
099            return;
100        }
101        try {
102            _outBuff.flush();
103        } catch (IOException ioe) {
104            log.error(OP_SESSION_LOG_ERROR,ioe.getMessage());
105        }
106    }
107
108    public static synchronized void close() {
109        if (_outBuff==null) {
110            return;
111        }
112        try {
113            writeLn(Bundle.getMessage("stopLog"));
114            _outBuff.flush();
115            _outBuff.close();
116        } catch (IOException ioe) {
117            log.error(OP_SESSION_LOG_ERROR,ioe.getMessage());
118        }
119    }
120
121    private static final Logger log = LoggerFactory.getLogger(OpSessionLog.class);
122}