From 1f1d59d76f49c8d8091d890750a435f7b8d555ff Mon Sep 17 00:00:00 2001 From: jmillman Date: Fri, 19 Jun 2015 17:20:35 -0400 Subject: [PATCH] remove uneeded notification code; let event handlers do it all. optionalize DrawableView --- .../actions/CategorizeAction.java | 13 +++- .../actions/DeleteFollowUpTagAction.java | 11 +--- .../datamodel/CategoryManager.java | 2 +- .../datamodel/grouping/GroupManager.java | 12 ++-- .../gui/drawableviews/DrawableTileBase.java | 66 +++++++++++++++++-- .../gui/drawableviews/DrawableView.java | 1 + .../gui/drawableviews/MetaDataPane.java | 41 ++++++++++-- .../gui/drawableviews/SlideShowView.java | 2 +- 8 files changed, 119 insertions(+), 29 deletions(-) diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/CategorizeAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/CategorizeAction.java index 24e59dda65..3f6a918524 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/CategorizeAction.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/CategorizeAction.java @@ -19,7 +19,6 @@ package org.sleuthkit.autopsy.imagegallery.actions; import java.util.HashSet; -import java.util.List; import java.util.Set; import java.util.logging.Level; import java.util.stream.Collectors; @@ -37,8 +36,6 @@ import org.sleuthkit.autopsy.imagegallery.datamodel.Category; import org.sleuthkit.autopsy.imagegallery.datamodel.CategoryManager; import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableFile; import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableTagsManager; -import org.sleuthkit.autopsy.imagegallery.grouping.GroupManager; -import org.sleuthkit.datamodel.ContentTag; import org.sleuthkit.datamodel.Tag; import org.sleuthkit.datamodel.TagName; import org.sleuthkit.datamodel.TskCoreException; @@ -154,6 +151,16 @@ public class CategorizeAction extends AddTagAction { .collect(Collectors.toList()).isEmpty()) { tagsManager.addContentTag(file, tagName, comment); } + } else { + tagsManager.getContentTagsByContent(file).stream() + .filter(tag -> CategoryManager.isCategoryTagName(tag.getName())) + .forEach((ct) -> { + try { + tagsManager.deleteContentTag(ct); + } catch (TskCoreException ex) { + LOGGER.log(Level.SEVERE, "Error removing old categories result", ex); + } + }); } } catch (TskCoreException ex) { diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/DeleteFollowUpTagAction.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/DeleteFollowUpTagAction.java index aab8a9c827..74082fcd1c 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/DeleteFollowUpTagAction.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/actions/DeleteFollowUpTagAction.java @@ -26,10 +26,7 @@ import org.controlsfx.control.action.Action; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.imagegallery.DrawableTagsManager; import org.sleuthkit.autopsy.imagegallery.ImageGalleryController; -import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableAttribute; import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableFile; -import org.sleuthkit.autopsy.imagegallery.grouping.GroupKey; -import org.sleuthkit.autopsy.imagegallery.grouping.GroupManager; import org.sleuthkit.datamodel.ContentTag; import org.sleuthkit.datamodel.TagName; import org.sleuthkit.datamodel.TskCoreException; @@ -50,23 +47,17 @@ public class DeleteFollowUpTagAction extends Action { @Override protected Void doInBackground() throws Exception { - final GroupManager groupManager = controller.getGroupManager(); final DrawableTagsManager tagsManager = controller.getTagsManager(); try { final TagName followUpTagName = tagsManager.getFollowUpTagName(); - // remove file from old category group - groupManager.removeFromGroup(new GroupKey(DrawableAttribute.TAGS, followUpTagName), fileID); - + List contentTagsByContent = tagsManager.getContentTagsByContent(file); for (ContentTag ct : contentTagsByContent) { if (ct.getName().getDisplayName().equals(followUpTagName.getDisplayName())) { tagsManager.deleteContentTag(ct); } } - - //make sure rest of ui hears category change. -// groupManager.handleFileUpdate(FileUpdateEvent.newUpdateEvent(Collections.singleton(fileID), DrawableAttribute.TAGS)); } catch (TskCoreException ex) { LOGGER.log(Level.SEVERE, "Failed to delete follow up tag.", ex); } diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/CategoryManager.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/CategoryManager.java index 1f0d490857..e685c118f5 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/CategoryManager.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/CategoryManager.java @@ -262,7 +262,7 @@ public class CategoryManager { fireChange(Collections.singleton(addedTag.getContent().getId()), newCat); } } - + @Subscribe @Subscribe public void handleTagDeleted(ContentTagDeletedEvent event) { ContentTag deleted = event.getTag(); diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupManager.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupManager.java index e0c865e86e..ed1b5b3706 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupManager.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/datamodel/grouping/GroupManager.java @@ -293,6 +293,7 @@ public class GroupManager { if (unSeenGroups.contains(group)) { unSeenGroups.remove(group); } + } }); } } else { //group == null @@ -550,10 +551,12 @@ public class GroupManager { @Subscribe public void handleTagAdded(ContentTagAddedEvent evt) { - final GroupKey groupKey = new GroupKey<>(DrawableAttribute.TAGS, evt.getAddedTag().getName()); - final long fileID = evt.getAddedTag().getContent().getId(); - DrawableGroup g = getGroupForKey(groupKey); - addFileToGroup(g, groupKey, fileID); + if (groupBy == DrawableAttribute.TAGS || groupBy == DrawableAttribute.CATEGORY) { + final GroupKey groupKey = new GroupKey<>(DrawableAttribute.TAGS, evt.getAddedTag().getName()); + final long fileID = evt.getAddedTag().getContent().getId(); + DrawableGroup g = getGroupForKey(groupKey); + addFileToGroup(g, groupKey, fileID); + } } @@ -615,6 +618,7 @@ public class GroupManager { final long fileID = evt.getTag().getContent().getId(); DrawableGroup g = removeFromGroup(groupKey, fileID); } + } } @Subscribe diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableTileBase.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableTileBase.java index 6bfbc8a70a..c9bfe35b29 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableTileBase.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableTileBase.java @@ -23,6 +23,8 @@ import com.google.common.eventbus.Subscribe; import java.util.ArrayList; import java.util.Collection; import java.util.Optional; +import static java.util.Objects.nonNull; +import java.util.Optional; import java.util.logging.Level; import javafx.application.Platform; import javafx.beans.Observable; @@ -126,6 +128,30 @@ public abstract class DrawableTileBase extends DrawableUIBase { @FXML protected BorderPane imageBorder; + + @Override + public Optional getFileID() { + return fileIDOpt; + } + + @Override + public Optional> getFile() { + if (fileIDOpt.isPresent()) { + if (fileOpt.isPresent() && fileOpt.get().getId() == fileIDOpt.get()) { + return fileOpt; + } else { + try { + fileOpt = Optional.of(ImageGalleryController.getDefault().getFileFromId(fileIDOpt.get())); + } catch (TskCoreException ex) { + Logger.getAnonymousLogger().log(Level.WARNING, "failed to get DrawableFile for obj_id" + fileIDOpt.get(), ex); + fileOpt = Optional.empty(); + } + return fileOpt; + } + } else { + return Optional.empty(); + } + } /** * the groupPane this {@link DrawableTileBase} is embedded in */ @@ -258,7 +284,7 @@ public abstract class DrawableTileBase extends DrawableUIBase { try { globalSelectionModel.clearAndSelect(file.getId()); new AddDrawableTagAction(getController()).addTag(getController().getTagsManager().getFollowUpTagName(), ""); - new AddDrawableTagAction(controller).addTag(followUpTagName, ""); + new AddDrawableTagAction(controller).addTag(followUpTagName, ""); } catch (TskCoreException ex) { LOGGER.log(Level.SEVERE, "Failed to add Follow Up tag. Could not load TagName.", ex); } @@ -281,10 +307,12 @@ public abstract class DrawableTileBase extends DrawableUIBase { } } else { return false; + if (Objects.equals(newFileID, fileIDOpt.get()) == false) { + setFileHelper(newFileID); } } - @Override + private void setFileHelper(final Long newFileID) { protected void setFileHelper(final Long newFileID) { setFileIDOpt(Optional.ofNullable(newFileID)); disposeContent(); @@ -352,14 +380,44 @@ public abstract class DrawableTileBase extends DrawableUIBase { @Subscribe @Override public void handleTagAdded(ContentTagAddedEvent evt) { + fileIDOpt.ifPresent(fileID -> { + try { + if (fileID == evt.getAddedTag().getContent().getId() + && evt.getAddedTag().getName() == getController().getTagsManager().getFollowUpTagName()) { - updateFollowUpIcon(); + Platform.runLater(() -> { + followUpImageView.setImage(followUpIcon); + followUpToggle.setSelected(true); + }); + } + } catch (TskCoreException ex) { + LOGGER.log(Level.SEVERE, "Failed to get follow up status for file.", ex); + } + }); } @Subscribe @Override public void handleTagDeleted(ContentTagDeletedEvent evt) { - updateFollowUpIcon(); + + fileIDOpt.ifPresent(fileID -> { + try { + if (fileID == evt.getDeletedTag().getContent().getId() + && evt.getDeletedTag().getName() == controller.getTagsManager().getFollowUpTagName()) { + updateFollowUpIcon(); + } + } catch (TskCoreException ex) { + LOGGER.log(Level.SEVERE, "Failed to get follow up status for file.", ex); + } + }); + } + + private void updateFollowUpIcon() { + boolean hasFollowUp = hasFollowUp(); + Platform.runLater(() -> { + followUpImageView.setImage(hasFollowUp ? followUpIcon : followUpGray); + followUpToggle.setSelected(hasFollowUp); + }); } @Subscribe diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableView.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableView.java index 67647334d6..37737675e5 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableView.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/DrawableView.java @@ -2,6 +2,7 @@ package org.sleuthkit.autopsy.imagegallery.gui.drawableviews; import com.google.common.eventbus.Subscribe; import java.util.Optional; +import java.util.Optional; import java.util.logging.Level; import javafx.application.Platform; import javafx.scene.layout.Border; diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/MetaDataPane.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/MetaDataPane.java index e9109ab121..232cfe8a6f 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/MetaDataPane.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/MetaDataPane.java @@ -24,6 +24,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Objects; import java.util.Optional; +import java.util.Optional; import java.util.stream.Collectors; import javafx.application.Platform; import javafx.beans.property.SimpleObjectProperty; @@ -83,7 +84,6 @@ public class MetaDataPane extends DrawableUIBase { public MetaDataPane(ImageGalleryController controller) { super(controller); - FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("MetaDataPane.fxml")); fxmlLoader.setRoot(this); fxmlLoader.setController(this); @@ -93,8 +93,6 @@ public class MetaDataPane extends DrawableUIBase { } catch (IOException exception) { throw new RuntimeException(exception); } - } - @FXML @SuppressWarnings("unchecked") void initialize() { @@ -155,10 +153,35 @@ public class MetaDataPane extends DrawableUIBase { }); } + volatile private Optional> fileOpt = Optional.empty(); + + volatile private Optional fileIDOpt = Optional.empty(); + @Override protected synchronized void setFileHelper(Long newFileID) { setFileIDOpt(Optional.ofNullable(newFileID)); if (newFileID == null) { + + @Override + public Optional> getFile() { + if (fileIDOpt.isPresent()) { + if (fileOpt.isPresent() && fileOpt.get().getId() == fileIDOpt.get()) { + return fileOpt; + } else { + return fileOpt; + if (Objects.equals(newFileID, fileIDOpt.get()) == false) { + setFileHelper(newFileID); + } + } else { + if (nonNull(newFileID)) { + setFileHelper(newFileID); + } + } + setFileHelper(newFileID); + } + private void setFileHelper(Long newFileID) { + fileIDOpt = Optional.of(newFileID); + if (newFileID == null) { Platform.runLater(() -> { imageView.setImage(null); tableView.getItems().clear(); @@ -183,6 +206,7 @@ public class MetaDataPane extends DrawableUIBase { updateCategory(); }); + } @Override @@ -227,9 +251,14 @@ public class MetaDataPane extends DrawableUIBase { @Override public void handleTagDeleted(ContentTagDeletedEvent evt) { - if (getFile() != null && evt.getDeletedTag().getContent().getId() == getFileID()) { - updateUI(); - } + handleTagChanged(evt.getDeletedTag().getContent().getId()); } + private void handleTagChanged(Long tagFileID) { + getFileID().ifPresent(fileID -> { + if (Objects.equals(tagFileID, fileID)) { + updateUI(); + } + }); + } } diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/SlideShowView.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/SlideShowView.java index 91fbec5a24..ba60735da9 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/SlideShowView.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/drawableviews/SlideShowView.java @@ -50,7 +50,6 @@ import org.openide.util.Exceptions; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ThreadConfined; import org.sleuthkit.autopsy.coreutils.ThreadConfined.ThreadType; -import org.sleuthkit.autopsy.imagegallery.DrawableTagsManager; import org.sleuthkit.autopsy.imagegallery.FXMLConstructor; import org.sleuthkit.autopsy.imagegallery.FileIDSelectionModel; import org.sleuthkit.autopsy.imagegallery.actions.CategorizeAction; @@ -319,6 +318,7 @@ public class SlideShowView extends DrawableTileBase { public Category updateCategory() { if (getFile().isPresent()) { final Category category = super.updateCategory(); + final Border border1 = hasHashHit() && (category == Category.ZERO) ToggleButton toggleForCategory = getToggleForCategory(category); Platform.runLater(() -> { toggleForCategory.setSelected(true);