19 package org.sleuthkit.autopsy.casemodule;
21 import java.awt.Color;
22 import java.beans.PropertyChangeEvent;
23 import java.beans.PropertyChangeListener;
24 import java.io.BufferedReader;
26 import java.io.IOException;
27 import java.io.InputStreamReader;
28 import java.nio.file.Paths;
29 import java.util.concurrent.atomic.AtomicBoolean;
30 import java.util.logging.Level;
31 import javax.swing.JFrame;
32 import javax.swing.SwingWorker;
33 import org.openide.modules.InstalledFileLocator;
34 import org.openide.util.NbBundle;
35 import org.openide.windows.WindowManager;
43 @SuppressWarnings(
"PMD.SingularField")
44 class UnpackagePortableCaseProgressDialog extends javax.swing.JDialog implements PropertyChangeListener {
46 private UnpackageWorker worker;
51 @NbBundle.Messages({
"UnpackagePortableCaseProgressDialog.title.text=Unpackage Portable Case Progress",})
52 UnpackagePortableCaseProgressDialog() {
53 super((JFrame) WindowManager.getDefault().getMainWindow(),
54 Bundle.UnpackagePortableCaseProgressDialog_title_text(),
57 customizeComponents();
60 private void customizeComponents() {
61 cancelButton.setEnabled(
true);
62 okButton.setEnabled(
false);
63 progressBar.setIndeterminate(
true);
64 resultLabel.setText(
"");
73 void unpackageCase(String packagedCase, String outputFolder) {
75 worker =
new UnpackageWorker(packagedCase, outputFolder);
76 worker.addPropertyChangeListener(
this);
79 setLocationRelativeTo((JFrame) WindowManager.getDefault().getMainWindow());
80 this.setVisible(
true);
84 @NbBundle.Messages({
"UnpackagePortableCaseProgressDialog.propertyChange.success=Successfully unpacked case",})
86 public void propertyChange(PropertyChangeEvent evt) {
88 if (
"state".equals(evt.getPropertyName())
89 && (SwingWorker.StateValue.DONE.equals(evt.getNewValue()))) {
93 cancelButton.setEnabled(
false);
94 okButton.setEnabled(
true);
96 if (worker.isSuccess()) {
97 progressBar.setIndeterminate(
false);
98 progressBar.setValue(progressBar.getMaximum());
99 resultLabel.setText(Bundle.UnpackagePortableCaseProgressDialog_propertyChange_success());
102 progressBar.setIndeterminate(
false);
103 progressBar.setValue(0);
104 resultLabel.setForeground(Color.red);
105 resultLabel.setText(worker.getDisplayError());
118 private final AtomicBoolean success =
new AtomicBoolean();
119 private String lastError =
"";
122 this.packagedCase = packagedCase;
123 this.outputFolder = outputFolder;
124 this.success.set(
false);
128 "UnpackageWorker.doInBackground.errorFinding7zip=Could not locate 7-Zip executable",
129 "UnpackageWorker.doInBackground.errorCompressingCase=Error unpackaging case",
130 "UnpackageWorker.doInBackground.canceled=Unpackaging canceled by user",
136 File sevenZipExe = locate7ZipExecutable();
137 if (sevenZipExe == null) {
138 setDisplayError(Bundle.UnpackageWorker_doInBackground_errorFinding7zip());
139 throw new TskCoreException(
"Error finding 7-Zip executable");
142 String outputFolderSwitch =
"-o" + outputFolder;
143 ProcessBuilder procBuilder =
new ProcessBuilder();
145 sevenZipExe.getAbsolutePath(),
152 Process process = procBuilder.start();
154 while (process.isAlive()) {
155 if (this.isCancelled()) {
156 setDisplayError(Bundle.UnpackageWorker_doInBackground_canceled());
162 int exitCode = process.exitValue();
165 StringBuilder sb =
new StringBuilder();
166 try (BufferedReader br =
new BufferedReader(
new InputStreamReader(process.getErrorStream()))) {
168 while ((line = br.readLine()) != null) {
169 sb.append(line).append(System.getProperty(
"line.separator"));
173 setDisplayError(Bundle.UnpackageWorker_doInBackground_errorCompressingCase());
174 throw new TskCoreException(
"Error unpackaging case. 7-Zip output: " + sb.toString());
176 }
catch (IOException | InterruptedException ex) {
177 setDisplayError(Bundle.UnpackageWorker_doInBackground_errorCompressingCase());
178 throw new TskCoreException(
"Error unpackaging case", ex);
186 synchronized protected void done() {
187 if (this.isCancelled()) {
193 }
catch (Exception ex) {
194 Logger.
getLogger(UnpackagePortableCaseProgressDialog.class.getName()).log(Level.SEVERE,
"Error unpackaging portable case", ex);
204 lastError = errorStr;
216 return success.get();
229 String executableToFindName = Paths.get(
"7-Zip",
"7z.exe").toString();
230 File exeFile = InstalledFileLocator.getDefault().locate(executableToFindName, UnpackagePortableCaseProgressDialog.class.getPackage().getName(),
false);
231 if (null == exeFile) {
235 if (!exeFile.canExecute()) {
248 @SuppressWarnings(
"unchecked")
250 private
void initComponents() {
252 progressBar =
new javax.swing.JProgressBar();
253 cancelButton =
new javax.swing.JButton();
254 okButton =
new javax.swing.JButton();
255 resultLabel =
new javax.swing.JLabel();
257 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
259 org.openide.awt.Mnemonics.setLocalizedText(cancelButton,
org.openide.util.NbBundle.getMessage(UnpackagePortableCaseProgressDialog.class,
"UnpackagePortableCaseProgressDialog.cancelButton.text"));
260 cancelButton.addActionListener(
new java.awt.event.ActionListener() {
261 public void actionPerformed(java.awt.event.ActionEvent evt) {
262 cancelButtonActionPerformed(evt);
266 org.openide.awt.Mnemonics.setLocalizedText(okButton,
org.openide.util.NbBundle.getMessage(UnpackagePortableCaseProgressDialog.class,
"UnpackagePortableCaseProgressDialog.okButton.text"));
267 okButton.addActionListener(
new java.awt.event.ActionListener() {
268 public void actionPerformed(java.awt.event.ActionEvent evt) {
269 okButtonActionPerformed(evt);
273 org.openide.awt.Mnemonics.setLocalizedText(resultLabel,
org.openide.util.NbBundle.getMessage(UnpackagePortableCaseProgressDialog.class,
"UnpackagePortableCaseProgressDialog.resultLabel.text"));
275 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(getContentPane());
276 getContentPane().setLayout(layout);
277 layout.setHorizontalGroup(
278 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
279 .addGroup(layout.createSequentialGroup()
281 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
282 .addComponent(progressBar, javax.swing.GroupLayout.DEFAULT_SIZE, 409, Short.MAX_VALUE)
283 .addGroup(layout.createSequentialGroup()
284 .addComponent(resultLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
285 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
286 .addComponent(okButton, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
287 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
288 .addComponent(cancelButton)))
291 layout.setVerticalGroup(
292 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
293 .addGroup(layout.createSequentialGroup()
295 .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
296 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
297 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
298 .addComponent(cancelButton)
299 .addComponent(okButton)
300 .addComponent(resultLabel))
301 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
307 private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {
312 private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {
317 private javax.swing.JButton cancelButton;
318 private javax.swing.JButton okButton;
319 private javax.swing.JProgressBar progressBar;
320 private javax.swing.JLabel resultLabel;
synchronized String getDisplayError()
File locate7ZipExecutable()
final String packagedCase
synchronized void setDisplayError(String errorStr)
synchronized static Logger getLogger(String name)
final String outputFolder