19 package org.sleuthkit.autopsy.report;
 
   21 import com.google.common.collect.ListMultimap;
 
   22 import com.google.common.collect.Lists;
 
   23 import com.google.common.collect.Multimaps;
 
   24 import java.sql.ResultSet;
 
   25 import java.sql.SQLException;
 
   26 import java.util.ArrayList;
 
   27 import java.util.Arrays;
 
   28 import java.util.Collection;
 
   29 import java.util.Collections;
 
   30 import java.util.Comparator;
 
   31 import java.util.HashMap;
 
   32 import java.util.HashSet;
 
   33 import java.util.Iterator;
 
   34 import java.util.List;
 
   36 import java.util.Objects;
 
   38 import java.util.TreeSet;
 
   39 import java.util.logging.Level;
 
   40 import org.openide.util.NbBundle;
 
   58 class TableReportGenerator {
 
   60     private final List<BlackboardArtifact.Type> artifactTypes = 
new ArrayList<>();
 
   61     private final HashSet<String> tagNamesFilter = 
new HashSet<>();
 
   63     private final Set<Content> images = 
new HashSet<>();
 
   64     private final ReportProgressPanel progressPanel;
 
   65     private final TableReportModule tableReport;
 
   66     private final Map<Integer, List<Column>> columnHeaderMap;
 
   67     private static final Logger logger = Logger.getLogger(TableReportGenerator.class.getName());
 
   69     private final List<String> errorList;
 
   71     TableReportGenerator(Map<BlackboardArtifact.Type, Boolean> artifactTypeSelections, Map<String, Boolean> tagNameSelections, ReportProgressPanel progressPanel, TableReportModule tableReport) {
 
   73         this.progressPanel = progressPanel;
 
   74         this.tableReport = tableReport;
 
   75         this.columnHeaderMap = 
new HashMap<>();
 
   76         errorList = 
new ArrayList<>();
 
   78         for (Map.Entry<BlackboardArtifact.Type, Boolean> entry : artifactTypeSelections.entrySet()) {
 
   79             if (entry.getValue()) {
 
   80                 artifactTypes.add(entry.getKey());
 
   85         if (null != tagNameSelections) {
 
   86             for (Map.Entry<String, Boolean> entry : tagNameSelections.entrySet()) {
 
   87                 if (entry.getValue() == 
true) {
 
   88                     tagNamesFilter.add(entry.getKey());
 
   94     protected void execute() {
 
   97         progressPanel.start();
 
   98         progressPanel.setIndeterminate(
false);
 
   99         progressPanel.setMaximumProgress(this.artifactTypes.size() + 2); 
 
  101         if (progressPanel.getStatus() != ReportProgressPanel.ReportStatus.CANCELED) {
 
  102             makeBlackboardArtifactTables();
 
  106         if (progressPanel.getStatus() != ReportProgressPanel.ReportStatus.CANCELED) {
 
  107             makeContentTagsTables();
 
  110         if (progressPanel.getStatus() != ReportProgressPanel.ReportStatus.CANCELED) {
 
  111             makeBlackboardArtifactTagsTables();
 
  114         if (progressPanel.getStatus() != ReportProgressPanel.ReportStatus.CANCELED) {
 
  116             makeThumbnailTable();
 
  123     private void makeBlackboardArtifactTables() {
 
  126         if (!tagNamesFilter.isEmpty()) {
 
  127             comment += NbBundle.getMessage(this.getClass(), 
"ReportGenerator.artifactTable.taggedResults.text");
 
  128             comment += makeCommaSeparatedList(tagNamesFilter);
 
  132         for (BlackboardArtifact.Type type : artifactTypes) {
 
  135             if (progressPanel.getStatus() == ReportProgressPanel.ReportStatus.CANCELED) {
 
  139             progressPanel.updateStatusLabel(
 
  140                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processing",
 
  141                             type.getDisplayName()));
 
  144             if (type.getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID()) {
 
  145                 writeKeywordHits(tableReport, comment, tagNamesFilter);
 
  147             } 
else if (type.getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID()) {
 
  148                 writeHashsetHits(tableReport, comment, tagNamesFilter);
 
  152             List<ArtifactData> artifactList = getFilteredArtifacts(type, tagNamesFilter);
 
  154             if (artifactList.isEmpty()) {
 
  163             if (type.getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_ACCOUNT.getTypeID()) {
 
  165                 ListMultimap<String, ArtifactData> groupedArtifacts = Multimaps.index(artifactList,
 
  168                                 return artifactData.getArtifact().getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ACCOUNT_TYPE)).getValueString();
 
  169                             } 
catch (TskCoreException ex) {
 
  170                                 logger.log(Level.SEVERE, 
"Unable to get value of TSK_ACCOUNT_TYPE attribute. Defaulting to \"unknown\"", ex);
 
  174                 for (String accountTypeStr : groupedArtifacts.keySet()) {
 
  181                     String accountDisplayname = accountTypeStr;
 
  182                     if (accountTypeStr != null) {
 
  184                             Account.Type acctType = Case.getCurrentCase().getSleuthkitCase().getCommunicationsManager().getAccountType(accountTypeStr);
 
  185                             if (acctType != null) {
 
  186                                 accountDisplayname = acctType.getDisplayName();
 
  188                         } 
catch (TskCoreException ex) {
 
  189                             logger.log(Level.SEVERE, 
"Unable to get display name for account type " + accountTypeStr, ex);
 
  193                     final String compundDataTypeName = BlackboardArtifact.ARTIFACT_TYPE.TSK_ACCOUNT.getDisplayName() + 
": " + accountDisplayname;
 
  194                     writeTableForDataType(
new ArrayList<>(groupedArtifacts.get(accountTypeStr)), type, compundDataTypeName, comment);
 
  198                 writeTableForDataType(artifactList, type, type.getDisplayName(), comment);
 
  213     private void writeTableForDataType(List<ArtifactData> artifactList, BlackboardArtifact.Type type, String tableName, String comment) {
 
  218         Set<BlackboardAttribute.Type> attrTypeSet = 
new TreeSet<>(Comparator.comparing(BlackboardAttribute.Type::getDisplayName));
 
  219         for (ArtifactData data : artifactList) {
 
  220             List<BlackboardAttribute> attributes = data.getAttributes();
 
  221             for (BlackboardAttribute attribute : attributes) {
 
  222                 attrTypeSet.add(attribute.getAttributeType());
 
  230         List<Column> columns = getArtifactTableColumns(type.getTypeID(), attrTypeSet);
 
  231         if (columns.isEmpty()) {
 
  234         columnHeaderMap.put(type.getTypeID(), columns);
 
  240         Collections.sort(artifactList);
 
  242         tableReport.startDataType(tableName, comment);
 
  245         for (ArtifactData artifactData : artifactList) {
 
  248             List<String> rowData = artifactData.getRow();
 
  249             if (rowData.isEmpty()) {
 
  253             tableReport.addRow(rowData);
 
  256         progressPanel.increment();
 
  257         tableReport.endTable();
 
  258         tableReport.endDataType();
 
  264     @SuppressWarnings(
"deprecation")
 
  265     private 
void makeContentTagsTables() {
 
  268         List<ContentTag> tags;
 
  270             tags = Case.getCurrentCase().getServices().getTagsManager().getAllContentTags();
 
  271         } 
catch (TskCoreException ex) {
 
  272             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetContentTags"));
 
  273             logger.log(Level.SEVERE, 
"failed to get content tags", ex); 
 
  280         progressPanel.updateStatusLabel(
 
  281                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processing",
 
  282                         BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE.getDisplayName()));
 
  283         ArrayList<String> columnHeaders = 
new ArrayList<>(Arrays.asList(
 
  284                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.tag"),
 
  285                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.file"),
 
  286                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.comment"),
 
  287                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.timeModified"),
 
  288                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.timeChanged"),
 
  289                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.timeAccessed"),
 
  290                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.timeCreated"),
 
  291                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.size"),
 
  292                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.hash")));
 
  294         StringBuilder comment = 
new StringBuilder();
 
  295         if (!tagNamesFilter.isEmpty()) {
 
  297                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.makeContTagTab.taggedFiles.msg"));
 
  298             comment.append(makeCommaSeparatedList(tagNamesFilter));
 
  300         if (tableReport instanceof ReportHTML) {
 
  301             ReportHTML htmlReportModule = (ReportHTML) tableReport;
 
  302             htmlReportModule.startDataType(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE.getDisplayName(), comment.toString());
 
  303             htmlReportModule.startContentTagsTable(columnHeaders);
 
  305             tableReport.startDataType(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE.getDisplayName(), comment.toString());
 
  306             tableReport.startTable(columnHeaders);
 
  310         for (ContentTag tag : tags) {
 
  312             String notableString = tag.getName().getKnownStatus() == TskData.FileKnown.BAD ? TagsManager.getNotableTagLabel() : 
"";
 
  313             if (passesTagNamesFilter(tag.getName().getDisplayName() + notableString) == 
false) {
 
  319                 fileName = tag.getContent().getUniquePath();
 
  320             } 
catch (TskCoreException ex) {
 
  321                 fileName = tag.getContent().getName();
 
  324             ArrayList<String> rowData = 
new ArrayList<>(Arrays.asList(tag.getName().getDisplayName() + notableString, fileName, tag.getComment()));
 
  325             Content content = tag.getContent();
 
  326             if (content instanceof AbstractFile) {
 
  327                 AbstractFile file = (AbstractFile) content;
 
  330                 rowData.add(file.getMtimeAsDate());
 
  331                 rowData.add(file.getCtimeAsDate());
 
  332                 rowData.add(file.getAtimeAsDate());
 
  333                 rowData.add(file.getCrtimeAsDate());
 
  334                 rowData.add(Long.toString(file.getSize()));
 
  335                 rowData.add(file.getMd5Hash());
 
  338             if (tableReport instanceof ReportHTML) {
 
  339                 ReportHTML htmlReportModule = (ReportHTML) tableReport;
 
  340                 htmlReportModule.addRowWithTaggedContentHyperlink(rowData, tag);
 
  342                 tableReport.addRow(rowData);
 
  346             checkIfTagHasImage(tag);
 
  350         progressPanel.increment();
 
  351         tableReport.endTable();
 
  352         tableReport.endDataType();
 
  358     @SuppressWarnings(
"deprecation")
 
  359     private 
void makeBlackboardArtifactTagsTables() {
 
  361         List<BlackboardArtifactTag> tags;
 
  363             tags = Case.getCurrentCase().getServices().getTagsManager().getAllBlackboardArtifactTags();
 
  364         } 
catch (TskCoreException ex) {
 
  365             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetBBArtifactTags"));
 
  366             logger.log(Level.SEVERE, 
"failed to get blackboard artifact tags", ex); 
 
  372         progressPanel.updateStatusLabel(
 
  373                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processing",
 
  374                         BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_ARTIFACT.getDisplayName()));
 
  375         StringBuilder comment = 
new StringBuilder();
 
  376         if (!tagNamesFilter.isEmpty()) {
 
  378                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.makeBbArtTagTab.taggedRes.msg"));
 
  379             comment.append(makeCommaSeparatedList(tagNamesFilter));
 
  381         tableReport.startDataType(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_ARTIFACT.getDisplayName(), comment.toString());
 
  382         tableReport.startTable(
new ArrayList<>(Arrays.asList(
 
  383                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.tagTable.header.resultType"),
 
  384                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.tagTable.header.tag"),
 
  385                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.tagTable.header.comment"),
 
  386                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.tagTable.header.srcFile"))));
 
  389         for (BlackboardArtifactTag tag : tags) {
 
  390             String notableString = tag.getName().getKnownStatus() == TskData.FileKnown.BAD ? TagsManager.getNotableTagLabel() : 
"";
 
  391             if (passesTagNamesFilter(tag.getName().getDisplayName() + notableString) == 
false) {
 
  396             row = 
new ArrayList<>(Arrays.asList(tag.getArtifact().getArtifactTypeName(), tag.getName().getDisplayName() + notableString, tag.getComment(), tag.getContent().getName()));
 
  397             tableReport.addRow(row);
 
  400             checkIfTagHasImage(tag);
 
  404         progressPanel.increment();
 
  405         tableReport.endTable();
 
  406         tableReport.endDataType();
 
  416     private boolean passesTagNamesFilter(String tagName) {
 
  417         return tagNamesFilter.isEmpty() || tagNamesFilter.contains(tagName);
 
  423     private void makeThumbnailTable() {
 
  424         progressPanel.updateStatusLabel(
 
  425                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.createdThumb.text"));
 
  427         if (tableReport instanceof ReportHTML) {
 
  428             ReportHTML htmlModule = (ReportHTML) tableReport;
 
  429             htmlModule.startDataType(
 
  430                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.thumbnailTable.name"),
 
  431                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.thumbnailTable.desc"));
 
  432             List<String> emptyHeaders = 
new ArrayList<>();
 
  433             for (
int i = 0; i < ReportHTML.THUMBNAIL_COLUMNS; i++) {
 
  434                 emptyHeaders.add(
"");
 
  436             htmlModule.startTable(emptyHeaders);
 
  438             htmlModule.addThumbnailRows(images);
 
  440             htmlModule.endTable();
 
  441             htmlModule.endDataType();
 
  452     private void checkIfTagHasImage(BlackboardArtifactTag artifactTag) {
 
  455             file = Case.getCurrentCase().getSleuthkitCase().getAbstractFileById(artifactTag.getArtifact().getObjectID());
 
  456         } 
catch (TskCoreException ex) {
 
  458                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.errGetContentFromBBArtifact"));
 
  459             logger.log(Level.WARNING, 
"Error while getting content from a blackboard artifact to report on.", ex); 
 
  464             checkIfFileIsImage(file);
 
  475     private void checkIfTagHasImage(ContentTag contentTag) {
 
  476         Content c = contentTag.getContent();
 
  477         if (c instanceof AbstractFile == 
false) {
 
  480         checkIfFileIsImage((AbstractFile) c);
 
  488     private void checkIfFileIsImage(AbstractFile file) {
 
  491                 || file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS
 
  492                 || file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNUSED_BLOCKS) {
 
  496         if (ImageUtils.thumbnailSupported(file)) {
 
  509     private String makeCommaSeparatedList(Collection<String> items) {
 
  511         for (Iterator<String> iterator = items.iterator(); iterator.hasNext();) {
 
  512             list += iterator.next() + (iterator.hasNext() ? 
", " : 
"");
 
  522     @SuppressWarnings(
"deprecation")
 
  523     private 
void writeKeywordHits(TableReportModule tableModule, String comment, HashSet<String> tagNamesFilter) {
 
  530         String orderByClause;
 
  531         if (Case.getCurrentCase().getCaseType() == Case.CaseType.MULTI_USER_CASE) {
 
  532             orderByClause = 
"ORDER BY convert_to(att.value_text, 'SQL_ASCII') ASC NULLS FIRST"; 
 
  534             orderByClause = 
"ORDER BY list ASC"; 
 
  536         String keywordListQuery
 
  537                 = 
"SELECT att.value_text AS list " 
  539                 "FROM blackboard_attributes AS att, blackboard_artifacts AS art " 
  541                 "WHERE att.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID() + 
" " 
  543                 "AND art.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() + 
" " 
  545                 "AND att.artifact_id = art.artifact_id " 
  547                 "GROUP BY list " + orderByClause; 
 
  549         try (SleuthkitCase.CaseDbQuery dbQuery = Case.getCurrentCase().getSleuthkitCase().executeQuery(keywordListQuery)) {
 
  550             ResultSet listsRs = dbQuery.getResultSet();
 
  551             List<String> lists = 
new ArrayList<>();
 
  552             while (listsRs.next()) {
 
  553                 String list = listsRs.getString(
"list"); 
 
  554                 if (list.isEmpty()) {
 
  555                     list = NbBundle.getMessage(this.getClass(), 
"ReportGenerator.writeKwHits.userSrchs");
 
  561             tableModule.startDataType(BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getDisplayName(), comment);
 
  562             tableModule.addSetIndex(lists);
 
  563             progressPanel.updateStatusLabel(
 
  564                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processing",
 
  565                             BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getDisplayName()));
 
  566         } 
catch (TskCoreException | SQLException ex) {
 
  567             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedQueryKWLists"));
 
  568             logger.log(Level.SEVERE, 
"Failed to query keyword lists: ", ex); 
 
  572         if (Case.getCurrentCase().getCaseType() == Case.CaseType.MULTI_USER_CASE) {
 
  573             orderByClause = 
"ORDER BY convert_to(att3.value_text, 'SQL_ASCII') ASC NULLS FIRST, "  
  574                     + 
"convert_to(att1.value_text, 'SQL_ASCII') ASC NULLS FIRST, "  
  575                     + 
"convert_to(f.parent_path, 'SQL_ASCII') ASC NULLS FIRST, "  
  576                     + 
"convert_to(f.name, 'SQL_ASCII') ASC NULLS FIRST, "  
  577                     + 
"convert_to(att2.value_text, 'SQL_ASCII') ASC NULLS FIRST"; 
 
  579             orderByClause = 
"ORDER BY list ASC, keyword ASC, parent_path ASC, name ASC, preview ASC"; 
 
  583                 = 
"SELECT art.artifact_id, art.obj_id, att1.value_text AS keyword, att2.value_text AS preview, att3.value_text AS list, f.name AS name, f.parent_path AS parent_path " 
  585                 "FROM blackboard_artifacts AS art, blackboard_attributes AS att1, blackboard_attributes AS att2, blackboard_attributes AS att3, tsk_files AS f " 
  587                 "WHERE (att1.artifact_id = art.artifact_id) " 
  589                 "AND (att2.artifact_id = art.artifact_id) " 
  591                 "AND (att3.artifact_id = art.artifact_id) " 
  593                 "AND (f.obj_id = art.obj_id) " 
  595                 "AND (att1.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID() + 
") " 
  597                 "AND (att2.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_PREVIEW.getTypeID() + 
") " 
  599                 "AND (att3.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID() + 
") " 
  601                 "AND (art.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() + 
") " 
  605         try (SleuthkitCase.CaseDbQuery dbQuery = Case.getCurrentCase().getSleuthkitCase().executeQuery(keywordsQuery)) {
 
  606             ResultSet resultSet = dbQuery.getResultSet();
 
  608             String currentKeyword = 
"";
 
  609             String currentList = 
"";
 
  610             while (resultSet.next()) {
 
  612                 if (progressPanel.getStatus() == ReportProgressPanel.ReportStatus.CANCELED) {
 
  617                 HashSet<String> uniqueTagNames = getUniqueTagNames(resultSet.getLong(
"artifact_id")); 
 
  618                 if (failsTagFilter(uniqueTagNames, tagNamesFilter)) {
 
  621                 String tagsList = makeCommaSeparatedList(uniqueTagNames);
 
  623                 Long objId = resultSet.getLong(
"obj_id"); 
 
  624                 String keyword = resultSet.getString(
"keyword"); 
 
  625                 String preview = resultSet.getString(
"preview"); 
 
  626                 String list = resultSet.getString(
"list"); 
 
  627                 String uniquePath = 
"";
 
  630                     AbstractFile f = Case.getCurrentCase().getSleuthkitCase().getAbstractFileById(objId);
 
  632                         uniquePath = Case.getCurrentCase().getSleuthkitCase().getAbstractFileById(objId).getUniquePath();
 
  634                 } 
catch (TskCoreException ex) {
 
  636                             NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetAbstractFileByID"));
 
  637                     logger.log(Level.WARNING, 
"Failed to get Abstract File by ID.", ex); 
 
  641                 if ((!list.equals(currentList) && !list.isEmpty()) || (list.isEmpty() && !currentList.equals(
 
  642                         NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.writeKwHits.userSrchs")))) {
 
  643                     if (!currentList.isEmpty()) {
 
  644                         tableModule.endTable();
 
  645                         tableModule.endSet();
 
  647                     currentList = list.isEmpty() ? NbBundle
 
  648                             .getMessage(this.getClass(), 
"ReportGenerator.writeKwHits.userSrchs") : list;
 
  650                     tableModule.startSet(currentList);
 
  651                     progressPanel.updateStatusLabel(
 
  652                             NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processingList",
 
  653                                     BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getDisplayName(), currentList));
 
  655                 if (!keyword.equals(currentKeyword)) {
 
  656                     if (!currentKeyword.equals(
"")) {
 
  657                         tableModule.endTable();
 
  659                     currentKeyword = keyword;
 
  660                     tableModule.addSetElement(currentKeyword);
 
  661                     List<String> columnHeaderNames = 
new ArrayList<>();
 
  662                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.preview"));
 
  663                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.srcFile"));
 
  664                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tags"));
 
  665                     tableModule.startTable(columnHeaderNames);
 
  668                 tableModule.addRow(Arrays.asList(
new String[]{preview, uniquePath, tagsList}));
 
  672             progressPanel.increment();
 
  673             tableModule.endDataType();
 
  674         } 
catch (TskCoreException | SQLException ex) {
 
  675             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedQueryKWs"));
 
  676             logger.log(Level.SEVERE, 
"Failed to query keywords: ", ex); 
 
  685     @SuppressWarnings(
"deprecation")
 
  686     private 
void writeHashsetHits(TableReportModule tableModule, String comment, HashSet<String> tagNamesFilter) {
 
  687         String orderByClause;
 
  688         if (Case.getCurrentCase().getCaseType() == Case.CaseType.MULTI_USER_CASE) {
 
  689             orderByClause = 
"ORDER BY convert_to(att.value_text, 'SQL_ASCII') ASC NULLS FIRST"; 
 
  691             orderByClause = 
"ORDER BY att.value_text ASC"; 
 
  694                 = 
"SELECT att.value_text AS list " 
  696                 "FROM blackboard_attributes AS att, blackboard_artifacts AS art " 
  698                 "WHERE att.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID() + 
" " 
  700                 "AND art.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID() + 
" " 
  702                 "AND att.artifact_id = art.artifact_id " 
  704                 "GROUP BY list " + orderByClause; 
 
  706         try (SleuthkitCase.CaseDbQuery dbQuery = Case.getCurrentCase().getSleuthkitCase().executeQuery(hashsetsQuery)) {
 
  708             ResultSet listsRs = dbQuery.getResultSet();
 
  709             List<String> lists = 
new ArrayList<>();
 
  710             while (listsRs.next()) {
 
  711                 lists.add(listsRs.getString(
"list")); 
 
  714             tableModule.startDataType(BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getDisplayName(), comment);
 
  715             tableModule.addSetIndex(lists);
 
  716             progressPanel.updateStatusLabel(
 
  717                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processing",
 
  718                             BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getDisplayName()));
 
  719         } 
catch (TskCoreException | SQLException ex) {
 
  720             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedQueryHashsetLists"));
 
  721             logger.log(Level.SEVERE, 
"Failed to query hashset lists: ", ex); 
 
  725         if (Case.getCurrentCase().getCaseType() == Case.CaseType.MULTI_USER_CASE) {
 
  726             orderByClause = 
"ORDER BY convert_to(att.value_text, 'SQL_ASCII') ASC NULLS FIRST, "  
  727                     + 
"convert_to(f.parent_path, 'SQL_ASCII') ASC NULLS FIRST, "  
  728                     + 
"convert_to(f.name, 'SQL_ASCII') ASC NULLS FIRST, "  
  729                     + 
"size ASC NULLS FIRST"; 
 
  731             orderByClause = 
"ORDER BY att.value_text ASC, f.parent_path ASC, f.name ASC, size ASC"; 
 
  733         String hashsetHitsQuery
 
  734                 = 
"SELECT art.artifact_id, art.obj_id, att.value_text AS setname, f.name AS name, f.size AS size, f.parent_path AS parent_path " 
  736                 "FROM blackboard_artifacts AS art, blackboard_attributes AS att, tsk_files AS f " 
  738                 "WHERE (att.artifact_id = art.artifact_id) " 
  740                 "AND (f.obj_id = art.obj_id) " 
  742                 "AND (att.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID() + 
") " 
  744                 "AND (art.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID() + 
") " 
  748         try (SleuthkitCase.CaseDbQuery dbQuery = Case.getCurrentCase().getSleuthkitCase().executeQuery(hashsetHitsQuery)) {
 
  750             ResultSet resultSet = dbQuery.getResultSet();
 
  751             String currentSet = 
"";
 
  752             while (resultSet.next()) {
 
  754                 if (progressPanel.getStatus() == ReportProgressPanel.ReportStatus.CANCELED) {
 
  759                 HashSet<String> uniqueTagNames = getUniqueTagNames(resultSet.getLong(
"artifact_id")); 
 
  760                 if (failsTagFilter(uniqueTagNames, tagNamesFilter)) {
 
  763                 String tagsList = makeCommaSeparatedList(uniqueTagNames);
 
  765                 Long objId = resultSet.getLong(
"obj_id"); 
 
  766                 String set = resultSet.getString(
"setname"); 
 
  767                 String size = resultSet.getString(
"size"); 
 
  768                 String uniquePath = 
"";
 
  771                     AbstractFile f = Case.getCurrentCase().getSleuthkitCase().getAbstractFileById(objId);
 
  773                         uniquePath = Case.getCurrentCase().getSleuthkitCase().getAbstractFileById(objId).getUniquePath();
 
  775                 } 
catch (TskCoreException ex) {
 
  777                             NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetAbstractFileFromID"));
 
  778                     logger.log(Level.WARNING, 
"Failed to get Abstract File from ID.", ex); 
 
  783                 if (!set.equals(currentSet)) {
 
  784                     if (!currentSet.isEmpty()) {
 
  785                         tableModule.endTable();
 
  786                         tableModule.endSet();
 
  789                     tableModule.startSet(currentSet);
 
  790                     List<String> columnHeaderNames = 
new ArrayList<>();
 
  791                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.file"));
 
  792                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.size"));
 
  793                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tags"));
 
  794                     tableModule.startTable(columnHeaderNames);
 
  795                     progressPanel.updateStatusLabel(
 
  796                             NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processingList",
 
  797                                     BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getDisplayName(), currentSet));
 
  801                 tableModule.addRow(Arrays.asList(
new String[]{uniquePath, size, tagsList}));
 
  805             progressPanel.increment();
 
  806             tableModule.endDataType();
 
  807         } 
catch (TskCoreException | SQLException ex) {
 
  808             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedQueryHashsetHits"));
 
  809             logger.log(Level.SEVERE, 
"Failed to query hashsets hits: ", ex); 
 
  816     List<String> getErrorList() {
 
  829         private List<String> rowData = null;
 
  832         ArtifactData(BlackboardArtifact artifact, List<BlackboardAttribute> attrs, HashSet<String> tags) {
 
  834             this.attributes = attrs;
 
  838             } 
catch (TskCoreException ex) {
 
  839                 logger.log(Level.SEVERE, 
"Could not get content from database");
 
  856             return artifact.getArtifactID();
 
  860             return artifact.getObjectID();
 
  881             List<String> thisRow = 
getRow();
 
  882             List<String> otherRow = otherArtifactData.
getRow();
 
  883             for (
int i = 0; i < thisRow.size(); i++) {
 
  884                 int compare = thisRow.get(i).compareTo(otherRow.get(i));
 
  900             if (rowData == null) {
 
  905                     if (rowData.size() > 0) {
 
  907                         for (
int i = 0; i < rowData.size(); i++) {
 
  908                             if (rowData.get(i) == null) {
 
  914                         return new ArrayList<>();
 
  916                 } 
catch (TskCoreException ex) {
 
  918                             NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.coreExceptionWhileGenRptRow"));
 
  919                     logger.log(Level.WARNING, 
"Core exception while generating row data for artifact report.", ex); 
 
  920                     rowData = Collections.<String>emptyList();
 
  937             List<String> orderedRowData = 
new ArrayList<>();
 
  938             if (BlackboardArtifact.ARTIFACT_TYPE.TSK_EXT_MISMATCH_DETECTED.getTypeID() == 
getArtifact().getArtifactTypeID()) {
 
  939                 if (content != null && content instanceof AbstractFile) {
 
  940                     AbstractFile file = (AbstractFile) content;
 
  941                     orderedRowData.add(file.getName());
 
  942                     orderedRowData.add(file.getNameExtension());
 
  943                     String mimeType = file.getMIMEType();
 
  944                     if (mimeType == null) {
 
  945                         orderedRowData.add(
"");
 
  947                         orderedRowData.add(mimeType);
 
  949                     orderedRowData.add(file.getUniquePath());
 
  952                     orderedRowData.add(null);
 
  953                     orderedRowData.add(null);
 
  954                     orderedRowData.add(null);
 
  955                     orderedRowData.add(null);
 
  957                 orderedRowData.add(makeCommaSeparatedList(
getTags()));
 
  959             } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID() == 
getArtifact().getArtifactTypeID()) {
 
  960                 String[] attributeDataArray = 
new String[3];
 
  962                 for (BlackboardAttribute attr : attributes) {
 
  963                     if (attr.getAttributeType().equals(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME))) {
 
  964                         attributeDataArray[0] = attr.getDisplayString();
 
  965                     } 
else if (attr.getAttributeType().equals(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY))) {
 
  966                         attributeDataArray[1] = attr.getDisplayString();
 
  970                 attributeDataArray[2] = content.getUniquePath();
 
  971                 orderedRowData.addAll(Arrays.asList(attributeDataArray));
 
  973                 HashSet<String> allTags = 
getTags();
 
  976                     for (ContentTag ct : contentTags) {
 
  978                         allTags.add(ct.getName().getDisplayName() + notableString);
 
  980                 } 
catch (TskCoreException ex) {
 
  981                     errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetContentTags"));
 
  982                     logger.log(Level.SEVERE, 
"Failed to get content tags", ex); 
 
  984                 orderedRowData.add(makeCommaSeparatedList(allTags));
 
  986             } 
else if (columnHeaderMap.containsKey(
this.artifact.getArtifactTypeID())) {
 
  988                 for (
Column currColumn : columnHeaderMap.get(
this.artifact.getArtifactTypeID())) {
 
  989                     String cellData = currColumn.getCellData(
this);
 
  990                     orderedRowData.add(cellData);
 
  994             return orderedRowData;
 
 1008     private List<ArtifactData> getFilteredArtifacts(BlackboardArtifact.Type type, HashSet<String> tagNamesFilter) {
 
 1009         List<ArtifactData> artifacts = 
new ArrayList<>();
 
 1013                 HashSet<String> uniqueTagNames = 
new HashSet<>();
 
 1014                 for (BlackboardArtifactTag tag : tags) {
 
 1016                     uniqueTagNames.add(tag.getName().getDisplayName() + notableString);
 
 1018                 if (failsTagFilter(uniqueTagNames, tagNamesFilter)) {
 
 1022                     artifacts.add(
new ArtifactData(artifact, Case.getCurrentCase().getSleuthkitCase().getBlackboardAttributes(artifact), uniqueTagNames));
 
 1023                 } 
catch (TskCoreException ex) {
 
 1024                     errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetBBAttribs"));
 
 1025                     logger.log(Level.SEVERE, 
"Failed to get Blackboard Attributes when generating report.", ex); 
 
 1028         } 
catch (TskCoreException ex) {
 
 1029             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetBBArtifacts"));
 
 1030             logger.log(Level.SEVERE, 
"Failed to get Blackboard Artifacts when generating report.", ex); 
 
 1035     private Boolean failsTagFilter(HashSet<String> tagNames, HashSet<String> tagsNamesFilter) {
 
 1036         if (null == tagsNamesFilter || tagsNamesFilter.isEmpty()) {
 
 1040         HashSet<String> filteredTagNames = 
new HashSet<>(tagNames);
 
 1041         filteredTagNames.retainAll(tagsNamesFilter);
 
 1042         return filteredTagNames.isEmpty();
 
 1055     private List<Column> getArtifactTableColumns(
int artifactTypeId, Set<BlackboardAttribute.Type> attributeTypeSet) {
 
 1056         ArrayList<Column> columns = 
new ArrayList<>();
 
 1060         if (BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID() == artifactTypeId) {
 
 1061             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.url"),
 
 1062                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL)));
 
 1064             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.title"),
 
 1065                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TITLE)));
 
 1067             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateCreated"),
 
 1068                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_CREATED)));
 
 1070             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1071                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1073         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID() == artifactTypeId) {
 
 1074             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.url"),
 
 1075                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL)));
 
 1077             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1078                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1080             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1081                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1083             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.value"),
 
 1084                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_VALUE)));
 
 1086             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1087                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1089         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID() == artifactTypeId) {
 
 1090             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.url"),
 
 1091                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL)));
 
 1093             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateAccessed"),
 
 1094                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED)));
 
 1096             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.referrer"),
 
 1097                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_REFERRER)));
 
 1099             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.title"),
 
 1100                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TITLE)));
 
 1102             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1103                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1105             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.urlDomainDecoded"),
 
 1106                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL_DECODED)));
 
 1108         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID() == artifactTypeId) {
 
 1109             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dest"),
 
 1110                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH)));
 
 1112             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.sourceUrl"),
 
 1113                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL)));
 
 1115             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateAccessed"),
 
 1116                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED)));
 
 1118             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1119                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1121         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_RECENT_OBJECT.getTypeID() == artifactTypeId) {
 
 1122             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.path"),
 
 1123                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH)));
 
 1125             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1126                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1128         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_INSTALLED_PROG.getTypeID() == artifactTypeId) {
 
 1129             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.progName"),
 
 1130                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1132             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.instDateTime"),
 
 1133                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1135         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() == artifactTypeId) {
 
 1136             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.preview")));
 
 1138         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID() == artifactTypeId) {
 
 1139             columns.add(
new SourceFileColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.file")));
 
 1141             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.size")));
 
 1143         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID() == artifactTypeId) {
 
 1144             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.devMake"),
 
 1145                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_MAKE)));
 
 1147             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.devModel"),
 
 1148                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_MODEL)));
 
 1150             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.deviceId"),
 
 1151                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_ID)));
 
 1153             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1154                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1156         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_SEARCH_QUERY.getTypeID() == artifactTypeId) {
 
 1157             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.text"),
 
 1158                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TEXT)));
 
 1160             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.domain"),
 
 1161                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN)));
 
 1163             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateAccessed"),
 
 1164                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED)));
 
 1166             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.progName"),
 
 1167                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1169         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF.getTypeID() == artifactTypeId) {
 
 1170             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTaken"),
 
 1171                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_CREATED)));
 
 1173             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.devManufacturer"),
 
 1174                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_MAKE)));
 
 1176             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.devModel"),
 
 1177                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_MODEL)));
 
 1179             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitude"),
 
 1180                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE)));
 
 1182             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitude"),
 
 1183                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE)));
 
 1185             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.altitude"),
 
 1186                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE)));
 
 1188         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT.getTypeID() == artifactTypeId) {
 
 1189             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.personName"),
 
 1190                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1192             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.phoneNumber"),
 
 1193                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER)));
 
 1195             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.phoneNumHome"),
 
 1196                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_HOME)));
 
 1198             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.phoneNumOffice"),
 
 1199                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_OFFICE)));
 
 1201             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.phoneNumMobile"),
 
 1202                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_MOBILE)));
 
 1204             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.email"),
 
 1205                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL)));
 
 1207         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE.getTypeID() == artifactTypeId) {
 
 1208             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.msgType"),
 
 1209                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MESSAGE_TYPE)));
 
 1211             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.direction"),
 
 1212                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DIRECTION)));
 
 1214             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.readStatus"),
 
 1215                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_READ_STATUS)));
 
 1217             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1218                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1220             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.fromPhoneNum"),
 
 1221                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM)));
 
 1223             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.fromEmail"),
 
 1224                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_FROM)));
 
 1226             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.toPhoneNum"),
 
 1227                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO)));
 
 1229             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.toEmail"),
 
 1230                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_TO)));
 
 1232             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.subject"),
 
 1233                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT)));
 
 1235             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.text"),
 
 1236                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TEXT)));
 
 1238         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG.getTypeID() == artifactTypeId) {
 
 1239             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.personName"),
 
 1240                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1242             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.fromPhoneNum"),
 
 1243                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM)));
 
 1245             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.toPhoneNum"),
 
 1246                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO)));
 
 1248             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1249                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START)));
 
 1251             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.direction"),
 
 1252                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DIRECTION)));
 
 1254         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_CALENDAR_ENTRY.getTypeID() == artifactTypeId) {
 
 1255             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.calendarEntryType"),
 
 1256                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CALENDAR_ENTRY_TYPE)));
 
 1258             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.description"),
 
 1259                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DESCRIPTION)));
 
 1261             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.startDateTime"),
 
 1262                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START)));
 
 1264             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.endDateTime"),
 
 1265                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_END)));
 
 1267             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.location"),
 
 1268                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCATION)));
 
 1270         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_SPEED_DIAL_ENTRY.getTypeID() == artifactTypeId) {
 
 1271             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.shortCut"),
 
 1272                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SHORTCUT)));
 
 1274             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.personName"),
 
 1275                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME_PERSON)));
 
 1277             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.phoneNumber"),
 
 1278                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER)));
 
 1280         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING.getTypeID() == artifactTypeId) {
 
 1281             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.deviceName"),
 
 1282                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_NAME)));
 
 1284             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.deviceAddress"),
 
 1285                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_ID)));
 
 1287             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1288                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1290         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID() == artifactTypeId) {
 
 1291             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitude"),
 
 1292                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE)));
 
 1294             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitude"),
 
 1295                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE)));
 
 1297             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1298                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1300         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_BOOKMARK.getTypeID() == artifactTypeId) {
 
 1301             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitude"),
 
 1302                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE)));
 
 1304             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitude"),
 
 1305                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE)));
 
 1307             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.altitude"),
 
 1308                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE)));
 
 1310             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1311                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1313             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.locationAddress"),
 
 1314                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCATION)));
 
 1316             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1317                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1319         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_LAST_KNOWN_LOCATION.getTypeID() == artifactTypeId) {
 
 1320             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitude"),
 
 1321                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE)));
 
 1323             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitude"),
 
 1324                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE)));
 
 1326             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.altitude"),
 
 1327                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE)));
 
 1329             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1330                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1332             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.locationAddress"),
 
 1333                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCATION)));
 
 1335             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1336                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1338         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_SEARCH.getTypeID() == artifactTypeId) {
 
 1339             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitude"),
 
 1340                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE)));
 
 1342             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitude"),
 
 1343                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE)));
 
 1345             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.altitude"),
 
 1346                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE)));
 
 1348             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1349                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1351             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.locationAddress"),
 
 1352                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCATION)));
 
 1354             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1355                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1357         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_SERVICE_ACCOUNT.getTypeID() == artifactTypeId) {
 
 1358             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.category"),
 
 1359                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY)));
 
 1361             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.userId"),
 
 1362                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_USER_ID)));
 
 1364             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.password"),
 
 1365                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PASSWORD)));
 
 1367             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.personName"),
 
 1368                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1370             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.appName"),
 
 1371                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1373             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.url"),
 
 1374                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL)));
 
 1376             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.appPath"),
 
 1377                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH)));
 
 1379             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.description"),
 
 1380                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DESCRIPTION)));
 
 1382             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.replytoAddress"),
 
 1383                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_REPLYTO)));
 
 1385             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.mailServer"),
 
 1386                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SERVER_NAME)));
 
 1388         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_DETECTED.getTypeID() == artifactTypeId  || 
 
 1389                 BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_SUSPECTED.getTypeID() == artifactTypeId) {
 
 1390             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1391                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1393         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_EXT_MISMATCH_DETECTED.getTypeID() == artifactTypeId) {
 
 1394             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.file")));
 
 1396             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.extension.text")));
 
 1398             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.mimeType.text")));
 
 1400             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.path")));
 
 1402         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_OS_INFO.getTypeID() == artifactTypeId) {
 
 1403             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.processorArchitecture.text"),
 
 1404                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROCESSOR_ARCHITECTURE)));
 
 1406             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.osName.text"),
 
 1407                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1409             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.osInstallDate.text"),
 
 1410                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1412         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID() == artifactTypeId) {
 
 1413             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskEmailTo"),
 
 1414                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_TO)));
 
 1416             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskEmailFrom"),
 
 1417                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_FROM)));
 
 1419             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskSubject"),
 
 1420                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT)));
 
 1422             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskDateTimeSent"),
 
 1423                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT)));
 
 1425             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskDateTimeRcvd"),
 
 1426                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_RCVD)));
 
 1428             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskPath"),
 
 1429                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH)));
 
 1431             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskEmailCc"),
 
 1432                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_CC)));
 
 1434             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskEmailBcc"),
 
 1435                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_BCC)));
 
 1437             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskMsgId"),
 
 1438                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MSG_ID)));
 
 1440         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID() == artifactTypeId) {
 
 1441             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskSetName"),
 
 1442                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME)));
 
 1444             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskInterestingFilesCategory"),
 
 1445                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY)));
 
 1447             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskPath"),
 
 1448                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH)));
 
 1450         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_ROUTE.getTypeID() == artifactTypeId) {
 
 1451             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskGpsRouteCategory"),
 
 1452                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY)));
 
 1454             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1455                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1457             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitudeEnd"),
 
 1458                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE_END)));
 
 1460             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitudeEnd"),
 
 1461                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE_END)));
 
 1463             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitudeStart"),
 
 1464                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE_START)));
 
 1466             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitudeStart"),
 
 1467                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE_START)));
 
 1469             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1470                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1472             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.location"),
 
 1473                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCATION)));
 
 1475             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1476                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1478         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID() == artifactTypeId) {
 
 1479             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskSetName"),
 
 1480                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME)));
 
 1482             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.associatedArtifact"),
 
 1483                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT)));
 
 1485             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1486                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1488         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_PROG_RUN.getTypeID() == artifactTypeId) {
 
 1489             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1490                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1492             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.associatedArtifact"),
 
 1493                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT)));
 
 1495             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1496                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1498             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.count"),
 
 1499                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_COUNT)));
 
 1501         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_OS_ACCOUNT.getTypeID() == artifactTypeId) {
 
 1502             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.userName"),
 
 1503                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_USER_NAME)));
 
 1505             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.userId"),
 
 1506                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_USER_ID)));
 
 1508         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_REMOTE_DRIVE.getTypeID() == artifactTypeId) {
 
 1509             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.localPath"),
 
 1510                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCAL_PATH)));
 
 1512             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.remotePath"),
 
 1513                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_REMOTE_PATH)));
 
 1514         } 
