address review comments: fix typos, rename variables, catch exceptions higher up.

This commit is contained in:
jmillman 2016-05-18 14:29:27 -04:00
parent a185a43d11
commit f7e7404ec4
3 changed files with 56 additions and 32 deletions

View File

@ -22,6 +22,7 @@ import com.google.common.collect.Iterables;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.logging.Level;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.beans.InvalidationListener; import javafx.beans.InvalidationListener;
import javafx.beans.Observable; import javafx.beans.Observable;
@ -37,6 +38,7 @@ import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Priority; import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import org.controlsfx.control.Notifications;
import org.openide.explorer.ExplorerManager; import org.openide.explorer.ExplorerManager;
import org.openide.explorer.ExplorerUtils; import org.openide.explorer.ExplorerUtils;
import org.openide.util.NbBundle; import org.openide.util.NbBundle;
@ -58,6 +60,7 @@ import org.sleuthkit.autopsy.timeline.ui.VisualizationPanel;
import org.sleuthkit.autopsy.timeline.ui.detailview.tree.EventsTree; import org.sleuthkit.autopsy.timeline.ui.detailview.tree.EventsTree;
import org.sleuthkit.autopsy.timeline.ui.filtering.FilterSetPanel; import org.sleuthkit.autopsy.timeline.ui.filtering.FilterSetPanel;
import org.sleuthkit.autopsy.timeline.zooming.ZoomSettingsPane; import org.sleuthkit.autopsy.timeline.zooming.ZoomSettingsPane;
import org.sleuthkit.datamodel.TskCoreException;
/** /**
* TopComponent for the Timeline feature. * TopComponent for the Timeline feature.
@ -71,7 +74,7 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer
private static final Logger LOGGER = Logger.getLogger(TimeLineTopComponent.class.getName()); private static final Logger LOGGER = Logger.getLogger(TimeLineTopComponent.class.getName());
private final DataContentPanel dataContentPanel; private final DataContentPanel contentViewerPanel;
private final TimeLineResultView tlResultView; private final TimeLineResultView tlResultView;
@ -79,17 +82,32 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer
private final TimeLineController controller; private final TimeLineController controller;
@NbBundle.Messages({
"TimelineTopComponent.selectedEventListener.errorMsg=There was a problem getting the content for the selected event."})
/** /**
* Listener that drives the ContentViewer when in List ViewMode. * Listener that drives the ContentViewer when in List ViewMode.
*/ */
private final InvalidationListener selectionListener = new InvalidationListener() { private final InvalidationListener selectedEventListener = new InvalidationListener() {
@Override @Override
public void invalidated(Observable observable) { public void invalidated(Observable observable) {
if (controller.getSelectedEventIDs().size() == 1) { if (controller.getSelectedEventIDs().size() == 1) {
try {
EventNode eventNode = EventNode.createEventNode(Iterables.getOnlyElement(controller.getSelectedEventIDs()), controller.getEventsModel()); EventNode eventNode = EventNode.createEventNode(Iterables.getOnlyElement(controller.getSelectedEventIDs()), controller.getEventsModel());
SwingUtilities.invokeLater(() -> dataContentPanel.setNode(eventNode)); SwingUtilities.invokeLater(() -> contentViewerPanel.setNode(eventNode));
} catch (IllegalStateException ex) {
//Since the case is closed, the user probably doesn't care about this, just log it as a precaution.
LOGGER.log(Level.SEVERE, "There was no case open to lookup the Sleuthkit object backing a SingleEvent.", ex); // NON-NLS
} catch (TskCoreException ex) {
LOGGER.log(Level.SEVERE, "Failed to lookup Sleuthkit object backing a SingleEvent.", ex); // NON-NLS
Platform.runLater(() -> {
Notifications.create()
.owner(jFXVizPanel.getScene().getWindow())
.text(Bundle.TimelineTopComponent_selectedEventListener_errorMsg())
.showError();
});
}
} else { } else {
SwingUtilities.invokeLater(() -> dataContentPanel.setNode(null)); SwingUtilities.invokeLater(() -> contentViewerPanel.setNode(null));
} }
} }
}; };
@ -103,9 +121,9 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer
setToolTipText(NbBundle.getMessage(TimeLineTopComponent.class, "HINT_TimeLineTopComponent")); setToolTipText(NbBundle.getMessage(TimeLineTopComponent.class, "HINT_TimeLineTopComponent"));
setIcon(WindowManager.getDefault().getMainWindow().getIconImage()); //use the same icon as main application setIcon(WindowManager.getDefault().getMainWindow().getIconImage()); //use the same icon as main application
dataContentPanel = DataContentPanel.createInstance(); contentViewerPanel = DataContentPanel.createInstance();
this.contentViewerContainerPanel.add(dataContentPanel, BorderLayout.CENTER); this.contentViewerContainerPanel.add(contentViewerPanel, BorderLayout.CENTER);
tlResultView = new TimeLineResultView(controller, dataContentPanel); tlResultView = new TimeLineResultView(controller, contentViewerPanel);
final DataResultPanel dataResultPanel = tlResultView.getDataResultPanel(); final DataResultPanel dataResultPanel = tlResultView.getDataResultPanel();
this.resultContainerPanel.add(dataResultPanel, BorderLayout.CENTER); this.resultContainerPanel.add(dataResultPanel, BorderLayout.CENTER);
dataResultPanel.open(); dataResultPanel.open();
@ -127,7 +145,7 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer
lowerSplitXPane.add(contentViewerContainerPanel); lowerSplitXPane.add(contentViewerContainerPanel);
} }
}); });
controller.getSelectedEventIDs().removeListener(selectionListener); controller.getSelectedEventIDs().removeListener(selectedEventListener);
break; break;
case LIST: case LIST:
/* /*
@ -139,7 +157,7 @@ public final class TimeLineTopComponent extends TopComponent implements Explorer
splitYPane.add(contentViewerContainerPanel); splitYPane.add(contentViewerContainerPanel);
dataResultPanel.setNode(null); dataResultPanel.setNode(null);
}); });
controller.getSelectedEventIDs().addListener(selectionListener); controller.getSelectedEventIDs().addListener(selectedEventListener);
break; break;
default: default:
throw new UnsupportedOperationException("Unknown ViewMode: " + controller.getViewMode()); throw new UnsupportedOperationException("Unknown ViewMode: " + controller.getViewMode());

View File

@ -167,7 +167,7 @@ public class EventNode extends DisplayableItemNode {
} }
/** /**
* Factory method to create an EventNode form the event ID and the events * Factory method to create an EventNode from the event ID and the events
* model. * model.
* *
* @param eventID The ID of the event this node is for. * @param eventID The ID of the event this node is for.
@ -176,31 +176,21 @@ public class EventNode extends DisplayableItemNode {
* @return An EventNode with the file (and artifact) backing this event in * @return An EventNode with the file (and artifact) backing this event in
* its lookup. * its lookup.
*/ */
public static EventNode createEventNode(final Long eventID, FilteredEventsModel eventsModel) { public static EventNode createEventNode(final Long eventID, FilteredEventsModel eventsModel) throws TskCoreException, IllegalStateException {
/* /*
* Look up the event by id and creata an EventNode with the appropriate * Look up the event by id and creata an EventNode with the appropriate
* data in the lookup. * data in the lookup.
*/ */
final SingleEvent eventById = eventsModel.getEventById(eventID); final SingleEvent eventById = eventsModel.getEventById(eventID);
try {
SleuthkitCase sleuthkitCase = Case.getCurrentCase().getSleuthkitCase(); SleuthkitCase sleuthkitCase = Case.getCurrentCase().getSleuthkitCase();
AbstractFile file = sleuthkitCase.getAbstractFileById(eventById.getFileID()); AbstractFile file = sleuthkitCase.getAbstractFileById(eventById.getFileID());
if (file != null) {
if (eventById.getArtifactID().isPresent()) { if (eventById.getArtifactID().isPresent()) {
BlackboardArtifact blackboardArtifact = sleuthkitCase.getBlackboardArtifact(eventById.getArtifactID().get()); BlackboardArtifact blackboardArtifact = sleuthkitCase.getBlackboardArtifact(eventById.getArtifactID().get());
return new EventNode(eventById, file, blackboardArtifact); return new EventNode(eventById, file, blackboardArtifact);
} else { } else {
return new EventNode(eventById, file); return new EventNode(eventById, file);
} }
} else {
//This should never happen in normal operations
LOGGER.log(Level.WARNING, "Failed to lookup sleuthkit object backing TimeLineEvent."); // NON-NLS
return null;
}
} catch (IllegalStateException | TskCoreException ex) {
//if some how the case was closed or ther is another unspecified exception, just bail out with a warning.
LOGGER.log(Level.WARNING, "Failed to lookup sleuthkit object backing TimeLineEvent.", ex); // NON-NLS
return null;
}
} }
} }

