remove uneeded notification code; let event handlers do it all. optionalize DrawableView

This commit is contained in:
jmillman 2015-06-19 17:20:35 -04:00
parent 1665dc11b9
commit 1f1d59d76f
8 changed files with 119 additions and 29 deletions

View File

@ -19,7 +19,6 @@
package org.sleuthkit.autopsy.imagegallery.actions; package org.sleuthkit.autopsy.imagegallery.actions;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.stream.Collectors; 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.CategoryManager;
import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableFile; import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableFile;
import org.sleuthkit.autopsy.imagegallery.datamodel.DrawableTagsManager; 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.Tag;
import org.sleuthkit.datamodel.TagName; import org.sleuthkit.datamodel.TagName;
import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskCoreException;
@ -154,6 +151,16 @@ public class CategorizeAction extends AddTagAction {
.collect(Collectors.toList()).isEmpty()) { .collect(Collectors.toList()).isEmpty()) {
tagsManager.addContentTag(file, tagName, comment); 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) { } catch (TskCoreException ex) {

View File

@ -26,10 +26,7 @@ import org.controlsfx.control.action.Action;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.imagegallery.DrawableTagsManager; import org.sleuthkit.autopsy.imagegallery.DrawableTagsManager;
import org.sleuthkit.autopsy.imagegallery.ImageGalleryController; 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.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.ContentTag;
import org.sleuthkit.datamodel.TagName; import org.sleuthkit.datamodel.TagName;
import org.sleuthkit.datamodel.TskCoreException; import org.sleuthkit.datamodel.TskCoreException;
@ -50,13 +47,10 @@ public class DeleteFollowUpTagAction extends Action {
@Override @Override
protected Void doInBackground() throws Exception { protected Void doInBackground() throws Exception {
final GroupManager groupManager = controller.getGroupManager();
final DrawableTagsManager tagsManager = controller.getTagsManager(); final DrawableTagsManager tagsManager = controller.getTagsManager();
try { try {
final TagName followUpTagName = tagsManager.getFollowUpTagName(); final TagName followUpTagName = tagsManager.getFollowUpTagName();
// remove file from old category group
groupManager.removeFromGroup(new GroupKey<TagName>(DrawableAttribute.TAGS, followUpTagName), fileID);
List<ContentTag> contentTagsByContent = tagsManager.getContentTagsByContent(file); List<ContentTag> contentTagsByContent = tagsManager.getContentTagsByContent(file);
for (ContentTag ct : contentTagsByContent) { for (ContentTag ct : contentTagsByContent) {
@ -64,9 +58,6 @@ public class DeleteFollowUpTagAction extends Action {
tagsManager.deleteContentTag(ct); tagsManager.deleteContentTag(ct);
} }
} }
//make sure rest of ui hears category change.
// groupManager.handleFileUpdate(FileUpdateEvent.newUpdateEvent(Collections.singleton(fileID), DrawableAttribute.TAGS));
} catch (TskCoreException ex) { } catch (TskCoreException ex) {
LOGGER.log(Level.SEVERE, "Failed to delete follow up tag.", ex); LOGGER.log(Level.SEVERE, "Failed to delete follow up tag.", ex);
} }

View File

@ -262,7 +262,7 @@ public class CategoryManager {
fireChange(Collections.singleton(addedTag.getContent().getId()), newCat); fireChange(Collections.singleton(addedTag.getContent().getId()), newCat);
} }
} }
@Subscribe
@Subscribe @Subscribe
public void handleTagDeleted(ContentTagDeletedEvent event) { public void handleTagDeleted(ContentTagDeletedEvent event) {
ContentTag deleted = event.getTag(); ContentTag deleted = event.getTag();

View File

@ -293,6 +293,7 @@ public class GroupManager {
if (unSeenGroups.contains(group)) { if (unSeenGroups.contains(group)) {
unSeenGroups.remove(group); unSeenGroups.remove(group);
} }
}
}); });
} }
} else { //group == null } else { //group == null
@ -550,10 +551,12 @@ public class GroupManager {
@Subscribe @Subscribe
public void handleTagAdded(ContentTagAddedEvent evt) { public void handleTagAdded(ContentTagAddedEvent evt) {
final GroupKey<TagName> groupKey = new GroupKey<>(DrawableAttribute.TAGS, evt.getAddedTag().getName()); if (groupBy == DrawableAttribute.TAGS || groupBy == DrawableAttribute.CATEGORY) {
final long fileID = evt.getAddedTag().getContent().getId(); final GroupKey<TagName> groupKey = new GroupKey<>(DrawableAttribute.TAGS, evt.getAddedTag().getName());
DrawableGroup g = getGroupForKey(groupKey); final long fileID = evt.getAddedTag().getContent().getId();
addFileToGroup(g, groupKey, fileID); DrawableGroup g = getGroupForKey(groupKey);
addFileToGroup(g, groupKey, fileID);
}
} }
@ -615,6 +618,7 @@ public class GroupManager {
final long fileID = evt.getTag().getContent().getId(); final long fileID = evt.getTag().getContent().getId();
DrawableGroup g = removeFromGroup(groupKey, fileID); DrawableGroup g = removeFromGroup(groupKey, fileID);
} }
}
} }
@Subscribe @Subscribe

