From 6a886e918b229317f23043e13d4b1b21e1eb69b2 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Wed, 3 Oct 2018 12:35:44 +0200 Subject: [PATCH 1/5] generate images on jfx thread --- .../autopsy/datamodel/DhsImageCategory.java | 38 +++++++++++++------ 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java b/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java index 2357c61599..ba37c32a1f 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2013-16 Basis Technology Corp. + * Copyright 2013-18 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,10 +19,14 @@ package org.sleuthkit.autopsy.datamodel; import com.google.common.collect.ImmutableList; +import com.google.common.util.concurrent.SettableFuture; import java.util.Map; +import java.util.concurrent.ExecutionException; import java.util.function.Function; +import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.Stream; +import javafx.application.Platform; import javafx.geometry.Insets; import javafx.scene.Node; import javafx.scene.Scene; @@ -38,7 +42,7 @@ import javafx.scene.layout.CornerRadii; import javafx.scene.layout.Region; import javafx.scene.paint.Color; import org.openide.util.NbBundle; -import org.sleuthkit.autopsy.datamodel.Bundle; +import org.sleuthkit.autopsy.coreutils.Logger; /** * Enum to represent the six categories in the DHS image categorization scheme. @@ -63,6 +67,7 @@ public enum DhsImageCategory { FIVE(Color.GREEN, 5, Bundle.Category_five()), ZERO(Color.LIGHTGREY, 0, Bundle.Category_zero()); + private static final Logger logger = Logger.getLogger(DhsImageCategory.class.getName()); private static final BorderWidths BORDER_WIDTHS_2 = new BorderWidths(2); private static final CornerRadii CORNER_RADII_4 = new CornerRadii(4); @@ -70,15 +75,15 @@ public enum DhsImageCategory { return nonZeroCategories; } - private static final ImmutableList nonZeroCategories = - ImmutableList.of(DhsImageCategory.FIVE, DhsImageCategory.FOUR, DhsImageCategory.THREE, DhsImageCategory.TWO, DhsImageCategory.ONE); + private static final ImmutableList nonZeroCategories + = ImmutableList.of(DhsImageCategory.FIVE, DhsImageCategory.FOUR, DhsImageCategory.THREE, DhsImageCategory.TWO, DhsImageCategory.ONE); /** * map from displayName to enum value */ - private static final Map nameMap = - Stream.of(values()).collect(Collectors.toMap(DhsImageCategory::getDisplayName, - Function.identity())); + private static final Map nameMap + = Stream.of(values()).collect(Collectors.toMap(DhsImageCategory::getDisplayName, + Function.identity())); public static DhsImageCategory fromDisplayName(String displayName) { return nameMap.get(displayName); @@ -93,9 +98,7 @@ public enum DhsImageCategory { } private final Color color; - private final String displayName; - private final int id; private Image snapshot; @@ -124,13 +127,26 @@ public enum DhsImageCategory { synchronized public Node getGraphic() { if (snapshot == null) { + generateGraphic(); + } + return new ImageView(snapshot); + } + + synchronized private Image generateGraphic() { + SettableFuture imageFuture = SettableFuture.create(); + Platform.runLater(() -> { Region region = new Region(); region.setBackground(new Background(new BackgroundFill(getColor(), CORNER_RADII_4, Insets.EMPTY))); region.setPrefSize(16, 16); region.setBorder(new Border(new BorderStroke(getColor().darker(), BorderStrokeStyle.SOLID, CORNER_RADII_4, BORDER_WIDTHS_2))); Scene scene = new Scene(region, 16, 16, Color.TRANSPARENT); - snapshot = region.snapshot(null, null); + imageFuture.set(region.snapshot(null, null)); + }); + try { + return imageFuture.get(); + } catch (InterruptedException | ExecutionException ex) { + logger.log(Level.SEVERE, "Error generating graphic for DhsImageCategory" + this.getDisplayName(), ex); } - return new ImageView(snapshot); + return null; } } From 65b2393643f9101c73ac9ab409654b759fec6419 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Wed, 3 Oct 2018 13:15:20 +0200 Subject: [PATCH 2/5] make snapshot/graphic generation thread safe. --- .../autopsy/datamodel/DhsImageCategory.java | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java b/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java index ba37c32a1f..aea0b22e2a 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java @@ -19,11 +19,10 @@ package org.sleuthkit.autopsy.datamodel; import com.google.common.collect.ImmutableList; +import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.SettableFuture; import java.util.Map; -import java.util.concurrent.ExecutionException; import java.util.function.Function; -import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.Stream; import javafx.application.Platform; @@ -42,7 +41,6 @@ import javafx.scene.layout.CornerRadii; import javafx.scene.layout.Region; import javafx.scene.paint.Color; import org.openide.util.NbBundle; -import org.sleuthkit.autopsy.coreutils.Logger; /** * Enum to represent the six categories in the DHS image categorization scheme. @@ -67,7 +65,6 @@ public enum DhsImageCategory { FIVE(Color.GREEN, 5, Bundle.Category_five()), ZERO(Color.LIGHTGREY, 0, Bundle.Category_zero()); - private static final Logger logger = Logger.getLogger(DhsImageCategory.class.getName()); private static final BorderWidths BORDER_WIDTHS_2 = new BorderWidths(2); private static final CornerRadii CORNER_RADII_4 = new CornerRadii(4); @@ -127,26 +124,25 @@ public enum DhsImageCategory { synchronized public Node getGraphic() { if (snapshot == null) { - generateGraphic(); + snapshot = generateSnapshot(); } return new ImageView(snapshot); } - synchronized private Image generateGraphic() { - SettableFuture imageFuture = SettableFuture.create(); - Platform.runLater(() -> { + private Image generateSnapshot() { + if (Platform.isFxApplicationThread()) { + //We generate the 'icons' for the categories by taking a snapshot of ssimple custom Node. This must be done on the JFX thread. Region region = new Region(); region.setBackground(new Background(new BackgroundFill(getColor(), CORNER_RADII_4, Insets.EMPTY))); region.setPrefSize(16, 16); region.setBorder(new Border(new BorderStroke(getColor().darker(), BorderStrokeStyle.SOLID, CORNER_RADII_4, BORDER_WIDTHS_2))); Scene scene = new Scene(region, 16, 16, Color.TRANSPARENT); - imageFuture.set(region.snapshot(null, null)); - }); - try { - return imageFuture.get(); - } catch (InterruptedException | ExecutionException ex) { - logger.log(Level.SEVERE, "Error generating graphic for DhsImageCategory" + this.getDisplayName(), ex); + return region.snapshot(null, null); + } else { + //if we are not already on the JFX thread, do the generation on the javafx thread and block until done. + SettableFuture imageFuture = SettableFuture.create(); + Platform.runLater(() -> generateSnapshot()); + return Futures.getUnchecked(imageFuture); //block until snapshot is generated. It should be quick. } - return null; } } From 84b618feab0fe1085debc13ce96e91527096f8b5 Mon Sep 17 00:00:00 2001 From: millmanorama Date: Wed, 3 Oct 2018 15:20:07 +0200 Subject: [PATCH 3/5] unblock future by settings its value --- .../src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java b/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java index aea0b22e2a..49810cf5fa 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java @@ -136,12 +136,12 @@ public enum DhsImageCategory { region.setBackground(new Background(new BackgroundFill(getColor(), CORNER_RADII_4, Insets.EMPTY))); region.setPrefSize(16, 16); region.setBorder(new Border(new BorderStroke(getColor().darker(), BorderStrokeStyle.SOLID, CORNER_RADII_4, BORDER_WIDTHS_2))); - Scene scene = new Scene(region, 16, 16, Color.TRANSPARENT); + Scene scene = new Scene(region, 16, 16, Color.TRANSPARENT); // nead to add region to a scene for snapshot to work right. return region.snapshot(null, null); } else { //if we are not already on the JFX thread, do the generation on the javafx thread and block until done. SettableFuture imageFuture = SettableFuture.create(); - Platform.runLater(() -> generateSnapshot()); + Platform.runLater(() -> imageFuture.set(generateSnapshot())); return Futures.getUnchecked(imageFuture); //block until snapshot is generated. It should be quick. } } From 88652395edd2f6c61e31d4a0f7edb1c47c2db3cb Mon Sep 17 00:00:00 2001 From: millmanorama Date: Wed, 3 Oct 2018 19:58:05 +0200 Subject: [PATCH 4/5] use files for icon rather than taking a snapshot, avoiding the whole issue of what thread they are generated on. --- .../autopsy/datamodel/DhsImageCategory.java | 57 ++++-------------- .../src/org/sleuthkit/autopsy/images/cat0.png | Bin 0 -> 382 bytes .../src/org/sleuthkit/autopsy/images/cat1.png | Bin 0 -> 264 bytes .../src/org/sleuthkit/autopsy/images/cat2.png | Bin 0 -> 332 bytes .../src/org/sleuthkit/autopsy/images/cat3.png | Bin 0 -> 399 bytes .../src/org/sleuthkit/autopsy/images/cat4.png | Bin 0 -> 410 bytes .../src/org/sleuthkit/autopsy/images/cat5.png | Bin 0 -> 318 bytes .../autopsy/imagegallery/gui/GuiUtils.java | 8 +-- 8 files changed, 15 insertions(+), 50 deletions(-) create mode 100644 Core/src/org/sleuthkit/autopsy/images/cat0.png create mode 100644 Core/src/org/sleuthkit/autopsy/images/cat1.png create mode 100644 Core/src/org/sleuthkit/autopsy/images/cat2.png create mode 100644 Core/src/org/sleuthkit/autopsy/images/cat3.png create mode 100644 Core/src/org/sleuthkit/autopsy/images/cat4.png create mode 100644 Core/src/org/sleuthkit/autopsy/images/cat5.png diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java b/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java index 49810cf5fa..96251bba7e 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java @@ -19,26 +19,13 @@ package org.sleuthkit.autopsy.datamodel; import com.google.common.collect.ImmutableList; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.SettableFuture; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; -import javafx.application.Platform; -import javafx.geometry.Insets; import javafx.scene.Node; -import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.scene.image.ImageView; -import javafx.scene.layout.Background; -import javafx.scene.layout.BackgroundFill; -import javafx.scene.layout.Border; -import javafx.scene.layout.BorderStroke; -import javafx.scene.layout.BorderStrokeStyle; -import javafx.scene.layout.BorderWidths; -import javafx.scene.layout.CornerRadii; -import javafx.scene.layout.Region; import javafx.scene.paint.Color; import org.openide.util.NbBundle; @@ -58,15 +45,12 @@ public enum DhsImageCategory { * preserves the fact that lower category numbers are first/most sever, * except 0 which is last */ - ONE(Color.RED, 1, Bundle.Category_one()), - TWO(Color.ORANGE, 2, Bundle.Category_two()), - THREE(Color.YELLOW, 3, Bundle.Category_three()), - FOUR(Color.BISQUE, 4, Bundle.Category_four()), - FIVE(Color.GREEN, 5, Bundle.Category_five()), - ZERO(Color.LIGHTGREY, 0, Bundle.Category_zero()); - - private static final BorderWidths BORDER_WIDTHS_2 = new BorderWidths(2); - private static final CornerRadii CORNER_RADII_4 = new CornerRadii(4); + ONE(Color.RED, 1, Bundle.Category_one(), "cat1.png"), + TWO(Color.ORANGE, 2, Bundle.Category_two(), "cat2.png"), + THREE(Color.YELLOW, 3, Bundle.Category_three(), "cat3.png"), + FOUR(Color.BISQUE, 4, Bundle.Category_four(), "cat4.png"), + FIVE(Color.GREEN, 5, Bundle.Category_five(), "cat5.png"), + ZERO(Color.LIGHTGREY, 0, Bundle.Category_zero(), "cat0.png"); public static ImmutableList getNonZeroCategories() { return nonZeroCategories; @@ -97,12 +81,13 @@ public enum DhsImageCategory { private final Color color; private final String displayName; private final int id; - private Image snapshot; + private final Image icon; - private DhsImageCategory(Color color, int id, String name) { + private DhsImageCategory(Color color, int id, String name, String filename) { this.color = color; this.displayName = name; this.id = id; + this.icon = new Image(getClass().getResourceAsStream("/org/sleuthkit/autopsy/images/" + filename)); } public int getCategoryNumber() { @@ -122,27 +107,7 @@ public enum DhsImageCategory { return displayName; } - synchronized public Node getGraphic() { - if (snapshot == null) { - snapshot = generateSnapshot(); - } - return new ImageView(snapshot); - } - - private Image generateSnapshot() { - if (Platform.isFxApplicationThread()) { - //We generate the 'icons' for the categories by taking a snapshot of ssimple custom Node. This must be done on the JFX thread. - Region region = new Region(); - region.setBackground(new Background(new BackgroundFill(getColor(), CORNER_RADII_4, Insets.EMPTY))); - region.setPrefSize(16, 16); - region.setBorder(new Border(new BorderStroke(getColor().darker(), BorderStrokeStyle.SOLID, CORNER_RADII_4, BORDER_WIDTHS_2))); - Scene scene = new Scene(region, 16, 16, Color.TRANSPARENT); // nead to add region to a scene for snapshot to work right. - return region.snapshot(null, null); - } else { - //if we are not already on the JFX thread, do the generation on the javafx thread and block until done. - SettableFuture imageFuture = SettableFuture.create(); - Platform.runLater(() -> imageFuture.set(generateSnapshot())); - return Futures.getUnchecked(imageFuture); //block until snapshot is generated. It should be quick. - } + public Node getGraphic() { + return new ImageView(icon); } } diff --git a/Core/src/org/sleuthkit/autopsy/images/cat0.png b/Core/src/org/sleuthkit/autopsy/images/cat0.png new file mode 100644 index 0000000000000000000000000000000000000000..142cc111b71672e6899d360f25d538ddc5da508b GIT binary patch literal 382 zcmV-^0fGLBP)Q z3!|uM6NwLcRrS7pRozN!Ex-kE3LGw%%VSnjO7T@nDHjC6tB5=UkHB3BTmd&9O|@E$ z4H6(;om*f}fb&g`Ejkn6=pTTia20D!lgR|FHO@IYoeu4Gd#$Ics(rE69{eoic}~CI zXF8p-SS%O}2F&MkA0YJJo@E)v7`ojqyC17HOI? z8jVm&k*2Bl83B~mItLow>J}Me5a4AOGeB9E2=KHkpkA-vhrl)O%RB)Z*4k*B(HKJ% cMGwH`8`g|=)am6KO#lD@07*qoM6N<$g7eIm*#H0l literal 0 HcmV?d00001 diff --git a/Core/src/org/sleuthkit/autopsy/images/cat1.png b/Core/src/org/sleuthkit/autopsy/images/cat1.png new file mode 100644 index 0000000000000000000000000000000000000000..2ad7fdd04ab33ca9e76b0bc8a9310d9ebe73b366 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAP;i&0 zi(`mI@6t<#SxkWf$3EV-YiecLxZw-Kyc74-CTK4a*s|fYWX_(*92ag+rn0`H>kcM; zf13LF-~s6wKl$&^UfI-Qu454Nyxex*`(2NEbj_Ml1#FW;S> z|F!XKQG?cxOKaA&?-RDGHv7*|_MhPmOY@5UXE$O}J!NLkJIE^}n#L(!ELpK@^7JXO~qhM1oj}rKMLOScn%Oc7h;y5jOr5 zLG%jj1<9hFAb0^<1(6_PYo(=yXuuSbwb+fyG8;|&U^v6f`QABaW}++=V+$LYK#0ARX^_eGoyB}G~49b*-cJ1k%hmq<$coqiSEVoCnQX8|*+ zTe!v|o{Q7>aT-cYwfD%M7^T273z)EmYtD)~+A7_UQ`zW|MY02&E)<#(~} e@2#|PjO|ZUKQCHYlqu{000004uhZo literal 0 HcmV?d00001 diff --git a/Core/src/org/sleuthkit/autopsy/images/cat3.png b/Core/src/org/sleuthkit/autopsy/images/cat3.png new file mode 100644 index 0000000000000000000000000000000000000000..53ab5432ffef75045cdc800a630445bcac73373d GIT binary patch literal 399 zcmV;A0dW3_P)K`|P|8%P>KQ4nmju}R}o_ypTq2sT#w3fkCN+S>#hOH&AfF=iuC z1Pd<-S?6sA(|uZ|Nw00+Ph5?c~V z$ZaFx0}~`e-2wv%%>V-~V1HhNz@=1Lpi&vf+K}bt3+CsqB5ui~?c1Bv7Y#^raZybr*e5Fq6q>=ZntvR*JB(Xuj2c|6bf}_ zXK!M4k^W!EWLiv5H^}9lsMSWfy&aAhcB}BkySqVoo~NUuwf|SBR!1q77MYs5=kjtA zfPDTj_5oKikz=Rh&}a;CeqJDxX;Cbmv9eN*4KNbVK!3L_enY#R!U9i8%-;hJlLln7 t&0QqY5_=L460IO`^cP=VdiCi^e*npBiR8e*Fz23c?wv8Dm{q_6FbAY+4R4H&48!2N41+LgMm{1+m4R(w z%>@REz0M{XZVT0j_z`RDB?S9iQrTnaH9Sh?>i+=lM}tDCLiN4Q)qVAmCSiw3oyLGsYK1l zkHe-HAhhS+*f}O;Tg=Z)@w?6sT9~@`iO0uy7c5qCKy78tfVRKjSRF1Ny z9~@;$KN!TiJFW`p2pM{)<$O7C;OVFHGppbEoMid3p|_I7e$}=6rwk8S@(I65+|QPC ziHXlZc*E^aMWNP=bL%BaguYrn6#CwEhB4Zs-q3UMK~}kqAx7Dy0hbK!Y45T)n8VYx zH%=nO&#;}hW}D%OLfzu-b!SBTULA;NY52M+?x=u%F3&uJ16+Bh;z~LzegE^8TO3|= z#?b7x#FC0WpYW>|4{DhVmh~@)xDanTXIfRjpRb#eem~|s$5H!bAHy<5!~H*<-pc{~ O&fw|l=d#Wzp$PyVuYvLa literal 0 HcmV?d00001 diff --git a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/GuiUtils.java b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/GuiUtils.java index 91b55e5bf1..8288ee4abf 100644 --- a/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/GuiUtils.java +++ b/ImageGallery/src/org/sleuthkit/autopsy/imagegallery/gui/GuiUtils.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2015 Basis Technology Corp. + * Copyright 2015-2018 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,6 +27,7 @@ import javafx.scene.control.MenuItem; import javafx.scene.image.Image; import javafx.stage.Stage; import org.controlsfx.control.action.Action; +import org.controlsfx.control.action.ActionUtils; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.ThreadConfined; @@ -64,12 +65,11 @@ public final class GuiUtils { * @return */ public static MenuItem createAutoAssigningMenuItem(ButtonBase button, Action action) { - - MenuItem menuItem = new MenuItem(action.getText(), action.getGraphic()); + MenuItem menuItem = ActionUtils.createMenuItem(action); menuItem.setOnAction(actionEvent -> { action.handle(actionEvent); button.setText(action.getText()); - button.setGraphic(action.getGraphic()); + button.setGraphic(menuItem.getGraphic()); button.setOnAction(action); }); return menuItem; From fcf108198395ecc853029145f47f11e741a447ee Mon Sep 17 00:00:00 2001 From: millmanorama Date: Wed, 3 Oct 2018 22:11:37 +0200 Subject: [PATCH 5/5] cleanup DhsImageCategory for codacy --- .../autopsy/datamodel/DhsImageCategory.java | 50 ++++++++----------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java b/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java index 96251bba7e..50974519c7 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/DhsImageCategory.java @@ -19,10 +19,9 @@ package org.sleuthkit.autopsy.datamodel; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Maps; +import java.util.Arrays; import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; import javafx.scene.Node; import javafx.scene.image.Image; import javafx.scene.image.ImageView; @@ -32,7 +31,8 @@ import org.openide.util.NbBundle; /** * Enum to represent the six categories in the DHS image categorization scheme. */ -@NbBundle.Messages({"Category.one=CAT-1: Child Exploitation (Illegal)", +@NbBundle.Messages({ + "Category.one=CAT-1: Child Exploitation (Illegal)", "Category.two=CAT-2: Child Exploitation (Non-Illegal/Age Difficult)", "Category.three=CAT-3: CGI/Animation (Child Exploitive)", "Category.four=CAT-4: Exemplar/Comparison (Internal Use Only)", @@ -52,31 +52,9 @@ public enum DhsImageCategory { FIVE(Color.GREEN, 5, Bundle.Category_five(), "cat5.png"), ZERO(Color.LIGHTGREY, 0, Bundle.Category_zero(), "cat0.png"); - public static ImmutableList getNonZeroCategories() { - return nonZeroCategories; - } - - private static final ImmutableList nonZeroCategories - = ImmutableList.of(DhsImageCategory.FIVE, DhsImageCategory.FOUR, DhsImageCategory.THREE, DhsImageCategory.TWO, DhsImageCategory.ONE); - - /** - * map from displayName to enum value - */ + /** Map from displayName to enum value */ private static final Map nameMap - = Stream.of(values()).collect(Collectors.toMap(DhsImageCategory::getDisplayName, - Function.identity())); - - public static DhsImageCategory fromDisplayName(String displayName) { - return nameMap.get(displayName); - } - - public static boolean isCategoryName(String tName) { - return nameMap.containsKey(tName); - } - - public static boolean isNotCategoryName(String tName) { - return nameMap.containsKey(tName) == false; - } + = Maps.uniqueIndex(Arrays.asList(values()), DhsImageCategory::getDisplayName); private final Color color; private final String displayName; @@ -90,6 +68,22 @@ public enum DhsImageCategory { this.icon = new Image(getClass().getResourceAsStream("/org/sleuthkit/autopsy/images/" + filename)); } + public static ImmutableList getNonZeroCategories() { + return ImmutableList.of(FIVE, FOUR, THREE, TWO, ONE); + } + + public static DhsImageCategory fromDisplayName(String displayName) { + return nameMap.get(displayName); + } + + public static boolean isCategoryName(String tName) { + return nameMap.containsKey(tName); + } + + public static boolean isNotCategoryName(String tName) { + return nameMap.containsKey(tName) == false; + } + public int getCategoryNumber() { return id; }