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    }