From 3b1586fd2d05c6f94e818339136d35d7df4e6e3f Mon Sep 17 00:00:00 2001 From: jmillman Date: Tue, 26 Aug 2014 17:36:49 -0400 Subject: [PATCH] connect historymanager to filtered events through property: back is broken --- .../autopsy/timeline/HistoryManager.java | 6 +- .../autopsy/timeline/ProgressWindow.java | 88 ++++++------------ .../autopsy/timeline/TimeLineController.java | 90 +++++++++---------- .../timeline/TimeLineTopComponent.java | 2 +- .../timeline/events/FilteredEventsModel.java | 59 +++++++----- .../autopsy/timeline/events/db/EventDB.java | 4 +- .../timeline/events/db/EventsRepository.java | 9 +- ...nced_timeline.txt => license-timeline.txt} | 0 8 files changed, 122 insertions(+), 136 deletions(-) rename Timeline/src/org/sleuthkit/autopsy/timeline/{license-advanced_timeline.txt => license-timeline.txt} (100%) diff --git a/Timeline/src/org/sleuthkit/autopsy/timeline/HistoryManager.java b/Timeline/src/org/sleuthkit/autopsy/timeline/HistoryManager.java index ed0e2e2a31..f119d31279 100644 --- a/Timeline/src/org/sleuthkit/autopsy/timeline/HistoryManager.java +++ b/Timeline/src/org/sleuthkit/autopsy/timeline/HistoryManager.java @@ -36,11 +36,11 @@ public class HistoryManager { private final ReadOnlyObjectWrapper currentState = new ReadOnlyObjectWrapper<>(); - public ReadOnlyObjectWrapper getCurrentState() { + public ReadOnlyObjectWrapper currentState() { return currentState; } - public T currentState() { + public T getCurrentState() { return currentState.get(); } @@ -78,7 +78,7 @@ public class HistoryManager { return peek; } - synchronized private void advance(T newState) { + synchronized public void advance(T newState) { if (currentState.equals(newState) == false) { historyStack.push(currentState.get()); diff --git a/Timeline/src/org/sleuthkit/autopsy/timeline/ProgressWindow.java b/Timeline/src/org/sleuthkit/autopsy/timeline/ProgressWindow.java index 3fb9624f2a..e8f8239c72 100644 --- a/Timeline/src/org/sleuthkit/autopsy/timeline/ProgressWindow.java +++ b/Timeline/src/org/sleuthkit/autopsy/timeline/ProgressWindow.java @@ -46,12 +46,12 @@ import org.openide.windows.WindowManager; */ public class ProgressWindow extends JFrame { - private final SwingWorker worker; + private final SwingWorker worker; /** * Creates new form TimelineProgressDialog */ - public ProgressWindow(Component parent, boolean modal, SwingWorker worker) { + public ProgressWindow(Component parent, boolean modal, SwingWorker worker) { super(); initComponents(); @@ -60,18 +60,13 @@ public class ProgressWindow extends JFrame { setAlwaysOnTop(modal); //set icon the same as main app - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - setIconImage(WindowManager.getDefault().getMainWindow().getIconImage()); - } + SwingUtilities.invokeLater(() -> { + setIconImage(WindowManager.getDefault().getMainWindow().getIconImage()); }); - //progressBar.setIndeterminate(true); - - setName("Advanced Timeline"); - setTitle("Generating Advanced Timeline data"); + setName("Timeline"); + setTitle("Generating Timeline data"); // Close the dialog when Esc is pressed String cancelName = "cancel"; InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); @@ -89,66 +84,42 @@ public class ProgressWindow extends JFrame { } public void updateProgress(final int progress) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - - progressBar.setValue(progress); - } + SwingUtilities.invokeLater(() -> { + progressBar.setValue(progress); }); } public void updateProgress(final int progress, final String message) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - - progressBar.setValue(progress); - progressBar.setString(message); - } + SwingUtilities.invokeLater(() -> { + progressBar.setValue(progress); + progressBar.setString(message); }); } public void updateProgress(final String message) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - - progressBar.setString(message); - } + SwingUtilities.invokeLater(() -> { + progressBar.setString(message); }); } public void setProgressTotal(final int total) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - progressBar.setIndeterminate(false); - progressBar.setMaximum(total); - progressBar.setStringPainted(true); - - } + SwingUtilities.invokeLater(() -> { + progressBar.setIndeterminate(false); + progressBar.setMaximum(total); + progressBar.setStringPainted(true); }); } public void updateHeaderMessage(final String headerMessage) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - progressHeader.setText(headerMessage); - - } + SwingUtilities.invokeLater(() -> { + progressHeader.setText(headerMessage); }); } public void setIndeterminate() { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - progressBar.setIndeterminate(true); - progressBar.setStringPainted(true); - - } + SwingUtilities.invokeLater(() -> { + progressBar.setIndeterminate(true); + progressBar.setStringPainted(true); }); } @@ -206,17 +177,14 @@ public class ProgressWindow extends JFrame { }//GEN-LAST:event_closeDialog public void cancel() { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - 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); - if (showConfirmDialog == JOptionPane.YES_OPTION) { - close(); - } - } else { + 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); + if (showConfirmDialog == JOptionPane.YES_OPTION) { close(); } + } else { + close(); } }); } diff --git a/Timeline/src/org/sleuthkit/autopsy/timeline/TimeLineController.java b/Timeline/src/org/sleuthkit/autopsy/timeline/TimeLineController.java index 7d5d9e4898..a59a287c9f 100644 --- a/Timeline/src/org/sleuthkit/autopsy/timeline/TimeLineController.java +++ b/Timeline/src/org/sleuthkit/autopsy/timeline/TimeLineController.java @@ -172,17 +172,16 @@ public class TimeLineController { /** list based stack to hold history, 'top' is at index 0; */ @GuardedBy("this") - private final ObservableStack historyStack = new ObservableStack<>(); + private final HistoryManager historyManager = new HistoryManager<>(); - @GuardedBy("this") - private final ObservableStack forwardStack = new ObservableStack<>(); + synchronized public ObservableStack getHistoryStack() { - return historyStack; + return historyManager.getHistoryStack(); } synchronized public ObservableStack getForwardStack() { - return forwardStack; + return historyManager.getForwardStack(); } //all members should be access with the intrinsict lock of this object held @@ -221,17 +220,17 @@ public class TimeLineController { public TimeLineController() { //initalize repository and filteredEvents on creation - eventsRepository = new EventsRepository(); + eventsRepository = new EventsRepository(historyManager.currentState()); filteredEvents = eventsRepository.getEventsModel(); InitialZoomState = new ZoomParams(filteredEvents.getSpanningInterval(), EventTypeZoomLevel.BASE_TYPE, Filter.getDefaultFilter(), DescriptionLOD.SHORT); - filteredEvents.requestZoomState(InitialZoomState, true); + historyManager.currentState().set(InitialZoomState); + //persistent listener instances caseListener = new AutopsyCaseListener(); - } /** @return a shared events model */ @@ -354,7 +353,7 @@ public class TimeLineController { LOGGER.log(Level.SEVERE, "Unexpected error when generating timeline, ", ex); } } - + @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")) { @@ -502,51 +501,52 @@ public class TimeLineController { } synchronized public ZoomParams goForward() { - - final ZoomParams currentZoom = filteredEvents.getRequestedZoomParamters().get(); - - final ZoomParams fpeek = forwardStack.peek(); - - if (fpeek != null && currentZoom.equals(fpeek) == false) { - historyStack.push(currentZoom); - filteredEvents.requestZoomState(fpeek, false); - forwardStack.pop(); - } - return fpeek; + return historyManager.advance(); +// +// final ZoomParams currentZoom = filteredEvents.getRequestedZoomParamters().get(); +// +// final ZoomParams fpeek = forwardStack.peek(); +// +// if (fpeek != null && currentZoom.equals(fpeek) == false) { +// historyStack.push(currentZoom); +// filteredEvents.requestZoomState(fpeek, false); +// forwardStack.pop(); +// } +// return fpeek; } synchronized public ZoomParams goBack() { - final ZoomParams currentZoom = filteredEvents.getRequestedZoomParamters().get(); - final ZoomParams peek = historyStack.peek(); - if (peek != null && peek.equals(currentZoom) == false) { - forwardStack.push(currentZoom); - filteredEvents.requestZoomState(historyStack.pop(), false); - } else if (peek != null && peek.equals(currentZoom)) { - historyStack.pop(); - return goBack(); - } - return peek; + return historyManager.retreat(); +// final ZoomParams currentZoom = filteredEvents.getRequestedZoomParamters().get(); +// final ZoomParams peek = historyStack.peek(); +// +// if (peek != null && peek.equals(currentZoom) == false) { +// forwardStack.push(currentZoom); +// filteredEvents.requestZoomState(historyStack.pop(), false); +// } else if (peek != null && peek.equals(currentZoom)) { +// historyStack.pop(); +// return goBack(); +// } +// return peek; } - + synchronized private void pushZoom(ZoomParams newState) { - synchronized private void pushZoom(ZoomParams zCrumb) { - final ZoomParams currentZoom = filteredEvents.getRequestedZoomParamters().get(); - - if ( currentZoom.equals(zCrumb) == false) { - historyStack.push(currentZoom); - filteredEvents.requestZoomState(zCrumb, false); - if (zCrumb.equals(forwardStack.peek())) { - forwardStack.pop(); - } else { - forwardStack.clear(); - } - } + historyManager.advance(newState); +// final ZoomParams currentZoom = filteredEvents.getRequestedZoomParamters().get(); +// +// if (currentZoom.equals(zCrumb) == false) { +// historyStack.push(currentZoom); +// filteredEvents.requestZoomState(zCrumb, false); +// if (zCrumb.equals(forwardStack.peek())) { +// forwardStack.pop(); +// } else { +// forwardStack.clear(); +// } +// } } - - public void selectTimeAndType(Interval interval, EventType type) { final Interval timeRange = filteredEvents.getSpanningInterval().overlap(interval); diff --git a/Timeline/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java b/Timeline/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java index f326576862..d04d37ab95 100644 --- a/Timeline/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java +++ b/Timeline/src/org/sleuthkit/autopsy/timeline/TimeLineTopComponent.java @@ -56,7 +56,7 @@ import org.sleuthkit.autopsy.timeline.ui.filtering.FilterSetPanel; import org.sleuthkit.autopsy.timeline.zooming.ZoomSettingsPane; /** - * TopComponent for the advanced timeline module. + * TopComponent for the timeline feature. */ @ConvertAsProperties( dtd = "-//org.sleuthkit.autopsy.timeline//TimeLine//EN", diff --git a/Timeline/src/org/sleuthkit/autopsy/timeline/events/FilteredEventsModel.java b/Timeline/src/org/sleuthkit/autopsy/timeline/events/FilteredEventsModel.java index 6bd3481d42..d2513bec82 100644 --- a/Timeline/src/org/sleuthkit/autopsy/timeline/events/FilteredEventsModel.java +++ b/Timeline/src/org/sleuthkit/autopsy/timeline/events/FilteredEventsModel.java @@ -19,10 +19,11 @@ package org.sleuthkit.autopsy.timeline.events; import java.util.Collection; -import java.util.EnumSet; import java.util.List; import java.util.Map; import java.util.Set; +import javafx.beans.Observable; +import javafx.beans.property.ObjectProperty; import javafx.beans.property.ReadOnlyObjectProperty; import javafx.beans.property.ReadOnlyObjectWrapper; import javax.annotation.concurrent.GuardedBy; @@ -88,13 +89,29 @@ public class FilteredEventsModel { @GuardedBy("this") private final EventsRepository repo; - public FilteredEventsModel(EventsRepository repo) { + public FilteredEventsModel(EventsRepository repo, ObjectProperty currentStateProperty) { this.repo = repo; - requestedZoomParamters.set(new ZoomParams(new Interval(repo.getMinTime(), repo.getMaxTime(), DateTimeZone.UTC), - EventTypeZoomLevel.BASE_TYPE, - Filter.getDefaultFilter(), - DescriptionLOD.SHORT, - EnumSet.noneOf(ZoomParams.Field.class))); + requestedZoomParamters.bind(currentStateProperty); +// currentStateProperty.set(new ZoomParams(new Interval(repo.getMinTime(), repo.getMaxTime(), DateTimeZone.UTC), EventTypeZoomLevel.BASE_TYPE, +// Filter.getDefaultFilter(), +// DescriptionLOD.SHORT, +// EnumSet.noneOf(ZoomParams.Field.class))); + + requestedZoomParamters.addListener((Observable observable) -> { + final ZoomParams zoomParams = requestedZoomParamters.get(); + + if (zoomParams.getTypeZoomLevel().equals(requestedTypeZoom.get()) == false + || zoomParams.getDescrLOD().equals(requestedLOD.get()) == false + || zoomParams.getFilter().equals(requestedFilter.get()) == false + || zoomParams.getTimeRange().equals(requestedTimeRange.get()) == false) { + +// requestedZoomParamters.set(zoomParams); + requestedTypeZoom.set(zoomParams.getTypeZoomLevel()); + requestedFilter.set(zoomParams.getFilter().copyOf()); + requestedTimeRange.set(zoomParams.getTimeRange()); + requestedLOD.set(zoomParams.getDescrLOD()); + } + }); this.requestedTimeRange.set(getSpanningInterval()); } @@ -233,18 +250,18 @@ public class FilteredEventsModel { return requestedTypeZoom.get(); } - synchronized public void requestZoomState(ZoomParams zCrumb, boolean force) { - if (force - || zCrumb.getTypeZoomLevel().equals(requestedTypeZoom.get()) == false - || zCrumb.getDescrLOD().equals(requestedLOD.get()) == false - || zCrumb.getFilter().equals(requestedFilter.get()) == false - || zCrumb.getTimeRange().equals(requestedTimeRange.get()) == false) { - - requestedZoomParamters.set(zCrumb); - requestedTypeZoom.set(zCrumb.getTypeZoomLevel()); - requestedFilter.set(zCrumb.getFilter().copyOf()); - requestedTimeRange.set(zCrumb.getTimeRange()); - requestedLOD.set(zCrumb.getDescrLOD()); - } - } +// synchronized public void requestZoomState(ZoomParams zCrumb, boolean force) { +// if (force +// || zCrumb.getTypeZoomLevel().equals(requestedTypeZoom.get()) == false +// || zCrumb.getDescrLOD().equals(requestedLOD.get()) == false +// || zCrumb.getFilter().equals(requestedFilter.get()) == false +// || zCrumb.getTimeRange().equals(requestedTimeRange.get()) == false) { +// +// requestedZoomParamters.set(zCrumb); +// requestedTypeZoom.set(zCrumb.getTypeZoomLevel()); +// requestedFilter.set(zCrumb.getFilter().copyOf()); +// requestedTimeRange.set(zCrumb.getTimeRange()); +// requestedLOD.set(zCrumb.getDescrLOD()); +// } +// } } diff --git a/Timeline/src/org/sleuthkit/autopsy/timeline/events/db/EventDB.java b/Timeline/src/org/sleuthkit/autopsy/timeline/events/db/EventDB.java index 979317bee4..2286a584d5 100644 --- a/Timeline/src/org/sleuthkit/autopsy/timeline/events/db/EventDB.java +++ b/Timeline/src/org/sleuthkit/autopsy/timeline/events/db/EventDB.java @@ -50,6 +50,7 @@ import org.joda.time.DateTimeZone; import org.joda.time.Interval; import org.joda.time.Period; import org.openide.util.Exceptions; +import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.timeline.TimeLineController; import org.sleuthkit.autopsy.timeline.events.AggregateEvent; import org.sleuthkit.autopsy.timeline.events.TimeLineEvent; @@ -67,12 +68,11 @@ import org.sleuthkit.autopsy.timeline.zooming.DescriptionLOD; import org.sleuthkit.autopsy.timeline.zooming.EventTypeZoomLevel; import org.sleuthkit.autopsy.timeline.zooming.TimeUnits; import org.sleuthkit.autopsy.timeline.zooming.ZoomParams; -import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.datamodel.TskData; import org.sqlite.SQLiteJDBCLoader; /** - * This class provides access to the Advanced Timeline SQLite database. This + * This class provides access to the Timeline SQLite database. This * class borrows a lot of ideas and techniques from {@link SleuthkitCase}, * Creating an abstract base class for sqlite databases, or using a higherlevel * persistence api may make sense in the future. diff --git a/Timeline/src/org/sleuthkit/autopsy/timeline/events/db/EventsRepository.java b/Timeline/src/org/sleuthkit/autopsy/timeline/events/db/EventsRepository.java index da9bab52d8..fecca54cf2 100644 --- a/Timeline/src/org/sleuthkit/autopsy/timeline/events/db/EventsRepository.java +++ b/Timeline/src/org/sleuthkit/autopsy/timeline/events/db/EventsRepository.java @@ -32,11 +32,14 @@ import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.logging.Level; +import javafx.beans.property.ObjectProperty; import javax.annotation.concurrent.GuardedBy; import javax.swing.JOptionPane; import javax.swing.SwingWorker; import org.apache.commons.lang3.StringUtils; import org.joda.time.Interval; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.timeline.ProgressWindow; import org.sleuthkit.autopsy.timeline.events.AggregateEvent; import org.sleuthkit.autopsy.timeline.events.FilteredEventsModel; @@ -47,8 +50,6 @@ import org.sleuthkit.autopsy.timeline.events.type.FileSystemTypes; import org.sleuthkit.autopsy.timeline.events.type.RootEventType; import org.sleuthkit.autopsy.timeline.filters.Filter; import org.sleuthkit.autopsy.timeline.zooming.ZoomParams; -import org.sleuthkit.autopsy.casemodule.Case; -import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.datamodel.AbstractFile; import org.sleuthkit.datamodel.BlackboardArtifact; import org.sleuthkit.datamodel.SleuthkitCase; @@ -103,7 +104,7 @@ public class EventsRepository { return modelInstance; } - public EventsRepository() { + public EventsRepository(ObjectProperty currentStateProperty) { //TODO: we should check that case is open, or get passed a case object/directory -jm this.eventDB = EventDB.getEventDB(Case.getCurrentCase().getCaseDirectory()); @@ -118,7 +119,7 @@ public class EventsRepository { }).build(CacheLoader.from(eventDB::getAggregatedEvents)); maxCache = CacheBuilder.newBuilder().build(CacheLoader.from(eventDB::getMaxTime)); minCache = CacheBuilder.newBuilder().build(CacheLoader.from(eventDB::getMinTime)); - this.modelInstance = new FilteredEventsModel(this); + this.modelInstance = new FilteredEventsModel(this, currentStateProperty); } diff --git a/Timeline/src/org/sleuthkit/autopsy/timeline/license-advanced_timeline.txt b/Timeline/src/org/sleuthkit/autopsy/timeline/license-timeline.txt similarity index 100% rename from Timeline/src/org/sleuthkit/autopsy/timeline/license-advanced_timeline.txt rename to Timeline/src/org/sleuthkit/autopsy/timeline/license-timeline.txt