19 package org.sleuthkit.autopsy.datamodel;
21 import com.google.common.cache.Cache;
22 import com.google.common.cache.CacheBuilder;
23 import java.beans.PropertyChangeEvent;
24 import java.beans.PropertyChangeListener;
25 import java.lang.ref.WeakReference;
26 import java.text.MessageFormat;
27 import java.util.ArrayList;
28 import java.util.Arrays;
29 import java.util.EnumSet;
30 import java.util.LinkedHashMap;
31 import java.util.List;
33 import java.util.MissingResourceException;
35 import java.util.concurrent.ExecutionException;
36 import java.util.concurrent.TimeUnit;
37 import java.util.logging.Level;
38 import java.util.stream.Collectors;
39 import javax.swing.Action;
40 import org.apache.commons.lang3.StringUtils;
41 import org.apache.commons.lang3.tuple.Pair;
42 import org.openide.nodes.Sheet;
43 import org.openide.util.Lookup;
44 import org.openide.util.NbBundle;
45 import org.openide.util.WeakListeners;
46 import org.openide.util.lookup.Lookups;
71 import org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
73 import org.
sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE;
97 private static final Cache<Long, Content>
contentCache = CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.MINUTES).build();
116 BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID(),
117 BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID(),
118 BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID(),
119 BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID()
127 BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID()
141 private final PropertyChangeListener
listener =
new PropertyChangeListener() {
143 public void propertyChange(PropertyChangeEvent evt) {
144 String eventType = evt.getPropertyName();
147 if (event.getAddedTag().getArtifact().equals(artifact)) {
152 if (event.getDeletedTagInfo().getArtifactID() == artifact.getArtifactID()) {
157 if (event.getAddedTag().getContent().equals(srcContent)) {
162 if (event.getDeletedTagInfo().getContentID() == srcContent.getId()) {
167 if (event.getContentID() == srcContent.getId()) {
171 if (evt.getNewValue() == null) {
176 contentCache.invalidateAll();
179 SCOData scoData = (SCOData) evt.getNewValue();
180 if (scoData.getScoreAndDescription() != null) {
182 Bundle.BlackboardArtifactNode_createSheet_score_name(),
183 Bundle.BlackboardArtifactNode_createSheet_score_displayName(),
184 scoData.getScoreAndDescription().getRight(),
185 scoData.getScoreAndDescription().getLeft()));
187 if (scoData.getComment() != null) {
189 Bundle.BlackboardArtifactNode_createSheet_comment_name(),
190 Bundle.BlackboardArtifactNode_createSheet_comment_displayName(),
193 if (scoData.getCountAndDescription() != null) {
195 Bundle.BlackboardArtifactNode_createSheet_count_name(),
196 Bundle.BlackboardArtifactNode_createSheet_count_displayName(),
197 scoData.getCountAndDescription().getRight(),
198 scoData.getCountAndDescription().getLeft()));
207 String originalName = evt.getOldValue().toString();
208 translatedSourceName = evt.getNewValue().toString();
209 setDisplayName(translatedSourceName);
210 setShortDescription(originalName);
212 Bundle.BlackboardArtifactNode_createSheet_srcFile_origName(),
213 Bundle.BlackboardArtifactNode_createSheet_srcFile_origDisplayName(),
227 private final PropertyChangeListener
weakListener = WeakListeners.propertyChange(listener, null);
239 for (Content lookupContent : this.getLookup().lookupAll(Content.class)) {
240 if ((lookupContent != null) && (!(lookupContent instanceof BlackboardArtifact))) {
241 srcContent = lookupContent;
249 srcContent.getUniquePath();
250 }
catch (TskCoreException ex) {
251 logger.log(Level.WARNING, MessageFormat.format(
"Error getting the unique path of the source content (artifact objID={0})", artifact.getId()), ex);
256 if (srcContent == null) {
257 throw new IllegalArgumentException(MessageFormat.format(
"Artifact missing source content (artifact objID={0})", artifact));
259 setName(Long.toString(artifact.getArtifactID()));
260 String displayName = srcContent.getName();
261 setDisplayName(displayName);
262 setShortDescription(displayName);
263 setIconBaseWithExtension(iconPath);
286 final long objectID = artifact.getObjectID();
288 Content content = contentCache.get(objectID, () -> artifact.getSleuthkitCase().getContentById(objectID));
289 if (content == null) {
290 return Lookups.fixed(artifact);
292 return Lookups.fixed(artifact, content);
294 }
catch (ExecutionException ex) {
295 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting source content (artifact objID={0}", artifact.getId()), ex);
296 return Lookups.fixed(artifact);
333 List<Action> actionsList =
new ArrayList<>();
334 actionsList.addAll(Arrays.asList(super.getActions(context)));
344 }
catch (TskCoreException ex) {
345 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting artifact timestamp (artifact objID={0})", artifact.getId()), ex);
354 AbstractFile linkedFile = findLinked(artifact);
355 if (linkedFile != null) {
358 }
catch (TskCoreException ex) {
359 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting linked file of artifact (artifact objID={0})", artifact.getId()), ex);
367 AbstractFile file = getLookup().lookup(AbstractFile.class
373 return actionsList.toArray(
new Action[actionsList.size()]);
383 return srcContent.getName();
387 "BlackboardArtifactNode.createSheet.srcFile.name=Source File",
388 "BlackboardArtifactNode.createSheet.srcFile.displayName=Source File",
389 "BlackboardArtifactNode.createSheet.srcFile.origName=Original Name",
390 "BlackboardArtifactNode.createSheet.srcFile.origDisplayName=Original Name",
391 "BlackboardArtifactNode.createSheet.artifactType.displayName=Result Type",
392 "BlackboardArtifactNode.createSheet.artifactType.name=Result Type",
393 "BlackboardArtifactNode.createSheet.artifactDetails.displayName=Result Details",
394 "BlackboardArtifactNode.createSheet.artifactDetails.name=Result Details",
395 "BlackboardArtifactNode.createSheet.artifactMD5.displayName=MD5 Hash",
396 "BlackboardArtifactNode.createSheet.artifactMD5.name=MD5 Hash",
397 "BlackboardArtifactNode.createSheet.fileSize.name=Size",
398 "BlackboardArtifactNode.createSheet.fileSize.displayName=Size",
399 "BlackboardArtifactNode.createSheet.path.displayName=Path",
400 "BlackboardArtifactNode.createSheet.path.name=Path"
407 Sheet sheet = super.createSheet();
408 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
409 if (sheetSet == null) {
410 sheetSet = Sheet.createPropertiesSet();
421 Bundle.BlackboardArtifactNode_createSheet_srcFile_name(),
422 Bundle.BlackboardArtifactNode_createSheet_srcFile_displayName(),
433 Bundle.BlackboardArtifactNode_createSheet_srcFile_origName(),
434 Bundle.BlackboardArtifactNode_createSheet_srcFile_origDisplayName(),
436 translatedSourceName != null ? srcContent.getName() :
""));
437 if (translatedSourceName == null) {
454 Bundle.BlackboardArtifactNode_createSheet_score_name(),
455 Bundle.BlackboardArtifactNode_createSheet_score_displayName(),
459 Bundle.BlackboardArtifactNode_createSheet_comment_name(),
460 Bundle.BlackboardArtifactNode_createSheet_comment_displayName(),
465 Bundle.BlackboardArtifactNode_createSheet_count_name(),
466 Bundle.BlackboardArtifactNode_createSheet_count_displayName(),
470 backgroundTasksPool.submit(
new GetSCOTask(
new WeakReference<>(
this), weakListener));
478 if (artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID()) {
480 BlackboardAttribute attribute = artifact.getAttribute(
new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT));
481 if (attribute != null) {
484 NbBundle.getMessage(
BlackboardArtifactNode.class,
"BlackboardArtifactNode.createSheet.artifactType.name"),
485 NbBundle.getMessage(
BlackboardArtifactNode.class,
"BlackboardArtifactNode.createSheet.artifactType.displayName"),
487 associatedArtifact.getDisplayName()));
489 NbBundle.getMessage(
BlackboardArtifactNode.class,
"BlackboardArtifactNode.createSheet.artifactDetails.name"),
490 NbBundle.getMessage(
BlackboardArtifactNode.class,
"BlackboardArtifactNode.createSheet.artifactDetails.displayName"),
492 associatedArtifact.getShortDescription()));
495 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting associated artifact of TSK_INTERESTING_ARTIFACT_HIT artifact (objID={0}))", artifact.getId()), ex);
503 Map<String, Object> map =
new LinkedHashMap<>();
505 for (Map.Entry<String, Object> entry : map.entrySet()) {
515 if (customProperties != null) {
526 final int artifactTypeId = artifact.getArtifactTypeID();
527 if (artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_EXT_MISMATCH_DETECTED.getTypeID()) {
529 String actualMimeType =
"";
530 if (srcContent instanceof AbstractFile) {
531 AbstractFile file = (AbstractFile) srcContent;
532 ext = file.getNameExtension();
533 actualMimeType = file.getMIMEType();
534 if (actualMimeType == null) {
546 NbBundle.getMessage(
BlackboardArtifactNode.class,
"BlackboardArtifactNode.createSheet.mimeType.displayName"),
555 if (Arrays.asList(SHOW_UNIQUE_PATH).contains(artifactTypeId)) {
556 String sourcePath =
"";
558 sourcePath = srcContent.getUniquePath();
559 }
catch (TskCoreException ex) {
560 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting unique path of source content (artifact objID={0})", artifact.getId()), ex);
564 if (sourcePath.isEmpty() ==
false) {
567 NbBundle.getMessage(
BlackboardArtifactNode.class,
"BlackboardArtifactNode.createSheet.filePath.displayName"),
577 if (Arrays.asList(SHOW_FILE_METADATA).contains(artifactTypeId)) {
578 AbstractFile file = srcContent instanceof AbstractFile ? (AbstractFile) srcContent : null;
581 NbBundle.getMessage(
BlackboardArtifactNode.class,
"ContentTagNode.createSheet.fileModifiedTime.displayName"),
586 NbBundle.getMessage(
BlackboardArtifactNode.class,
"ContentTagNode.createSheet.fileChangedTime.displayName"),
591 NbBundle.getMessage(
BlackboardArtifactNode.class,
"ContentTagNode.createSheet.fileAccessedTime.displayName"),
596 NbBundle.getMessage(
BlackboardArtifactNode.class,
"ContentTagNode.createSheet.fileCreatedTime.displayName"),
603 file == null ?
"" : file.getSize()));
605 Bundle.BlackboardArtifactNode_createSheet_artifactMD5_name(),
606 Bundle.BlackboardArtifactNode_createSheet_artifactMD5_displayName(),
608 file == null ?
"" : StringUtils.defaultString(file.getMd5Hash())));
611 String dataSourceStr =
"";
613 Content dataSource = srcContent.getDataSource();
614 if (dataSource != null) {
615 dataSourceStr = dataSource.getName();
619 }
catch (TskCoreException ex) {
620 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting source data source name (artifact objID={0})", artifact.getId()), ex);
624 if (dataSourceStr.isEmpty() ==
false) {
627 NbBundle.getMessage(
BlackboardArtifactNode.class,
"BlackboardArtifactNode.createSheet.dataSrc.displayName"),
637 if (artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF.getTypeID()) {
640 if (srcContent instanceof AbstractFile) {
641 AbstractFile af = (AbstractFile) srcContent;
644 path = af.getUniquePath();
645 }
catch (TskCoreException ex) {
646 path = af.getParentPath();
652 NbBundle.getMessage(
BlackboardArtifactNode.class,
"BlackboardArtifactNode.createSheet.fileSize.displayName"),
674 List<Tag> tags =
new ArrayList<>();
679 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting tags for artifact and its source content (artifact objID={0})", artifact.getId()), ex);
698 return correlationAttribute;
724 for (Tag tag : tags) {
725 if (!StringUtils.isBlank(tag.getComment())) {
735 if (attribute != null && !StringUtils.isBlank(attribute.
getComment())) {
772 String description = Bundle.BlackboardArtifactNode_createSheet_noScore_description();
773 if (srcContent instanceof AbstractFile) {
774 if (((AbstractFile) srcContent).getKnown() == TskData.FileKnown.BAD) {
776 description = Bundle.BlackboardArtifactNode_createSheet_notableFile_description();
784 if (score ==
Score.
NO_SCORE && artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID()) {
786 BlackboardAttribute attr = artifact.getAttribute(
new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_SET_NAME));
789 if (hashDb.getHashSetName().equals(attr.getValueString())) {
791 description = Bundle.BlackboardArtifactNode_createSheet_notableFile_description();
795 }
catch (TskCoreException ex) {
796 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting TSK_SET_NAME attribute for TSK_HASHSET_HIT artifact (artifact objID={0})", artifact.getId()), ex);
805 if (!srcContent.getArtifacts(BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT).isEmpty()) {
807 description = Bundle.BlackboardArtifactNode_createSheet_interestingResult_description();
809 }
catch (TskCoreException ex) {
810 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting TSK_INTERESTING_ARTIFACT_HIT artifacts for source content (artifact objID={0})", artifact.getId()), ex);
821 description = Bundle.BlackboardArtifactNode_createSheet_taggedItem_description();
822 for (Tag tag : tags) {
823 if (tag.getName().getKnownStatus() == TskData.FileKnown.BAD) {
825 description = Bundle.BlackboardArtifactNode_createSheet_notableTaggedItem_description();
831 return Pair.of(score, description);
855 String description = defaultDescription;
857 if (corrAttrType != null && StringUtils.isNotBlank(attributeValue)) {
859 description = Bundle.BlackboardArtifactNode_createSheet_count_description(count, corrAttrType.
getDisplayName());
860 }
else if (corrAttrType != null) {
861 description = Bundle.BlackboardArtifactNode_createSheet_count_noCorrelationValues_description();
864 logger.log(Level.SEVERE, MessageFormat.format(
"Error querying central repository for other occurences count (artifact objID={0}, corrAttrType={1}, corrAttrValue={2})", artifact.getId(), corrAttrType, attributeValue), ex);
866 logger.log(Level.SEVERE, MessageFormat.format(
"Error normalizing correlation attribute for central repository query (artifact objID={0}, corrAttrType={2}, corrAttrValue={3})", artifact.getId(), corrAttrType, attributeValue), ex);
868 return Pair.of(count, description);
885 String parentName = srcContent.getName();
888 while ((parent = parent.getParent()) != null) {
889 parentName = parent.getName();
891 }
catch (TskCoreException ex) {
892 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting root ancestor name for source content (artifact objID={0})", artifact.getId()), ex);
905 if (customProperties == null) {
906 customProperties =
new ArrayList<>();
908 customProperties.add(property);
919 @SuppressWarnings(
"deprecation")
922 for (BlackboardAttribute attribute : artifact.getAttributes()) {
923 final int attributeTypeID = attribute.getAttributeType().getTypeID();
924 if (attributeTypeID == ATTRIBUTE_TYPE.TSK_PATH_ID.getTypeID()
925 || attributeTypeID == ATTRIBUTE_TYPE.TSK_TAGGED_ARTIFACT.getTypeID()
926 || attributeTypeID == ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT.getTypeID()
927 || attributeTypeID == ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID()
928 || attributeTypeID == ATTRIBUTE_TYPE.TSK_KEYWORD_SEARCH_TYPE.getTypeID()
929 || attribute.getValueType() == BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.JSON) {
933 }
else if (artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID()) {
935 }
else if (attribute.getAttributeType().getValueType() == BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME) {
937 }
else if (artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getTypeID()
938 && attributeTypeID == ATTRIBUTE_TYPE.TSK_TEXT.getTypeID()) {
947 String value = attribute.getDisplayString();
948 if (value.length() > 512) {
949 value = value.substring(0, 512);
951 map.put(attribute.getAttributeType().getDisplayName(), value);
953 map.put(attribute.getAttributeType().getDisplayName(), attribute.getDisplayString());
956 }
catch (TskCoreException ex) {
957 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting artifact attributes (artifact objID={0})", artifact.getId()), ex);
971 final int attributeTypeID = attribute.getAttributeType().getTypeID();
972 if (attributeTypeID == ATTRIBUTE_TYPE.TSK_DATETIME_SENT.getTypeID()
973 || attributeTypeID == ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_HTML.getTypeID()
974 || attributeTypeID == ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_RTF.getTypeID()
975 || attributeTypeID == ATTRIBUTE_TYPE.TSK_EMAIL_BCC.getTypeID()
976 || attributeTypeID == ATTRIBUTE_TYPE.TSK_EMAIL_CC.getTypeID()
977 || attributeTypeID == ATTRIBUTE_TYPE.TSK_HEADERS.getTypeID()) {
981 }
else if (attributeTypeID == ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_PLAIN.getTypeID()) {
982 String value = attribute.getDisplayString();
983 if (value.length() > 160) {
984 value = value.substring(0, 160) +
"...";
986 map.put(attribute.getAttributeType().getDisplayName(), value);
987 }
else if (attribute.getAttributeType().getValueType() == BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME) {
990 map.put(attribute.getAttributeType().getDisplayName(), attribute.getDisplayString());
996 return visitor.
visit(
this);
1006 return getClass().getName();
1010 public <T> T accept(ContentNodeVisitor<T> visitor) {
1011 return visitor.visit(
this);
1026 @NbBundle.Messages({
"BlackboardArtifactNode.createSheet.score.name=S",
1027 "BlackboardArtifactNode.createSheet.score.displayName=S",
1028 "BlackboardArtifactNode.createSheet.notableFile.description=Associated file recognized as notable.",
1029 "BlackboardArtifactNode.createSheet.interestingResult.description=Result has an interesting result associated with it.",
1030 "BlackboardArtifactNode.createSheet.taggedItem.description=Result or associated file has been tagged.",
1031 "BlackboardArtifactNode.createSheet.notableTaggedItem.description=Result or associated file tagged with notable tag.",
1032 "BlackboardArtifactNode.createSheet.noScore.description=No score"})
1036 sheetSet.put(
new NodeProperty<>(Bundle.BlackboardArtifactNode_createSheet_score_name(), Bundle.BlackboardArtifactNode_createSheet_score_displayName(), scoreAndDescription.getRight(), scoreAndDescription.getLeft()));
1048 @NbBundle.Messages({
1049 "BlackboardArtifactNode.createSheet.tags.displayName=Tags"}
1053 List<Tag> tags =
new ArrayList<>();
1058 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting tags for artifact and source content (artifact objID={0})", artifact.getId()), ex);
1060 sheetSet.put(
new NodeProperty<>(
"Tags", Bundle.BlackboardArtifactNode_createSheet_tags_displayName(),
NO_DESCR, tags.stream().map(t -> t.getName().getDisplayName()).collect(Collectors.joining(
", "))));
1076 sheetSet.put(
new NodeProperty<>(
"Tags", Bundle.BlackboardArtifactNode_createSheet_tags_displayName(),
NO_DESCR, tags.stream().map(t -> t.getName().getDisplayName()).collect(Collectors.joining(
", "))));
1091 @NbBundle.Messages({
"BlackboardArtifactNode.createSheet.count.name=O",
1092 "BlackboardArtifactNode.createSheet.count.displayName=O",
1093 "BlackboardArtifactNode.createSheet.count.noCorrelationAttributes.description=No correlation properties found",
1094 "BlackboardArtifactNode.createSheet.count.noCorrelationValues.description=Unable to find other occurrences because no value exists for the available correlation property",
1095 "# {0} - occurrenceCount",
1096 "# {1} - attributeType",
1097 "BlackboardArtifactNode.createSheet.count.description=There were {0} datasource(s) found with occurrences of the correlation value of type {1}"})
1101 sheetSet.put(
new NodeProperty<>(Bundle.BlackboardArtifactNode_createSheet_count_name(), Bundle.BlackboardArtifactNode_createSheet_count_displayName(), countAndDescription.getRight(), countAndDescription.getLeft()));
1118 @NbBundle.Messages({
"BlackboardArtifactNode.createSheet.comment.name=C",
1119 "BlackboardArtifactNode.createSheet.comment.displayName=C"})
1123 sheetSet.put(
new NodeProperty<>(Bundle.BlackboardArtifactNode_createSheet_comment_name(), Bundle.BlackboardArtifactNode_createSheet_comment_displayName(),
NO_DESCR, status));
Pair< DataResultViewerTable.Score, String > getScorePropertyAndDescription(List< Tag > tags)
static final String VALUE_LOADING
final void addTagProperty(Sheet.Set sheetSet, List< Tag > tags)
void addTagProperty(Sheet.Set sheetSet)
void fillPropertyMap(Map< String, Object > map, BlackboardArtifact artifact)
static String getStringTime(long epochSeconds, TimeZone tzone)
static boolean hasSupportedTimeStamp(BlackboardArtifact artifact)
void setName(String name)
static String getPropertyName()
BlackboardArtifactNode(BlackboardArtifact artifact, String iconPath)
final PropertyChangeListener weakListener
static Lookup createLookup(BlackboardArtifact artifact)
static final Integer[] SHOW_FILE_METADATA
static final Cache< Long, Content > contentCache
volatile String translatedSourceName
String getCorrelationValue()
T visit(DataSourcesNode in)
Action[] getActions(boolean context)
Type getCorrelationType()
void addNodeProperty(NodeProperty<?> property)
Pair< Long, String > getCountPropertyAndDescription(Type corrAttrType, String attributeValue, String defaultDescription)
static ViewFileInTimelineAction createViewSourceFileAction(AbstractFile file)
static final Set< Case.Events > CASE_EVENTS_OF_INTEREST
final void addScorePropertyAndDescription(Sheet.Set sheetSet, List< Tag > tags)
TagsManager getTagsManager()
synchronized List< HashDb > getKnownBadFileHashSets()
static TextTranslationService getInstance()
static boolean displayTranslatedFileNames()
List< NodeProperty<?extends Object > > customProperties
static synchronized HashDbManager getInstance()
final List< Tag > getAllTagsFromDatabase()
final BlackboardArtifact artifact
static CorrelationAttributeInstance getCorrAttrForFile(AbstractFile file)
void addEmailMsgProperty(Map< String, Object > map, BlackboardAttribute attribute)
static String getIconFilePath(int typeID)
static boolean getHideSCOColumns()
final void addCommentProperty(Sheet.Set sheetSet, List< Tag > tags, CorrelationAttributeInstance attribute)
final CorrelationAttributeInstance getCorrelationAttributeInstance()
SleuthkitCase getSleuthkitCase()
synchronized boolean hasProvider()
DataResultViewerTable.HasCommentStatus getCommentProperty(List< Tag > tags, CorrelationAttributeInstance attribute)
final void addCountProperty(Sheet.Set sheetSet, CorrelationAttributeInstance attribute)
BLACKBOARD_ARTIFACT_TAG_ADDED
static final Logger logger
BlackboardArtifact getArtifact()
synchronized static Logger getLogger(String name)
String getRootAncestorName()
static Case getCurrentCaseThrows()
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
final PropertyChangeListener listener
static void removeEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
static CentralRepository getInstance()
Long getCountUniqueCaseDataSourceTuplesHavingTypeValue(CorrelationAttributeInstance.Type aType, String value)
BlackboardArtifactNode(BlackboardArtifact artifact)
static final Integer[] SHOW_UNIQUE_PATH
static ViewFileInTimelineAction createViewFileAction(AbstractFile file)
BLACKBOARD_ARTIFACT_TAG_DELETED
void unregisterListener()
static boolean isEnabled()
static final String NO_DESCR