View File

@ -23,6 +23,8 @@ import com.google.common.eventbus.Subscribe;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Optional; import java.util.Optional;
import static java.util.Objects.nonNull;
import java.util.Optional;
import java.util.logging.Level; import java.util.logging.Level;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.beans.Observable; import javafx.beans.Observable;
@ -126,6 +128,30 @@ public abstract class DrawableTileBase extends DrawableUIBase {
@FXML @FXML
protected BorderPane imageBorder; protected BorderPane imageBorder;
@Override
public Optional<Long> getFileID() {
return fileIDOpt;
}
@Override
public Optional<DrawableFile<?>> 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 * the groupPane this {@link DrawableTileBase} is embedded in
*/ */
@ -258,7 +284,7 @@ public abstract class DrawableTileBase extends DrawableUIBase {
try { try {
globalSelectionModel.clearAndSelect(file.getId()); globalSelectionModel.clearAndSelect(file.getId());
new AddDrawableTagAction(getController()).addTag(getController().getTagsManager().getFollowUpTagName(), ""); new AddDrawableTagAction(getController()).addTag(getController().getTagsManager().getFollowUpTagName(), "");
new AddDrawableTagAction(controller).addTag(followUpTagName, ""); new AddDrawableTagAction(controller).addTag(followUpTagName, "");
} catch (TskCoreException ex) { } catch (TskCoreException ex) {
LOGGER.log(Level.SEVERE, "Failed to add Follow Up tag. Could not load TagName.", 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 { } else {
return false; return false;
if (Objects.equals(newFileID, fileIDOpt.get()) == false) {
setFileHelper(newFileID);
} }
} }
@Override private void setFileHelper(final Long newFileID) {
protected void setFileHelper(final Long newFileID) { protected void setFileHelper(final Long newFileID) {
setFileIDOpt(Optional.ofNullable(newFileID)); setFileIDOpt(Optional.ofNullable(newFileID));
disposeContent(); disposeContent();
@ -352,14 +380,44 @@ public abstract class DrawableTileBase extends DrawableUIBase {
@Subscribe @Subscribe
@Override @Override
public void handleTagAdded(ContentTagAddedEvent evt) { 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 @Subscribe
@Override @Override
public void handleTagDeleted(ContentTagDeletedEvent evt) { 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 @Subscribe

View File

@ -2,6 +2,7 @@ package org.sleuthkit.autopsy.imagegallery.gui.drawableviews;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import java.util.Optional; import java.util.Optional;
import java.util.Optional;
import java.util.logging.Level; import java.util.logging.Level;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.scene.layout.Border; import javafx.scene.layout.Border;

View File

@ -24,6 +24,7 @@ import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleObjectProperty;
@ -83,7 +84,6 @@ public class MetaDataPane extends DrawableUIBase {
public MetaDataPane(ImageGalleryController controller) { public MetaDataPane(ImageGalleryController controller) {
super(controller); super(controller);
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("MetaDataPane.fxml")); FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("MetaDataPane.fxml"));
fxmlLoader.setRoot(this); fxmlLoader.setRoot(this);
fxmlLoader.setController(this); fxmlLoader.setController(this);
@ -93,8 +93,6 @@ public class MetaDataPane extends DrawableUIBase {
} catch (IOException exception) { } catch (IOException exception) {
throw new RuntimeException(exception); throw new RuntimeException(exception);
} }
}
@FXML @FXML
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
void initialize() { void initialize() {
@ -155,10 +153,35 @@ public class MetaDataPane extends DrawableUIBase {
}); });
} }
volatile private Optional<DrawableFile<?>> fileOpt = Optional.empty();
volatile private Optional<Long> fileIDOpt = Optional.empty();
@Override @Override
protected synchronized void setFileHelper(Long newFileID) { protected synchronized void setFileHelper(Long newFileID) {
setFileIDOpt(Optional.ofNullable(newFileID)); setFileIDOpt(Optional.ofNullable(newFileID));
if (newFileID == null) { if (newFileID == null) {
@Override
public Optional<DrawableFile<?>> 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(() -> { Platform.runLater(() -> {
imageView.setImage(null); imageView.setImage(null);
tableView.getItems().clear(); tableView.getItems().clear();
@ -183,6 +206,7 @@ public class MetaDataPane extends DrawableUIBase {
updateCategory(); updateCategory();
}); });
} }
@Override @Override
@ -227,9 +251,14 @@ public class MetaDataPane extends DrawableUIBase {
@Override @Override
public void handleTagDeleted(ContentTagDeletedEvent evt) { public void handleTagDeleted(ContentTagDeletedEvent evt) {
if (getFile() != null && evt.getDeletedTag().getContent().getId() == getFileID()) { handleTagChanged(evt.getDeletedTag().getContent().getId());
updateUI();
}
} }
private void handleTagChanged(Long tagFileID) {
getFileID().ifPresent(fileID -> {
if (Objects.equals(tagFileID, fileID)) {
updateUI();
}
});
}
} }

View File

@ -50,7 +50,6 @@ import org.openide.util.Exceptions;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.ThreadConfined; import org.sleuthkit.autopsy.coreutils.ThreadConfined;
import org.sleuthkit.autopsy.coreutils.ThreadConfined.ThreadType; import org.sleuthkit.autopsy.coreutils.ThreadConfined.ThreadType;
import org.sleuthkit.autopsy.imagegallery.DrawableTagsManager;
import org.sleuthkit.autopsy.imagegallery.FXMLConstructor; import org.sleuthkit.autopsy.imagegallery.FXMLConstructor;
import org.sleuthkit.autopsy.imagegallery.FileIDSelectionModel; import org.sleuthkit.autopsy.imagegallery.FileIDSelectionModel;
import org.sleuthkit.autopsy.imagegallery.actions.CategorizeAction; import org.sleuthkit.autopsy.imagegallery.actions.CategorizeAction;
@ -319,6 +318,7 @@ public class SlideShowView extends DrawableTileBase {
public Category updateCategory() { public Category updateCategory() {
if (getFile().isPresent()) { if (getFile().isPresent()) {
final Category category = super.updateCategory(); final Category category = super.updateCategory();
final Border border1 = hasHashHit() && (category == Category.ZERO)
ToggleButton toggleForCategory = getToggleForCategory(category); ToggleButton toggleForCategory = getToggleForCategory(category);
Platform.runLater(() -> { Platform.runLater(() -> {
toggleForCategory.setSelected(true); toggleForCategory.setSelected(true);