View File

@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.timeline.explorernodes;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.logging.Level;
import org.openide.nodes.AbstractNode; import org.openide.nodes.AbstractNode;
import org.openide.nodes.ChildFactory; import org.openide.nodes.ChildFactory;
import org.openide.nodes.Children; import org.openide.nodes.Children;
@ -30,6 +31,7 @@ import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.datamodel.DisplayableItemNode; import org.sleuthkit.autopsy.datamodel.DisplayableItemNode;
import org.sleuthkit.autopsy.datamodel.DisplayableItemNodeVisitor; import org.sleuthkit.autopsy.datamodel.DisplayableItemNodeVisitor;
import org.sleuthkit.autopsy.timeline.datamodel.FilteredEventsModel; import org.sleuthkit.autopsy.timeline.datamodel.FilteredEventsModel;
import org.sleuthkit.datamodel.TskCoreException;
/** /**
* Root Explorer node to represent events. * Root Explorer node to represent events.
@ -125,7 +127,21 @@ public class EventRootNode extends DisplayableItemNode {
*/ */
return new TooManyNode(eventIDs.size()); return new TooManyNode(eventIDs.size());
} else { } else {
try {
return EventNode.createEventNode(eventID, filteredEvents); return EventNode.createEventNode(eventID, filteredEvents);
} catch (IllegalStateException ex) {
//Since the case is closed, the user probably doesn't care about this, just log it as a precaution.
LOGGER.log(Level.SEVERE, "There was no case open to lookup the Sleuthkit object backing a SingleEvent.", ex); // NON-NLS
return null;
} catch (TskCoreException ex) {
/*
* Just log it: There might be lots of these errors, and we
* don't want to flood the user with notifications. It will
* be obvious the UI is broken anyways
*/
LOGGER.log(Level.SEVERE, "Failed to lookup Sleuthkit object backing a SingleEvent.", ex); // NON-NLS
return null;
}
} }
} }
} }