From 670d2e6e0c5481401fa3149c22408dd65c3ba616 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Wed, 7 Nov 2018 14:45:45 +0100 Subject: [PATCH 1/2] make EventAddedEvent 'reconstitutable'' after transmision over the network. --- .../timeline/events/EventAddedEvent.java | 53 +++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/EventAddedEvent.java b/Core/src/org/sleuthkit/autopsy/timeline/events/EventAddedEvent.java index 71492565a4..352393d337 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/events/EventAddedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/events/EventAddedEvent.java @@ -18,15 +18,62 @@ */ package org.sleuthkit.autopsy.timeline.events; +import java.io.Serializable; +import java.util.logging.Level; import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.events.AutopsyEvent; +import org.sleuthkit.datamodel.TskCoreException; +import org.sleuthkit.datamodel.timeline.TimelineEvent; /** - * + * An AutopsyEvent broadcast when a TimelineEvent is added to the case. */ -public class EventAddedEvent extends AutopsyEvent { +public class EventAddedEvent extends AutopsyEvent implements Serializable { + + private static final long serialVersionUID = 1L; + private static final Logger logger = Logger.getLogger(EventAddedEvent.class.getName()); + + private transient TimelineEvent addedEvent; + private final long addedEventID; public EventAddedEvent(org.sleuthkit.datamodel.TimelineManager.EventAddedEvent event) { - super(Case.Events.EVENT_ADDED.name(), null, event.getEvent()); + super(Case.Events.EVENT_ADDED.name(), null, event.getAddedEvent().getEventID()); + addedEvent = event.getAddedEvent(); + addedEventID = addedEvent.getEventID(); + } + + /** + * Gets the TimelineEvent that was added. + * + * @return The TimelineEvent or null if there is an error retrieving the + * TimelineEvent. + */ + @Override + public TimelineEvent getNewValue() { + /** + * The addedEvent field is set in the constructor, but it is transient + * so it will become null when the event is serialized for publication + * over a network. Doing a lazy load of the TimelineEvent object + * bypasses the issues related to the serialization and de-serialization + * of TimelineEvent objects and may also save database round trips from + * other nodes since subscribers to this event are often not interested + * in the event data. + */ + if (null != addedEvent) { + return addedEvent; + } + try { + addedEvent = Case.getCurrentCaseThrows().getSleuthkitCase().getTimelineManager().getEventById(addedEventID); + return addedEvent; + } catch (NoCurrentCaseException | TskCoreException ex) { + logger.log(Level.SEVERE, "Error doing lazy load for remote event", ex); //NON-NLS + return null; + } + } + + public TimelineEvent getAddedEvent() { + return getNewValue(); } } From 9da50733d3ed8ef4408fd2bb1f849cbfe035d780 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Tue, 13 Nov 2018 12:31:34 +0100 Subject: [PATCH 2/2] don't use 'extra' field to store id that is also passed to the superclass constructor. --- .../autopsy/timeline/events/EventAddedEvent.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/timeline/events/EventAddedEvent.java b/Core/src/org/sleuthkit/autopsy/timeline/events/EventAddedEvent.java index 352393d337..0223ba3f3c 100644 --- a/Core/src/org/sleuthkit/autopsy/timeline/events/EventAddedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/timeline/events/EventAddedEvent.java @@ -36,12 +36,10 @@ public class EventAddedEvent extends AutopsyEvent implements Serializable { private static final Logger logger = Logger.getLogger(EventAddedEvent.class.getName()); private transient TimelineEvent addedEvent; - private final long addedEventID; public EventAddedEvent(org.sleuthkit.datamodel.TimelineManager.EventAddedEvent event) { super(Case.Events.EVENT_ADDED.name(), null, event.getAddedEvent().getEventID()); addedEvent = event.getAddedEvent(); - addedEventID = addedEvent.getEventID(); } /** @@ -65,6 +63,7 @@ public class EventAddedEvent extends AutopsyEvent implements Serializable { return addedEvent; } try { + Long addedEventID = (Long) super.getNewValue(); addedEvent = Case.getCurrentCaseThrows().getSleuthkitCase().getTimelineManager().getEventById(addedEventID); return addedEvent; } catch (NoCurrentCaseException | TskCoreException ex) { @@ -73,6 +72,12 @@ public class EventAddedEvent extends AutopsyEvent implements Serializable { } } + /** + * Gets the TimelineEvent that was added. + * + * @return The TimelineEvent or null if there is an error retrieving the + * TimelineEvent. + */ public TimelineEvent getAddedEvent() { return getNewValue(); }