KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > de > qfs > apps > qflog > logview > command > CommandSaveLog


1 // {{{ copyright
2

3 /********************************************************************
4  *
5  * $Id: CommandSaveLog.java,v 1.7 2000/07/05 14:07:45 gs Exp $
6  *
7  * The contents of this file are subject to the Mozilla Public
8  * License Version 1.1 (the "License"); you may not use this file
9  * except in compliance with the License. You may obtain a copy of
10  * the License at http://www.mozilla.org/MPL/
11  *
12  * Software distributed under the License is distributed on an "AS
13  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
14  * implied. See the License for the specific language governing
15  * rights and limitations under the License.
16  *
17  * The Original Code is qfs.de code.
18  *
19  * The Initial Developer of the Original Code is Gregor Schmid.
20  * Portions created by Gregor Schmid are
21  * Copyright (C) 1999 Quality First Software, Gregor Schmid.
22  * All Rights Reserved.
23  *
24  * Contributor(s):
25  *
26  *******************************************************************/

27
28 // }}}
29

30 package de.qfs.apps.qflog.logview.command;
31
32 // {{{ imports
33

34 import java.awt.Frame JavaDoc;
35
36 import java.io.BufferedReader JavaDoc;
37 import java.io.File JavaDoc;
38 import java.io.FileInputStream JavaDoc;
39 import java.io.FileWriter JavaDoc;
40 import java.io.FileReader JavaDoc;
41 import java.io.PrintWriter JavaDoc;
42 import java.io.ObjectInputStream JavaDoc;
43 import java.io.ObjectOutputStream JavaDoc;
44 import java.io.IOException JavaDoc;
45
46 import java.lang.reflect.InvocationTargetException JavaDoc;
47
48 import java.util.Properties JavaDoc;
49
50 import javax.swing.JFileChooser JavaDoc;
51 import javax.swing.JOptionPane JavaDoc;
52 import javax.swing.JTable JavaDoc;
53 import javax.swing.ProgressMonitor JavaDoc;
54 import javax.swing.filechooser.FileFilter JavaDoc;
55
56 import de.qfs.lib.command.CancelCommandException;
57 import de.qfs.lib.command.Command;
58 import de.qfs.lib.command.CommandException;
59 import de.qfs.lib.command.Invokable;
60 import de.qfs.lib.command.MessageCommandException;
61 import de.qfs.lib.gui.Message;
62 import de.qfs.lib.gui.SwingUtil;
63 import de.qfs.lib.log.Log;
64 import de.qfs.lib.log.LogEntry;
65 import de.qfs.lib.log.Logger;
66
67 import de.qfs.apps.qflog.logview.LogFileFilter;
68 import de.qfs.apps.qflog.logview.LogFrame;
69 import de.qfs.apps.qflog.logview.LogParser;
70 import de.qfs.apps.qflog.logview.LogTableModel;
71 import de.qfs.apps.qflog.logview.LogView;
72
73 // }}}
74

75 /**
76  * Save or restore a LogView's or LogFrame's Logs.
77  *
78  * @author Gregor Schmid
79  * @version $Revision: 1.7 $
80  */

