Autopsy 4.22.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
RecentCases.java
Go to the documentation of this file.
1/*
2 * Autopsy Forensic Browser
3 *
4 * Copyright 2011-2018 Basis Technology Corp.
5 * Contact: carrier <at> sleuthkit <dot> org
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19package org.sleuthkit.autopsy.casemodule;
20
21import java.awt.event.ActionEvent;
22import java.io.File;
23import java.io.IOException;
24import java.util.ArrayList;
25import java.util.Arrays;
26import java.util.Deque;
27import java.util.Iterator;
28import java.util.LinkedList;
29import java.util.List;
30import java.util.logging.Level;
31import javax.swing.JMenuItem;
32import org.apache.commons.lang.ArrayUtils;
33import org.openide.filesystems.FileUtil;
34import org.openide.util.HelpCtx;
35import org.openide.util.NbBundle;
36import org.openide.util.actions.CallableSystemAction;
37import org.openide.util.actions.Presenter;
38import org.sleuthkit.autopsy.coreutils.Logger;
39import org.sleuthkit.autopsy.coreutils.ModuleSettings;
40
46final class RecentCases extends CallableSystemAction implements Presenter.Menu {
47
48 private static final long serialVersionUID = 1L;
49 private static final int LENGTH = 6;
50 private static final String NAME_PROP_KEY = "LBL_RecentCase_Name"; //NON-NLS
51 private static final String PATH_PROP_KEY = "LBL_RecentCase_Path"; //NON-NLS
52 private static final RecentCase BLANK_RECENTCASE = new RecentCase("", "");
53 private final static RecentCases instance = new RecentCases();
54 private final Deque<RecentCase> recentCases; // newest case is last case
55
62 static public RecentCases getInstance() {
63 instance.refreshRecentCases();
64 return instance;
65 }
66
70 private RecentCases() {
71
72 for (int i = 0; i < LENGTH; i++) {
73 try {
74 if (ModuleSettings.getConfigSetting(ModuleSettings.MAIN_SETTINGS, nameKey(i)) == null) {
75 ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, nameKey(i), "");
76 }
77 if (ModuleSettings.getConfigSetting(ModuleSettings.MAIN_SETTINGS, pathKey(i)) == null) {
78 ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, pathKey(i), "");
79 }
80 } catch (Exception e) {
81
82 }
83 }
84
85 // Load recentCases from properties
86 recentCases = new LinkedList<>();
87
88 for (int i = 0; i < LENGTH; i++) {
89 final RecentCase rc = new RecentCase(getName(i), getPath(i));
90 if (!rc.equals(BLANK_RECENTCASE)) {
91 recentCases.add(rc);
92 }
93 }
94
95 refreshRecentCases();
96 }
97
98 private static void validateCaseIndex(int i) {
99 if (i < 0 || i >= LENGTH) {
100 throw new IllegalArgumentException(
101 NbBundle.getMessage(RecentCases.class, "RecentCases.exception.caseIdxOutOfRange.msg", i));
102 }
103 }
104
105 private static String nameKey(int i) {
106 validateCaseIndex(i);
107 return NAME_PROP_KEY + Integer.toString(i + 1);
108 }
109
110 private static String pathKey(int i) {
111 validateCaseIndex(i);
112 return PATH_PROP_KEY + Integer.toString(i + 1);
113 }
114
115 private String getName(int i) {
116 try {
117 return ModuleSettings.getConfigSetting(ModuleSettings.MAIN_SETTINGS, nameKey(i));
118 } catch (Exception e) {
119 return null;
120 }
121 }
122
123 private String getPath(int i) {
124 try {
125 return ModuleSettings.getConfigSetting(ModuleSettings.MAIN_SETTINGS, pathKey(i));
126 } catch (Exception e) {
127 return null;
128 }
129 }
130
131 private void setName(int i, String name) {
132 ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, nameKey(i), name);
133 }
134
135 private void setPath(int i, String path) {
136 ModuleSettings.setConfigSetting(ModuleSettings.MAIN_SETTINGS, pathKey(i), path);
137 }
138
139 private void setRecentCase(int i, RecentCase rc) {
140 setName(i, rc.name);
141 setPath(i, rc.path);
142 }
143
144 private static final class RecentCase {
145
146 String name, path;
147
153 private RecentCase(String name, String path) {
154 this.name = name;
155 this.path = path;
156 }
157
167 static RecentCase createSafe(String name, String unsafePath) {
168 return new RecentCase(name, FileUtil.normalizePath(unsafePath));
169 }
170
176 boolean exists() {
177 return !(name.isEmpty() || path.isEmpty() || !new File(path).exists());
178 }
179
180 // netbeans autogenerated hashCode
181 @Override
182 public int hashCode() {
183 int hash = 7;
184 hash = 13 * hash + (this.name != null ? this.name.hashCode() : 0);
185 hash = 13 * hash + (this.path != null ? this.path.hashCode() : 0);
186 return hash;
187 }
188
189 @Override
190 public boolean equals(Object obj) {
191 if (obj == null) {
192 return false;
193 }
194 if (getClass() != obj.getClass()) {
195 return false;
196 }
197 final RecentCase other = (RecentCase) obj;
198 if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) {
199 return false;
200 }
201 if ((this.path == null) ? (other.path != null) : !this.path.equals(other.path)) {
202 return false;
203 }
204 return true;
205 }
206 }
207
212 private void refreshRecentCases() {
213 List<RecentCase> toDelete = new ArrayList<>();
214 for (RecentCase rc : recentCases) {
215 if (!rc.exists()) {
216 toDelete.add(rc);
217 }
218 }
219 for (RecentCase deleteMe : toDelete) {
220 removeRecentCase(deleteMe.name, deleteMe.path);
221 }
222 }
223
224 private void storeRecentCases() throws IOException {
225 int i = 0;
226
227 // store however many recent cases exist
228 for (RecentCase rc : recentCases) {
229 setRecentCase(i, rc);
230 i++;
231 }
232
233 // set the rest to blanks
234 while (i < LENGTH) {
235 setRecentCase(i, BLANK_RECENTCASE);
236 i++;
237 }
238
239 }
240
246 @Override
247 public JMenuItem getMenuPresenter() {
248 return new UpdateRecentCases();
249 }
250
256 @Override
257 public void actionPerformed(ActionEvent e) {
258 UpdateRecentCases.setHasRecentCase(false);
259
260 recentCases.clear();
261
262 try {
263 // clear the properties file
264 storeRecentCases();
265 } catch (IOException ex) {
266 Logger.getLogger(RecentCases.class.getName()).log(Level.WARNING, "Error: Could not clear the properties file.", ex); //NON-NLS
267 }
268 }
269
270 private void addRecentCase(RecentCase rc) {
271 // remove the case if it's already in the list
272 recentCases.remove(rc);
273
274 // make space if it's needed
275 if (recentCases.size() == LENGTH) {
276 recentCases.remove();
277 }
278
279 recentCases.add(rc);
280 }
281
290 public void addRecentCase(String name, String unsafePath) {
291 RecentCase rc = RecentCase.createSafe(name, unsafePath);
292
293 addRecentCase(rc);
294
295 this.getMenuPresenter().setVisible(true); // invoke the contructor again
296
297 try {
298 storeRecentCases();
299 } catch (IOException ex) {
300 Logger.getLogger(RecentCases.class.getName()).log(Level.WARNING, "Error: Could not update the properties file.", ex); //NON-NLS
301 }
302 }
303
314 public void updateRecentCase(String oldName, String oldPath, String newName, String newPath) throws Exception {
315 RecentCase oldRc = RecentCase.createSafe(oldName, oldPath);
316 RecentCase newRc = RecentCase.createSafe(newName, newPath);
317
318 // remove all instances of the old recent case
319 recentCases.removeAll(Arrays.asList(oldRc));
320
321 addRecentCase(newRc);
322
323 this.getMenuPresenter().setVisible(true); // invoke the contructor again
324
325 try {
326 storeRecentCases();
327 } catch (IOException ex) {
328 Logger.getLogger(RecentCases.class.getName()).log(Level.WARNING, "Error: Could not update the properties file.", ex); //NON-NLS
329 }
330 }
331
337 public int getTotalRecentCases() {
338 return recentCases.size();
339 }
340
348 public void removeRecentCase(String name, String path) {
349 RecentCase rc = RecentCase.createSafe(name, path);
350
351 // remove all instances of the old recent case
352 recentCases.removeAll(Arrays.asList(rc));
353
354 this.getMenuPresenter().setVisible(true); // invoke the contructor again
355
356 // write the properties file
357 try {
358 storeRecentCases();
359 } catch (IOException ex) {
360 Logger.getLogger(RecentCases.class.getName()).log(Level.WARNING, "Error: Could not update the properties file.", ex); //NON-NLS
361 }
362 }
363
370 public String[] getRecentCaseNames() {
371 String[] caseNames = new String[LENGTH];
372
373 Iterator<RecentCase> mostRecentFirst = recentCases.descendingIterator();
374 int i = 0;
375 String currentCaseName = null;
376 try {
377 currentCaseName = Case.getCurrentCaseThrows().getDisplayName();
378 } catch (NoCurrentCaseException ex) {
379 // in case there is no current case.
380 }
381
382 while (mostRecentFirst.hasNext()) {
383 String name = mostRecentFirst.next().name;
384 if ((currentCaseName != null && !name.equals(currentCaseName)) || currentCaseName == null) {
385 // exclude currentCaseName from the caseNames[]
386 caseNames[i] = name;
387 i++;
388 }
389 }
390
391 while (i < caseNames.length) {
392 caseNames[i] = "";
393 i++;
394 }
395
396 // return last 5 case names
397 return (String[]) ArrayUtils.subarray(caseNames, 0, LENGTH - 1);
398 }
399
406 public String[] getRecentCasePaths() {
407 String[] casePaths = new String[LENGTH];
408 String currentCasePath = null;
409 try {
410 currentCasePath = Case.getCurrentCaseThrows().getMetadata().getFilePath().toString();
411 } catch (NoCurrentCaseException ex) {
412 /*
413 * There may be no current case.
414 */
415 }
416
417 Iterator<RecentCase> mostRecentFirst = recentCases.descendingIterator();
418 int i = 0;
419 while (mostRecentFirst.hasNext()) {
420 String path = mostRecentFirst.next().path;
421 if ((currentCasePath != null && !path.equals(currentCasePath)) || currentCasePath == null) {
422 // exclude currentCasePath from the casePaths[]
423 casePaths[i] = path;
424 i++;
425 }
426 }
427
428 while (i < casePaths.length) {
429 casePaths[i] = "";
430 i++;
431 }
432
433 // return last 5 case paths
434 return (String[]) ArrayUtils.subarray(casePaths, 0, LENGTH - 1);
435 }
436
440 @Override
441 public void performAction() {
442 }
443
449 @Override
450 public String getName() {
451 //return NbBundle.getMessage(RecentCases.class, "CTL_RecentCases");
452 return NbBundle.getMessage(RecentCases.class, "RecentCases.getName.text");
453 }
454
460 @Override
461 public HelpCtx getHelpCtx() {
462 return HelpCtx.DEFAULT_HELP;
463 }
464}

Copyright © 2012-2024 Sleuth Kit Labs. Generated on:
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.