19 package org.sleuthkit.autopsy.datamodel;
 
   21 import com.google.common.util.concurrent.ThreadFactoryBuilder;
 
   22 import java.sql.ResultSet;
 
   23 import java.sql.SQLException;
 
   24 import java.util.List;
 
   25 import java.util.concurrent.ExecutorService;
 
   26 import java.util.concurrent.Executors;
 
   27 import java.util.logging.Level;
 
   28 import org.apache.commons.lang3.tuple.Pair;
 
   29 import org.openide.nodes.Children;
 
   30 import org.openide.nodes.Sheet;
 
   32 import org.openide.util.lookup.Lookups;
 
   33 import org.openide.util.Lookup;
 
   34 import org.openide.util.NbBundle;
 
   35 import org.openide.util.NbBundle.Messages;
 
   42 import org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
 
   69     static final ExecutorService backgroundTasksPool;
 
   75     @NbBundle.Messages({
"AbstractContentNode.nodescription=no description",
 
   76         "AbstractContentNode.valueLoading=value loading"})
 
   77     protected static final String 
NO_DESCR = Bundle.AbstractContentNode_nodescription();
 
   78     protected static final String 
VALUE_LOADING = Bundle.AbstractContentNode_valueLoading();
 
   86     enum NodeSpecificEvents {
 
   87         TRANSLATION_AVAILABLE,
 
   94         backgroundTasksPool = Executors.newFixedThreadPool(MAX_POOL_SIZE,
 
   95                 new ThreadFactoryBuilder().setNameFormat(
"content-node-background-task-%d").build());
 
  103     AbstractContentNode(T content) {
 
  104         this(
content, Lookups.fixed(content, 
new TskContentItem<>(content)));
 
  113     AbstractContentNode(T content, Lookup lookup) {
 
  114         super(Children.create(
new ContentChildren(content), 
true), lookup);
 
  117         super.setName(
"content_" + Long.toString(content.getId())); 
 
  136         return super.getName();
 
  161                 if (!c.hasChildren()) {
 
  164             } 
catch (TskCoreException ex) {
 
  166                 logger.log(Level.SEVERE, 
"Error checking if the node has children, for content: " + c, ex); 
 
  170             String query = 
"SELECT COUNT(obj_id) AS count FROM " 
  171                     + 
" ( SELECT obj_id FROM tsk_objects WHERE par_obj_id = " + c.getId() + 
" AND type = " 
  172                     + TskData.ObjectType.ARTIFACT.getObjectType()
 
  173                     + 
"   INTERSECT SELECT artifact_obj_id FROM blackboard_artifacts WHERE obj_id = " + c.getId()
 
  174                     + 
"     AND (artifact_type_id = " + ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID()
 
  175                     + 
" OR artifact_type_id = " + ARTIFACT_TYPE.TSK_MESSAGE.getTypeID() + 
") " 
  176                     + 
"   UNION SELECT obj_id FROM tsk_objects WHERE par_obj_id = " + c.getId()
 
  177                     + 
"     AND type = " + TskData.ObjectType.ABSTRACTFILE.getObjectType() + 
") AS OBJECT_IDS"; 
 
  180                 ResultSet resultSet = dbQuery.getResultSet();
 
  181                 if (resultSet.next()) {
 
  182                     return (0 < resultSet.getInt(
"count"));
 
  185                 logger.log(Level.SEVERE, 
"Error checking if the node has children, for content: " + c, ex); 
 
  198         boolean hasChildren = 
false;
 
  200         if (content != null) {
 
  202                 hasChildren = content.hasChildren();
 
  203             } 
catch (TskCoreException ex) {
 
  204                 logger.log(Level.SEVERE, 
"Error checking if the node has children, for content: " + content, ex); 
 
  218         List<Long> childrenIds = null;
 
  220         if (content != null) {
 
  222                 childrenIds = content.getChildrenIds();
 
  223             } 
catch (TskCoreException ex) {
 
  224                 logger.log(Level.SEVERE, 
"Error getting children ids, for content: " + content, ex); 
 
  238         List<Content> children = null;
 
  240         if (content != null) {
 
  242                 children = content.getChildren();
 
  243             } 
catch (TskCoreException ex) {
 
  244                 logger.log(Level.SEVERE, 
"Error getting children, for content: " + content, ex); 
 
  260         int childrenCount = -1;
 
  262         if (content != null) {
 
  264                 childrenCount = content.getChildrenCount();
 
  265             } 
catch (TskCoreException ex) {
 
  266                 logger.log(Level.SEVERE, 
"Error checking node content children count, for content: " + content, ex); 
 
  270         return childrenCount;
 
  285     public int read(byte[] buf, 
long offset, 
long len) 
throws TskException {
 
  286         return content.read(buf, offset, len);
 
  305         Sheet visibleSheet = this.getSheet();
 
  306         Sheet.Set visibleSheetSet = visibleSheet.get(Sheet.PROPERTIES);
 
  307         Property<?>[] visibleProps = visibleSheetSet.getProperties();
 
  309             for (
int i = 0; i < visibleProps.length; i++) {
 
  310                 if (visibleProps[i].
getName().equals(newProp.getName())) {
 
  311                     visibleProps[i] = newProp;
 
  315         visibleSheetSet.put(visibleProps);
 
  316         visibleSheet.put(visibleSheetSet);
 
  318         this.setSheet(visibleSheet);
 
  336         "# {0} - significanceDisplayName",
 
  337         "AbstractContentNode_getScorePropertyAndDescription_description=Has an {0} analysis result score" 
  340         Score score = Score.SCORE_UNKNOWN;
 
  342             score = this.content.getAggregateScore();
 
  343         } 
catch (TskCoreException ex) {
 
  344             logger.log(Level.WARNING, 
"Unable to get aggregate score for content with id: " + 
this.content.getId(), ex);
 
  347         String significanceDisplay = score.getSignificance().getDisplayName();
 
  348         String description = Bundle.AbstractContentNode_getScorePropertyAndDescription_description(significanceDisplay);
 
  349         return Pair.of(score, description);
 
synchronized void updateSheet(NodeProperty<?>...newProps)
 
int read(byte[] buf, long offset, long len)
 
static final String VALUE_LOADING
 
static final Integer MAX_POOL_SIZE
 
List< Content > getContentChildren()
 
static final Logger logger
 
void setName(String name)
 
Pair< Long, String > getCountPropertyAndDescription(CorrelationAttributeInstance attribute, String defaultDescription)
 
int getContentChildrenCount()
 
DataResultViewerTable.HasCommentStatus getCommentProperty(List< Tag > tags, List< CorrelationAttributeInstance > attributes)
 
boolean hasContentChildren()
 
boolean hasVisibleContentChildren()
 
Pair< Score, String > getScorePropertyAndDescription(List< Tag > tags)
 
SleuthkitCase getSleuthkitCase()
 
synchronized static Logger getLogger(String name)
 
static Case getCurrentCaseThrows()
 
abstract List< Tag > getAllTagsFromDatabase()
 
List< Long > getContentChildrenIds()
 
static boolean contentHasVisibleContentChildren(Content c)
 
static final String NO_DESCR