1 3 27 28 30 package de.qfs.apps.qflog.logview.command; 31 32 34 import java.awt.Frame ; 35 36 import java.io.BufferedReader ; 37 import java.io.File ; 38 import java.io.FileInputStream ; 39 import java.io.FileWriter ; 40 import java.io.FileReader ; 41 import java.io.PrintWriter ; 42 import java.io.ObjectInputStream ; 43 import java.io.ObjectOutputStream ; 44 import java.io.IOException ; 45 46 import java.lang.reflect.InvocationTargetException ; 47 48 import java.util.Properties ; 49 50 import javax.swing.JFileChooser ; 51 import javax.swing.JOptionPane ; 52 import javax.swing.JTable ; 53 import javax.swing.ProgressMonitor ; 54 import javax.swing.filechooser.FileFilter ; 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 75 81 public class CommandSaveLog 82 extends Command 83 implements Invokable 84 { 85 87 90 private final static Logger logger = 91 new Logger (CommandSaveLog.class); 92 93 96 private boolean save; 97 98 101 private boolean all; 102 103 106 private LogFrame frame; 107 108 111 private LogView view; 112 113 116 private Frame parent; 117 118 121 private File file; 122 123 126 private static JFileChooser fileChooser; 127 128 133 136 private static LogFileFilter logFilter; 137 138 139 141 143 153 public CommandSaveLog(Object source, LogFrame frame, File 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 176 public CommandSaveLog(Object source, Frame parent, LogView view, 177 File 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 189 191 public Object 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 214 216 private void save() 217 throws CommandException 218 { 219 setupFileChooser(); 220 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 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 [] {file.getName()}) 238 != JOptionPane.YES_OPTION) { 239 throw new CancelCommandException (); 240 } 241 } 242 } 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 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 PrintWriter pw = new PrintWriter 280 (new FileWriter (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 } catch (IOException 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 [] {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 312 private void restore() 313 throws CommandException 314 { 315 setupFileChooser(); 316 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 } 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 [] {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 (readText(file)) { 369 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 [] {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 394 401 428 431 438 private boolean readText(File file) 439 { 440 int max = (int) file.length(); 441 final ProgressMonitor pm = 442 new ProgressMonitor (parent, "parsing...", null, 0, max); 443 444 try { 445 final BufferedReader br = new BufferedReader 446 (new FileReader (file)); 447 br.mark(4090); 448 String line = br.readLine(); 449 if (line == null) { 450 return false; 452 } 453 String 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 run() 476 throws IOException 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 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 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 506 508 511 private void setupFileChooser() 512 { 513 if (fileChooser != null) { 514 return; 515 } 516 517 fileChooser = new JFileChooser (new File (".")); 518 519 logFilter = new LogFileFilter 524 (view.getResources().getString("logView.fileFilter.log", 525 "qflog text log file"), 526 ".log"); 527 fileChooser.setFileFilter(logFilter); 529 } 530 531 } 533 | Popular Tags |