Autopsy  4.19.3
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;
42 import org.sleuthkit.datamodel.BlackboardArtifact;
43 import org.sleuthkit.datamodel.BlackboardArtifactTag;
44 import org.sleuthkit.datamodel.CaseDbAccessManager;
45 import org.sleuthkit.datamodel.Content;
46 import org.sleuthkit.datamodel.ContentTag;
47 import org.sleuthkit.datamodel.SleuthkitCase;
48 import org.sleuthkit.datamodel.TagName;
49 import org.sleuthkit.datamodel.TagSet;
50 import org.sleuthkit.datamodel.TaggingManager;
51 import org.sleuthkit.datamodel.TskCoreException;
52 import org.sleuthkit.datamodel.TskData;
53 import org.sleuthkit.datamodel.TskData.DbType;
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 {
109  CaseDbAccessManager caseDb = currentCase.getSleuthkitCase().getCaseDbAccessManager();
110  if (caseDb.tableExists(ContentViewerTagManager.TABLE_NAME)) {
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.getKnownStatus() == TskData.FileKnown.BAD) {
201  tagDisplayNames.add(tagDef.getDisplayName());
202  }
203  }
204 
205  try {
207  for (TagName tagName : tagsManager.getAllTagNames()) {
208  if (tagName.getKnownStatus() == TskData.FileKnown.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  }
242  } catch (NoCurrentCaseException | TskCoreException ex) {
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.getKnownStatus());
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.getKnownStatus()));
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 
507  public TagName addTagName(String displayName) throws TagNameAlreadyExistsException, TskCoreException {
508  return addTagName(displayName, "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN);
509  }
510 
526  public TagName addTagName(String displayName, String description) throws TagNameAlreadyExistsException, TskCoreException {
527  return addTagName(displayName, description, TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN);
528  }
529 
545  public TagName addTagName(String displayName, String description, TagName.HTML_COLOR color) throws TagNameAlreadyExistsException, TskCoreException {
546  return addTagName(displayName, description, color, TskData.FileKnown.UNKNOWN);
547  }
548 
566  public TagName addTagName(String displayName, String description, TagName.HTML_COLOR color, TskData.FileKnown knownStatus) throws TagNameAlreadyExistsException, TskCoreException {
567  synchronized (lock) {
568  try {
569  TagName tagName = caseDb.getTaggingManager().addOrUpdateTagName(displayName, description, color, knownStatus);
570  Set<TagNameDefinition> customTypes = TagNameDefinition.getTagNameDefinitions();
571  customTypes.add(new TagNameDefinition(displayName, description, color, knownStatus));
572  TagNameDefinition.setTagNameDefinitions(customTypes);
573  return tagName;
574  } catch (TskCoreException ex) {
575  List<TagName> existingTagNames = getAllTagNames();
576  for (TagName tagName : existingTagNames) {
577  if (tagName.getDisplayName().equals(displayName)) {
578  throw new TagNameAlreadyExistsException();
579  }
580  }
581  throw ex;
582  }
583  }
584  }
585 
599  public ContentTag addContentTag(Content content, TagName tagName) throws TskCoreException {
600  return addContentTag(content, tagName, "", -1, -1);
601  }
602 
617  public ContentTag addContentTag(Content content, TagName tagName, String comment) throws TskCoreException {
618  return addContentTag(content, tagName, comment, -1, -1);
619  }
620 
637  public ContentTag addContentTag(Content content, TagName tagName, String comment, long beginByteOffset, long endByteOffset) throws TskCoreException {
638  TaggingManager.ContentTagChange tagChange = caseDb.getTaggingManager().addContentTag(content, tagName, comment, beginByteOffset, endByteOffset);
639  try {
640  Case currentCase = Case.getCurrentCaseThrows();
641 
642  currentCase.notifyContentTagAdded(tagChange.getAddedTag(), tagChange.getRemovedTags().isEmpty() ? null : tagChange.getRemovedTags());
643 
644  } catch (NoCurrentCaseException ex) {
645  throw new TskCoreException("Added a tag to a closed case", ex);
646  }
647  return tagChange.getAddedTag();
648  }
649 
658  public void deleteContentTag(ContentTag tag) throws TskCoreException {
659  caseDb.deleteContentTag(tag);
660  try {
662  } catch (NoCurrentCaseException ex) {
663  throw new TskCoreException("Deleted a tag from a closed case", ex);
664  }
665  }
666 
675  public List<ContentTag> getAllContentTags() throws TskCoreException {
676  return caseDb.getAllContentTags();
677  }
678 
691  public long getContentTagsCountByTagName(TagName tagName) throws TskCoreException {
692  return caseDb.getContentTagsCountByTagName(tagName);
693  }
694 
709  public long getContentTagsCountByTagNameForUser(TagName tagName, String userName) throws TskCoreException {
710  long count = 0;
711  List<ContentTag> contentTags = getContentTagsByTagName(tagName);
712  for (ContentTag tag : contentTags) {
713  if (userName.equals(tag.getUserName())) {
714  count++;
715  }
716  }
717  return count;
718  }
719 
735  public long getContentTagsCountByTagName(TagName tagName, long dsObjId) throws TskCoreException {
736  return caseDb.getContentTagsCountByTagName(tagName, dsObjId);
737  }
738 
755  public long getContentTagsCountByTagNameForUser(TagName tagName, long dsObjId, String userName) throws TskCoreException {
756  long count = 0;
757  List<ContentTag> contentTags = getContentTagsByTagName(tagName, dsObjId);
758  for (ContentTag tag : contentTags) {
759  if (userName.equals(tag.getUserName())) {
760  count++;
761  }
762  }
763  return count;
764  }
765 
776  public ContentTag getContentTagByTagID(long tagId) throws TskCoreException {
777  return caseDb.getContentTagByID(tagId);
778  }
779 
791  public List<ContentTag> getContentTagsByTagName(TagName tagName) throws TskCoreException {
792  return caseDb.getContentTagsByTagName(tagName);
793  }
794 
808  public List<ContentTag> getContentTagsByTagName(TagName tagName, long dsObjId) throws TskCoreException {
809  return caseDb.getContentTagsByTagName(tagName, dsObjId);
810  }
811 
823  public List<ContentTag> getContentTagsByContent(Content content) throws TskCoreException {
824  return caseDb.getContentTagsByContent(content);
825  }
826 
840  public BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName) throws TskCoreException {
841  return addBlackboardArtifactTag(artifact, tagName, "");
842  }
843 
858  public BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName, String comment) throws TskCoreException {
859  TaggingManager.BlackboardArtifactTagChange tagChange = caseDb.getTaggingManager().addArtifactTag(artifact, tagName, comment);
860  try {
861  Case currentCase = Case.getCurrentCaseThrows();
862  currentCase.notifyBlackBoardArtifactTagAdded(tagChange.getAddedTag(), tagChange.getRemovedTags().isEmpty() ? null : tagChange.getRemovedTags());
863  } catch (NoCurrentCaseException ex) {
864  throw new TskCoreException("Added a tag to a closed case", ex);
865  }
866  return tagChange.getAddedTag();
867  }
868 
877  public void deleteBlackboardArtifactTag(BlackboardArtifactTag tag) throws TskCoreException {
878  caseDb.deleteBlackboardArtifactTag(tag);
879  try {
881  } catch (NoCurrentCaseException ex) {
882  throw new TskCoreException("Deleted a tag from a closed case", ex);
883  }
884  }
885 
894  public List<BlackboardArtifactTag> getAllBlackboardArtifactTags() throws TskCoreException {
895  return caseDb.getAllBlackboardArtifactTags();
896  }
897 
910  public long getBlackboardArtifactTagsCountByTagName(TagName tagName) throws TskCoreException {
911  return caseDb.getBlackboardArtifactTagsCountByTagName(tagName);
912  }
913 
928  public long getBlackboardArtifactTagsCountByTagNameForUser(TagName tagName, String userName) throws TskCoreException {
929  long count = 0;
930  List<BlackboardArtifactTag> artifactTags = getBlackboardArtifactTagsByTagName(tagName);
931  for (BlackboardArtifactTag tag : artifactTags) {
932  if (userName.equals(tag.getUserName())) {
933  count++;
934  }
935  }
936  return count;
937  }
938 
953  public long getBlackboardArtifactTagsCountByTagName(TagName tagName, long dsObjId) throws TskCoreException {
954  return caseDb.getBlackboardArtifactTagsCountByTagName(tagName, dsObjId);
955  }
956 
973  public long getBlackboardArtifactTagsCountByTagNameForUser(TagName tagName, long dsObjId, String userName) throws TskCoreException {
974  long count = 0;
975  List<BlackboardArtifactTag> artifactTags = getBlackboardArtifactTagsByTagName(tagName, dsObjId);
976  for (BlackboardArtifactTag tag : artifactTags) {
977  if (userName.equals(tag.getUserName())) {
978  count++;
979  }
980  }
981  return count;
982  }
983 
994  public BlackboardArtifactTag getBlackboardArtifactTagByTagID(long tagId) throws TskCoreException {
995  return caseDb.getBlackboardArtifactTagByID(tagId);
996  }
997 
1011  public List<BlackboardArtifactTag> getBlackboardArtifactTagsByTagName(TagName tagName) throws TskCoreException {
1012  return caseDb.getBlackboardArtifactTagsByTagName(tagName);
1013  }
1014 
1029  public List<BlackboardArtifactTag> getBlackboardArtifactTagsByTagName(TagName tagName, long dsObjId) throws TskCoreException {
1030  return caseDb.getBlackboardArtifactTagsByTagName(tagName, dsObjId);
1031  }
1032 
1044  public List<BlackboardArtifactTag> getBlackboardArtifactTagsByArtifact(BlackboardArtifact artifact) throws TskCoreException {
1045  return caseDb.getBlackboardArtifactTagsByArtifact(artifact);
1046  }
1047 
1051  public static class TagNameAlreadyExistsException extends Exception {
1052 
1053  private static final long serialVersionUID = 1L;
1054  }
1055 
1066  @Deprecated
1067  public boolean tagNameExists(String tagDisplayName) {
1068  try {
1069  Map<String, TagName> tagNames = getDisplayNamesToTagNamesMap();
1070  return tagNames.containsKey(tagDisplayName) && (tagNames.get(tagDisplayName) != null);
1071  } catch (TskCoreException ex) {
1072  LOGGER.log(Level.SEVERE, "Error querying case database for tag names", ex);
1073  return false;
1074  }
1075  }
1076 
1083  @Deprecated
1084  @Override
1085  public void close() throws IOException {
1086  }
1087 }
void notifyContentTagDeleted(ContentTag deletedTag)
Definition: Case.java:1846
void notifyBlackBoardArtifactTagDeleted(BlackboardArtifactTag deletedTag)
Definition: Case.java:1911
static void addTagSetDefinition(TagSetDefinition tagSetDef)
List< TagName > getTagNamesInUseForUser(String userName)
long getContentTagsCountByTagName(TagName tagName, long dsObjId)
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)
long getContentTagsCountByTagNameForUser(TagName tagName, long dsObjId, String userName)
TagName addTagName(String displayName, String description)
static boolean containsIllegalCharacters(String tagDisplayName)
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)
List< BlackboardArtifactTag > getAllBlackboardArtifactTags()
TagSet addTagSet(String name, List< TagName > tagNameList)
void notifyBlackBoardArtifactTagAdded(BlackboardArtifactTag newTag)
Definition: Case.java:1887
List< BlackboardArtifactTag > getBlackboardArtifactTagsByTagName(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:711
void notifyContentTagAdded(ContentTag newTag)
Definition: Case.java:1822
List< ContentTag > getContentTagsByTagName(TagName tagName)
long getContentTagsCountByTagNameForUser(TagName tagName, String userName)
long getBlackboardArtifactTagsCountByTagNameForUser(TagName tagName, String userName)
ContentTag addContentTag(Content content, TagName tagName, String comment)
BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName, String comment)
List< BlackboardArtifactTag > getBlackboardArtifactTagsByArtifact(BlackboardArtifact artifact)

Copyright © 2012-2022 Basis Technology. Generated on: Sat Sep 24 2022
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.