19 package org.sleuthkit.autopsy.directorytree;
21 import java.awt.Component;
22 import java.awt.event.ActionEvent;
24 import java.util.ArrayList;
25 import java.util.Collection;
26 import java.util.HashSet;
27 import java.util.Iterator;
29 import java.util.logging.Level;
30 import javax.swing.AbstractAction;
31 import javax.swing.JFileChooser;
32 import javax.swing.JOptionPane;
33 import javax.swing.SwingWorker;
34 import org.netbeans.api.progress.ProgressHandle;
35 import org.openide.util.Cancellable;
36 import org.openide.util.Exceptions;
37 import org.openide.util.NbBundle;
38 import org.openide.util.Utilities;
63 if (null == instance) {
70 super(NbBundle.getMessage(
ExtractAction.class,
"ExtractAction.title.extractFiles.text"));
81 Collection<? extends AbstractFile> selectedFiles = Utilities.actionsGlobalContext().lookupAll(AbstractFile.class);
82 if (selectedFiles.size() > 1) {
84 }
else if (selectedFiles.size() == 1) {
85 AbstractFile source = selectedFiles.iterator().next();
100 @NbBundle.Messages ({
"ExtractAction.noOpenCase.errMsg=No open case available."})
101 private void extractFile(ActionEvent e, AbstractFile selectedFile) {
106 JOptionPane.showMessageDialog((Component) e.getSource(), Bundle.ExtractAction_noOpenCase_errMsg());
107 logger.log(Level.INFO,
"Exception while getting open case.", ex);
110 JFileChooser fileChooser =
new JFileChooser();
114 if (fileChooser.showSaveDialog((Component) e.getSource()) == JFileChooser.APPROVE_OPTION) {
115 ArrayList<FileExtractionTask> fileExtractionTasks =
new ArrayList<>();
116 fileExtractionTasks.add(
new FileExtractionTask(selectedFile, fileChooser.getSelectedFile()));
127 private void extractFiles(ActionEvent e, Collection<? extends AbstractFile> selectedFiles) {
132 JOptionPane.showMessageDialog((Component) e.getSource(), Bundle.ExtractAction_noOpenCase_errMsg());
133 logger.log(Level.INFO,
"Exception while getting open case.", ex);
136 JFileChooser folderChooser =
new JFileChooser();
137 folderChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
139 if (folderChooser.showSaveDialog((Component) e.getSource()) == JFileChooser.APPROVE_OPTION) {
140 File destinationFolder = folderChooser.getSelectedFile();
141 if (!destinationFolder.exists()) {
143 destinationFolder.mkdirs();
144 }
catch (Exception ex) {
145 JOptionPane.showMessageDialog((Component) e.getSource(), NbBundle.getMessage(this.getClass(),
146 "ExtractAction.extractFiles.cantCreateFolderErr.msg"));
147 logger.log(Level.INFO,
"Unable to create folder(s) for user " + destinationFolder.getAbsolutePath(), ex);
155 Set<AbstractFile> uniqueFiles =
new HashSet<>(selectedFiles);
158 ArrayList<FileExtractionTask> fileExtractionTasks =
new ArrayList<>();
159 for (AbstractFile source : uniqueFiles) {
170 for (Iterator<FileExtractionTask> it = fileExtractionTasks.iterator(); it.hasNext();) {
183 if (task.destination.exists()) {
184 if (JOptionPane.showConfirmDialog((Component) e.getSource(),
185 NbBundle.getMessage(this.getClass(),
"ExtractAction.confDlg.destFileExist.msg", task.destination.getAbsolutePath()),
186 NbBundle.getMessage(
this.getClass(),
"ExtractAction.confDlg.destFileExist.title"),
187 JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
189 JOptionPane.showMessageDialog((Component) e.getSource(),
190 NbBundle.getMessage(this.getClass(),
"ExtractAction.msgDlg.cantOverwriteFile.msg", task.destination.getAbsolutePath()));
200 if (!fileExtractionTasks.isEmpty()) {
204 }
catch (Exception ex) {
205 logger.log(Level.WARNING,
"Unable to start background file extraction thread", ex);
209 NbBundle.getMessage(
this.getClass(),
"ExtractAction.notifyDlg.noFileToExtr.msg"));
219 this.source = source;
220 this.destination = destination;
233 FileExtracter(ArrayList<FileExtractionTask> extractionTasks) {
239 if (extractionTasks.isEmpty()) {
244 final String displayName = NbBundle.getMessage(this.getClass(),
"ExtractAction.progress.extracting");
245 progress = ProgressHandle.createHandle(displayName,
new Cancellable() {
247 public boolean cancel() {
248 if (progress != null) {
249 progress.setDisplayName(
250 NbBundle.getMessage(
this.getClass(),
"ExtractAction.progress.cancellingExtraction", displayName));
256 progress.switchToIndeterminate();
275 boolean msgDisplayed =
false;
278 }
catch (Exception ex) {
279 logger.log(Level.SEVERE,
"Fatal error during file extraction", ex);
281 NbBundle.getMessage(
this.getClass(),
"ExtractAction.done.notifyMsg.extractErr", ex.getMessage()));
285 if (!this.isCancelled() && !msgDisplayed) {
287 NbBundle.getMessage(
this.getClass(),
"ExtractAction.done.notifyMsg.fileExtr.text"));
295 workUnits += file.getSize();
298 for (Content child : file.getChildren()) {
299 if (child instanceof AbstractFile) {
303 }
catch (TskCoreException ex) {
304 logger.log(Level.SEVERE,
"Could not get children of content", ex);
static boolean deleteFileDir(File path)
static String escapeFileName(String fileName)
synchronized static Logger getLogger(String name)
static Case getCurrentCaseThrows()
String getExportDirectory()
static void info(String message)
static boolean isDotDirectory(AbstractFile dir)