Autopsy  4.21.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
TagsManager.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2013-2020 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.casemodule.services;
20 
21 import java.beans.PropertyChangeEvent;
22 import java.beans.PropertyChangeListener;
23 import java.io.Closeable;
24 import java.io.IOException;
25 import java.util.ArrayList;
26 import java.util.Collections;
27 import java.util.EnumSet;
28 import java.util.HashMap;
29 import java.util.HashSet;
30 import java.util.List;
31 import java.util.Map;
32 import java.util.Set;
33 import java.util.logging.Level;
34 import org.openide.util.NbBundle;
35 import org.openide.util.WeakListeners;
54 
59 public class TagsManager implements Closeable {
60 
61  private static final Logger LOGGER = Logger.getLogger(TagsManager.class.getName());
62  private final SleuthkitCase caseDb;
63 
64  // NOTE: This name is also hard coded in Image Gallery and Projet Vic module.
65  // They need to stay in sync
66  private static String PROJECT_VIC_TAG_SET_NAME = "Project VIC";
67 
68  private static final Object lock = new Object();
69 
70  private final Map<String, TagName> allTagNameMap = Collections.synchronizedMap(new HashMap<>());
71 
72  private final PropertyChangeListener listener = new PropertyChangeListener() {
73  @Override
74  public void propertyChange(PropertyChangeEvent evt) {
75  if (evt.getPropertyName().equals(Case.Events.TAG_NAMES_ADDED.name())
76  || evt.getPropertyName().equals(Case.Events.TAG_NAMES_UPDATED.name())) {
77  TagNamesEvent tagEvent = (TagNamesEvent) evt;
78  List<TagName> addTagNames = tagEvent.getTagNames();
79  for (TagName tag : addTagNames) {
80  allTagNameMap.put(tag.getDisplayName(), tag);
81  }
82  } else if (evt.getPropertyName().equals(Case.Events.TAG_NAMES_DELETED.name())) {
84  List<Long> deletedIds = tagEvent.getTagNameIds();
85  List<String> keysToRemove = new ArrayList<>();
86  for (TagName tagName : getAllTagNames()) {
87  if (deletedIds.contains(tagName.getId())) {
88  keysToRemove.add(tagName.getDisplayName());
89  }
90  }
91 
92  for (String key : keysToRemove) {
93  allTagNameMap.remove(key);
94  }
95  }
96  }
97  };
98 
99  private final PropertyChangeListener weakListener = WeakListeners.propertyChange(listener, null);
100 
101  static {
102 
103  //Create the contentviewer tags table if the current case does not
104  //have the table present
105  Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), evt -> {
106  if (evt.getNewValue() != null) {
107  Case currentCase = (Case) evt.getNewValue();
108  try {
111  return;
112  }
113 
114  if (currentCase.getSleuthkitCase().getDatabaseType().equals(DbType.SQLITE)) {
116  } else if (currentCase.getSleuthkitCase().getDatabaseType().equals(DbType.POSTGRESQL)) {
118  }
119  } catch (TskCoreException ex) {
120  LOGGER.log(Level.SEVERE,
121  String.format("Unable to create the %s table for image tag storage.",
123  }
124  }
125  });
126  }
127 
136  public static boolean containsIllegalCharacters(String tagDisplayName) {
137  return (tagDisplayName.contains("\\")
138  || tagDisplayName.contains(":")
139  || tagDisplayName.contains("*")
140  || tagDisplayName.contains("?")
141  || tagDisplayName.contains("\"")
142  || tagDisplayName.contains("<")
143  || tagDisplayName.contains(">")
144  || tagDisplayName.contains("|")
145  || tagDisplayName.contains(",")
146  || tagDisplayName.contains(";"));
147 
148  }
149 
150  @NbBundle.Messages({"TagsManager.notableTagEnding.text= (Notable)"})
156  public static String getNotableTagLabel() {
157  return Bundle.TagsManager_notableTagEnding_text();
158  }
159 
171  public static Set<String> getTagDisplayNames() throws TskCoreException {
172  Set<String> tagDisplayNames = new HashSet<>();
173  Set<TagNameDefinition> customNames = TagNameDefinition.getTagNameDefinitions();
174  customNames.forEach((tagType) -> {
175  tagDisplayNames.add(tagType.getDisplayName());
176  });
177  try {
179  for (TagName tagName : tagsManager.getAllTagNames()) {
180  tagDisplayNames.add(tagName.getDisplayName());
181  }
182  } catch (NoCurrentCaseException ignored) {
183  /*
184  * No current case, nothing more to add to the set.
185  */
186  }
187  return tagDisplayNames;
188  }
189 
197  public static List<String> getNotableTagDisplayNames() {
198  List<String> tagDisplayNames = new ArrayList<>();
199  for (TagNameDefinition tagDef : TagNameDefinition.getTagNameDefinitions()) {
200  if (tagDef.getTagType() == TskData.TagType.BAD) {
201  tagDisplayNames.add(tagDef.getDisplayName());
202  }
203  }
204 
205  try {
207  for (TagName tagName : tagsManager.getAllTagNames()) {
208  if (tagName.getTagType() == TskData.TagType.BAD
209  && !tagDisplayNames.contains(tagName.getDisplayName())) {
210  tagDisplayNames.add(tagName.getDisplayName());
211  }
212  }
213  } catch (NoCurrentCaseException ignored) {
214  /*
215  * No current case, nothing more to add to the set.
216  */
217  }
218  return tagDisplayNames;
219  }
220 
226  public static List<String> getStandardTagNames() {
227  List<String> tagList = new ArrayList<>();
228 
229  for (TagNameDefinition tagNameDef : TagNameDefinition.getStandardTagNameDefinitions()) {
230  tagList.add(tagNameDef.getDisplayName());
231  }
232 
233  try {
234  List<TagSet> tagSetList = Case.getCurrentCaseThrows().getSleuthkitCase().getTaggingManager().getTagSets();
235  for (TagSet tagSet : tagSetList) {
236  if (tagSet.getName().equals(PROJECT_VIC_TAG_SET_NAME)) {
237  for (TagName tagName : tagSet.getTagNames()) {
238  tagList.add(tagName.getDisplayName());
239  }
240  }
241  }
243  LOGGER.log(Level.SEVERE, "Failed to get Project VIC tags from the database.", ex);
244  }
245 
246  return tagList;
247  }
248 
254  public static String getBookmarkTagDisplayName() {
255  return TagNameDefinition.getBookmarkTagDisplayName();
256  }
257 
263  public static String getFollowUpTagDisplayName() {
264  return TagNameDefinition.getFollowUpTagDisplayName();
265  }
266 
272  public static String getNotableTagDisplayName() {
273  return TagNameDefinition.getNotableTagDisplayName();
274  }
275 
283  public static void addTagSetDefinition(TagSetDefinition tagSetDef) throws IOException {
284  synchronized (lock) {
285  TagSetDefinition.writeTagSetDefinition(tagSetDef);
286  }
287  }
288 
295  TagsManager(SleuthkitCase caseDb) {
296  this.caseDb = caseDb;
297 
298  // Add standard tags and any configured tag sets.
299  TaggingManager taggingMgr = caseDb.getTaggingManager();
300  try {
301  List<TagSet> tagSetsInCase = taggingMgr.getTagSets();
302  if (tagSetsInCase.isEmpty()) {
303 
304  // add the standard tag names
305  for (TagNameDefinition def : TagNameDefinition.getStandardTagNameDefinitions()) {
306  taggingMgr.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getTagType());
307  }
308 
309  //Assume new case and add all tag sets
310  for (TagSetDefinition setDef : TagSetDefinition.readTagSetDefinitions()) {
311  List<TagName> tagNamesInSet = new ArrayList<>();
312  for (TagNameDefinition tagNameDef : setDef.getTagNameDefinitions()) {
313  tagNamesInSet.add(taggingMgr.addOrUpdateTagName(tagNameDef.getDisplayName(), tagNameDef.getDescription(), tagNameDef.getColor(), tagNameDef.getTagType()));
314  }
315 
316  if (!tagNamesInSet.isEmpty()) {
317  taggingMgr.addTagSet(setDef.getName(), tagNamesInSet);
318  }
319  }
320  }
321 
322  for(TagName tagName: caseDb.getAllTagNames()) {
323  allTagNameMap.put(tagName.getDisplayName(), tagName);
324  }
325 
326  } catch (TskCoreException ex) {
327  LOGGER.log(Level.SEVERE, "Error updating standard tag name and tag set definitions", ex);
328  } catch (IOException ex) {
329  LOGGER.log(Level.SEVERE, "Error loading tag set JSON files", ex);
330  }
331 
332  for (TagNameDefinition tagName : TagNameDefinition.getTagNameDefinitions()) {
333  tagName.saveToCase(caseDb);
334  }
335 
336  Case.addEventTypeSubscriber(Collections.singleton(Case.Events.TAG_NAMES_UPDATED), weakListener);
337  Case.addEventTypeSubscriber(Collections.singleton(Case.Events.TAG_NAMES_ADDED), weakListener);
338  Case.addEventTypeSubscriber(Collections.singleton(Case.Events.TAG_NAMES_DELETED), weakListener);
339  }
340 
348  public List<TagSet> getAllTagSets() throws TskCoreException {
349  return caseDb.getTaggingManager().getTagSets();
350  }
351 
361  public TagSet getTagSet(TagName tagName) throws TskCoreException {
362  return caseDb.getTaggingManager().getTagSet(tagName);
363  }
364 
376  public TagSet addTagSet(String name, List<TagName> tagNameList) throws TskCoreException {
377  return caseDb.getTaggingManager().addTagSet(name, tagNameList);
378  }
379 
385  public synchronized List<TagName> getAllTagNames() {
386 
387  List<TagName> tagNames = new ArrayList<>();
388  tagNames.addAll(allTagNameMap.values());
389  return tagNames;
390  }
391 
400  public List<TagName> getTagNamesInUse() throws TskCoreException {
401  return caseDb.getTagNamesInUse();
402  }
403 
414  public List<TagName> getTagNamesInUseForUser(String userName) throws TskCoreException {
415  Set<TagName> tagNameSet = new HashSet<>();
416  List<BlackboardArtifactTag> artifactTags = caseDb.getAllBlackboardArtifactTags();
417  for (BlackboardArtifactTag tag : artifactTags) {
418  if (tag.getUserName().equals(userName)) {
419  tagNameSet.add(tag.getName());
420  }
421  }
422  List<ContentTag> contentTags = caseDb.getAllContentTags();
423  for (ContentTag tag : contentTags) {
424  if (tag.getUserName().equals(userName)) {
425  tagNameSet.add(tag.getName());
426  }
427  }
428  return new ArrayList<>(tagNameSet);
429  }
430 
443  public List<TagName> getTagNamesInUse(long dsObjId) throws TskCoreException {
444  return caseDb.getTagNamesInUse(dsObjId);
445  }
446 
461  public List<TagName> getTagNamesInUseForUser(long dsObjId, String userName) throws TskCoreException {
462  Set<TagName> tagNameSet = new HashSet<>();
463  List<BlackboardArtifactTag> artifactTags = caseDb.getAllBlackboardArtifactTags();
464  for (BlackboardArtifactTag tag : artifactTags) {
465  if (tag.getUserName().equals(userName) && tag.getArtifact().getDataSource().getId() == dsObjId) {
466  tagNameSet.add(tag.getName());
467  }
468  }
469  List<ContentTag> contentTags = caseDb.getAllContentTags();
470  for (ContentTag tag : contentTags) {
471  if (tag.getUserName().equals(userName) && tag.getContent().getDataSource().getId() == dsObjId) {
472  tagNameSet.add(tag.getName());
473  }
474  }
475  return new ArrayList<>(tagNameSet);
476  }
477 
485  public Map<String, TagName> getDisplayNamesToTagNamesMap() throws TskCoreException {
486  Map<String, TagName> tagNames = new HashMap<>();
487  for (TagName tagName : getAllTagNames()) {
488  tagNames.put(tagName.getDisplayName(), tagName);
489  }
490  return tagNames;
491  }
492 
508  return addTagName(displayName, "", TagName.HTML_COLOR.NONE, TskData.TagType.SUSPICIOUS);
509  }
510 
526  public TagName addTagName(String displayName, String description) throws TagNameAlreadyExistsException, TskCoreException {
527  return addTagName(displayName, description, TagName.HTML_COLOR.NONE, TskData.TagType.SUSPICIOUS);
528  }
529 
545  public TagName addTagName(String displayName, String description, TagName.HTML_COLOR color) throws TagNameAlreadyExistsException, TskCoreException {
546  return addTagName(displayName, description, color, TskData.TagType.SUSPICIOUS);
547  }
548 
560  @Deprecated
561  public TagName addTagName(String displayName, String description, TagName.HTML_COLOR color, TskData.FileKnown knownStatus) throws TagNameAlreadyExistsException, TskCoreException {
562  return addTagName(displayName, description, color, TskData.TagType.convertFileKnownToTagType(knownStatus));
563  }
564 
582  public TagName addTagName(String displayName, String description, TagName.HTML_COLOR color, TskData.TagType tagType) throws TagNameAlreadyExistsException, TskCoreException {
583  synchronized (lock) {
584  try {
585  TagName tagName = caseDb.getTaggingManager().addOrUpdateTagName(displayName, description, color, tagType);
586  Set<TagNameDefinition> customTypes = TagNameDefinition.getTagNameDefinitions();
587  customTypes.add(new TagNameDefinition(displayName, description, color, tagType));
588  TagNameDefinition.setTagNameDefinitions(customTypes);
589  return tagName;
590  } catch (TskCoreException ex) {
591  List<TagName> existingTagNames = getAllTagNames();
592  for (TagName tagName : existingTagNames) {
593  if (tagName.getDisplayName().equals(displayName)) {
594  throw new TagNameAlreadyExistsException();
595  }
596  }
597  throw ex;
598  }
599  }
600  }
601 
615  public ContentTag addContentTag(Content content, TagName tagName) throws TskCoreException {
616  return addContentTag(content, tagName, "", -1, -1);
617  }
618 
633  public ContentTag addContentTag(Content content, TagName tagName, String comment) throws TskCoreException {
634  return addContentTag(content, tagName, comment, -1, -1);
635  }
636 
653  public ContentTag addContentTag(Content content, TagName tagName, String comment, long beginByteOffset, long endByteOffset) throws TskCoreException {
654  TaggingManager.ContentTagChange tagChange = caseDb.getTaggingManager().addContentTag(content, tagName, comment, beginByteOffset, endByteOffset);
655  try {
656  Case currentCase = Case.getCurrentCaseThrows();
657 
658  currentCase.notifyContentTagAdded(tagChange.getAddedTag(), tagChange.getRemovedTags().isEmpty() ? null : tagChange.getRemovedTags());
659 
660  } catch (NoCurrentCaseException ex) {
661  throw new TskCoreException("Added a tag to a closed case", ex);
662  }
663  return tagChange.getAddedTag();
664  }
665 
674  public void deleteContentTag(ContentTag tag) throws TskCoreException {
675  caseDb.deleteContentTag(tag);
676  try {
678  } catch (NoCurrentCaseException ex) {
679  throw new TskCoreException("Deleted a tag from a closed case", ex);
680  }
681  }
682 
691  public List<ContentTag> getAllContentTags() throws TskCoreException {
692  return caseDb.getAllContentTags();
693  }
694 
708  return caseDb.getContentTagsCountByTagName(tagName);
709  }
710 
725  public long getContentTagsCountByTagNameForUser(TagName tagName, String userName) throws TskCoreException {
726  long count = 0;
727  List<ContentTag> contentTags = getContentTagsByTagName(tagName);
728  for (ContentTag tag : contentTags) {
729  if (userName.equals(tag.getUserName())) {
730  count++;
731  }
732  }
733  return count;
734  }
735 
751  public long getContentTagsCountByTagName(TagName tagName, long dsObjId) throws TskCoreException {
752  return caseDb.getContentTagsCountByTagName(tagName, dsObjId);
753  }
754 
771  public long getContentTagsCountByTagNameForUser(TagName tagName, long dsObjId, String userName) throws TskCoreException {
772  long count = 0;
773  List<ContentTag> contentTags = getContentTagsByTagName(tagName, dsObjId);
774  for (ContentTag tag : contentTags) {
775  if (userName.equals(tag.getUserName())) {
776  count++;
777  }
778  }
779  return count;
780  }
781 
793  return caseDb.getContentTagByID(tagId);
794  }
795 
807  public List<ContentTag> getContentTagsByTagName(TagName tagName) throws TskCoreException {
808  return caseDb.getContentTagsByTagName(tagName);
809  }
810 
824  public List<ContentTag> getContentTagsByTagName(TagName tagName, long dsObjId) throws TskCoreException {
825  return caseDb.getContentTagsByTagName(tagName, dsObjId);
826  }
827 
839  public List<ContentTag> getContentTagsByContent(Content content) throws TskCoreException {
840  return caseDb.getContentTagsByContent(content);
841  }
842 
857  return addBlackboardArtifactTag(artifact, tagName, "");
858  }
859 
875  TaggingManager.BlackboardArtifactTagChange tagChange = caseDb.getTaggingManager().addArtifactTag(artifact, tagName, comment);
876  try {
877  Case currentCase = Case.getCurrentCaseThrows();
878  currentCase.notifyBlackBoardArtifactTagAdded(tagChange.getAddedTag(), tagChange.getRemovedTags().isEmpty() ? null : tagChange.getRemovedTags());
879  } catch (NoCurrentCaseException ex) {
880  throw new TskCoreException("Added a tag to a closed case", ex);
881  }
882  return tagChange.getAddedTag();
883  }
884 
894  caseDb.deleteBlackboardArtifactTag(tag);
895  try {
897  } catch (NoCurrentCaseException ex) {
898  throw new TskCoreException("Deleted a tag from a closed case", ex);
899  }
900  }
901 
910  public List<BlackboardArtifactTag> getAllBlackboardArtifactTags() throws TskCoreException {
911  return caseDb.getAllBlackboardArtifactTags();
912  }
913 
927  return caseDb.getBlackboardArtifactTagsCountByTagName(tagName);
928  }
929 
944  public long getBlackboardArtifactTagsCountByTagNameForUser(TagName tagName, String userName) throws TskCoreException {
945  long count = 0;
946  List<BlackboardArtifactTag> artifactTags = getBlackboardArtifactTagsByTagName(tagName);
947  for (BlackboardArtifactTag tag : artifactTags) {
948  if (userName.equals(tag.getUserName())) {
949  count++;
950  }
951  }
952  return count;
953  }
954 
969  public long getBlackboardArtifactTagsCountByTagName(TagName tagName, long dsObjId) throws TskCoreException {
970  return caseDb.getBlackboardArtifactTagsCountByTagName(tagName, dsObjId);
971  }
972 
989  public long getBlackboardArtifactTagsCountByTagNameForUser(TagName tagName, long dsObjId, String userName) throws TskCoreException {
990  long count = 0;
991  List<BlackboardArtifactTag> artifactTags = getBlackboardArtifactTagsByTagName(tagName, dsObjId);
992  for (BlackboardArtifactTag tag : artifactTags) {
993  if (userName.equals(tag.getUserName())) {
994  count++;
995  }
996  }
997  return count;
998  }
999 
1011  return caseDb.getBlackboardArtifactTagByID(tagId);
1012  }
1013 
1027  public List<BlackboardArtifactTag> getBlackboardArtifactTagsByTagName(TagName tagName) throws TskCoreException {
1028  return caseDb.getBlackboardArtifactTagsByTagName(tagName);
1029  }
1030 
1045  public List<BlackboardArtifactTag> getBlackboardArtifactTagsByTagName(TagName tagName, long dsObjId) throws TskCoreException {
1046  return caseDb.getBlackboardArtifactTagsByTagName(tagName, dsObjId);
1047  }
1048 
1060  public List<BlackboardArtifactTag> getBlackboardArtifactTagsByArtifact(BlackboardArtifact artifact) throws TskCoreException {
1061  return caseDb.getBlackboardArtifactTagsByArtifact(artifact);
1062  }
1063 
1067  public static class TagNameAlreadyExistsException extends Exception {
1068 
1069  private static final long serialVersionUID = 1L;
1070  }
1071 
1082  @Deprecated
1083  public boolean tagNameExists(String tagDisplayName) {
1084  try {
1085  Map<String, TagName> tagNames = getDisplayNamesToTagNamesMap();
1086  return tagNames.containsKey(tagDisplayName) && (tagNames.get(tagDisplayName) != null);
1087  } catch (TskCoreException ex) {
1088  LOGGER.log(Level.SEVERE, "Error querying case database for tag names", ex);
1089  return false;
1090  }
1091  }
1092 
1099  @Deprecated
1100  @Override
1101  public void close() throws IOException {
1102  }
1103 }
void notifyContentTagDeleted(ContentTag deletedTag)
Definition: Case.java:1849
TagName addOrUpdateTagName(String displayName, String description, TagName.HTML_COLOR color, TskData.FileKnown knownStatus)
long getBlackboardArtifactTagsCountByTagName(TagName tagName)
void notifyBlackBoardArtifactTagDeleted(BlackboardArtifactTag deletedTag)
Definition: Case.java:1914
static void addTagSetDefinition(TagSetDefinition tagSetDef)
BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, TagName tagName, String comment)
synchronized CaseDbAccessManager getCaseDbAccessManager()
List< TagName > getTagNamesInUseForUser(String userName)
long getContentTagsCountByTagName(TagName tagName, long dsObjId)
BlackboardArtifactTag getBlackboardArtifactTagByID(long artifactTagID)
List< BlackboardArtifactTag > getBlackboardArtifactTagsByArtifact(BlackboardArtifact artifact)
List< ContentTag > getContentTagsByContent(Content content)
BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName)
List< BlackboardArtifactTag > getBlackboardArtifactTagsByTagName(TagName tagName, long dsObjId)
TagName addTagName(String displayName, String description, TagName.HTML_COLOR color, TskData.FileKnown knownStatus)
ContentTag getContentTagByID(long contentTagID)
long getContentTagsCountByTagNameForUser(TagName tagName, long dsObjId, String userName)
TagName addTagName(String displayName, String description)
static boolean containsIllegalCharacters(String tagDisplayName)
synchronized TaggingManager getTaggingManager()
List< ContentTag > getContentTagsByTagName(TagName tagName, long dsObjId)
long getBlackboardArtifactTagsCountByTagNameForUser(TagName tagName, long dsObjId, String userName)
ContentTag addContentTag(Content content, TagName tagName)
void deleteBlackboardArtifactTag(BlackboardArtifactTag tag)
BlackboardArtifactTag getBlackboardArtifactTagByTagID(long tagId)
ContentTag addContentTag(Content content, TagName tagName, String comment, long beginByteOffset, long endByteOffset)
TagName addTagName(String displayName, String description, TagName.HTML_COLOR color, TskData.TagType tagType)
List< BlackboardArtifactTag > getAllBlackboardArtifactTags()
TagSet addTagSet(String name, List< TagName > tagNameList)
void deleteBlackboardArtifactTag(BlackboardArtifactTag tag)
List< ContentTag > getContentTagsByTagName(TagName tagName)
void createTable(final String tableName, final String tableSchema)
List< BlackboardArtifactTag > getBlackboardArtifactTagsByTagName(TagName tagName)
void notifyBlackBoardArtifactTagAdded(BlackboardArtifactTag newTag)
Definition: Case.java:1890
List< BlackboardArtifactTag > getAllBlackboardArtifactTags()
List< BlackboardArtifactTag > getBlackboardArtifactTagsByTagName(TagName tagName)
ContentTagChange addContentTag(Content content, TagName tagName, String comment, long beginByteOffset, long endByteOffset)
long getContentTagsCountByTagName(TagName tagName)
List< TagName > getTagNamesInUseForUser(long dsObjId, String userName)
long getBlackboardArtifactTagsCountByTagName(TagName tagName, long dsObjId)
synchronized static Logger getLogger(String name)
Definition: Logger.java:124
TagName addTagName(String displayName, String description, TagName.HTML_COLOR color)
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
Definition: Case.java:712
List< ContentTag > getContentTagsByContent(Content content)
void notifyContentTagAdded(ContentTag newTag)
Definition: Case.java:1825
List< ContentTag > getContentTagsByTagName(TagName tagName)
static TagType convertFileKnownToTagType(FileKnown fileKnown)
long getContentTagsCountByTagNameForUser(TagName tagName, String userName)
long getBlackboardArtifactTagsCountByTagNameForUser(TagName tagName, String userName)
TagSet addTagSet(String name, List< TagName > tagNames)
ContentTag addContentTag(Content content, TagName tagName, String comment)
BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName, String comment)
List< BlackboardArtifactTag > getBlackboardArtifactTagsByArtifact(BlackboardArtifact artifact)

Copyright © 2012-2024 Sleuth Kit Labs. Generated on: Mon Mar 17 2025
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.