diff --git a/Core/src/org/sleuthkit/autopsy/timeline/Bundle.properties b/Core/src/org/sleuthkit/autopsy/timeline/Bundle.properties index a2a287e322..fdb649329b 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/timeline/Bundle.properties @@ -1,17 +1,14 @@ OpenIDE-Module-Name=Timeline CTL_MakeTimeline="Timeline" +CTL_TimeLineTopComponentAction=TimeLineTopComponent +CTL_TimeLineTopComponent=Timeline Window +HINT_TimeLineTopComponent=This is a Timeline window Timeline.frameName.text={0} - Autopsy Timeline Timeline.resultsPanel.title=Timeline Results Timeline.runJavaFxThread.progress.creating=Creating timeline . . . Timeline.zoomOutButton.text=Zoom Out Timeline.goToButton.text=Go To\: Timeline.yearBarChart.x.years=Years -Timeline.yearBarChart.y.numEvents=Number of Events -Timeline.MonthsBarChart.x.monthYY=Month ({0}) -Timeline.MonthsBarChart.y.numEvents=Number of Events -Timeline.eventsByMoBarChart.x.dayOfMo=Day of Month -Timeline.eventsByMoBarChart.y.numEvents=Number of Events -Timeline.node.emptyRoot=Empty Root Timeline.resultPanel.loading=Loading... Timeline.node.root=Root Timeline.propChg.confDlg.timelineOOD.msg=The event data is out of date. Would you like to regenerate it? @@ -33,5 +30,16 @@ TimelinePanel.jButton2.text=1m TimelinePanel.jButton3.text=3m TimelinePanel.jButton4.text=2w ProgressWindow.progressHeader.text=\ -AggregateEvent.differentTypes="aggregate events are not compatible they have different types" -AggregateEvent.differentDescriptions="aggregate events are not compatible they have different descriptions" +TimeLineTopComponent.eventsTab.name=Events +TimeLineTopComponent.filterTab.name=Filters +Timeline.showLastPopulatedWhileIngestingConf.confDlg.details=re populate events? +Timeline.do_repopulate.msg=The events database was previously populated while ingest was running.\nSome events may not have been populated or may have been populated inaccurately.\nDo you want to repopulate the events database now? +Timeline.pushDescrLOD.confdlg.msg=You are about to show details for {0} events. This might be very slow or even crash Autopsy.\n\nDo you want to continue? +Timeline.pushDescrLOD.confdlg.details= +OpenTimelineAction.title=Timeline +Timeline.ProgressWindow.cancel.confdlg.msg=Do you want to cancel time line creation? +Timeline.ProgressWindow.cancel.confdlg.detail=Cancel timeline creation? +Timeline.progressWindow.name=Timeline +Timeline.progressWindow.title=Generating Timeline data +OpenTimeLineAction.msgdlg.text=Error creating timeline, there are no data sources. +TimeLineTopComponent.timeZonePanel.text=Display Times In\: diff --git a/Core/src/org/sleuthkit/autopsy/timeline/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/Bundle_ja.properties new file mode 100644 index 0000000000..7efc917835 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/timeline/Bundle_ja.properties @@ -0,0 +1,29 @@ +CTL_MakeTimeline=\u300C\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u300D +CTL_TimeLineTopComponent=\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u30A6\u30A3\u30F3\u30C9\u30A6 +CTL_TimeLineTopComponentAction=\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u30C8\u30C3\u30D7\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8 +HINT_TimeLineTopComponent=\u3053\u308C\u306F\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u30A6\u30A3\u30F3\u30C9\u30A6\u3067\u3059 +OpenIDE-Module-Name=\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3 +OpenTimelineAction.title=\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3 +Timeline.do_repopulate.msg=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3092\u5B9F\u884C\u4E2D\u306B\u30A4\u30D9\u30F3\u30C8\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u306F\u4EE5\u524D\u57CB\u3081\u3089\u308C\u307E\u3057\u305F\u3002\n\u4E00\u90E8\u306E\u30A4\u30D9\u30F3\u30C8\u306F\u7A7A\u767D\u306E\u307E\u307E\u3082\u3057\u304F\u306F\u4E0D\u6B63\u78BA\u306A\u30C7\u30FC\u30BF\u3067\u57CB\u307E\u3063\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\n\u4ECA\u3059\u3050\u30A4\u30D9\u30F3\u30C8\u306E\u30C7\u30FC\u30BF\u3092\u518D\u5EA6\u57CB\u3081\u307E\u3059\u304B\uFF1F +Timeline.frameName.text={0} - Autopsy\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3 +Timeline.goToButton.text=\u4E0B\u8A18\u3078\u79FB\u52D5\uFF1A +Timeline.initTimeline.confDlg.genBeforeIngest.details=\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3 +Timeline.initTimeline.confDlg.genBeforeIngest.msg=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u304C\u5B8C\u4E86\u3059\u308B\u524D\u306B\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u3092\u4F5C\u6210\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u307E\u3059\u3002\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u304C\u4E0D\u5B8C\u5168\u306B\u306A\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u5B9F\u884C\u3057\u307E\u3059\u304B\uFF1F +Timeline.node.root=\u30EB\u30FC\u30C8 +Timeline.ProgressWindow.cancel.confdlg.detail=\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u4F5C\u6210\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3059\u304B\uFF1F +Timeline.ProgressWindow.cancel.confdlg.msg=\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u4F5C\u6210\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3059\u304B\uFF1F +Timeline.progressWindow.name=\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3 +Timeline.progressWindow.title=\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u30C7\u30FC\u30BF\u4F5C\u6210\u4E2D +Timeline.propChg.confDlg.timelineOOD.details=\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u9078\u629E +Timeline.propChg.confDlg.timelineOOD.msg=\u30A4\u30D9\u30F3\u30C8\u30C7\u30FC\u30BF\u304C\u6700\u65B0\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u518D\u5EA6\u4F5C\u6210\u3057\u307E\u3059\u304B\uFF1F +Timeline.pushDescrLOD.confdlg.msg=\u5B9F\u884C\u3059\u308B\u3068{0}\u30A4\u30D9\u30F3\u30C8\u306E\u8A73\u7D30\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002\u3053\u306E\u51E6\u7406\u306F\u9577\u6642\u9593\u304B\u304B\u308B\u3082\u3057\u304F\u306FAutopsy\u3092\u30AF\u30E9\u30C3\u30B7\u30E5\u3059\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\n\n\u5B9F\u884C\u3057\u307E\u3059\u304B\uFF1F +Timeline.resultPanel.loading=\u30ED\u30FC\u30C9\u4E2D\u30FB\u30FB\u30FB +Timeline.resultsPanel.title=\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u7D50\u679C +Timeline.runJavaFxThread.progress.creating=\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u4F5C\u6210\u4E2D\u30FB\u30FB\u30FB +Timeline.showLastPopulatedWhileIngestingConf.confDlg.details=\u30A4\u30D9\u30F3\u30C8\u3092\u518D\u5EA6\u57CB\u3081\u307E\u3059\u304B\uFF1F +Timeline.zoomOutButton.text=\u30BA\u30FC\u30E0\u30A2\u30A6\u30C8 +TimelineFrame.title=\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3 +TimeLineTopComponent.eventsTab.name=\u30A4\u30D9\u30F3\u30C8 +TimeLineTopComponent.filterTab.name=\u30D5\u30A3\u30EB\u30BF +OpenTimeLineAction.msgdlg.text=\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u4F5C\u6210\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u304C\u3042\u308A\u307E\u305B\u3093\u3002 +TimeLineTopComponent.timeZonePanel.text=\u6642\u9593\u3092\u4E0B\u8A18\u3067\u8868\u793A\uFF1A \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/timeline/FXMLConstructor.java b/Core/src/org/sleuthkit/autopsy/timeline/FXMLConstructor.java index d97551d00a..cdf6a38455 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/FXMLConstructor.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/FXMLConstructor.java @@ -40,7 +40,7 @@ import org.openide.util.Exceptions; public class FXMLConstructor { static public void construct(Node n, String fxmlFileName) { - final String name = "nbres:/" + StringUtils.replace(n.getClass().getPackage().getName(), ".", "/") + "/" + fxmlFileName; + final String name = "nbres:/" + StringUtils.replace(n.getClass().getPackage().getName(), ".", "/") + "/" + fxmlFileName; // NON-NLS System.out.println(name); try { diff --git a/Core/src/org/sleuthkit/autopsy/timeline/OpenTimelineAction.java b/Core/src/org/sleuthkit/autopsy/timeline/OpenTimelineAction.java index fd1f450370..295ae4b124 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/OpenTimelineAction.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/OpenTimelineAction.java @@ -25,6 +25,7 @@ import org.openide.awt.ActionReference; import org.openide.awt.ActionReferences; import org.openide.awt.ActionRegistration; import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; import org.openide.util.actions.CallableSystemAction; import org.openide.windows.WindowManager; import org.sleuthkit.autopsy.casemodule.Case; @@ -66,14 +67,15 @@ public class OpenTimelineAction extends CallableSystemAction { final Case currentCase = Case.getCurrentCase(); if (currentCase.hasData() == false) { - JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), "Error creating timeline, there are no data sources."); - LOGGER.log(Level.INFO, "Error creating timeline, there are no data sources."); + JOptionPane.showMessageDialog(WindowManager.getDefault().getMainWindow(), + NbBundle.getMessage(this.getClass(), "OpenTimeLineAction.msgdlg.text")); + LOGGER.log(Level.INFO, "Error creating timeline, there are no data sources.");// NON-NLS return; } synchronized (OpenTimelineAction.class) { if (timeLineController == null) { timeLineController = new TimeLineController(); - LOGGER.log(Level.WARNING, "Failed to get TimeLineController from lookup. Instantiating one directly.S"); + LOGGER.log(Level.WARNING, "Failed to get TimeLineController from lookup. Instantiating one directly.S");// NON-NLS } } timeLineController.openTimeLine(); @@ -81,7 +83,7 @@ public class OpenTimelineAction extends CallableSystemAction { @Override public String getName() { - return "Timeline"; + return NbBundle.getMessage(TimeLineTopComponent.class, "OpenTimelineAction.title"); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ProgressWindow.java b/Core/src/org/sleuthkit/autopsy/timeline/ProgressWindow.java index e8f8239c72..7dec49018c 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/ProgressWindow.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/ProgressWindow.java @@ -65,10 +65,10 @@ public class ProgressWindow extends JFrame { }); //progressBar.setIndeterminate(true); - setName("Timeline"); - setTitle("Generating Timeline data"); + setName(NbBundle.getMessage(TimeLineTopComponent.class, "Timeline.progressWindow.name")); + setTitle(NbBundle.getMessage(TimeLineTopComponent.class, "Timeline.progressWindow.title")); // Close the dialog when Esc is pressed - String cancelName = "cancel"; + String cancelName = "cancel"; // NON-NLS InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), cancelName); @@ -179,7 +179,12 @@ public class ProgressWindow extends JFrame { public void cancel() { SwingUtilities.invokeLater(() -> { if (isVisible()) { - int showConfirmDialog = JOptionPane.showConfirmDialog(ProgressWindow.this, "Do you want to cancel time line creation?", "Cancel timeline creation?", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); + int showConfirmDialog = JOptionPane.showConfirmDialog(ProgressWindow.this, + NbBundle.getMessage(TimeLineTopComponent.class, + "Timeline.ProgressWindow.cancel.confdlg.msg"), + NbBundle.getMessage(TimeLineTopComponent.class, + "Timeline.ProgressWindow.cancel.confdlg.detail"), + JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); if (showConfirmDialog == JOptionPane.YES_OPTION) { close(); } diff --git a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java index cd5cb85bee..91da1a556b 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java @@ -98,7 +98,8 @@ public class TimeLineController { private static final Logger LOGGER = Logger.getLogger(TimeLineController.class.getName()); - private static final String DO_REPOPULATE_MESSAGE = "The events databse was prevously populated while ingest was running.\n" + "Some events may not have been populated or may have been populated inaccurately.\n" + "Do you want to repopulate the events database now?"; + private static final String DO_REPOPULATE_MESSAGE = NbBundle.getMessage(TimeLineController.class, + "Timeline.do_repopulate.msg"); private static final ReadOnlyObjectWrapper timeZone = new ReadOnlyObjectWrapper<>(TimeZone.getDefault()); @@ -107,7 +108,7 @@ public class TimeLineController { } public static DateTimeFormatter getZonedFormatter() { - return DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss").withZone(getJodaTimeZone()); + return DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss").withZone(getJodaTimeZone()); // NON-NLS } public static DateTimeZone getJodaTimeZone() { @@ -253,7 +254,7 @@ public class TimeLineController { return false; } } - LOGGER.log(Level.INFO, "Beginning generation of timeline"); + LOGGER.log(Level.INFO, "Beginning generation of timeline"); // NON-NLS try { SwingUtilities.invokeLater(() -> { if (mainFrame != null) { @@ -286,7 +287,7 @@ public class TimeLineController { }); } } catch (TskCoreException ex) { - LOGGER.log(Level.SEVERE, "Error when generating timeline, ", ex); + LOGGER.log(Level.SEVERE, "Error when generating timeline, ", ex); // NON-NLS return false; } return true; @@ -347,18 +348,18 @@ public class TimeLineController { } } catch (TskCoreException ex) { - LOGGER.log(Level.SEVERE, "Error when generating timeline, ", ex); + LOGGER.log(Level.SEVERE, "Error when generating timeline, ", ex); // NON-NLS } catch (HeadlessException | MissingResourceException ex) { - LOGGER.log(Level.SEVERE, "Unexpected error when generating timeline, ", ex); + LOGGER.log(Level.SEVERE, "Unexpected error when generating timeline, ", ex); // NON-NLS } } @SuppressWarnings("deprecation") private long getCaseLastArtifactID(final SleuthkitCase sleuthkitCase) { long caseLastArtfId = -1; - try (ResultSet runQuery = sleuthkitCase.runQuery("select Max(artifact_id) as max_id from blackboard_artifacts")) { + try (ResultSet runQuery = sleuthkitCase.runQuery("select Max(artifact_id) as max_id from blackboard_artifacts")) { // NON-NLS while (runQuery.next()) { - caseLastArtfId = runQuery.getLong("max_id"); + caseLastArtfId = runQuery.getLong("max_id"); // NON-NLS } sleuthkitCase.closeRunQuery(runQuery); } catch (SQLException ex) { @@ -403,7 +404,7 @@ public class TimeLineController { } public void selectEventIDs(Collection events) { - final LoggedTask selectEventIDsTask = new LoggedTask("Select Event IDs", true) { + final LoggedTask selectEventIDsTask = new LoggedTask("Select Event IDs", true) { // NON-NLS @Override protected Interval call() throws Exception { return filteredEvents.getSpanningInterval(events); @@ -419,10 +420,10 @@ public class TimeLineController { } } catch (InterruptedException ex) { Logger.getLogger(FilteredEventsModel.class - .getName()).log(Level.SEVERE, getTitle() + " interrupted unexpectedly", ex); + .getName()).log(Level.SEVERE, getTitle() + " interrupted unexpectedly", ex); // NON-NLS } catch (ExecutionException ex) { Logger.getLogger(FilteredEventsModel.class - .getName()).log(Level.SEVERE, getTitle() + " unexpectedly threw " + ex.getCause(), ex); + .getName()).log(Level.SEVERE, getTitle() + " unexpectedly threw " + ex.getCause(), ex); // NON-NLS } } }; @@ -435,8 +436,9 @@ public class TimeLineController { */ synchronized private void showWindow() { if (mainFrame == null) { - LOGGER.log(Level.WARNING, "Tried to show timeline with invalid window. Rebuilding GUI."); - mainFrame = (TimeLineTopComponent) WindowManager.getDefault().findTopComponent("TimeLineTopComponent"); + LOGGER.log(Level.WARNING, "Tried to show timeline with invalid window. Rebuilding GUI."); // NON-NLS + mainFrame = (TimeLineTopComponent) WindowManager.getDefault().findTopComponent( + NbBundle.getMessage(TimeLineTopComponent.class, "CTL_TimeLineTopComponentAction")); if (mainFrame == null) { mainFrame = new TimeLineTopComponent(); } @@ -476,9 +478,12 @@ public class TimeLineController { if (newLOD == DescriptionLOD.FULL && count > 10_000) { int showConfirmDialog = JOptionPane.showConfirmDialog(mainFrame, - "You are about to show details for " + NumberFormat.getInstance().format(count) + " events. This might be very slow or even crash Autopsy.\n\nDo you want to continue?", - "", - JOptionPane.YES_NO_OPTION); + NbBundle.getMessage(this.getClass(), + "Timeline.pushDescrLOD.confdlg.msg", + NumberFormat.getInstance().format(count)), + NbBundle.getMessage(TimeLineTopComponent.class, + "Timeline.pushDescrLOD.confdlg.details"), + JOptionPane.YES_NO_OPTION); shouldContinue = (showConfirmDialog == JOptionPane.YES_OPTION); } @@ -533,7 +538,7 @@ public class TimeLineController { public void selectTimeAndType(Interval interval, EventType type) { final Interval timeRange = filteredEvents.getSpanningInterval().overlap(interval); - final LoggedTask> selectTimeAndTypeTask = new LoggedTask>("Select Time and Type", true) { + final LoggedTask> selectTimeAndTypeTask = new LoggedTask>("Select Time and Type", true) { // NON-NLS @Override protected Collection< Long> call() throws Exception { synchronized (TimeLineController.this) { @@ -551,10 +556,10 @@ public class TimeLineController { } } catch (InterruptedException ex) { Logger.getLogger(FilteredEventsModel.class - .getName()).log(Level.SEVERE, getTitle() + " interrupted unexpectedly", ex); + .getName()).log(Level.SEVERE, getTitle() + " interrupted unexpectedly", ex);// NON-NLS } catch (ExecutionException ex) { Logger.getLogger(FilteredEventsModel.class - .getName()).log(Level.SEVERE, getTitle() + " unexpectedly threw " + ex.getCause(), ex); + .getName()).log(Level.SEVERE, getTitle() + " unexpectedly threw " + ex.getCause(), ex);// NON-NLS } } }; @@ -625,7 +630,8 @@ public class TimeLineController { synchronized int showLastPopulatedWhileIngestingConfirmation() { return JOptionPane.showConfirmDialog(mainFrame, DO_REPOPULATE_MESSAGE, - "re populate events?", + NbBundle.getMessage(TimeLineTopComponent.class, + "Timeline.showLastPopulatedWhileIngestingConf.confDlg.details"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); diff --git a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java index d04d37ab95..d5015bc5c1 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java @@ -37,7 +37,7 @@ import javafx.scene.layout.VBox; import org.netbeans.api.settings.ConvertAsProperties; import org.openide.explorer.ExplorerManager; import org.openide.explorer.ExplorerUtils; -import org.openide.util.NbBundle.Messages; +import org.openide.util.NbBundle; import org.openide.windows.Mode; import org.openide.windows.TopComponent; import static org.openide.windows.TopComponent.PROP_UNDOCKING_DISABLED; @@ -66,11 +66,6 @@ import org.sleuthkit.autopsy.timeline.zooming.ZoomSettingsPane; //iconBase="SET/PATH/TO/ICON/HERE", persistenceType = TopComponent.PERSISTENCE_NEVER) @TopComponent.Registration(mode = "timeline", openAtStartup = false) -@Messages({ - "CTL_TimeLineTopComponentAction=TimeLineTopComponent", - "CTL_TimeLineTopComponent=Timeline Window", - "HINT_TimeLineTopComponent=This is a Timeline window" -}) public final class TimeLineTopComponent extends TopComponent implements ExplorerManager.Provider, TimeLineUI { private static final Logger LOGGER = Logger.getLogger(TimeLineTopComponent.class.getName()); @@ -86,9 +81,11 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer ////jfx componenets that make up the interface private final FilterSetPanel filtersPanel = new FilterSetPanel(); - private final Tab eventsTab = new Tab("Events"); + private final Tab eventsTab = new Tab( + NbBundle.getMessage(TimeLineTopComponent.class, "TimeLineTopComponent.eventsTab.name")); - private final Tab filterTab = new Tab("Filters"); + private final Tab filterTab = new Tab( + NbBundle.getMessage(TimeLineTopComponent.class, "TimeLineTopComponent.filterTab.name")); private final VBox leftVBox = new VBox(5); @@ -111,10 +108,11 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer associateLookup(ExplorerUtils.createLookup(em, getActionMap())); - setName(Bundle.CTL_TimeLineTopComponent()); - setToolTipText(Bundle.HINT_TimeLineTopComponent()); + setName(NbBundle.getMessage(TimeLineTopComponent.class, "CTL_TimeLineTopComponent")); + setToolTipText(NbBundle.getMessage(TimeLineTopComponent.class, "HINT_TimeLineTopComponent")); setIcon(WindowManager.getDefault().getMainWindow().getIconImage()); //use the same icon as main application + timeZonePanel.setText(NbBundle.getMessage(this.getClass(), "TimeLineTopComponent.timeZonePanel.text")); customizeComponents(); } @@ -136,11 +134,11 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer filterTab.setClosable(false); filterTab.setContent(filtersPanel); - filterTab.setGraphic(new ImageView("org/sleuthkit/autopsy/timeline/images/funnel.png")); + filterTab.setGraphic(new ImageView("org/sleuthkit/autopsy/timeline/images/funnel.png")); // NON-NLS eventsTab.setClosable(false); eventsTab.setContent(navPanel); - eventsTab.setGraphic(new ImageView("org/sleuthkit/autopsy/timeline/images/timeline_marker.png")); + eventsTab.setGraphic(new ImageView("org/sleuthkit/autopsy/timeline/images/timeline_marker.png")); // NON-NLS tabPane.getTabs().addAll(filterTab, eventsTab); VBox.setVgrow(tabPane, Priority.ALWAYS); diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/Back.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/Back.java index 95edd68425..af77a6231d 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/actions/Back.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/actions/Back.java @@ -24,6 +24,7 @@ import javafx.scene.image.ImageView; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyCodeCombination; import org.controlsfx.control.action.Action; +import org.openide.util.NbBundle; import org.sleuthkit.autopsy.timeline.TimeLineController; /** @@ -32,12 +33,12 @@ import org.sleuthkit.autopsy.timeline.TimeLineController; //TODO: This and the corresponding imageanalyzer action are identical except for the type of the controller... abstract something! -jm public class Back extends Action { - private static final Image BACK_IMAGE = new Image("/org/sleuthkit/autopsy/timeline/images/arrow-180.png", 16, 16, true, true, true); + private static final Image BACK_IMAGE = new Image("/org/sleuthkit/autopsy/timeline/images/arrow-180.png", 16, 16, true, true, true); // NON-NLS private final TimeLineController controller; public Back(TimeLineController controller) { - super("Back"); + super(NbBundle.getMessage(Back.class, "Back.actions.name.text")); setGraphic(new ImageView(BACK_IMAGE)); setAccelerator(new KeyCodeCombination(KeyCode.LEFT, KeyCodeCombination.ALT_DOWN)); this.controller = controller; diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/Bundle.properties b/Core/src/org/sleuthkit/autopsy/timeline/actions/Bundle.properties new file mode 100644 index 0000000000..89f959f6a4 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/timeline/actions/Bundle.properties @@ -0,0 +1,6 @@ +Back.actions.name.text=Back +DefaultFilters.action.name.text=apply default filters +Forward.action.name.text=Forward +SaveSnapshot.action.name.text=save snapshot +SaveSnapshot.fileChoose.title.text=Save snapshot to +ZoomOut.action.name.text=apply default filters \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/actions/Bundle_ja.properties new file mode 100644 index 0000000000..03ca0a58f5 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/timeline/actions/Bundle_ja.properties @@ -0,0 +1,6 @@ +Back.actions.name.text=\u623B\u308B +DefaultFilters.action.name.text=\u30C7\u30D5\u30A9\u30EB\u30C8\u30D5\u30A3\u30EB\u30BF\u3092\u9069\u7528 +Forward.action.name.text=\u9032\u3080 +SaveSnapshot.action.name.text=\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u4FDD\u5B58 +SaveSnapshot.fileChoose.title.text=\u4E0B\u8A18\u3078\u4FDD\u5B58 +ZoomOut.action.name.text=\u30C7\u30D5\u30A9\u30EB\u30C8\u30D5\u30A3\u30EB\u30BF\u3092\u9069\u7528 \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/DefaultFilters.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/DefaultFilters.java index 519d8d771d..a949059a36 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/actions/DefaultFilters.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/actions/DefaultFilters.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.timeline.actions; import javafx.beans.binding.BooleanBinding; import javafx.event.ActionEvent; import org.controlsfx.control.action.Action; +import org.openide.util.NbBundle; import org.sleuthkit.autopsy.timeline.TimeLineController; import org.sleuthkit.autopsy.timeline.events.FilteredEventsModel; import org.sleuthkit.autopsy.timeline.filters.Filter; @@ -35,7 +36,7 @@ public class DefaultFilters extends Action { private FilteredEventsModel eventsModel; public DefaultFilters(final TimeLineController controller) { - super("apply default filters"); + super(NbBundle.getMessage(DefaultFilters.class, "DefaultFilters.action.name.text")); this.controller = controller; eventsModel = controller.getEventsModel(); disabledProperty().bind(new BooleanBinding() { diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/Forward.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/Forward.java index 5096f89cb1..41df360a3a 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/actions/Forward.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/actions/Forward.java @@ -24,6 +24,7 @@ import javafx.scene.image.ImageView; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyCodeCombination; import org.controlsfx.control.action.Action; +import org.openide.util.NbBundle; import org.sleuthkit.autopsy.timeline.TimeLineController; /** @@ -32,12 +33,12 @@ import org.sleuthkit.autopsy.timeline.TimeLineController; //TODO: This and the corresponding imageanalyzer action are identical except for the type of the controller... abstract something! -jm public class Forward extends Action { - private static final Image BACK_IMAGE = new Image("/org/sleuthkit/autopsy/timeline/images/arrow.png", 16, 16, true, true, true); + private static final Image BACK_IMAGE = new Image("/org/sleuthkit/autopsy/timeline/images/arrow.png", 16, 16, true, true, true); // NON-NLS private final TimeLineController controller; public Forward(TimeLineController controller) { - super("Forward"); + super(NbBundle.getMessage(Forward.class, "Forward.action.name.text")); setGraphic(new ImageView(BACK_IMAGE)); setAccelerator(new KeyCodeCombination(KeyCode.RIGHT, KeyCodeCombination.ALT_DOWN)); this.controller = controller; diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/SaveSnapshot.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/SaveSnapshot.java index 24423ebbad..528a44bacf 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/actions/SaveSnapshot.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/actions/SaveSnapshot.java @@ -37,6 +37,7 @@ import javafx.stage.DirectoryChooser; import javafx.util.Pair; import javax.imageio.ImageIO; import org.controlsfx.control.action.Action; +import org.openide.util.NbBundle; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.timeline.TimeLineController; @@ -58,7 +59,7 @@ public class SaveSnapshot extends Action { private final WritableImage snapshot; public SaveSnapshot(TimeLineController controller, WritableImage snapshot) { - super("save snapshot"); + super(NbBundle.getMessage(SaveSnapshot.class, "SaveSnapshot.action.name.text")); this.controller = controller; this.snapshot = snapshot; setEventHandler(new Consumer() { @@ -67,8 +68,8 @@ public class SaveSnapshot extends Action { public void accept(ActionEvent t) { //choose location/name DirectoryChooser fileChooser = new DirectoryChooser(); - fileChooser.setTitle("Save snapshot to"); - fileChooser.setInitialDirectory(new File(Case.getCurrentCase().getCaseDirectory() + File.separator + "Reports")); + fileChooser.setTitle(NbBundle.getMessage(this.getClass(), "SaveSnapshot.fileChoose.title.text")); + fileChooser.setInitialDirectory(new File(Case.getCurrentCase().getCaseDirectory() + File.separator + "Reports")); // NON-NLS File outFolder = fileChooser.showDialog(null); if (outFolder == null) { return; @@ -79,57 +80,57 @@ public class SaveSnapshot extends Action { //gather metadata List> reportMetaData = new ArrayList<>(); - reportMetaData.add(new Pair<>("Case", Case.getCurrentCase().getName())); + reportMetaData.add(new Pair<>("Case", Case.getCurrentCase().getName())); // NON-NLS ZoomParams get = controller.getEventsModel().getRequestedZoomParamters().get(); - reportMetaData.add(new Pair<>("Time Range", get.getTimeRange().toString())); - reportMetaData.add(new Pair<>("Description Level of Detail", get.getDescrLOD().getDisplayName())); - reportMetaData.add(new Pair<>("Event Type Zoom Level", get.getTypeZoomLevel().getDisplayName())); - reportMetaData.add(new Pair<>("Filters", get.getFilter().getHTMLReportString())); + reportMetaData.add(new Pair<>("Time Range", get.getTimeRange().toString())); // NON-NLS + reportMetaData.add(new Pair<>("Description Level of Detail", get.getDescrLOD().getDisplayName())); // NON-NLS + reportMetaData.add(new Pair<>("Event Type Zoom Level", get.getTypeZoomLevel().getDisplayName())); // NON-NLS + reportMetaData.add(new Pair<>("Filters", get.getFilter().getHTMLReportString())); // NON-NLS //save snapshot as png try { - ImageIO.write(SwingFXUtils.fromFXImage(snapshot, null), "png", new File(outFolder.getPath() + File.separator + outFolder.getName() + REPORT_IMAGE_EXTENSION)); + ImageIO.write(SwingFXUtils.fromFXImage(snapshot, null), "png", new File(outFolder.getPath() + File.separator + outFolder.getName() + REPORT_IMAGE_EXTENSION)); // NON-NLS } catch (IOException ex) { - LOGGER.log(Level.WARNING, "failed to write snapshot to disk", ex); + LOGGER.log(Level.WARNING, "failed to write snapshot to disk", ex); // NON-NLS return; } //build html string StringBuilder wrapper = new StringBuilder(); - wrapper.append("\n\n\t").append("timeline snapshot").append("\n\t\n\n\n"); - wrapper.append("
\n

").append(outFolder.getName()).append("

\n"); - wrapper.append("\"snaphot\""); - wrapper.append("\n"); + wrapper.append("\n\n\t").append("timeline snapshot").append("\n\t\n\n\n"); // NON-NLS + wrapper.append("
\n

").append(outFolder.getName()).append("

\n"); // NON-NLS + wrapper.append("\"snaphot\""); // NON-NLS + wrapper.append("
\n"); // NON-NLS for (Pair pair : reportMetaData) { - wrapper.append("\n"); + wrapper.append("\n"); // NON-NLS } - wrapper.append("
").append(pair.getKey()).append(": ").append(pair.getValue()).append("
").append(pair.getKey()).append(": ").append(pair.getValue()).append("
\n"); - wrapper.append("
\n\n"); + wrapper.append("\n"); // NON-NLS + wrapper.append("\n\n"); // NON-NLS //write html wrapper try (Writer htmlWriter = new FileWriter(new File(outFolder, name + HTML_EXT))) { htmlWriter.write(wrapper.toString()); } catch (FileNotFoundException ex) { - LOGGER.log(Level.WARNING, "failed to open html wrapper file for writing ", ex); + LOGGER.log(Level.WARNING, "failed to open html wrapper file for writing ", ex); // NON-NLS return; } catch (IOException ex) { - LOGGER.log(Level.WARNING, "failed to write html wrapper file", ex); + LOGGER.log(Level.WARNING, "failed to write html wrapper file", ex); // NON-NLS return; } //copy css - try (InputStream resource = this.getClass().getResourceAsStream("/org/sleuthkit/autopsy/timeline/index.css")) { - Files.copy(resource, Paths.get(outFolder.getPath(), "index.css")); + try (InputStream resource = this.getClass().getResourceAsStream("/org/sleuthkit/autopsy/timeline/index.css")) { // NON-NLS + Files.copy(resource, Paths.get(outFolder.getPath(), "index.css")); // NON-NLS } catch (IOException ex) { - LOGGER.log(Level.WARNING, "failed to copy css file", ex); + LOGGER.log(Level.WARNING, "failed to copy css file", ex); // NON-NLS } //add html file as report to case try { - Case.getCurrentCase().addReport(outFolder.getPath() + File.separator + outFolder.getName() + HTML_EXT, "Timeline", outFolder.getName() + HTML_EXT); + Case.getCurrentCase().addReport(outFolder.getPath() + File.separator + outFolder.getName() + HTML_EXT, "Timeline", outFolder.getName() + HTML_EXT); // NON-NLS } catch (TskCoreException ex) { - LOGGER.log(Level.WARNING, "failed add html wrapper as a report", ex); + LOGGER.log(Level.WARNING, "failed add html wrapper as a report", ex); // NON-NLS } } }); diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomOut.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomOut.java index a3178c0ae4..f5e9bd61cc 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomOut.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomOut.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.timeline.actions; import javafx.beans.binding.BooleanBinding; import javafx.event.ActionEvent; import org.controlsfx.control.action.Action; +import org.openide.util.NbBundle; import org.sleuthkit.autopsy.timeline.TimeLineController; import org.sleuthkit.autopsy.timeline.events.FilteredEventsModel; @@ -34,7 +35,7 @@ public class ZoomOut extends Action { private final FilteredEventsModel eventsModel; public ZoomOut(final TimeLineController controller) { - super("apply default filters"); + super(NbBundle.getMessage(ZoomOut.class, "ZoomOut.action.name.text")); this.controller = controller; eventsModel = controller.getEventsModel(); disabledProperty().bind(new BooleanBinding() { diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/AggregateEvent.java b/Core/src/org/sleuthkit/autopsy/timeline/events/AggregateEvent.java index 454b90975c..938d4f5fe0 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/events/AggregateEvent.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/events/AggregateEvent.java @@ -95,11 +95,11 @@ public class AggregateEvent { public static AggregateEvent merge(AggregateEvent ag1, AggregateEvent ag2) { if (ag1.getType() != ag2.getType()) { - throw new IllegalArgumentException(NbBundle.getMessage(AggregateEvent.class, "AggregateEvent.differentTypes")); + throw new IllegalArgumentException("aggregate events are not compatible they have different types"); } if (!ag1.getDescription().equals(ag2.getDescription())) { - throw new IllegalArgumentException(NbBundle.getMessage(AggregateEvent.class, "AggregateEvent.differentDescriptions")); + throw new IllegalArgumentException("aggregate events are not compatible they have different descriptions"); } HashSet ids = new HashSet<>(ag1.getEventIDs()); ids.addAll(ag2.getEventIDs()); diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/db/Bundle.properties b/Core/src/org/sleuthkit/autopsy/timeline/events/db/Bundle.properties new file mode 100644 index 0000000000..b09aa42a5b --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/timeline/events/db/Bundle.properties @@ -0,0 +1,6 @@ +EventsRepository.progressWindow.msg.reinit_db=(re)initializing events database +EventsRepository.progressWindow.msg.populateMacEventsFiles=populating mac events for files\: +EventsRepository.progressWindow.msg.populateMacEventsFiles2=populating mac events for files\: +EventsRepository.progressWindow.msg.commitingDb=committing events db +EventsRepository.msgdlg.problem.text=There was a problem populating the timeline. Not all events may be present or accurate. See the log for details. +EventsRepository.progressWindow.populatingXevents=populating {0} events \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/db/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/events/db/Bundle_ja.properties new file mode 100644 index 0000000000..55992eec21 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/timeline/events/db/Bundle_ja.properties @@ -0,0 +1,6 @@ +EventsRepository.msgdlg.problem.text=\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u4F5C\u6210\u4E2D\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u6B20\u843D\u3057\u3066\u3044\u308B\u307E\u305F\u306F\u4E0D\u6B63\u78BA\u306A\u30A4\u30D9\u30F3\u30C8\u304C\u3042\u308B\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002\u8A73\u7D30\u306F\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002 +EventsRepository.progressWindow.msg.commitingDb=\u30A4\u30D9\u30F3\u30C8DB\u3092\u30B3\u30DF\u30C3\u30C8\u4E2D +EventsRepository.progressWindow.msg.reinit_db=\u30A4\u30D9\u30F3\u30C8\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3092\uFF08\u518D\uFF09\u521D\u671F\u5316\u4E2D +EventsRepository.progressWindow.msg.populateMacEventsFiles=\u4E0B\u8A18\u30D5\u30A1\u30A4\u30EB\u306EMAC time\u30A4\u30D9\u30F3\u30C8\u3092\u5165\u529B\u4E2D\uFF1A +EventsRepository.progressWindow.msg.populateMacEventsFiles2=\u4E0B\u8A18\u30D5\u30A1\u30A4\u30EB\u306EMAC time\u30A4\u30D9\u30F3\u30C8\u3092\u5165\u529B\u4E2D\uFF1A +EventsRepository.progressWindow.populatingXevents={0} \u30A4\u30D9\u30F3\u30C8\u3092\u5165\u529B\u4E2D \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/db/EventDB.java b/Core/src/org/sleuthkit/autopsy/timeline/events/db/EventDB.java index 6b4cf50a89..459f0fcb7f 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/events/db/EventDB.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/events/db/EventDB.java @@ -79,41 +79,41 @@ import org.sqlite.SQLiteJDBCLoader; */ public class EventDB { - private static final String ARTIFACT_ID_COLUMN = "artifact_id"; + private static final String ARTIFACT_ID_COLUMN = "artifact_id"; // NON-NLS - private static final String BASE_TYPE_COLUMN = "base_type"; + private static final String BASE_TYPE_COLUMN = "base_type"; // NON-NLS - private static final String EVENT_ID_COLUMN = "event_id"; + private static final String EVENT_ID_COLUMN = "event_id"; // NON-NLS //column name constants////////////////////// - private static final String FILE_ID_COLUMN = "file_id"; + private static final String FILE_ID_COLUMN = "file_id"; // NON-NLS - private static final String FULL_DESCRIPTION_COLUMN = "full_description"; + private static final String FULL_DESCRIPTION_COLUMN = "full_description"; // NON-NLS - private static final String KNOWN_COLUMN = "known_state"; + private static final String KNOWN_COLUMN = "known_state"; // NON-NLS - private static final String LAST_ARTIFACT_ID_KEY = "last_artifact_id"; + private static final String LAST_ARTIFACT_ID_KEY = "last_artifact_id"; // NON-NLS - private static final String LAST_OBJECT_ID_KEY = "last_object_id"; + private static final String LAST_OBJECT_ID_KEY = "last_object_id"; // NON-NLS private static final java.util.logging.Logger LOGGER = Logger.getLogger(EventDB.class.getName()); - private static final String MED_DESCRIPTION_COLUMN = "med_description"; + private static final String MED_DESCRIPTION_COLUMN = "med_description"; // NON-NLS - private static final String SHORT_DESCRIPTION_COLUMN = "short_description"; + private static final String SHORT_DESCRIPTION_COLUMN = "short_description"; // NON-NLS - private static final String SUB_TYPE_COLUMN = "sub_type"; + private static final String SUB_TYPE_COLUMN = "sub_type"; // NON-NLS - private static final String TIME_COLUMN = "time"; + private static final String TIME_COLUMN = "time"; // NON-NLS - private static final String WAS_INGEST_RUNNING_KEY = "was_ingest_running"; + private static final String WAS_INGEST_RUNNING_KEY = "was_ingest_running"; // NON-NLS static { //make sure sqlite driver is loaded // possibly redundant try { - Class.forName("org.sqlite.JDBC"); + Class.forName("org.sqlite.JDBC"); // NON-NLS } catch (ClassNotFoundException ex) { - LOGGER.log(Level.SEVERE, "Failed to load sqlite JDBC driver", ex); + LOGGER.log(Level.SEVERE, "Failed to load sqlite JDBC driver", ex); // NON-NLS } } @@ -128,14 +128,14 @@ public class EventDB { */ public static EventDB getEventDB(String dbPath) { try { - EventDB eventDB = new EventDB(dbPath + File.separator + "events.db"); + EventDB eventDB = new EventDB(dbPath + File.separator + "events.db"); // NON-NLS return eventDB; } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "sql error creating database connection", ex); + LOGGER.log(Level.SEVERE, "sql error creating database connection", ex); // NON-NLS return null; } catch (Exception ex) { - LOGGER.log(Level.SEVERE, "error creating database connection", ex); + LOGGER.log(Level.SEVERE, "error creating database connection", ex); // NON-NLS return null; } } @@ -156,14 +156,14 @@ public class EventDB { return filter.getSubFilters().stream() .filter(Filter::isActive) .map(EventDB::getSQLWhere) - .collect(Collectors.joining(" and ", "( ", ")")); + .collect(Collectors.joining(" and ", "( ", ")")); // NON-NLS } static String getSQLWhere(UnionFilter filter) { return filter.getSubFilters().stream() .filter(Filter::isActive) .map(EventDB::getSQLWhere) - .collect(Collectors.joining(" or ", "( ", ")")); + .collect(Collectors.joining(" or ", "( ", ")")); // NON-NLS } private static String getSQLWhere(Filter filter) { @@ -185,14 +185,14 @@ public class EventDB { } else { return "1"; } - result = StringUtils.deleteWhitespace(result).equals("(1and1and1)") ? "1" : result; + result = StringUtils.deleteWhitespace(result).equals("(1and1and1)") ? "1" : result; // NON-NLS //System.out.println(result); return result; } private static String getSQLWhere(HideKnownFilter filter) { return (filter.isActive()) - ? "(known_state is not '" + TskData.FileKnown.KNOWN.getFileKnownValue() + "')" + ? "(known_state is not '" + TskData.FileKnown.KNOWN.getFileKnownValue() + "')" // NON-NLS : "1"; } @@ -202,9 +202,9 @@ public class EventDB { return "1"; } String strip = StringUtils.strip(filter.getText()); - return "((" + MED_DESCRIPTION_COLUMN + " like '%" + strip + "%') or (" - + FULL_DESCRIPTION_COLUMN + " like '%" + strip + "%') or (" - + SHORT_DESCRIPTION_COLUMN + " like '%" + strip + "%'))"; + return "((" + MED_DESCRIPTION_COLUMN + " like '%" + strip + "%') or (" // NON-NLS + + FULL_DESCRIPTION_COLUMN + " like '%" + strip + "%') or (" // NON-NLS + + SHORT_DESCRIPTION_COLUMN + " like '%" + strip + "%'))"; // NON-NLS } else { return "1"; } @@ -228,7 +228,7 @@ public class EventDB { return "1"; //then collapse clause to true } } - return "(" + SUB_TYPE_COLUMN + " in (" + StringUtils.join(getActiveSubTypes(filter), ",") + "))"; + return "(" + SUB_TYPE_COLUMN + " in (" + StringUtils.join(getActiveSubTypes(filter), ",") + "))"; // NON-NLS } private volatile Connection con; @@ -274,13 +274,13 @@ public class EventDB { try (Statement stmt = con.createStatement(); //You can't inject multiple values into one ? paramater in prepared statement, //so we make new statement each time... - ResultSet rs = stmt.executeQuery("select Min(time), Max(time) from events where event_id in (" + StringUtils.join(eventIDs, ", ") + ")");) { + ResultSet rs = stmt.executeQuery("select Min(time), Max(time) from events where event_id in (" + StringUtils.join(eventIDs, ", ") + ")");) { // NON-NLS while (rs.next()) { - span = new Interval(rs.getLong("Min(time)"), rs.getLong("Max(time)") + 1, DateTimeZone.UTC); + span = new Interval(rs.getLong("Min(time)"), rs.getLong("Max(time)") + 1, DateTimeZone.UTC); // NON-NLS } } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "Error executing get spanning interval query.", ex); + LOGGER.log(Level.SEVERE, "Error executing get spanning interval query.", ex); // NON-NLS } finally { dbReadUnlock(); } @@ -297,7 +297,7 @@ public class EventDB { closeStatements(); con.close(); } catch (SQLException ex) { - LOGGER.log(Level.WARNING, "Failed to close connection to evetns.db", ex); + LOGGER.log(Level.WARNING, "Failed to close connection to evetns.db", ex); // NON-NLS } } con = null; @@ -305,7 +305,7 @@ public class EventDB { void commitTransaction(EventTransaction tr, Boolean notify) { if (tr.isClosed()) { - throw new IllegalArgumentException("can't close already closed transaction"); + throw new IllegalArgumentException("can't close already closed transaction"); // NON-NLS } tr.commit(notify); } @@ -314,9 +314,9 @@ public class EventDB { int result = -1; dbReadLock(); //TODO convert this to prepared statement -jm - try (ResultSet rs = con.createStatement().executeQuery("select count(*) as count from events")) { + try (ResultSet rs = con.createStatement().executeQuery("select count(*) as count from events")) { // NON-NLS while (rs.next()) { - result = rs.getInt("count"); + result = rs.getInt("count"); // NON-NLS break; } } catch (SQLException ex) { @@ -374,9 +374,9 @@ public class EventDB { //TODO: use prepared statement - jm dbWriteLock(); try (Statement createStatement = con.createStatement()) { - createStatement.execute("drop table if exists events"); + createStatement.execute("drop table if exists events"); // NON-NLS } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "could not drop old events table", ex); + LOGGER.log(Level.SEVERE, "could not drop old events table", ex); // NON-NLS } finally { dbWriteUnlock(); } @@ -393,11 +393,11 @@ public class EventDB { dbReadLock(); try (Statement stmt = con.createStatement(); //can't use prepared statement because of complex where clause - ResultSet rs = stmt.executeQuery(" select (select Max(time) from events where time <=" + start + " and " + sqlWhere + ") as start,(select Min(time) from events where time >= " + end + " and " + sqlWhere + ") as end")) { + ResultSet rs = stmt.executeQuery(" select (select Max(time) from events where time <=" + start + " and " + sqlWhere + ") as start,(select Min(time) from events where time >= " + end + " and " + sqlWhere + ") as end")) { // NON-NLS while (rs.next()) { - long start2 = rs.getLong("start"); - long end2 = rs.getLong("end"); + long start2 = rs.getLong("start"); // NON-NLS + long end2 = rs.getLong("end"); // NON-NLS if (end2 == 0) { end2 = getMaxTime(); @@ -406,7 +406,7 @@ public class EventDB { return new Interval(start2 * 1000, (end2 + 1) * 1000, TimeLineController.getJodaTimeZone()); } } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "Failed to get MIN time.", ex); + LOGGER.log(Level.SEVERE, "Failed to get MIN time.", ex); // NON-NLS } finally { dbReadUnlock(); } @@ -426,7 +426,7 @@ public class EventDB { } } } catch (SQLException sqlEx) { - LOGGER.log(Level.SEVERE, "exception while querying for event with id = " + eventID, sqlEx); + LOGGER.log(Level.SEVERE, "exception while querying for event with id = " + eventID, sqlEx); // NON-NLS } finally { dbReadUnlock(); } @@ -444,7 +444,7 @@ public class EventDB { Set resultIDs = new HashSet<>(); dbReadLock(); - final String query = "select event_id from events where time >= " + startTime + " and time <" + endTime + " and " + getSQLWhere(filter); + final String query = "select event_id from events where time >= " + startTime + " and time <" + endTime + " and " + getSQLWhere(filter); // NON-NLS //System.out.println(query); try (Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query)) { @@ -454,7 +454,7 @@ public class EventDB { } } catch (SQLException sqlEx) { - LOGGER.log(Level.SEVERE, "failed to execute query for event ids in range", sqlEx); + LOGGER.log(Level.SEVERE, "failed to execute query for event ids in range", sqlEx); // NON-NLS } finally { dbReadUnlock(); } @@ -475,10 +475,10 @@ public class EventDB { dbReadLock(); try (ResultSet rs = getMaxTimeStmt.executeQuery()) { while (rs.next()) { - return rs.getLong("max"); + return rs.getLong("max"); // NON-NLS } } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "Failed to get MAX time.", ex); + LOGGER.log(Level.SEVERE, "Failed to get MAX time.", ex); // NON-NLS } finally { dbReadUnlock(); } @@ -490,10 +490,10 @@ public class EventDB { dbReadLock(); try (ResultSet rs = getMinTimeStmt.executeQuery()) { while (rs.next()) { - return rs.getLong("min"); + return rs.getLong("min"); // NON-NLS } } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "Failed to get MIN time.", ex); + LOGGER.log(Level.SEVERE, "Failed to get MIN time.", ex); // NON-NLS } finally { dbReadUnlock(); } @@ -519,49 +519,49 @@ public class EventDB { configureDB(); } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "problem accessing database", ex); + LOGGER.log(Level.SEVERE, "problem accessing database", ex); // NON-NLS } dbWriteLock(); try { try (Statement stmt = con.createStatement()) { - String sql = "CREATE TABLE if not exists db_info " - + " ( key TEXT, " - + " value INTEGER, " - + "PRIMARY KEY (key))"; + String sql = "CREATE TABLE if not exists db_info " // NON-NLS + + " ( key TEXT, " // NON-NLS + + " value INTEGER, " // NON-NLS + + "PRIMARY KEY (key))"; // NON-NLS stmt.execute(sql); } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "problem creating db_info table", ex); + LOGGER.log(Level.SEVERE, "problem creating db_info table", ex); // NON-NLS } try (Statement stmt = con.createStatement()) { - String sql = "CREATE TABLE if not exists events " - + " (event_id INTEGER PRIMARY KEY, " - + " file_id INTEGER, " - + " artifact_id INTEGER, " - + " time INTEGER, " - + " sub_type INTEGER, " - + " base_type INTEGER, " - + " full_description TEXT, " - + " med_description TEXT, " - + " short_description TEXT, " - + " known_state INTEGER)"; + String sql = "CREATE TABLE if not exists events " // NON-NLS + + " (event_id INTEGER PRIMARY KEY, " // NON-NLS + + " file_id INTEGER, " // NON-NLS + + " artifact_id INTEGER, " // NON-NLS + + " time INTEGER, " // NON-NLS + + " sub_type INTEGER, " // NON-NLS + + " base_type INTEGER, " // NON-NLS + + " full_description TEXT, " // NON-NLS + + " med_description TEXT, " // NON-NLS + + " short_description TEXT, " // NON-NLS + + " known_state INTEGER)"; // NON-NLS stmt.execute(sql); } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "problem creating database table", ex); + LOGGER.log(Level.SEVERE, "problem creating database table", ex); // NON-NLS } try (Statement stmt = con.createStatement()) { - String sql = "CREATE INDEX if not exists file_idx ON events(file_id)"; + String sql = "CREATE INDEX if not exists file_idx ON events(file_id)"; // NON-NLS stmt.execute(sql); } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "problem creating file_idx", ex); + LOGGER.log(Level.SEVERE, "problem creating file_idx", ex); // NON-NLS } try (Statement stmt = con.createStatement()) { - String sql = "CREATE INDEX if not exists artifact_idx ON events(artifact_id)"; + String sql = "CREATE INDEX if not exists artifact_idx ON events(artifact_id)"; // NON-NLS stmt.execute(sql); } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "problem creating artifact_idx", ex); + LOGGER.log(Level.SEVERE, "problem creating artifact_idx", ex); // NON-NLS } //for common queries the covering indexes below were better, but having the time index 'blocke' them @@ -572,38 +572,38 @@ public class EventDB { // LOGGER.log(Level.SEVERE, "problem creating time_idx", ex); // } try (Statement stmt = con.createStatement()) { - String sql = "CREATE INDEX if not exists sub_type_idx ON events(sub_type, time)"; + String sql = "CREATE INDEX if not exists sub_type_idx ON events(sub_type, time)"; // NON-NLS stmt.execute(sql); } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "problem creating sub_type_idx", ex); + LOGGER.log(Level.SEVERE, "problem creating sub_type_idx", ex); // NON-NLS } try (Statement stmt = con.createStatement()) { - String sql = "CREATE INDEX if not exists base_type_idx ON events(base_type, time)"; + String sql = "CREATE INDEX if not exists base_type_idx ON events(base_type, time)"; // NON-NLS stmt.execute(sql); } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "problem creating base_type_idx", ex); + LOGGER.log(Level.SEVERE, "problem creating base_type_idx", ex); // NON-NLS } try (Statement stmt = con.createStatement()) { - String sql = "CREATE INDEX if not exists known_idx ON events(known_state)"; + String sql = "CREATE INDEX if not exists known_idx ON events(known_state)"; // NON-NLS stmt.execute(sql); } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "problem creating known_idx", ex); + LOGGER.log(Level.SEVERE, "problem creating known_idx", ex); // NON-NLS } try { insertRowStmt = prepareStatement( - "INSERT INTO events (file_id ,artifact_id, time, sub_type, base_type, full_description, med_description, short_description, known_state) " - + "VALUES (?,?,?,?,?,?,?,?,?)"); + "INSERT INTO events (file_id ,artifact_id, time, sub_type, base_type, full_description, med_description, short_description, known_state) " // NON-NLS + + "VALUES (?,?,?,?,?,?,?,?,?)"); // NON-NLS - getMaxTimeStmt = prepareStatement("select Max(time) as max from events"); - getMinTimeStmt = prepareStatement("select Min(time) as min from events"); - getEventByIDStmt = prepareStatement("select * from events where event_id = ?"); - recordDBInfoStmt = prepareStatement("insert or replace into db_info (key, value) values (?, ?)"); - getDBInfoStmt = prepareStatement("select value from db_info where key = ?"); + getMaxTimeStmt = prepareStatement("select Max(time) as max from events"); // NON-NLS + getMinTimeStmt = prepareStatement("select Min(time) as min from events"); // NON-NLS + getEventByIDStmt = prepareStatement("select * from events where event_id = ?"); // NON-NLS + recordDBInfoStmt = prepareStatement("insert or replace into db_info (key, value) values (?, ?)"); // NON-NLS + getDBInfoStmt = prepareStatement("select value from db_info where key = ?"); // NON-NLS } catch (SQLException sQLException) { - LOGGER.log(Level.SEVERE, "failed to prepareStatment", sQLException); + LOGGER.log(Level.SEVERE, "failed to prepareStatment", sQLException); // NON-NLS } } finally { @@ -626,7 +626,7 @@ public class EventDB { */ void insertEvent(long time, EventType type, Long objID, Long artifactID, String fullDescription, String medDescription, String shortDescription, TskData.FileKnown known, EventTransaction tr) { if (tr.isClosed()) { - throw new IllegalArgumentException("can't update database with closed transaction"); + throw new IllegalArgumentException("can't update database with closed transaction"); // NON-NLS } int typeNum; int superTypeNum; @@ -667,7 +667,7 @@ public class EventDB { insertRowStmt.executeUpdate(); } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "failed to insert event", ex); + LOGGER.log(Level.SEVERE, "failed to insert event", ex); // NON-NLS } finally { dbWriteUnlock(); } @@ -683,10 +683,10 @@ public class EventDB { void openDBCon() { try { if (con == null || con.isClosed()) { - con = DriverManager.getConnection("jdbc:sqlite:" + dbPath); + con = DriverManager.getConnection("jdbc:sqlite:" + dbPath); // NON-NLS } } catch (SQLException ex) { - LOGGER.log(Level.WARNING, "Failed to open connection to events.db", ex); + LOGGER.log(Level.WARNING, "Failed to open connection to events.db", ex); // NON-NLS } } @@ -709,8 +709,8 @@ public class EventDB { boolean tableExists() { //TODO: use prepared statement - jm try (Statement createStatement = con.createStatement(); - ResultSet executeQuery = createStatement.executeQuery("SELECT name FROM sqlite_master WHERE type='table' AND name='events'")) { - if (executeQuery.getString("name").equals("events") == false) { + ResultSet executeQuery = createStatement.executeQuery("SELECT name FROM sqlite_master WHERE type='table' AND name='events'")) { // NON-NLS + if (executeQuery.getString("name").equals("events") == false) { // NON-NLS return false; } } catch (SQLException ex) { @@ -730,26 +730,26 @@ public class EventDB { //this should match Sleuthkit db setupt try (Statement statement = con.createStatement()) { //reduce i/o operations, we have no OS crash recovery anyway - statement.execute("PRAGMA synchronous = OFF;"); + statement.execute("PRAGMA synchronous = OFF;"); // NON-NLS //we don't use this feature, so turn it off for minimal speed up on queries //this is deprecated and not recomended - statement.execute("PRAGMA count_changes = OFF;"); + statement.execute("PRAGMA count_changes = OFF;"); // NON-NLS //this made a big difference to query speed - statement.execute("PRAGMA temp_store = MEMORY"); + statement.execute("PRAGMA temp_store = MEMORY"); // NON-NLS //this made a modest improvement in query speeds - statement.execute("PRAGMA cache_size = 50000"); + statement.execute("PRAGMA cache_size = 50000"); // NON-NLS //we never delete anything so... - statement.execute("PRAGMA auto_vacuum = 0"); + statement.execute("PRAGMA auto_vacuum = 0"); // NON-NLS //allow to query while in transaction - no need read locks - statement.execute("PRAGMA read_uncommitted = True;"); + statement.execute("PRAGMA read_uncommitted = True;"); // NON-NLS } finally { dbWriteUnlock(); } try { - LOGGER.log(Level.INFO, String.format("sqlite-jdbc version %s loaded in %s mode", + LOGGER.log(Level.INFO, String.format("sqlite-jdbc version %s loaded in %s mode", // NON-NLS SQLiteJDBCLoader.getVersion(), SQLiteJDBCLoader.isNativeMode() - ? "native" : "pure-java")); + ? "native" : "pure-java")); // NON-NLS } catch (Exception exception) { } } @@ -795,9 +795,9 @@ public class EventDB { final boolean useSubTypes = (zoomLevel == EventTypeZoomLevel.SUB_TYPE); //get some info about the range of dates requested - final String queryString = "select count(*), " + (useSubTypes ? SUB_TYPE_COLUMN : BASE_TYPE_COLUMN) - + " from events where time >= " + startTime + " and time < " + endTime + " and " + getSQLWhere(filter) - + " GROUP BY " + (useSubTypes ? SUB_TYPE_COLUMN : BASE_TYPE_COLUMN); + final String queryString = "select count(*), " + (useSubTypes ? SUB_TYPE_COLUMN : BASE_TYPE_COLUMN) // NON-NLS + + " from events where time >= " + startTime + " and time < " + endTime + " and " + getSQLWhere(filter) // NON-NLS + + " GROUP BY " + (useSubTypes ? SUB_TYPE_COLUMN : BASE_TYPE_COLUMN); // NON-NLS ResultSet rs = null; dbReadLock(); @@ -814,11 +814,11 @@ public class EventDB { ? RootEventType.allTypes.get(rs.getInt(SUB_TYPE_COLUMN)) : BaseTypes.values()[rs.getInt(BASE_TYPE_COLUMN)]; - typeMap.put(type, rs.getLong("count(*)")); + typeMap.put(type, rs.getLong("count(*)")); // NON-NLS } } catch (Exception ex) { - LOGGER.log(Level.SEVERE, "error getting count of events from db.", ex); + LOGGER.log(Level.SEVERE, "error getting count of events from db.", ex); // NON-NLS } finally { try { rs.close(); @@ -876,10 +876,10 @@ public class EventDB { //get all agregate events in this time unit dbReadLock(); - String query = "select strftime('" + strfTimeFormat + "',time , 'unixepoch'" + (TimeLineController.getTimeZone().get().equals(TimeZone.getDefault()) ? ", 'localtime'" : "") + ") as interval, group_concat(event_id) as event_ids, Min(time), Max(time), " + descriptionColumn + ", " + (useSubTypes ? SUB_TYPE_COLUMN : BASE_TYPE_COLUMN) - + " from events where time >= " + start + " and time < " + end + " and " + getSQLWhere(filter) - + " group by interval, " + (useSubTypes ? SUB_TYPE_COLUMN : BASE_TYPE_COLUMN) + " , " + descriptionColumn - + " order by Min(time)"; + String query = "select strftime('" + strfTimeFormat + "',time , 'unixepoch'" + (TimeLineController.getTimeZone().get().equals(TimeZone.getDefault()) ? ", 'localtime'" : "") + ") as interval, group_concat(event_id) as event_ids, Min(time), Max(time), " + descriptionColumn + ", " + (useSubTypes ? SUB_TYPE_COLUMN : BASE_TYPE_COLUMN) // NON-NLS + + " from events where time >= " + start + " and time < " + end + " and " + getSQLWhere(filter) // NON-NLS + + " group by interval, " + (useSubTypes ? SUB_TYPE_COLUMN : BASE_TYPE_COLUMN) + " , " + descriptionColumn // NON-NLS + + " order by Min(time)"; // NON-NLS //System.out.println(query); ResultSet rs = null; try (Statement stmt = con.createStatement(); // scoop up requested events in groups organized by interval, type, and desription @@ -895,9 +895,9 @@ public class EventDB { EventType type = useSubTypes ? RootEventType.allTypes.get(rs.getInt(SUB_TYPE_COLUMN)) : BaseTypes.values()[rs.getInt(BASE_TYPE_COLUMN)]; AggregateEvent aggregateEvent = new AggregateEvent( - new Interval(rs.getLong("Min(time)") * 1000, rs.getLong("Max(time)") * 1000, TimeLineController.getJodaTimeZone()), + new Interval(rs.getLong("Min(time)") * 1000, rs.getLong("Max(time)") * 1000, TimeLineController.getJodaTimeZone()), // NON-NLS type, - Arrays.asList(rs.getString("event_ids").split(",")), + Arrays.asList(rs.getString("event_ids").split(",")), // NON-NLS rs.getString(descriptionColumn), lod); //put events in map from type/descrition -> event @@ -967,16 +967,16 @@ public class EventDB { try (ResultSet rs = getDBInfoStmt.executeQuery()) { long result = defaultValue; while (rs.next()) { - result = rs.getLong("value"); + result = rs.getLong("value"); // NON-NLS } return result; } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "failed to read key: " + key + " from db_info", ex); + LOGGER.log(Level.SEVERE, "failed to read key: " + key + " from db_info", ex); // NON-NLS } finally { dbReadUnlock(); } } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "failed to set key: " + key + " on getDBInfoStmt ", ex); + LOGGER.log(Level.SEVERE, "failed to set key: " + key + " on getDBInfoStmt ", ex); // NON-NLS } return defaultValue; @@ -997,19 +997,19 @@ public class EventDB { private String getStrfTimeFormat(TimeUnits info) { switch (info) { case DAYS: - return "%Y-%m-%dT00:00:00"; + return "%Y-%m-%dT00:00:00"; // NON-NLS case HOURS: - return "%Y-%m-%dT%H:00:00"; + return "%Y-%m-%dT%H:00:00"; // NON-NLS case MINUTES: - return "%Y-%m-%dT%H:%M:00"; + return "%Y-%m-%dT%H:%M:00"; // NON-NLS case MONTHS: - return "%Y-%m-01T00:00:00"; + return "%Y-%m-01T00:00:00"; // NON-NLS case SECONDS: - return "%Y-%m-%dT%H:%M:%S"; + return "%Y-%m-%dT%H:%M:%S"; // NON-NLS case YEARS: - return "%Y-01-01T00:00:00"; + return "%Y-01-01T00:00:00"; // NON-NLS default: - return "%Y-%m-%dT%H:%M:%S"; + return "%Y-%m-%dT%H:%M:%S"; // NON-NLS } } @@ -1026,7 +1026,7 @@ public class EventDB { recordDBInfoStmt.setLong(2, value); recordDBInfoStmt.executeUpdate(); } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "failed to set dbinfo key: " + key + " value: " + value, ex); + LOGGER.log(Level.SEVERE, "failed to set dbinfo key: " + key + " value: " + value, ex); // NON-NLS } finally { dbWriteUnlock(); } @@ -1056,7 +1056,7 @@ public class EventDB { con.setAutoCommit(false); } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "failed to set auto-commit to to false", ex); + LOGGER.log(Level.SEVERE, "failed to set auto-commit to to false", ex); // NON-NLS } } @@ -1067,7 +1067,7 @@ public class EventDB { con.rollback(); } catch (SQLException ex1) { - LOGGER.log(Level.SEVERE, "Exception while attempting to rollback!!", ex1); + LOGGER.log(Level.SEVERE, "Exception while attempting to rollback!!", ex1); // NON-NLS } finally { close(); } @@ -1085,7 +1085,7 @@ public class EventDB { // fireNewEvents(newEvents); } } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "Error commiting events.db.", ex); + LOGGER.log(Level.SEVERE, "Error commiting events.db.", ex); // NON-NLS rollback(); } } @@ -1096,7 +1096,7 @@ public class EventDB { try { con.setAutoCommit(true); } catch (SQLException ex) { - LOGGER.log(Level.SEVERE, "Error setting auto-commit to true.", ex); + LOGGER.log(Level.SEVERE, "Error setting auto-commit to true.", ex); // NON-NLS } finally { closed = true; @@ -1112,10 +1112,10 @@ public class EventDB { public class MultipleTransactionException extends IllegalStateException { - private static final String CANNOT_HAVE_MORE_THAN_ONE_OPEN_TRANSACTIO = "cannot have more than one open transaction"; + private static final String CANNOT_HAVE_MORE_THAN_ONE_OPEN_TRANSACTION = "cannot have more than one open transaction"; // NON-NLS public MultipleTransactionException() { - super(CANNOT_HAVE_MORE_THAN_ONE_OPEN_TRANSACTIO); + super(CANNOT_HAVE_MORE_THAN_ONE_OPEN_TRANSACTION); } } diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/db/EventsRepository.java b/Core/src/org/sleuthkit/autopsy/timeline/events/db/EventsRepository.java index 6a17153ec9..52af156e35 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/events/db/EventsRepository.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/events/db/EventsRepository.java @@ -38,6 +38,7 @@ import javax.swing.JOptionPane; import javax.swing.SwingWorker; import org.apache.commons.lang3.StringUtils; import org.joda.time.Interval; +import org.openide.util.NbBundle; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.timeline.ProgressWindow; @@ -126,13 +127,13 @@ public class EventsRepository { /** @return min time (in seconds from unix epoch) */ public Long getMaxTime() { - return maxCache.getUnchecked("max"); + return maxCache.getUnchecked("max"); // NON-NLS // return eventDB.getMaxTime(); } /** @return max tie (in seconds from unix epoch) */ public Long getMinTime() { - return minCache.getUnchecked("min"); + return minCache.getUnchecked("min"); // NON-NLS // return eventDB.getMinTime(); } @@ -218,7 +219,8 @@ public class EventsRepository { @Override protected Void doInBackground() throws Exception { - process(Arrays.asList(new ProgressWindow.ProgressUpdate(0, -1, "(re)initializing events database", ""))); + process(Arrays.asList(new ProgressWindow.ProgressUpdate(0, -1, NbBundle.getMessage(this.getClass(), + "EventsRepository.progressWindow.msg.reinit_db"), ""))); //reset database //TODO: can we do more incremental updates? -jm eventDB.dropTable(); @@ -229,7 +231,8 @@ public class EventsRepository { List files = skCase.findAllFileIdsWhere(FILES_AND_DIRS_WHERE_CLAUSE); final int numFiles = files.size(); - process(Arrays.asList(new ProgressWindow.ProgressUpdate(0, numFiles, "populating mac events for files: ", ""))); + process(Arrays.asList(new ProgressWindow.ProgressUpdate(0, numFiles, NbBundle.getMessage(this.getClass(), + "EventsRepository.progressWindow.msg.populateMacEventsFiles"), ""))); //insert file events into db int i = 1; @@ -263,9 +266,11 @@ public class EventsRepository { eventDB.insertEvent(f.getCrtime(), FileSystemTypes.FILE_CREATED, fID, null, uniquePath, medD, shortDesc, f.getKnown(), trans); } - process(Arrays.asList(new ProgressWindow.ProgressUpdate(i, numFiles, "populating mac events for files: ", f.getName()))); + process(Arrays.asList(new ProgressWindow.ProgressUpdate(i, numFiles, + NbBundle.getMessage(this.getClass(), + "EventsRepository.progressWindow.msg.populateMacEventsFiles2"), f.getName()))); } catch (TskCoreException tskCoreException) { - LOGGER.log(Level.WARNING, "failed to insert mac event for file : " + fID, tskCoreException); + LOGGER.log(Level.WARNING, "failed to insert mac event for file : " + fID, tskCoreException); // NON-NLS } } i++; @@ -283,7 +288,8 @@ public class EventsRepository { } } - process(Arrays.asList(new ProgressWindow.ProgressUpdate(0, -1, "commiting events db", ""))); + process(Arrays.asList(new ProgressWindow.ProgressUpdate(0, -1, NbBundle.getMessage(this.getClass(), + "EventsRepository.progressWindow.msg.commitingDb"), ""))); if (isCancelled()) { eventDB.rollBackTransaction(trans); } else { @@ -315,13 +321,15 @@ public class EventsRepository { get(); } catch (CancellationException ex) { - LOGGER.log(Level.INFO, "Database population was cancelled by the user. Not all events may be present or accurate. See the log for details.", ex); + LOGGER.log(Level.INFO, "Database population was cancelled by the user. Not all events may be present or accurate. See the log for details.", ex); // NON-NLS } catch (InterruptedException | ExecutionException ex) { - LOGGER.log(Level.WARNING, "Exception while populating database.", ex); - JOptionPane.showMessageDialog(null, "There was a problem populating the timeline. Not all events may be present or accurate. See the log for details."); + LOGGER.log(Level.WARNING, "Exception while populating database.", ex); // NON-NLS + JOptionPane.showMessageDialog(null, NbBundle.getMessage(this.getClass(), + "EventsRepository.msgdlg.problem.text")); } catch (Exception ex) { - LOGGER.log(Level.WARNING, "Unexpected exception while populating database.", ex); - JOptionPane.showMessageDialog(null, "There was a problem populating the timeline. Not all events may be present or accurate. See the log for details."); + LOGGER.log(Level.WARNING, "Unexpected exception while populating database.", ex); // NON-NLS + JOptionPane.showMessageDialog(null, NbBundle.getMessage(this.getClass(), + "EventsRepository.msgdlg.problem.text")); } r.run(); //execute post db population operation } @@ -339,7 +347,10 @@ public class EventsRepository { final ArrayList blackboardArtifacts = skCase.getBlackboardArtifacts(type.getArtifactType()); final int numArtifacts = blackboardArtifacts.size(); - process(Arrays.asList(new ProgressWindow.ProgressUpdate(0, numArtifacts, "populating " + type.toString() + " events", ""))); + process(Arrays.asList(new ProgressWindow.ProgressUpdate(0, numArtifacts, + NbBundle.getMessage(this.getClass(), + "EventsRepository.progressWindow.populatingXevents", + type.toString()), ""))); int i = 0; for (final BlackboardArtifact bbart : blackboardArtifacts) { @@ -351,10 +362,13 @@ public class EventsRepository { } i++; - process(Arrays.asList(new ProgressWindow.ProgressUpdate(i, numArtifacts, "populating " + type.toString() + " events", ""))); + process(Arrays.asList(new ProgressWindow.ProgressUpdate(i, numArtifacts, + NbBundle.getMessage(this.getClass(), + "EventsRepository.progressWindow.populatingXevents", + type.toString()), ""))); } } catch (TskCoreException ex) { - LOGGER.log(Level.SEVERE, "There was a problem getting events with sub type = " + type.toString() + ".", ex); + LOGGER.log(Level.SEVERE, "There was a problem getting events with sub type = " + type.toString() + ".", ex); // NON-NLS } } } diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/type/ArtifactEventType.java b/Core/src/org/sleuthkit/autopsy/timeline/events/type/ArtifactEventType.java index 55cb563e04..99ffebcf6b 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/events/type/ArtifactEventType.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/events/type/ArtifactEventType.java @@ -156,7 +156,7 @@ public interface ArtifactEventType extends EventType { } if (attrMap.get(type.getDateTimeAttrubuteType()) == null) { - Logger.getLogger(AttributeEventDescription.class.getName()).log(Level.WARNING, "Artifact {0} has no date/time attribute, skipping it.", artf.getArtifactID()); + Logger.getLogger(AttributeEventDescription.class.getName()).log(Level.WARNING, "Artifact {0} has no date/time attribute, skipping it.", artf.getArtifactID()); // NON-NLS return null; } //use the hook provided by this subtype implementation diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/type/BaseTypes.java b/Core/src/org/sleuthkit/autopsy/timeline/events/type/BaseTypes.java index ff7fc925ff..b4b6a8acc6 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/events/type/BaseTypes.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/events/type/BaseTypes.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.timeline.events.type; import java.util.Arrays; import java.util.List; import javafx.scene.image.Image; +import org.openide.util.NbBundle; import org.sleuthkit.autopsy.timeline.zooming.EventTypeZoomLevel; /** @@ -28,7 +29,7 @@ import org.sleuthkit.autopsy.timeline.zooming.EventTypeZoomLevel; */ public enum BaseTypes implements EventType { - FILE_SYSTEM("File System", "blue-document.png") { + FILE_SYSTEM(NbBundle.getMessage(BaseTypes.class, "BaseTypes.fileSystem.name"), "blue-document.png") { // NON-NLS @Override public List getSubTypes() { @@ -40,7 +41,7 @@ public enum BaseTypes implements EventType { return FileSystemTypes.valueOf(string); } }, - WEB_ACTIVITY("Web Activity", "web-file.png") { + WEB_ACTIVITY(NbBundle.getMessage(BaseTypes.class, "BaseTypes.webActivity.name"), "web-file.png") { // NON-NLS @Override public List getSubTypes() { @@ -52,7 +53,7 @@ public enum BaseTypes implements EventType { return WebTypes.valueOf(string); } }, - MISC_TYPES("Misc Types", "block.png") { + MISC_TYPES(NbBundle.getMessage(BaseTypes.class, "BaseTypes.miscTypes.name"), "block.png") { // NON-NLS @Override public List getSubTypes() { @@ -93,7 +94,7 @@ public enum BaseTypes implements EventType { private BaseTypes(String displayName, String iconBase) { this.displayName = displayName; this.iconBase = iconBase; - this.image = new Image("org/sleuthkit/autopsy/timeline/images/" + iconBase, true); + this.image = new Image("org/sleuthkit/autopsy/timeline/images/" + iconBase, true); // NON-NLS } @Override diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/type/Bundle.properties b/Core/src/org/sleuthkit/autopsy/timeline/events/type/Bundle.properties new file mode 100644 index 0000000000..bac872cf02 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/timeline/events/type/Bundle.properties @@ -0,0 +1,22 @@ +BaseTypes.fileSystem.name=File System +BaseTypes.webActivity.name=Web Activity +BaseTypes.miscTypes.name=Misc Types +FileSystemTypes.fileModified.name=File Modified +FileSystemTypes.fileAccessed.name=File Accessed +FileSystemTypes.fileCreated.name=File Created +FileSystemTypes.fileChanged.name=File Changed +MiscTypes.message.name=Messages +MiscTypes.GPSRoutes.name=GPS Routes +MiscTypes.GPSTrackpoint.name=Location History +MiscTypes.Calls.name=Calls +MiscTypes.Email.name=Email +MiscTypes.recentDocuments.name=Recent Documents +MiscTypes.installedPrograms.name=Installed Programs +MiscTypes.exif.name=Exif +MiscTypes.devicesAttached.name=Devices Attached +RootEventType.eventTypes.name=Event Types +WebTypes.webDownloads.name=Web Downloads +WebTypes.webCookies.name=Web Cookies +WebTypes.webBookmarks.name=Web Bookmarks +WebTypes.webHistory.name=Web History +WebTypes.webSearch.name=Web Searches \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/type/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/events/type/Bundle_ja.properties new file mode 100644 index 0000000000..f6d6a011a1 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/timeline/events/type/Bundle_ja.properties @@ -0,0 +1,22 @@ +BaseTypes.fileSystem.name=\u30D5\u30A1\u30A4\u30EB\u30B7\u30B9\u30C6\u30E0 +BaseTypes.miscTypes.name=\u305D\u306E\u4ED6\u30BF\u30A4\u30D7 +BaseTypes.webActivity.name=\u30A6\u30A7\u30D6\u30A2\u30AF\u30C6\u30A3\u30D3\u30C6\u30A3 +FileSystemTypes.fileAccessed.name=\u30A2\u30AF\u30BB\u30B9\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB +FileSystemTypes.fileChanged.name=\u5909\u66F4\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB +FileSystemTypes.fileCreated.name=\u4F5C\u6210\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB +FileSystemTypes.fileModified.name=\u66F4\u65B0\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB +MiscTypes.Calls.name=\u30B3\u30FC\u30EB +MiscTypes.devicesAttached.name=\u30A2\u30BF\u30C3\u30C1\u3055\u308C\u3066\u3044\u308B\u6A5F\u5668 +MiscTypes.Email.name=E\u30E1\u30FC\u30EB +MiscTypes.exif.name=Exif +MiscTypes.GPSRoutes.name=GPS\u30EB\u30FC\u30C8 +MiscTypes.GPSTrackpoint.name=\u4F4D\u7F6E\u60C5\u5831\u5C65\u6B74 +MiscTypes.installedPrograms.name=\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3055\u308C\u3066\u3044\u308B\u30D7\u30ED\u30B0\u30E9\u30E0 +MiscTypes.message.name=\u30E1\u30C3\u30BB\u30FC\u30B8 +MiscTypes.recentDocuments.name=\u6700\u8FD1\u306E\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8 +RootEventType.eventTypes.name=\u30A4\u30D9\u30F3\u30C8\u30BF\u30A4\u30D7 +WebTypes.webBookmarks.name=\u30A6\u30A7\u30D6\u30D6\u30C3\u30AF\u30DE\u30FC\u30AF +WebTypes.webCookies.name=\u30A6\u30A7\u30D6\u30AF\u30C3\u30AD\u30FC +WebTypes.webDownloads.name=\u30A6\u30A7\u30D6\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9 +WebTypes.webHistory.name=\u30A6\u30A7\u30D6\u5C65\u6B74 +WebTypes.webSearch.name=\u30A6\u30A7\u30D6\u691C\u7D22 \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/type/FileSystemTypes.java b/Core/src/org/sleuthkit/autopsy/timeline/events/type/FileSystemTypes.java index 771b692023..fae716c656 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/events/type/FileSystemTypes.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/events/type/FileSystemTypes.java @@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.timeline.events.type; import java.util.Collections; import java.util.List; import javafx.scene.image.Image; +import org.openide.util.NbBundle; import org.sleuthkit.autopsy.timeline.zooming.EventTypeZoomLevel; /** @@ -28,10 +29,10 @@ import org.sleuthkit.autopsy.timeline.zooming.EventTypeZoomLevel; */ public enum FileSystemTypes implements EventType { - FILE_MODIFIED("File Modified", "blue-document-attribute-m.png"), - FILE_ACCESSED("File Accessed", "blue-document-attribute-a.png"), - FILE_CREATED("File Created", "blue-document-attribute-b.png"), - FILE_CHANGED("File Changed", "blue-document-attribute-c.png"); + FILE_MODIFIED(NbBundle.getMessage(FileSystemTypes.class, "FileSystemTypes.fileModified.name"), "blue-document-attribute-m.png"), // NON-NLS + FILE_ACCESSED(NbBundle.getMessage(FileSystemTypes.class, "FileSystemTypes.fileAccessed.name"), "blue-document-attribute-a.png"), // NON-NLS + FILE_CREATED(NbBundle.getMessage(FileSystemTypes.class, "FileSystemTypes.fileCreated.name"), "blue-document-attribute-b.png"), // NON-NLS + FILE_CHANGED(NbBundle.getMessage(FileSystemTypes.class, "FileSystemTypes.fileChanged.name"), "blue-document-attribute-c.png"); // NON-NLS private final String iconBase; @@ -72,7 +73,7 @@ public enum FileSystemTypes implements EventType { private FileSystemTypes(String displayName, String iconBase) { this.displayName = displayName; this.iconBase = iconBase; - this.image = new Image("org/sleuthkit/autopsy/timeline/images/" + iconBase, true); + this.image = new Image("org/sleuthkit/autopsy/timeline/images/" + iconBase, true); // NON-NLS } @Override diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/type/MiscTypes.java b/Core/src/org/sleuthkit/autopsy/timeline/events/type/MiscTypes.java index 68851e9caf..db097ad884 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/events/type/MiscTypes.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/events/type/MiscTypes.java @@ -26,6 +26,7 @@ import java.util.function.BiFunction; import javafx.scene.image.Image; import org.apache.commons.lang3.StringUtils; import org.openide.util.Exceptions; +import org.openide.util.NbBundle; import org.sleuthkit.autopsy.timeline.zooming.EventTypeZoomLevel; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; @@ -36,7 +37,7 @@ import org.sleuthkit.datamodel.TskCoreException; */ public enum MiscTypes implements EventType, ArtifactEventType { - MESSAGE("Messages", "message.png", + MESSAGE(NbBundle.getMessage(MiscTypes.class, "MiscTypes.message.name"), "message.png", // NON-NLS BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME, new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MESSAGE_TYPE), @@ -50,7 +51,7 @@ public enum MiscTypes implements EventType, ArtifactEventType { return StringUtils.join(asList, " "); }, new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TEXT)), - GPS_ROUTE("GPS Routes", "gps-search.png", + GPS_ROUTE(NbBundle.getMessage(MiscTypes.class, "MiscTypes.GPSRoutes.name"), "gps-search.png", // NON-NLS BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_ROUTE, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME, new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME), @@ -60,35 +61,35 @@ public enum MiscTypes implements EventType, ArtifactEventType { final BlackboardAttribute longStart = attrMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE_START); final BlackboardAttribute latEnd = attrMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE_END); final BlackboardAttribute longEnd = attrMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE_END); - return String.format("from %1$g %2$g to %3$g %4$g", latStart.getValueDouble(), longStart.getValueDouble(), latEnd.getValueDouble(), longEnd.getValueDouble()); + return String.format("from %1$g %2$g to %3$g %4$g", latStart.getValueDouble(), longStart.getValueDouble(), latEnd.getValueDouble(), longEnd.getValueDouble()); // NON-NLS }), - GPS_TRACKPOINT("Location History", "gps-trackpoint.png", + GPS_TRACKPOINT(NbBundle.getMessage(MiscTypes.class, "MiscTypes.GPSTrackpoint.name"), "gps-trackpoint.png", // NON-NLS BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_TRACKPOINT, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME, new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME), (artf, attrMap) -> { final BlackboardAttribute longitude = attrMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE); final BlackboardAttribute latitude = attrMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE); - return (latitude != null ? latitude.getValueDouble() : "") + " " + (longitude != null ? longitude.getValueDouble() : ""); + return (latitude != null ? latitude.getValueDouble() : "") + " " + (longitude != null ? longitude.getValueDouble() : ""); // NON-NLS }, (artf, attrMap) -> ""), - CALL_LOG("Calls", "calllog.png", + CALL_LOG(NbBundle.getMessage(MiscTypes.class, "MiscTypes.Calls.name"), "calllog.png", // NON-NLS BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START, new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME), new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER), new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DIRECTION)), - EMAIL("Email", "mail-icon-16.png", + EMAIL(NbBundle.getMessage(MiscTypes.class, "MiscTypes.Email.name"), "mail-icon-16.png", // NON-NLS BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT, (artifact, attrMap) -> { final BlackboardAttribute emailFrom = attrMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_FROM); final BlackboardAttribute emailTo = attrMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_TO); - return (emailFrom != null ? emailFrom.getValueString() : "") + " to " + (emailTo != null ? emailTo.getValueString() : ""); + return (emailFrom != null ? emailFrom.getValueString() : "") + " to " + (emailTo != null ? emailTo.getValueString() : ""); // NON-NLS }, new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT), new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_PLAIN)), - RECENT_DOCUMENTS("Recent Documents", "recent_docs.png", + RECENT_DOCUMENTS(NbBundle.getMessage(MiscTypes.class, "MiscTypes.recentDocuments.name"), "recent_docs.png", // NON-NLS BlackboardArtifact.ARTIFACT_TYPE.TSK_RECENT_OBJECT, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME, new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH).andThen( @@ -114,13 +115,13 @@ public enum MiscTypes implements EventType, ArtifactEventType { return new AttributeEventDescription(time, shortDescription, medDescription, fullDescription); } }, - INSTALLED_PROGRAM("Installed Programs", "programs.png", + INSTALLED_PROGRAM(NbBundle.getMessage(MiscTypes.class, "MiscTypes.installedPrograms.name"), "programs.png", // NON-NLS BlackboardArtifact.ARTIFACT_TYPE.TSK_INSTALLED_PROG, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME, new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME), new EmptyExtractor(), new EmptyExtractor()), - EXIF("Exif", "camera-icon-16.png", + EXIF(NbBundle.getMessage(MiscTypes.class, "MiscTypes.exif.name"), "camera-icon-16.png", // NON-NLS BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_CREATED, new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_MAKE), @@ -131,10 +132,10 @@ public enum MiscTypes implements EventType, ArtifactEventType { return t.getSleuthkitCase().getAbstractFileById(t.getObjectID()).getName(); } catch (TskCoreException ex) { Exceptions.printStackTrace(ex); - return " error loading file name"; + return " error loading file name"; // NON-NLS } }), - DEVICES_ATTACHED("Devices Attached", "usb_devices.png", + DEVICES_ATTACHED(NbBundle.getMessage(MiscTypes.class, "MiscTypes.devicesAttached.name"), "usb_devices.png", // NON-NLS BlackboardArtifact.ARTIFACT_TYPE.TSK_DEVICE_ATTACHED, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME, new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_MAKE), @@ -150,12 +151,12 @@ public enum MiscTypes implements EventType, ArtifactEventType { return ""; } else { switch (dir.getDisplayString()) { - case "Incoming": - return "from"; - case "Outgoing": - return "to"; + case "Incoming": // NON-NLS + return "from"; // NON-NLS + case "Outgoing": // NON-NLS + return "to"; // NON-NLS default: - return ""; + return ""; // NON-NLS } } } @@ -233,7 +234,7 @@ public enum MiscTypes implements EventType, ArtifactEventType { this.shortExtractor = shortExtractor; this.medExtractor = medExtractor; this.longExtractor = longExtractor; - this.image = new Image("org/sleuthkit/autopsy/timeline/images/" + iconBase, true); + this.image = new Image("org/sleuthkit/autopsy/timeline/images/" + iconBase, true); // NON-NLS } @Override diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/type/RootEventType.java b/Core/src/org/sleuthkit/autopsy/timeline/events/type/RootEventType.java index dd6955fe37..4bb82c7f32 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/events/type/RootEventType.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/events/type/RootEventType.java @@ -23,6 +23,7 @@ import java.util.Collections; import java.util.List; import javafx.scene.image.Image; import javafx.scene.paint.Color; +import org.openide.util.NbBundle; import org.sleuthkit.autopsy.timeline.zooming.EventTypeZoomLevel; /** A singleton {@link } EventType to represent the root type of all event @@ -81,12 +82,12 @@ public class RootEventType implements EventType { @Override public String getIconBase() { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + throw new UnsupportedOperationException("Not supported yet."); // NON-NLS //To change body of generated methods, choose Tools | Templates. } @Override public String getDisplayName() { - return "Event Types"; + return NbBundle.getMessage(this.getClass(), "RootEventType.eventTypes.name"); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/type/WebTypes.java b/Core/src/org/sleuthkit/autopsy/timeline/events/type/WebTypes.java index fddb451f29..8c5cc3b0aa 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/events/type/WebTypes.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/events/type/WebTypes.java @@ -24,6 +24,7 @@ import java.util.Map; import java.util.function.BiFunction; import javafx.scene.image.Image; import org.apache.commons.lang3.StringUtils; +import org.openide.util.NbBundle; import org.sleuthkit.autopsy.timeline.zooming.EventTypeZoomLevel; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.BlackboardAttribute; @@ -33,8 +34,8 @@ import org.sleuthkit.datamodel.BlackboardAttribute; */ public enum WebTypes implements EventType, ArtifactEventType { - WEB_DOWNLOADS("Web Downloads", - "downloads.png", + WEB_DOWNLOADS(NbBundle.getMessage(WebTypes.class, "WebTypes.webDownloads.name"), + "downloads.png", // NON-NLS BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_DOWNLOAD, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED, new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN), @@ -52,40 +53,40 @@ public enum WebTypes implements EventType, ArtifactEventType { String fileName = StringUtils.substringAfterLast(path, "/"); String url = getFullExtractor().apply(artf, attrMap); - //TODO: review non default descritpion construction - String shortDescription = fileName + " from " + domain; - String medDescription = fileName + " from " + url; - String fullDescription = path + " from " + url; + //TODO: review non default description construction + String shortDescription = fileName + " from " + domain; // NON-NLS + String medDescription = fileName + " from " + url; // NON-NLS + String fullDescription = path + " from " + url; // NON-NLS return new AttributeEventDescription(time, shortDescription, medDescription, fullDescription); } }, - //TODO: review description seperators - WEB_COOKIE("Web Cookies", - "cookies.png", + //TODO: review description separators + WEB_COOKIE(NbBundle.getMessage(WebTypes.class, "WebTypes.webCookies.name"), + "cookies.png", // NON-NLS BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_COOKIE, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME, new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN), new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME), new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_VALUE)), - //TODO: review description seperators - WEB_BOOKMARK("Web Bookmarks", - "bookmarks.png", + //TODO: review description separators + WEB_BOOKMARK(NbBundle.getMessage(WebTypes.class, "WebTypes.webBookmarks.name"), + "bookmarks.png", // NON-NLS BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_BOOKMARK, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_CREATED, new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN), new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL), new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TITLE)), - //TODO: review description seperators - WEB_HISTORY("Web History", - "history.png", + //TODO: review description separators + WEB_HISTORY(NbBundle.getMessage(WebTypes.class, "WebTypes.webHistory.name"), + "history.png", // NON-NLS BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_HISTORY, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED, new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN), new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL), new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TITLE)), - //TODO: review description seperators - WEB_SEARCH("Web Searches", - "searchquery.png", + //TODO: review description separators + WEB_SEARCH(NbBundle.getMessage(WebTypes.class, "WebTypes.webSearch.name"), + "searchquery.png", // NON-NLS BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_SEARCH_QUERY, BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED, new AttributeExtractor(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TEXT), @@ -160,7 +161,7 @@ public enum WebTypes implements EventType, ArtifactEventType { this.shortExtractor = shortExtractor; this.medExtractor = medExtractor; this.longExtractor = longExtractor; - this.image = new Image("org/sleuthkit/autopsy/timeline/images/" + iconBase, true); + this.image = new Image("org/sleuthkit/autopsy/timeline/images/" + iconBase, true); // NON-NLS } @Override diff --git a/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/Bundle.properties b/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/Bundle.properties new file mode 100644 index 0000000000..9a701954f0 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/Bundle.properties @@ -0,0 +1 @@ +EventRoodNode.tooManyNode.displayName=Too many events to display. Maximum \= {0}. But there are {1} to display. \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/Bundle_ja.properties new file mode 100644 index 0000000000..d431985f98 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/Bundle_ja.properties @@ -0,0 +1 @@ +EventRoodNode.tooManyNode.displayName=\u8868\u793A\u3059\u308B\u30A4\u30D9\u30F3\u30C8\u6570\u304C\u591A\u3059\u304E\u307E\u3059\u3002\u6700\u5927 \= {0}\u3002\u8868\u793A\u3059\u308B\u30A4\u30D9\u30F3\u30C8\u306F{1}\u3042\u308A\u307E\u3059\u3002 \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventNode.java b/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventNode.java index 7f206d39d0..e03ca85c3b 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventNode.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventNode.java @@ -49,13 +49,13 @@ class EventNode extends DisplayableItemNode { EventNode(TimeLineEvent eventById, AbstractFile file, BlackboardArtifact artifact) { super(Children.LEAF, Lookups.fixed(eventById, file, artifact)); this.e = eventById; - this.setIconBaseWithExtension("org/sleuthkit/autopsy/timeline/images/" + e.getType().getIconBase()); + this.setIconBaseWithExtension("org/sleuthkit/autopsy/timeline/images/" + e.getType().getIconBase()); // NON-NLS } EventNode(TimeLineEvent eventById, AbstractFile file) { super(Children.LEAF, Lookups.fixed(eventById, file)); this.e = eventById; - this.setIconBaseWithExtension("org/sleuthkit/autopsy/timeline/images/" + e.getType().getIconBase()); + this.setIconBaseWithExtension("org/sleuthkit/autopsy/timeline/images/" + e.getType().getIconBase()); // NON-NLS } @Override @@ -67,7 +67,7 @@ class EventNode extends DisplayableItemNode { s.put(properties); } - final TimeProperty timePropery = new TimeProperty("time", "Date/Time", "time ", getDateTimeString()); + final TimeProperty timePropery = new TimeProperty("time", "Date/Time", "time ", getDateTimeString()); // NON-NLS TimeLineController.getTimeZone().addListener((Observable observable) -> { try { @@ -77,12 +77,12 @@ class EventNode extends DisplayableItemNode { } }); - properties.put(new NodeProperty<>("icon", "Icon", "icon", true)); //gets overriden with icon + properties.put(new NodeProperty<>("icon", "Icon", "icon", true)); // NON-NLS //gets overridden with icon properties.put(timePropery); - properties.put(new NodeProperty<>("description", "Description", "description", e.getFullDescription())); - properties.put(new NodeProperty<>("eventBaseType", "Base Type", "base type", e.getType().getSuperType().getDisplayName())); - properties.put(new NodeProperty<>("eventSubType", "Sub Type", "sub type", e.getType().getDisplayName())); - properties.put(new NodeProperty<>("Known", "Known", "known", e.getKnown().toString())); + properties.put(new NodeProperty<>("description", "Description", "description", e.getFullDescription())); // NON-NLS + properties.put(new NodeProperty<>("eventBaseType", "Base Type", "base type", e.getType().getSuperType().getDisplayName())); // NON-NLS + properties.put(new NodeProperty<>("eventSubType", "Sub Type", "sub type", e.getType().getDisplayName())); // NON-NLS + properties.put(new NodeProperty<>("Known", "Known", "known", e.getKnown().toString())); // NON-NLS return s; } @@ -113,7 +113,7 @@ class EventNode extends DisplayableItemNode { @Override public T accept(DisplayableItemNodeVisitor dinv) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + throw new UnsupportedOperationException("Not supported yet."); // NON-NLS //To change body of generated methods, choose Tools | Templates. } class TimeProperty extends PropertySupport.ReadWrite { @@ -140,7 +140,7 @@ class EventNode extends DisplayableItemNode { public void setValue(String t) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { String oldValue = getValue(); value = t; - firePropertyChange("time", oldValue, t); + firePropertyChange("time", oldValue, t); // NON-NLS } } } diff --git a/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventRootNode.java b/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventRootNode.java index 7716d392d9..93c7b469be 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventRootNode.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventRootNode.java @@ -25,6 +25,7 @@ import org.openide.nodes.AbstractNode; import org.openide.nodes.ChildFactory; import org.openide.nodes.Children; import org.openide.nodes.Node; +import org.openide.util.NbBundle; import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.timeline.events.FilteredEventsModel; import org.sleuthkit.autopsy.timeline.events.TimeLineEvent; @@ -110,7 +111,7 @@ public class EventRootNode extends DisplayableItemNode { } } catch (TskCoreException tskCoreException) { - LOGGER.log(Level.WARNING, "Failed to lookup sleuthkit object backing TimeLineEvent.", tskCoreException); + LOGGER.log(Level.WARNING, "Failed to lookup sleuthkit object backing TimeLineEvent.", tskCoreException); // NON-NLS return null; } } else { @@ -123,8 +124,12 @@ public class EventRootNode extends DisplayableItemNode { public TooManyNode(int size) { super(Children.LEAF); - this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/info-icon-16.png"); - setDisplayName("Too many events to display. Maximum = " + MAX_EVENTS_TO_DISPLAY + ". But there are " + size + " to display."); + this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/info-icon-16.png"); // NON-NLS + setDisplayName( + NbBundle.getMessage(this.getClass(), + "EventRoodNode.tooManyNode.displayName", + MAX_EVENTS_TO_DISPLAY, + size)); } } } diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/AbstractFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/AbstractFilter.java index f9c945a997..1bacfbaf51 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/filters/AbstractFilter.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/filters/AbstractFilter.java @@ -47,7 +47,7 @@ public abstract class AbstractFilter implements Filter { @Override public String getStringCheckBox() { - return "[" + (isActive() ? "x" : " ") + "]"; + return "[" + (isActive() ? "x" : " ") + "]"; // NON-NLS } diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/Bundle.properties b/Core/src/org/sleuthkit/autopsy/timeline/filters/Bundle.properties new file mode 100644 index 0000000000..1da4bb58fe --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/timeline/filters/Bundle.properties @@ -0,0 +1,4 @@ +hideKnownFilter.displayName.text=Hide Known Files +IntersectionFilter.displayName.text=Intersection{0} +TextFilter.displayName.text=Text Filter +TypeFilter.displayName.text=Event Type Filter \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/filters/Bundle_ja.properties new file mode 100644 index 0000000000..410abe0b58 --- /dev/null +++ b/Core/src/org/sleuthkit/autopsy/timeline/filters/Bundle_ja.properties @@ -0,0 +1,4 @@ +hideKnownFilter.displayName.text=\u65E2\u77E5\u30D5\u30A1\u30A4\u30EB\u3092\u96A0\u3059 +TextFilter.displayName.text=\u30C6\u30AD\u30B9\u30C8\u30D5\u30A3\u30EB\u30BF +TypeFilter.displayName.text=\u30A4\u30D9\u30F3\u30C8\u30BF\u30A4\u30D7\u30D5\u30A3\u30EB\u30BF +IntersectionFilter.displayName.text=\u30A4\u30F3\u30BF\u30FC\u30BB\u30AF\u30B7\u30E7\u30F3{0} \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/HideKnownFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/HideKnownFilter.java index 0742a91cbe..6583797c72 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/filters/HideKnownFilter.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/filters/HideKnownFilter.java @@ -18,6 +18,8 @@ */ package org.sleuthkit.autopsy.timeline.filters; +import org.openide.util.NbBundle; + /** * Filter to hide known files */ @@ -25,7 +27,7 @@ public class HideKnownFilter extends AbstractFilter { @Override public String getDisplayName() { - return "Hide Known Files"; + return NbBundle.getMessage(this.getClass(), "hideKnownFilter.displayName.text"); } public HideKnownFilter() { @@ -43,7 +45,7 @@ public class HideKnownFilter extends AbstractFilter { @Override public String getHTMLReportString() { - return "hide known" + getStringCheckBox(); + return "hide known" + getStringCheckBox();// NON-NLS } @Override diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/IntersectionFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/IntersectionFilter.java index 5af67c3483..2970b791ce 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/filters/IntersectionFilter.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/filters/IntersectionFilter.java @@ -7,6 +7,7 @@ package org.sleuthkit.autopsy.timeline.filters; import java.util.stream.Collectors; import javafx.collections.FXCollections; import javafx.collections.ObservableList; +import org.openide.util.NbBundle; /** Intersection(And) filter */ public class IntersectionFilter extends CompoundFilter { @@ -32,14 +33,16 @@ public class IntersectionFilter extends CompoundFilter { @Override public String getDisplayName() { - return "Intersection" + getSubFilters().stream() - .map(Filter::getDisplayName) - .collect(Collectors.joining(",", "[", "]")); + return NbBundle.getMessage(this.getClass(), + "IntersectionFilter.displayName.text", + getSubFilters().stream() + .map(Filter::getDisplayName) + .collect(Collectors.joining(",", "[", "]"))); } @Override public String getHTMLReportString() { - return getSubFilters().stream().filter(Filter::isActive).map(Filter::getHTMLReportString).collect(Collectors.joining("
  • ", "
    • ", "
    ")); + return getSubFilters().stream().filter(Filter::isActive).map(Filter::getHTMLReportString).collect(Collectors.joining("
  • ", "
    • ", "
    ")); // NON-NLS } @Override diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/TextFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/TextFilter.java index 6d7db2ca0e..9297de4f65 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/filters/TextFilter.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/filters/TextFilter.java @@ -22,6 +22,7 @@ import java.util.Objects; import javafx.beans.property.Property; import javafx.beans.property.SimpleStringProperty; import org.apache.commons.lang3.StringUtils; +import org.openide.util.NbBundle; /** Filter for text matching */ public class TextFilter extends AbstractFilter { @@ -41,7 +42,7 @@ public class TextFilter extends AbstractFilter { @Override public String getDisplayName() { - return "Text Filter"; + return NbBundle.getMessage(this.getClass(), "TextFilter.displayName.text"); } synchronized public String getText() { @@ -62,7 +63,7 @@ public class TextFilter extends AbstractFilter { @Override public String getHTMLReportString() { - return "text like \"" + StringUtils.defaultIfBlank(text.getValue(), "") + "\"" + getStringCheckBox(); + return "text like \"" + StringUtils.defaultIfBlank(text.getValue(), "") + "\"" + getStringCheckBox(); // NON-NLS } @Override diff --git a/Core/src/org/sleuthkit/autopsy/timeline/filters/TypeFilter.java b/Core/src/org/sleuthkit/autopsy/timeline/filters/TypeFilter.java index 80f5d1edcb..33a55a2b41 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/filters/TypeFilter.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/filters/TypeFilter.java @@ -23,6 +23,7 @@ import java.util.stream.Collectors; import javafx.collections.FXCollections; import javafx.scene.image.Image; import javafx.scene.paint.Color; +import org.openide.util.NbBundle; import org.sleuthkit.autopsy.timeline.events.type.EventType; import org.sleuthkit.autopsy.timeline.events.type.RootEventType; @@ -64,7 +65,11 @@ public class TypeFilter extends UnionFilter { @Override public String getDisplayName() { - return eventType == RootEventType.getInstance() ? "Event Type Filter" : eventType.getDisplayName(); + if (eventType == RootEventType.getInstance()) { + return NbBundle.getMessage(this.getClass(), "TypeFilter.displayName.text"); + } else { + return eventType.getDisplayName(); + } } /** @return a color to use in GUI components representing this filter */ @@ -95,7 +100,7 @@ public class TypeFilter extends UnionFilter { public String getHTMLReportString() { String string = getEventType().getDisplayName() + getStringCheckBox(); if (getSubFilters().isEmpty() == false) { - string = string + " : " + getSubFilters().stream().filter(Filter::isActive).map(Filter::getHTMLReportString).collect(Collectors.joining("
  • ", "
    • ", "
    ")); + string = string + " : " + getSubFilters().stream().filter(Filter::isActive).map(Filter::getHTMLReportString).collect(Collectors.joining("
  • ", "
    • ", "
    ")); // NON-NLS } return string; } diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractVisualization.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractVisualization.java index fad4f78949..3e66889536 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractVisualization.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractVisualization.java @@ -374,9 +374,9 @@ public abstract class AbstractVisualization -