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 }