001 package org.shiftone.jrat.desktop.action.file; 002 003 import org.shiftone.jrat.core.spi.ViewBuilder; 004 import org.shiftone.jrat.desktop.DesktopFrame; 005 import org.shiftone.jrat.desktop.DesktopPreferences; 006 import org.shiftone.jrat.desktop.util.Errors; 007 import org.shiftone.jrat.util.io.IOUtil; 008 import org.shiftone.jrat.util.log.Logger; 009 010 import javax.swing.*; 011 import javax.swing.filechooser.FileFilter; 012 import java.awt.event.ActionEvent; 013 import java.awt.event.KeyEvent; 014 import java.io.File; 015 import java.io.InputStream; 016 import java.io.ObjectInputStream; 017 import java.util.zip.GZIPInputStream; 018 019 020 /** 021 * @author jeff@shiftone.org (Jeff Drost) 022 */ 023 public class OpenAction extends AbstractAction { 024 025 private static final Logger LOG = Logger.getLogger(OpenAction.class); 026 private final DesktopFrame desktopFrame; 027 028 029 public OpenAction(DesktopFrame desktopFrame) { 030 super("Open"); 031 032 this.desktopFrame = desktopFrame; 033 putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_O)); 034 } 035 036 private File getCurrentDirectory() { 037 File file = DesktopPreferences.getLastOpenedFile(); 038 039 return (file != null) ? IOUtil.getNearestExistingParent(file) : new File(""); 040 } 041 042 private File getSelectedFile() { 043 File file = DesktopPreferences.getLastOpenedFile(); 044 return (file != null && file.exists()) ? file : null; 045 } 046 047 private File getParent(File file) { 048 File parent = file.getParentFile(); 049 if (parent.exists()) { 050 return parent; 051 } else { 052 return getParent(parent); 053 } 054 } 055 056 public void actionPerformed(ActionEvent e) { 057 058 JFileChooser chooser = new JFileChooser(); 059 chooser.setDialogTitle("Open JRat Output File"); 060 chooser.setMultiSelectionEnabled(true); 061 chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 062 chooser.setAcceptAllFileFilterUsed(false); 063 chooser.setCurrentDirectory(getCurrentDirectory()); 064 chooser.setSelectedFile(getSelectedFile()); 065 chooser.addChoosableFileFilter(JRatFileFilter.INSTANCE); 066 //chooser.addChoosableFileFilter(SessionFileFilter.INSTANCE); 067 068 if (JFileChooser.APPROVE_OPTION == chooser.showOpenDialog(desktopFrame)) { 069 openFiles(chooser.getSelectedFiles()); 070 } 071 } 072 073 074 private void openFiles(File[] files) { 075 for (int i = 0; i < files.length; i++) { 076 openFile(files[i]); 077 } 078 } 079 080 private void openFile(File file) { 081 DesktopPreferences.setLastOpenedFile(file); 082 new Thread(new OpenRunnable(file)).start(); 083 } 084 085 086 private class OpenRunnable implements Runnable { 087 private final File file; 088 089 public OpenRunnable(File file) { 090 this.file = file; 091 } 092 093 public void run() { 094 open(file.getName(), IOUtil.openInputStream(file)); 095 } 096 } 097 098 public void open(String name, InputStream inputStream) { 099 100 try { 101 desktopFrame.waitCursor(); 102 103 inputStream = new GZIPInputStream(inputStream); 104 105 ObjectInputStream objectInputStream = new ObjectInputStream(inputStream); 106 107 108 ViewBuilder viewBuilder = (ViewBuilder) objectInputStream.readObject(); 109 110 JComponent component = viewBuilder.buildView(objectInputStream); 111 112 desktopFrame.createView(name, component); 113 114 } catch (OutOfMemoryError e) { 115 116 Errors.showError(desktopFrame, e, "Out of Memory! Use the -Xmx Java option."); 117 118 } catch (Exception e) { 119 120 Errors.showError(desktopFrame, e, "Failed to open : " + name); 121 122 } finally { 123 124 desktopFrame.unwaitCursor(); 125 IOUtil.close(inputStream); 126 127 } 128 } 129 130 private static class JRatFileFilter extends FileFilter { 131 132 static FileFilter INSTANCE = new JRatFileFilter(); 133 134 public boolean accept(File f) { 135 if (f.isDirectory()) { 136 return true; 137 } 138 return (f.getName().endsWith(".jrat")); 139 } 140 141 public String getDescription() { 142 return "JRat Data File (*.jrat)"; 143 } 144 } 145 }