else if (artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_ACCOUNT.getTypeID()) {
 
 1515             columns.add(
new StatusColumn());
 
 1516             attributeTypeSet.remove(
new Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ACCOUNT_TYPE));
 
 1517             attributeTypeSet.remove(
new Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT));
 
 1518             attributeTypeSet.remove(
new Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME));
 
 1519             attributeTypeSet.remove(
new Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_SEARCH_DOCUMENT_ID));
 
 1523             for (BlackboardAttribute.Type type : attributeTypeSet) {
 
 1524                 columns.add(
new AttributeColumn(type.getDisplayName(), type));
 
 1526             columns.add(
new SourceFileColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.srcFile")));
 
 1527             columns.add(
new TaggedResultsColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tags")));
 
 1535         for (Column column : columns) {
 
 1536             attributeTypeSet = column.removeTypeFromSet(attributeTypeSet);
 
 1539         for (BlackboardAttribute.Type type : attributeTypeSet) {
 
 1540             columns.add(
new AttributeColumn(type.getDisplayName(), type));
 
 1543         if (artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID()
 
 1544                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID()
 
 1545                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID()
 
 1546                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID()
 
 1547                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_RECENT_OBJECT.getTypeID()
 
 1548                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_INSTALLED_PROG.getTypeID()
 
 1549                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID()
 
 1550                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_SEARCH_QUERY.getTypeID()
 
 1551                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF.getTypeID()
 
 1552                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT.getTypeID()
 
 1553                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE.getTypeID()
 
 1554                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG.getTypeID()
 
 1555                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALENDAR_ENTRY.getTypeID()
 
 1556                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_SPEED_DIAL_ENTRY.getTypeID()
 
 1557                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING.getTypeID()
 
 1558                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID()
 
 1559                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_BOOKMARK.getTypeID()
 
 1560                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_LAST_KNOWN_LOCATION.getTypeID()
 
 1561                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_SEARCH.getTypeID()
 
 1562                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_SERVICE_ACCOUNT.getTypeID()
 
 1563                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_DETECTED.getTypeID()
 
 1564                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_SUSPECTED.getTypeID()
 
 1565                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_OS_INFO.getTypeID()) {
 
 1566             columns.add(
new SourceFileColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.srcFile")));
 
 1568         columns.add(
new TaggedResultsColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tags")));
 
 1580     private String getFileUniquePath(Content content) {
 
 1582             if (content != null) {
 
 1583                 return content.getUniquePath();
 
 1587         } 
catch (TskCoreException ex) {
 
 1588             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetAbstractFileByID"));
 
 1589             logger.log(Level.WARNING, 
"Failed to get Abstract File by ID.", ex); 
 
 1604     @SuppressWarnings(
"deprecation")
 
 1605     private HashSet<String> getUniqueTagNames(
long artifactId) throws TskCoreException {
 
 1606         HashSet<String> uniqueTagNames = 
new HashSet<>();
 
 1608         String query = 
"SELECT display_name, artifact_id FROM tag_names AS tn, blackboard_artifact_tags AS bat " 
 1610                 "WHERE tn.tag_name_id = bat.tag_name_id AND bat.artifact_id = " + artifactId; 
 
 1612         try (SleuthkitCase.CaseDbQuery dbQuery = Case.getCurrentCase().getSleuthkitCase().executeQuery(query)) {
 
 1613             ResultSet tagNameRows = dbQuery.getResultSet();
 
 1614             while (tagNameRows.next()) {
 
 1615                 uniqueTagNames.add(tagNameRows.getString(
"display_name")); 
 
 1617         } 
catch (TskCoreException | SQLException ex) {
 
 1618             throw new TskCoreException(
"Error getting tag names for artifact: ", ex);
 
 1621         return uniqueTagNames;
 
 1631         Set<BlackboardAttribute.Type> 
removeTypeFromSet(Set<BlackboardAttribute.Type> types);
 
 1636         @NbBundle.Messages(
"TableReportGenerator.StatusColumn.Header=Review Status")
 
 1639             return Bundle.TableReportGenerator_StatusColumn_Header();
 
 1644             return artData.
getArtifact().getReviewStatus().getDisplayName();
 
 1667             this.columnHeader = Objects.requireNonNull(columnHeader);
 
 1678             List<BlackboardAttribute> attributes = artData.
getAttributes();
 
 1679             for (BlackboardAttribute attribute : attributes) {
 
 1680                 if (attribute.getAttributeType().equals(this.
attributeType)) {
 
 1681                     if (attribute.getAttributeType().getValueType() != BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME) {
 
 1682                         return attribute.getDisplayString();
 
 1713             return getFileUniquePath(artData.
getContent());
 
 1738             return makeCommaSeparatedList(artData.
getTags());
 
 1763             throw new UnsupportedOperationException(
"Cannot get cell data of unspecified column");
 
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)
 
static String getStringTime(long epochSeconds, TimeZone tzone)
 
final String columnHeader
 
String getCellData(ArtifactData artData)
 
BlackboardArtifact getArtifact()
 
final String columnHeader
 
final String columnHeader
 
final String columnHeader
 
final BlackboardAttribute.Type attributeType
 
HashSet< String > getTags()
 
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)
 
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)
 
String getCellData(ArtifactData artData)
 
String getCellData(ArtifactData artData)
 
TagsManager getTagsManager()
 
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)
 
String getCellData(ArtifactData artData)
 
SleuthkitCase getSleuthkitCase()
 
BlackboardArtifact artifact
 
String getCellData(ArtifactData artData)
 
List< BlackboardAttribute > getAttributes()
 
int compareTo(ArtifactData otherArtifactData)
 
String getCellData(ArtifactData artData)
 
List< String > getOrderedRowDataAsStrings()
 
static Case getCurrentCase()
 
List< BlackboardAttribute > attributes
 
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)
 
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)