19 package org.sleuthkit.autopsy.datamodel;
21 import com.google.common.annotations.Beta;
22 import com.google.common.cache.Cache;
23 import com.google.common.cache.CacheBuilder;
24 import java.beans.PropertyChangeEvent;
25 import java.beans.PropertyChangeListener;
26 import java.lang.ref.WeakReference;
27 import java.text.MessageFormat;
28 import java.util.ArrayList;
29 import java.util.Arrays;
30 import java.util.EnumSet;
31 import java.util.LinkedHashMap;
32 import java.util.List;
34 import java.util.MissingResourceException;
36 import java.util.concurrent.ExecutionException;
37 import java.util.concurrent.TimeUnit;
38 import java.util.logging.Level;
39 import java.util.stream.Collectors;
40 import javax.swing.Action;
41 import org.apache.commons.lang3.StringUtils;
42 import org.apache.commons.lang3.tuple.Pair;
43 import org.openide.nodes.Sheet;
44 import org.openide.util.Lookup;
45 import org.openide.util.NbBundle;
46 import org.openide.util.WeakListeners;
47 import org.openide.util.lookup.Lookups;
70 import org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
72 import org.
sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE;
83 import org.
sleuthkit.datamodel.BlackboardArtifact.Category;
99 private static final Cache<Long, Content>
contentCache = CacheBuilder.newBuilder().expireAfterWrite(1, TimeUnit.MINUTES).build();
118 BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID()
133 private final PropertyChangeListener
listener =
new PropertyChangeListener() {
135 public void propertyChange(PropertyChangeEvent evt) {
136 String eventType = evt.getPropertyName();
139 if (event.getAddedTag().getArtifact().equals(artifact)) {
144 if (event.getDeletedTagInfo().getArtifactID() == artifact.getArtifactID()) {
149 if (event.getAddedTag().getContent().equals(srcContent)) {
154 if (event.getDeletedTagInfo().getContentID() == srcContent.getId()) {
159 if (event.getContentID() == srcContent.getId()) {
163 if (evt.getNewValue() == null) {
168 contentCache.invalidateAll();
171 SCOData scoData = (SCOData) evt.getNewValue();
172 if (scoData.getScoreAndDescription() != null) {
174 Bundle.BlackboardArtifactNode_createSheet_score_name(),
175 Bundle.BlackboardArtifactNode_createSheet_score_displayName(),
176 scoData.getScoreAndDescription().getRight(),
177 scoData.getScoreAndDescription().getLeft()));
179 if (scoData.getComment() != null) {
181 Bundle.BlackboardArtifactNode_createSheet_comment_name(),
182 Bundle.BlackboardArtifactNode_createSheet_comment_displayName(),
185 if (scoData.getCountAndDescription() != null) {
187 Bundle.BlackboardArtifactNode_createSheet_count_name(),
188 Bundle.BlackboardArtifactNode_createSheet_count_displayName(),
189 scoData.getCountAndDescription().getRight(),
190 scoData.getCountAndDescription().getLeft()));
199 String originalName = evt.getOldValue().toString();
200 translatedSourceName = evt.getNewValue().toString();
201 setDisplayName(translatedSourceName);
202 setShortDescription(originalName);
204 Bundle.BlackboardArtifactNode_createSheet_srcFile_origName(),
205 Bundle.BlackboardArtifactNode_createSheet_srcFile_origDisplayName(),
219 private final PropertyChangeListener
weakListener = WeakListeners.propertyChange(listener, null);
233 for (Content lookupContent : this.getLookup().lookupAll(Content.class)) {
234 if ((lookupContent != null) && (!(lookupContent instanceof BlackboardArtifact))) {
235 srcContent = lookupContent;
243 srcContent.getUniquePath();
244 }
catch (TskCoreException ex) {
245 logger.log(Level.WARNING, MessageFormat.format(
"Error getting the unique path of the source content (artifact objID={0})", artifact.getId()), ex);
250 if (srcContent == null) {
251 throw new IllegalArgumentException(MessageFormat.format(
"Artifact missing source content (artifact objID={0})", artifact));
253 setName(Long.toString(artifact.getArtifactID()));
254 String displayName = srcContent.getName();
255 setDisplayName(displayName);
256 setShortDescription(displayName);
257 setIconBaseWithExtension(iconPath != null && iconPath.charAt(0) ==
'/' ? iconPath.substring(1) : iconPath);
272 super(artifact,
createLookup(artifact, lookupIsAssociatedFile));
278 srcContent = artifact.getParent();
279 }
catch (TskCoreException ex) {
280 logger.log(Level.WARNING, MessageFormat.format(
"Error getting the parent of the artifact for (artifact objID={0})", artifact.getId()), ex);
282 if (srcContent != null) {
290 srcContent.getUniquePath();
291 }
catch (TskCoreException ex) {
292 logger.log(Level.WARNING, MessageFormat.format(
"Error getting the unique path of the source content (artifact objID={0})", artifact.getId()), ex);
295 throw new IllegalArgumentException(MessageFormat.format(
"Artifact missing source content (artifact objID={0})", artifact));
297 setName(Long.toString(artifact.getArtifactID()));
298 String displayName = srcContent.getName();
299 setDisplayName(displayName);
300 setShortDescription(displayName);
302 setIconBaseWithExtension(iconPath != null && iconPath.charAt(0) ==
'/' ? iconPath.substring(1) : iconPath);
321 private static BlackboardArtifact.Type
getType(BlackboardArtifact artifact) {
323 return artifact.getType();
324 }
catch (TskCoreException ex) {
325 logger.log(Level.WARNING, MessageFormat.format(
"Error getting the artifact type for artifact (artifact objID={0})", artifact.getId()), ex);
339 final long objectID = artifact.getObjectID();
341 Content
content = contentCache.get(objectID, () -> artifact.getSleuthkitCase().getContentById(objectID));
342 if (content == null) {
343 return Lookups.fixed(artifact);
345 return Lookups.fixed(artifact, content);
347 }
catch (ExecutionException ex) {
348 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting source content (artifact objID={0}", artifact.getId()), ex);
349 return Lookups.fixed(artifact);
364 private static Lookup
createLookup(BlackboardArtifact artifact,
boolean lookupIsAssociatedFile) {
366 if (lookupIsAssociatedFile) {
369 }
catch (ExecutionException ex) {
370 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting source content (artifact objID={0}", artifact.getId()), ex);
373 if (content == null) {
374 return Lookups.fixed(artifact);
376 return Lookups.fixed(artifact, content);
397 private static Content
getPathIdFile(BlackboardArtifact artifact)
throws ExecutionException {
399 BlackboardAttribute attribute = artifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH_ID));
400 if (attribute != null) {
401 return contentCache.get(attribute.getValueLong(), () -> artifact.getSleuthkitCase().getContentById(attribute.getValueLong()));
403 }
catch (TskCoreException ex) {
404 logger.log(Level.WARNING, MessageFormat.format(
"Error getting content for path id attrbiute for artifact: ", artifact.getId()), ex);
442 List<Action> actionsList =
new ArrayList<>();
443 actionsList.addAll(Arrays.asList(super.getActions(context)));
452 (!(this.artifact instanceof AnalysisResult))) {
456 }
catch (TskCoreException ex) {
457 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting artifact timestamp (artifact objID={0})", artifact.getId()), ex);
466 AbstractFile linkedFile = findLinked(artifact);
467 if (linkedFile != null) {
470 }
catch (TskCoreException ex) {
471 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting linked file of artifact (artifact objID={0})", artifact.getId()), ex);
479 AbstractFile file = getLookup().lookup(AbstractFile.class
485 return actionsList.toArray(
new Action[actionsList.size()]);
495 return srcContent.getName();
499 "BlackboardArtifactNode.createSheet.srcFile.name=Source File",
500 "BlackboardArtifactNode.createSheet.srcFile.displayName=Source File",
501 "BlackboardArtifactNode.createSheet.srcFile.origName=Original Name",
502 "BlackboardArtifactNode.createSheet.srcFile.origDisplayName=Original Name",
503 "BlackboardArtifactNode.createSheet.artifactType.displayName=Result Type",
504 "BlackboardArtifactNode.createSheet.artifactType.name=Result Type",
505 "BlackboardArtifactNode.createSheet.artifactDetails.displayName=Result Details",
506 "BlackboardArtifactNode.createSheet.artifactDetails.name=Result Details",
507 "BlackboardArtifactNode.createSheet.artifactMD5.displayName=MD5 Hash",
508 "BlackboardArtifactNode.createSheet.artifactMD5.name=MD5 Hash",
509 "BlackboardArtifactNode.createSheet.fileSize.name=Size",
510 "BlackboardArtifactNode.createSheet.fileSize.displayName=Size",
511 "BlackboardArtifactNode.createSheet.path.displayName=Path",
512 "BlackboardArtifactNode.createSheet.path.name=Path"
519 Sheet sheet = super.createSheet();
520 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
521 if (sheetSet == null) {
522 sheetSet = Sheet.createPropertiesSet();
533 Bundle.BlackboardArtifactNode_createSheet_srcFile_name(),
534 Bundle.BlackboardArtifactNode_createSheet_srcFile_displayName(),
545 Bundle.BlackboardArtifactNode_createSheet_srcFile_origName(),
546 Bundle.BlackboardArtifactNode_createSheet_srcFile_origDisplayName(),
548 translatedSourceName != null ? srcContent.getName() :
""));
549 if (translatedSourceName == null) {
566 Bundle.BlackboardArtifactNode_createSheet_score_name(),
567 Bundle.BlackboardArtifactNode_createSheet_score_displayName(),
571 Bundle.BlackboardArtifactNode_createSheet_comment_name(),
572 Bundle.BlackboardArtifactNode_createSheet_comment_displayName(),
577 Bundle.BlackboardArtifactNode_createSheet_count_name(),
578 Bundle.BlackboardArtifactNode_createSheet_count_displayName(),
582 backgroundTasksPool.submit(
new GetSCOTask(
new WeakReference<>(
this), weakListener));
590 if (artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID()) {
592 BlackboardAttribute attribute = artifact.getAttribute(
new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT));
593 if (attribute != null) {
596 NbBundle.getMessage(
BlackboardArtifactNode.class,
"BlackboardArtifactNode.createSheet.artifactType.name"),
597 NbBundle.getMessage(
BlackboardArtifactNode.class,
"BlackboardArtifactNode.createSheet.artifactType.displayName"),
599 associatedArtifact.getDisplayName()));
601 NbBundle.getMessage(
BlackboardArtifactNode.class,
"BlackboardArtifactNode.createSheet.artifactDetails.name"),
602 NbBundle.getMessage(
BlackboardArtifactNode.class,
"BlackboardArtifactNode.createSheet.artifactDetails.displayName"),
604 associatedArtifact.getShortDescription()));
607 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting associated artifact of TSK_INTERESTING_ARTIFACT_HIT artifact (objID={0}))", artifact.getId()), ex);
615 Map<String, Object> map =
new LinkedHashMap<>();
617 for (Map.Entry<String, Object> entry : map.entrySet()) {
627 if (customProperties != null) {
638 final int artifactTypeId = artifact.getArtifactTypeID();
639 if (artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_EXT_MISMATCH_DETECTED.getTypeID()) {
641 String actualMimeType =
"";
642 if (srcContent instanceof AbstractFile) {
643 AbstractFile file = (AbstractFile) srcContent;
644 ext = file.getNameExtension();
645 actualMimeType = file.getMIMEType();
646 if (actualMimeType == null) {
658 NbBundle.getMessage(
BlackboardArtifactNode.class,
"BlackboardArtifactNode.createSheet.mimeType.displayName"),
668 String sourcePath =
"";
670 sourcePath = srcContent.getUniquePath();
671 }
catch (TskCoreException ex) {
672 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting unique path of source content (artifact objID={0})", artifact.getId()), ex);
676 if (sourcePath.isEmpty() ==
false) {
679 NbBundle.getMessage(
BlackboardArtifactNode.class,
"BlackboardArtifactNode.createSheet.filePath.displayName"),
689 if (Arrays.asList(SHOW_FILE_METADATA).contains(artifactTypeId)) {
690 AbstractFile file = srcContent instanceof AbstractFile ? (AbstractFile) srcContent : null;
693 NbBundle.getMessage(
BlackboardArtifactNode.class,
"ContentTagNode.createSheet.fileModifiedTime.displayName"),
698 NbBundle.getMessage(
BlackboardArtifactNode.class,
"ContentTagNode.createSheet.fileChangedTime.displayName"),
703 NbBundle.getMessage(
BlackboardArtifactNode.class,
"ContentTagNode.createSheet.fileAccessedTime.displayName"),
708 NbBundle.getMessage(
BlackboardArtifactNode.class,
"ContentTagNode.createSheet.fileCreatedTime.displayName"),
715 file == null ?
"" : file.getSize()));
717 Bundle.BlackboardArtifactNode_createSheet_artifactMD5_name(),
718 Bundle.BlackboardArtifactNode_createSheet_artifactMD5_displayName(),
720 file == null ?
"" : StringUtils.defaultString(file.getMd5Hash())));
723 String dataSourceStr =
"";
725 Content dataSource = srcContent.getDataSource();
726 if (dataSource != null) {
727 dataSourceStr = dataSource.getName();
731 }
catch (TskCoreException ex) {
732 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting source data source name (artifact objID={0})", artifact.getId()), ex);
736 if (dataSourceStr.isEmpty() ==
false) {
739 NbBundle.getMessage(
BlackboardArtifactNode.class,
"BlackboardArtifactNode.createSheet.dataSrc.displayName"),
749 if (artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF.getTypeID()) {
752 if (srcContent instanceof AbstractFile) {
753 AbstractFile af = (AbstractFile) srcContent;
756 path = af.getUniquePath();
757 }
catch (TskCoreException ex) {
758 path = af.getParentPath();
764 NbBundle.getMessage(
BlackboardArtifactNode.class,
"BlackboardArtifactNode.createSheet.fileSize.displayName"),
786 List<Tag> tags =
new ArrayList<>();
791 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting tags for artifact and its source content (artifact objID={0})", artifact.getId()), ex);
810 return correlationAttribute;
836 for (Tag tag : tags) {
837 if (!StringUtils.isBlank(tag.getComment())) {
847 if (attribute != null && !StringUtils.isBlank(attribute.
getComment())) {
879 String description = defaultDescription;
881 if (corrAttrType != null && StringUtils.isNotBlank(attributeValue)) {
883 description = Bundle.BlackboardArtifactNode_createSheet_count_description(count, corrAttrType.
getDisplayName());
884 }
else if (corrAttrType != null) {
885 description = Bundle.BlackboardArtifactNode_createSheet_count_noCorrelationValues_description();
888 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);
890 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);
892 return Pair.of(count, description);
909 String parentName = srcContent.getName();
912 while ((parent = parent.getParent()) != null) {
913 parentName = parent.getName();
915 }
catch (TskCoreException ex) {
916 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting root ancestor name for source content (artifact objID={0})", artifact.getId()), ex);
929 if (customProperties == null) {
930 customProperties =
new ArrayList<>();
932 customProperties.add(property);
943 @SuppressWarnings(
"deprecation")
946 for (BlackboardAttribute attribute : artifact.getAttributes()) {
947 final int attributeTypeID = attribute.getAttributeType().getTypeID();
948 if (attributeTypeID == ATTRIBUTE_TYPE.TSK_PATH_ID.getTypeID()
949 || attributeTypeID == ATTRIBUTE_TYPE.TSK_TAGGED_ARTIFACT.getTypeID()
950 || attributeTypeID == ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT.getTypeID()
951 || attributeTypeID == ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID()
952 || attributeTypeID == ATTRIBUTE_TYPE.TSK_KEYWORD_SEARCH_TYPE.getTypeID()
953 || attribute.getValueType() == BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.JSON) {
957 }
else if (artifact.getArtifactTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID()) {
959 }
else if (attribute.getAttributeType().getValueType() == BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME) {
961 }
else if (artifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getTypeID()
962 && attributeTypeID == ATTRIBUTE_TYPE.TSK_TEXT.getTypeID()) {
971 String value = attribute.getDisplayString();
972 if (value.length() > 512) {
973 value = value.substring(0, 512);
975 map.put(attribute.getAttributeType().getDisplayName(), value);
977 switch (attribute.getAttributeType().getValueType()) {
979 map.put(attribute.getAttributeType().getDisplayName(), attribute.getValueInt());
982 map.put(attribute.getAttributeType().getDisplayName(), attribute.getValueDouble());
985 map.put(attribute.getAttributeType().getDisplayName(), attribute.getValueLong());
988 map.put(attribute.getAttributeType().getDisplayName(), attribute.getDisplayString());
994 }
catch (TskCoreException ex) {
995 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting artifact attributes (artifact objID={0})", artifact.getId()), ex);
1009 final int attributeTypeID = attribute.getAttributeType().getTypeID();
1010 if (attributeTypeID == ATTRIBUTE_TYPE.TSK_DATETIME_SENT.getTypeID()
1011 || attributeTypeID == ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_HTML.getTypeID()
1012 || attributeTypeID == ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_RTF.getTypeID()
1013 || attributeTypeID == ATTRIBUTE_TYPE.TSK_EMAIL_BCC.getTypeID()
1014 || attributeTypeID == ATTRIBUTE_TYPE.TSK_EMAIL_CC.getTypeID()
1015 || attributeTypeID == ATTRIBUTE_TYPE.TSK_HEADERS.getTypeID()) {
1019 }
else if (attributeTypeID == ATTRIBUTE_TYPE.TSK_EMAIL_CONTENT_PLAIN.getTypeID()) {
1020 String value = attribute.getDisplayString();
1021 if (value.length() > 160) {
1022 value = value.substring(0, 160) +
"...";
1024 map.put(attribute.getAttributeType().getDisplayName(), value);
1025 }
else if (attribute.getAttributeType().getValueType() == BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME) {
1028 map.put(attribute.getAttributeType().getDisplayName(), attribute.getDisplayString());
1034 return visitor.
visit(
this);
1044 return getClass().getName();
1048 public <T> T accept(ContentNodeVisitor<T> visitor) {
1049 return visitor.visit(
this);
1064 @NbBundle.Messages({
"BlackboardArtifactNode.createSheet.score.name=S",
1065 "BlackboardArtifactNode.createSheet.score.displayName=S",
1066 "BlackboardArtifactNode.createSheet.notableFile.description=Associated file recognized as notable.",
1067 "BlackboardArtifactNode.createSheet.interestingResult.description=Result has an interesting result associated with it.",
1068 "BlackboardArtifactNode.createSheet.taggedItem.description=Result or associated file has been tagged.",
1069 "BlackboardArtifactNode.createSheet.notableTaggedItem.description=Result or associated file tagged with notable tag.",
1070 "BlackboardArtifactNode.createSheet.noScore.description=No score"})
1074 sheetSet.put(
new NodeProperty<>(Bundle.BlackboardArtifactNode_createSheet_score_name(), Bundle.BlackboardArtifactNode_createSheet_score_displayName(), scoreAndDescription.getRight(), scoreAndDescription.getLeft()));
1086 @NbBundle.Messages({
1087 "BlackboardArtifactNode.createSheet.tags.displayName=Tags"}
1091 List<Tag> tags =
new ArrayList<>();
1096 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting tags for artifact and source content (artifact objID={0})", artifact.getId()), ex);
1098 sheetSet.put(
new NodeProperty<>(
"Tags", Bundle.BlackboardArtifactNode_createSheet_tags_displayName(),
NO_DESCR, tags.stream().map(t -> t.getName().getDisplayName()).collect(Collectors.joining(
", "))));
1114 sheetSet.put(
new NodeProperty<>(
"Tags", Bundle.BlackboardArtifactNode_createSheet_tags_displayName(),
NO_DESCR, tags.stream().map(t -> t.getName().getDisplayName()).collect(Collectors.joining(
", "))));
1129 @NbBundle.Messages({
"BlackboardArtifactNode.createSheet.count.name=O",
1130 "BlackboardArtifactNode.createSheet.count.displayName=O",
1131 "BlackboardArtifactNode.createSheet.count.noCorrelationAttributes.description=No correlation properties found",
1132 "BlackboardArtifactNode.createSheet.count.noCorrelationValues.description=Unable to find other occurrences because no value exists for the available correlation property",
1133 "# {0} - occurrenceCount",
1134 "# {1} - attributeType",
1135 "BlackboardArtifactNode.createSheet.count.description=There were {0} datasource(s) found with occurrences of the correlation value of type {1}"})
1139 sheetSet.put(
new NodeProperty<>(Bundle.BlackboardArtifactNode_createSheet_count_name(), Bundle.BlackboardArtifactNode_createSheet_count_displayName(), countAndDescription.getRight(), countAndDescription.getLeft()));
1156 @NbBundle.Messages({
"BlackboardArtifactNode.createSheet.comment.name=C",
1157 "BlackboardArtifactNode.createSheet.comment.displayName=C"})
1161 sheetSet.put(
new NodeProperty<>(Bundle.BlackboardArtifactNode_createSheet_comment_name(), Bundle.BlackboardArtifactNode_createSheet_comment_displayName(),
NO_DESCR, status));
static final String VALUE_LOADING
static BlackboardArtifact.Type getType(BlackboardArtifact artifact)
final void addTagProperty(Sheet.Set sheetSet, List< Tag > tags)
void addTagProperty(Sheet.Set sheetSet)
void fillPropertyMap(Map< String, Object > map, BlackboardArtifact artifact)
static Lookup createLookup(BlackboardArtifact artifact, boolean lookupIsAssociatedFile)
static boolean hasSupportedTimeStamp(BlackboardArtifact artifact)
void setName(String name)
static String getPropertyName()
static String getFormattedTime(long epochTime)
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()
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()
static TextTranslationService getInstance()
static boolean displayTranslatedFileNames()
static Content getPathIdFile(BlackboardArtifact artifact)
List< NodeProperty<?extends Object > > customProperties
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)
Pair< Score, String > getScorePropertyAndDescription(List< Tag > tags)
final CorrelationAttributeInstance getCorrelationAttributeInstance()
SleuthkitCase getSleuthkitCase()
T visit(DataSourceFilesNode in)
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()
final BlackboardArtifact.Type artifactType
synchronized static Logger getLogger(String name)
String getRootAncestorName()
static Case getCurrentCaseThrows()
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
BlackboardArtifactNode(BlackboardArtifact artifact, boolean lookupIsAssociatedFile)
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 ViewFileInTimelineAction createViewFileAction(AbstractFile file)
BLACKBOARD_ARTIFACT_TAG_DELETED
void unregisterListener()
static boolean isEnabled()
static final String NO_DESCR