81 public class CommandSaveLog
82     extends Command
83     implements Invokable
84 {
85     // {{{ variables
86

87     /**
88      * The Logger used for logging.
89      */

90     private final static Logger logger =
91         new Logger (CommandSaveLog.class);
92
93     /**
94      * True to save, false to restore.
95      */

96     private boolean save;
97
98     /**
99      * True to save all messages, false to save only the visible ones.
100      */

101     private boolean all;
102
103     /**
104      * The LogFrame whose logs should be saved.
105      */

106     private LogFrame frame;
107
108     /**
109      * The LogView whose logs should be saved.
110      */

111     private LogView view;
112
113     /**
114      * Another frame parent for the dialog.
115      */

116     private Frame JavaDoc parent;
117
118     /**
119      * The file to save in / load from.
120      */

121     private File JavaDoc file;
122
123     /**
124      * The FileChooser for all CommandSaveLog commands.
125      */

126     private static JFileChooser JavaDoc fileChooser;
127
128     // /**
129
// * The FileFilter for binary .qfl files.
130
// */
131
// private static LogFileFilter qflFilter;
132

133     /**
134      * The FileFilter for text .log files.
135      */

136     private static LogFileFilter logFilter;
137
138
139     // }}}
140

141     // {{{ constructors
142

143     /**
144      * Create a new CommandSaveLog for a LogFrame.
145      *
146      * @param source The source of the command.
147      * @param frame The LogFrame whose logs should be saved.
148      * @param file The file to save in / load from.
149      * @param save True to save, false to restore.
150      * @param all True to save all messages, false to save only
151      * the visible ones.
152      */

153     public CommandSaveLog(Object JavaDoc source, LogFrame frame, File JavaDoc file,
154                           boolean save, boolean all)
155     {
156         super(source);
157         parent = frame;
158         this.frame = frame;
159         view = frame.getView();
160         this.file = file;
161         this.save = save;
162         this.all = all;
163     }
164
165     /**
166      * Create a new CommandSaveLog for a LogView.
167      *
168      * @param source The source of the command.
169      * @param parent A parent frame for the file dialog.
170      * @param view The LogView whose logs should be saved.
171      * @param file The file to save in / load from.
172      * @param save True to save, false to restore.
173      * @param all True to save all messages, false to save only
174      * the visible ones.
175      */

176     public CommandSaveLog(Object JavaDoc source, Frame JavaDoc parent, LogView view,
177                           File JavaDoc file, boolean save, boolean all)
178     {
179         super(source);
180         this.parent = parent;
181         this.view = view;
182         this.file = file;
183         this.save = save;
184         this.all = all;
185     }
186
187     // }}}
188

189     // {{{ invoke
190

191     public Object JavaDoc invoke()
192         throws CommandException
193     {
194         boolean excluded = ! view.isLoggingEnabled();
195         if (excluded) {
196             Log.excludeThread();
197         }
198         try {
199             if (save) {
200                 save();
201             } else {
202                 restore();
203             }
204             return null;
205         } finally {
206             if (excluded) {
207                 Log.includeThread();
208             }
209         }
210     }
211
212     // }}}
213

214     // {{{ save
215

216     private void save()
217         throws CommandException
218     {
219         setupFileChooser();
220         // FileFilter filter;
221
if (file == null) {
222             fileChooser.setSelectedFile(null);
223             fileChooser.rescanCurrentDirectory();
224             if (fileChooser.showSaveDialog(parent)
225                 != fileChooser.APPROVE_OPTION) {
226                 throw new CancelCommandException ();
227             }
228
229             file = fileChooser.getSelectedFile();
230             FileFilter JavaDoc filter = fileChooser.getFileFilter();
231             if (file.getName().indexOf(".") < 0
232                 && filter instanceof LogFileFilter) {
233                 file = ((LogFileFilter) filter).forceExtension(file);
234             }
235             if (file.exists()) {
236                 if (Message.showMessage(parent, "logView.askOverwrite",
237                                         new String JavaDoc[] {file.getName()})
238                     != JOptionPane.YES_OPTION) {
239                     throw new CancelCommandException ();
240                 }
241             }
242         // } else {
243
// filter = file.getName().endsWith(".qfl") ? qflFilter : logFilter;
244
}
245
246         boolean failed = true;
247         if (view.getStatusLine() != null) {
248             view.getStatusLine().pushMessage
249                 (view.getResources().getString
250                  ("logView.status.savingLog",
251                   "Saving log file..."));
252         }
253         try {
254             LogEntry[] data;
255             if (all) {
256                 data = view.getTableModel().getData();
257             } else {
258                 JTable JavaDoc table = view.getTableView().getTable();
259                 int rows = table.getRowCount();
260                 data = new LogEntry[rows];
261                 for (int i = 0; i < rows; i++) {
262                     data[i] = (LogEntry)
263                         table.getValueAt(i, LogTableModel.COL_ENTRY);
264                 }
265             }
266             // if (filter == qflFilter) {
267
// // binary
268
// ObjectOutputStream oos = new ObjectOutputStream
269
// (new FileOutputStream (file));
270
// oos.writeInt(view.SAVE_FILE_VERSION);
271
// oos.writeObject(new Object[] {view.getClientName()});
272
// for (int i = 0; i < data.length; i++) {
273
// oos.writeObject(data[i]);
274
// }
275
// oos.close();
276
// failed = false;
277
// } else {
278
// text
279
PrintWriter JavaDoc pw = new PrintWriter JavaDoc
280                     (new FileWriter JavaDoc (file));
281                 if (view.getClientName() != null) {
282                     pw.println("client name: " + view.getClientName());
283                 }
284                 for (int i = 0; i < data.length; i++) {
285                     pw.println(data[i].toString());
286                 }
287                 pw.close();
288                 failed = false;
289             // }
290
} catch (IOException JavaDoc ex) {
291             if (logger.level >= Log.ERR) {
292                 logger.log("save()", ex);
293             }
294             throw new MessageCommandException
295                 (ex.getMessage(), parent, "logView.saveError",
296                  new String JavaDoc[] {file.getPath()});
297         } finally {
298             if (view.getStatusLine() != null) {
299                 view.getStatusLine().popMessage();
300                 view.getStatusLine().setTemporaryMessage
301                     (view.getResources().getString
302                      (failed ? "logView.status.savingLog.failed"
303                       : "logView.status.savingLog.done",
304                       "Saving log file..." + (failed ? "failed" : "done")));
305             }
306         }
307     }
308
309     // }}}
310
// {{{ restore
311

312     private void restore()
313         throws CommandException
314     {
315         setupFileChooser();
316         // FileFilter filter = null;
317
if (file == null) {
318             fileChooser.setSelectedFile(null);
319             fileChooser.rescanCurrentDirectory();
320             if (fileChooser.showOpenDialog(parent)
321                 != fileChooser.APPROVE_OPTION) {
322                 throw new CancelCommandException ();
323             }
324
325             file = fileChooser.getSelectedFile();
326             // filter = fileChooser.getFileFilter();
327
}
328         if (file == null) {
329                 throw new CancelCommandException ();
330         }
331         if (!file.exists()) {
332             throw new MessageCommandException
333                 ("No such file: " + file.getPath(), parent,
334                  "logView.noSuchFile", new String JavaDoc[] {file.getPath()});
335         }
336
337         boolean failed = true;
338         if (view.getStatusLine() != null) {
339             view.getStatusLine().pushMessage
340                 (view.getResources().getString
341                  ("logView.status.loadingLog",
342                   "Loading log file..."));
343         }
344         try {
345             // if ((filter == qflFilter)
346
// || (filter != logFilter
347
// && ! file.getName().endsWith(".log"))) {
348
// // try binary
349
// if (readBinary(file)) {
350
// // ok
351
// failed = false;
352
// return;
353
// }
354
// System.err.println("binary failed");
355
// if (filter == qflFilter
356
// || (filter != logFilter
357
// && file.getName().endsWith(".qfl"))) {
358
// // no use to try text in this case
359
// System.err.println("giving up filter:" + filter +
360
// ", file: " + file);
361
// throw new MessageCommandException
362
// ("error loading " + file.getPath(),
363
// parent, "logView.loadError",
364
// new String[] {file.getPath()});
365
// }
366
// }
367
// try text
368
if (readText(file)) {
369                 // ok
370
failed = false;
371                 view.setState(view.STATE_FILE);
372                 view.setFile(file);
373                 return;
374             }
375             throw new MessageCommandException
376                 ("cannot load file " + file.getPath(),
377                  parent, "logView.loadError",
378                  new String JavaDoc[] {file.getPath()});
379         } finally {
380             if (view.getStatusLine() != null) {
381                 view.getStatusLine().popMessage();
382                 view.getStatusLine().setTemporaryMessage
383                     (view.getResources().getString
384                      (failed ? "logView.status.loadingLog.failed"
385                       : "logView.status.loadingLog.done",
386                       "Loading log file..." + (failed ? "failed" : "done")));
387             }
388         }
389     }
390
391     // }}}
392
// {{{ readBinary
393

394     /**
395      * Try to restore data from a binary file.
396      *
397      * @param file The file to restore from.
398      *
399      * @return True if the restore completed, false if it failed.
400      */

401     // private boolean readBinary(File file)
402
// {
403
// try {
404
// ArrayList data = new ArrayList ();
405
// ObjectInputStream ois = new ObjectInputStream
406
// (new FileInputStream (file));
407
// int version = ois.readInt();
408
// Object[] info = (Object[]) ois.readObject();
409
// LogEntry entry = (LogEntry) ois.readObject();
410
// while (entry != null) {
411
// data.add(entry);
412
// entry = (LogEntry) ois.readObject();
413
// }
414
// ois.close();
415
// view.setClientName((String) info[0]);
416
// view.getTableModel().setData
417
// ((LogEntry[]) data.toArray(new LogEntry[0]));
418
// } catch (Exception ex) {
419
// // IOException, ClassCastException or ClassNotFoundException
420
// if (logger.level >= Log.WRN) {
421
// logger.log(Log.WRN, "readBinary(File)", ex);
422
// }
423
// return false;
424
// }
425
// return true;
426
// }
427

428     // }}}
429
// {{{ readText
430

431     /**
432      * Try to restore data from a text file.
433      *
434      * @param file The file to restore from.
435      *
436      * @return True if the restore completed, false if it failed.
437      */

438     private boolean readText(File JavaDoc file)
439     {
440         int max = (int) file.length();
441         final ProgressMonitor JavaDoc pm =
442             new ProgressMonitor JavaDoc (parent, "parsing...", null, 0, max);
443
444         try {
445             final BufferedReader JavaDoc br = new BufferedReader JavaDoc
446                 (new FileReader JavaDoc (file));
447             br.mark(4090);
448             String JavaDoc line = br.readLine();
449             if (line == null) {
450                 // can't even start
451
return false;
452             }
453             String JavaDoc name = null;
454             if (line.startsWith("client name: ")) {
455                 name = line.substring("client name: ".length());
456             } else {
457                 br.reset();
458             }
459             final LogParser parser = new LogParser ();
460             parser.setProgressCallback(new LogParser.ProgressCallback() {
461                 private int count = 0;
462                 public boolean progress(int lines, int chars)
463                 {
464                     if (count++ % 50 == 0) {
465                         pm.setProgress(chars);
466                         Thread.currentThread().yield();
467                         return ! pm.isCanceled();
468                     } else {
469                         return true;
470                     }
471                 }
472             });
473             LogEntry[] data = (LogEntry[])
474                 SwingUtil.withEvents(new SwingUtil.UnsafeRunnable () {
475                     public Object JavaDoc run()
476                     throws IOException JavaDoc
477                     {
478                         return
479                         parser.parse(br);
480                     }
481                 }, SwingUtil.NO_EVENTS, SwingUtil.NO_EVENTS);
482             br.close();
483             view.setClientName(name);
484             view.getTableModel().setMaxRows(0);
485             view.getTableModel().setData(data);
486         } catch (IOException JavaDoc ex) {
487             ex.printStackTrace();
488             if (logger.level >= Log.WRN) {
489                 logger.log(Log.WRN, "readText(File)", ex);
490             }
491             return false;
492         } catch (InvocationTargetException JavaDoc ex) {
493             ex.getTargetException().printStackTrace();
494             if (logger.level >= Log.WRN) {
495                 logger.log(Log.WRN, "readText(File)", ex.getTargetException());
496             }
497             return false;
498         } finally {
499             pm.close();
500         }
501         return true;
502     }
503
504     // }}}
505

506     // {{{ setupFileChooser
507

508     /**
509      * Prepare the common FileChooser.
510      */

511     private void setupFileChooser()
512     {
513         if (fileChooser != null) {
514             return;
515         }
516
517         fileChooser = new JFileChooser JavaDoc (new File JavaDoc ("."));
518
519         // qflFilter = new LogFileFilter
520
// (view.getResources().getString("logView.fileFilter.qfl",
521
// "qflog binary log file"),
522
// ".qfl");
523
logFilter = new LogFileFilter
524             (view.getResources().getString("logView.fileFilter.log",
525                                            "qflog text log file"),
526              ".log");
527         // fileChooser.addChoosableFileFilter(qflFilter);
528
fileChooser.setFileFilter(logFilter);
529     }
530
531     // }}}
532
}
533
Popular Tags