From 820135d7723c229a1028ace0e458d3852f018310 Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Thu, 11 Jun 2015 00:40:07 -0400 Subject: [PATCH 1/6] Created Keys class for DataSource to update more cleanly when new data sources are added --- .../datamodel/AbstractContentChildren.java | 6 +- .../autopsy/datamodel/DataSourcesNode.java | 58 ++++++++++++++++++- .../DirectoryTreeTopComponent.java | 3 +- 3 files changed, 58 insertions(+), 9 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java index 77ca0752fb..0719a18c3c 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/AbstractContentChildren.java @@ -176,11 +176,7 @@ abstract class AbstractContentChildren extends Keys { @Override public AbstractNode visit(DataSources i) { - try { - return new DataSourcesNode(Case.getCurrentCase().getDataSources()); - } catch (TskCoreException ex) { - return defaultVisit(i); - } + return new DataSourcesNode(); } @Override diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java index 4d0ed1feb4..1d45eec0dc 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java @@ -18,26 +18,78 @@ */ package org.sleuthkit.autopsy.datamodel; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.Collections; import java.util.List; - import org.openide.nodes.Sheet; import org.openide.util.NbBundle; import org.openide.util.lookup.Lookups; +import org.sleuthkit.autopsy.casemodule.Case; +import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.datamodel.Content; +import org.sleuthkit.datamodel.TskCoreException; /** * Nodes for the images */ public class DataSourcesNode extends DisplayableItemNode { - public static final String NAME = NbBundle.getMessage(DataSourcesNode.class, "DataSourcesNode.name"); + // NOTE: The images passed in via argument will be ignored. + @Deprecated public DataSourcesNode(List images) { - super(new RootContentChildren(images), Lookups.singleton(NAME)); + super(new DataSourcesNodeChildren(), Lookups.singleton(NAME)); + init(); + } + + public DataSourcesNode() { + super(new DataSourcesNodeChildren(), Lookups.singleton(NAME)); + init(); + } + + private void init() { setName(NAME); setDisplayName(NAME); this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/image.png"); //NON-NLS } + + /* Custom Keys implementation that listens for new data sources being added. */ + private static class DataSourcesNodeChildren extends AbstractContentChildren { + private static final Logger logger = Logger.getLogger(DataSourcesNodeChildren.class.getName()); + + public DataSourcesNodeChildren() { + super(); + } + + private final PropertyChangeListener pcl = new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + String eventType = evt.getPropertyName(); + if (eventType.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { + addNotify(); + } + } + }; + + + @Override + protected void addNotify() { + Case.addPropertyChangeListener(pcl); + try { + setKeys(Case.getCurrentCase().getDataSources()); + } catch (TskCoreException | IllegalStateException ex) { + logger.severe("Error getting data sources: " + ex.getMessage()); // NON-NLS + setKeys(Collections.EMPTY_SET); + } + } + + @Override + protected void removeNotify() { + Case.removePropertyChangeListener(pcl); + setKeys(Collections.EMPTY_SET); + } + } @Override public boolean isLeafTypeNode() { diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java index 8161914bb9..c22515dfe2 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java @@ -573,7 +573,8 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat } } // if the image is added to the case else if (changed.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { - componentOpened(); + // we don't need to do anything in here. + // DataSourcesNode is listening for these events and updates itself } // change in node selection else if (changed.equals(ExplorerManager.PROP_SELECTED_NODES)) { From eab558bac5235889e409882bfd495977affbb459 Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Thu, 11 Jun 2015 00:42:32 -0400 Subject: [PATCH 2/6] formatting --- .../autopsy/datamodel/DataSourcesNode.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java index 1d45eec0dc..e247882240 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java @@ -34,6 +34,7 @@ import org.sleuthkit.datamodel.TskCoreException; * Nodes for the images */ public class DataSourcesNode extends DisplayableItemNode { + public static final String NAME = NbBundle.getMessage(DataSourcesNode.class, "DataSourcesNode.name"); // NOTE: The images passed in via argument will be ignored. @@ -42,22 +43,23 @@ public class DataSourcesNode extends DisplayableItemNode { super(new DataSourcesNodeChildren(), Lookups.singleton(NAME)); init(); } - + public DataSourcesNode() { super(new DataSourcesNodeChildren(), Lookups.singleton(NAME)); init(); } - - private void init() { + + private void init() { setName(NAME); setDisplayName(NAME); this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/image.png"); //NON-NLS } - + /* Custom Keys implementation that listens for new data sources being added. */ private static class DataSourcesNodeChildren extends AbstractContentChildren { + private static final Logger logger = Logger.getLogger(DataSourcesNodeChildren.class.getName()); - + public DataSourcesNodeChildren() { super(); } @@ -71,7 +73,6 @@ public class DataSourcesNode extends DisplayableItemNode { } } }; - @Override protected void addNotify() { From 6648873dbb6dd2a4cd01514b88cd0d0b20b7fabe Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Thu, 11 Jun 2015 00:51:36 -0400 Subject: [PATCH 3/6] added reloadKeys method to DataSourcesNode --- .../autopsy/datamodel/DataSourcesNode.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java index e247882240..ba162f6e25 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java @@ -69,7 +69,7 @@ public class DataSourcesNode extends DisplayableItemNode { public void propertyChange(PropertyChangeEvent evt) { String eventType = evt.getPropertyName(); if (eventType.equals(Case.Events.DATA_SOURCE_ADDED.toString())) { - addNotify(); + reloadKeys(); } } }; @@ -77,6 +77,16 @@ public class DataSourcesNode extends DisplayableItemNode { @Override protected void addNotify() { Case.addPropertyChangeListener(pcl); + reloadKeys(); + } + + @Override + protected void removeNotify() { + Case.removePropertyChangeListener(pcl); + setKeys(Collections.EMPTY_SET); + } + + private void reloadKeys() { try { setKeys(Case.getCurrentCase().getDataSources()); } catch (TskCoreException | IllegalStateException ex) { @@ -84,12 +94,6 @@ public class DataSourcesNode extends DisplayableItemNode { setKeys(Collections.EMPTY_SET); } } - - @Override - protected void removeNotify() { - Case.removePropertyChangeListener(pcl); - setKeys(Collections.EMPTY_SET); - } } @Override From d3b66102c59a7985f0f979d3542a78d6ef24f687 Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Thu, 11 Jun 2015 01:14:19 -0400 Subject: [PATCH 4/6] Expose child class so that it can be casted in DirectoryTree --- .../autopsy/datamodel/DataSourcesNode.java | 22 +++++++++++++++++-- .../DirectoryTreeTopComponent.java | 2 +- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java index ba162f6e25..2a1e62d9e1 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java @@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.datamodel; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.openide.nodes.Sheet; @@ -56,10 +57,13 @@ public class DataSourcesNode extends DisplayableItemNode { } /* Custom Keys implementation that listens for new data sources being added. */ - private static class DataSourcesNodeChildren extends AbstractContentChildren { + // @@@ This can become private once DirectoryTree doesn't want to refresh the entire tree + public static class DataSourcesNodeChildren extends AbstractContentChildren { private static final Logger logger = Logger.getLogger(DataSourcesNodeChildren.class.getName()); + List currentKeys = new ArrayList(); + public DataSourcesNodeChildren() { super(); } @@ -88,12 +92,26 @@ public class DataSourcesNode extends DisplayableItemNode { private void reloadKeys() { try { - setKeys(Case.getCurrentCase().getDataSources()); + currentKeys.addAll(Case.getCurrentCase().getDataSources()); + setKeys(currentKeys); } catch (TskCoreException | IllegalStateException ex) { logger.severe("Error getting data sources: " + ex.getMessage()); // NON-NLS setKeys(Collections.EMPTY_SET); } } + + /** + * Refresh all content keys + * This creates new nodes of keys have changed. + */ + // I think this goes away once we get more listeners in place + // It was added as an interim stage + @Deprecated + public void refreshContentKeys() { + for (Content key : currentKeys) { + refreshKey(key); + } + } } @Override diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java index c22515dfe2..8d0a814355 100644 --- a/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java +++ b/Core/src/org/sleuthkit/autopsy/directorytree/DirectoryTreeTopComponent.java @@ -779,7 +779,7 @@ public final class DirectoryTreeTopComponent extends TopComponent implements Dat Node imagesNode = imagesNodeOrig.getNode(); - RootContentChildren contentRootChildren = (RootContentChildren) imagesNode.getChildren(); + DataSourcesNode.DataSourcesNodeChildren contentRootChildren = (DataSourcesNode.DataSourcesNodeChildren) imagesNode.getChildren(); contentRootChildren.refreshContentKeys(); //final TreeView tree = getTree(); From 5e0d8a6f5ef3900a9307a542be8b8b3f2fac5914 Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Thu, 18 Jun 2015 16:01:30 -0400 Subject: [PATCH 5/6] Fixed compiler warnings --- .../org/sleuthkit/autopsy/datamodel/DataSourcesNode.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java index 2a1e62d9e1..b0c84fe805 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java @@ -62,10 +62,11 @@ public class DataSourcesNode extends DisplayableItemNode { private static final Logger logger = Logger.getLogger(DataSourcesNodeChildren.class.getName()); - List currentKeys = new ArrayList(); + List currentKeys; public DataSourcesNodeChildren() { super(); + this.currentKeys = new ArrayList<>(); } private final PropertyChangeListener pcl = new PropertyChangeListener() { @@ -87,7 +88,7 @@ public class DataSourcesNode extends DisplayableItemNode { @Override protected void removeNotify() { Case.removePropertyChangeListener(pcl); - setKeys(Collections.EMPTY_SET); + setKeys(Collections.emptySet()); } private void reloadKeys() { @@ -96,7 +97,7 @@ public class DataSourcesNode extends DisplayableItemNode { setKeys(currentKeys); } catch (TskCoreException | IllegalStateException ex) { logger.severe("Error getting data sources: " + ex.getMessage()); // NON-NLS - setKeys(Collections.EMPTY_SET); + setKeys(Collections.emptySet()); } } From 62df408f0e349b903f89e6059b8428c5b016aabd Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Thu, 18 Jun 2015 17:23:08 -0400 Subject: [PATCH 6/6] do not add to list --- Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java index b0c84fe805..f113a1b515 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DataSourcesNode.java @@ -88,12 +88,13 @@ public class DataSourcesNode extends DisplayableItemNode { @Override protected void removeNotify() { Case.removePropertyChangeListener(pcl); + currentKeys.clear(); setKeys(Collections.emptySet()); } private void reloadKeys() { try { - currentKeys.addAll(Case.getCurrentCase().getDataSources()); + currentKeys = Case.getCurrentCase().getDataSources(); setKeys(currentKeys); } catch (TskCoreException | IllegalStateException ex) { logger.severe("Error getting data sources: " + ex.getMessage()); // NON-NLS