19 package org.sleuthkit.autopsy.report.infrastructure;
 
   22 import com.google.common.collect.ListMultimap;
 
   23 import com.google.common.collect.Lists;
 
   24 import com.google.common.collect.Multimaps;
 
   25 import java.sql.ResultSet;
 
   26 import java.sql.SQLException;
 
   27 import java.util.ArrayList;
 
   28 import java.util.Arrays;
 
   29 import java.util.Collection;
 
   30 import java.util.Collections;
 
   31 import java.util.Comparator;
 
   32 import java.util.HashMap;
 
   33 import java.util.HashSet;
 
   34 import java.util.Iterator;
 
   35 import java.util.List;
 
   37 import java.util.Objects;
 
   39 import java.util.TreeSet;
 
   40 import java.util.logging.Level;
 
   41 import org.openide.util.NbBundle;
 
   42 import org.openide.util.NbBundle.Messages;
 
   64 class TableReportGenerator {
 
   66     private List<BlackboardArtifact.Type> artifactTypes = 
new ArrayList<>();
 
   67     private HashSet<String> tagNamesFilter = 
new HashSet<>();
 
   69     private final Set<Content> images = 
new HashSet<>();
 
   70     private final ReportProgressPanel progressPanel;
 
   71     private final TableReportModule tableReport;
 
   72     private final TableReportSettings settings;
 
   73     private final Map<Integer, List<Column>> columnHeaderMap;
 
   74     private static final Logger logger = Logger.getLogger(TableReportGenerator.class.getName());
 
   76     private final List<String> errorList;
 
   78     TableReportGenerator(TableReportSettings settings, ReportProgressPanel progressPanel, TableReportModule tableReport) {
 
   80         this.progressPanel = progressPanel;
 
   81         this.tableReport = tableReport;
 
   82         this.columnHeaderMap = 
new HashMap<>();
 
   83         errorList = 
new ArrayList<>();
 
   84         this.settings = settings;
 
   87     private void getAllExistingTags() throws NoCurrentCaseException, TskCoreException {
 
   88         List<String> tagNames = 
new ArrayList<>();
 
   91         List<TagName> tagNamesInUse = Case.getCurrentCaseThrows().getServices().getTagsManager().getTagNamesInUse();
 
   93         String notableString = 
"";
 
   94         for (TagName tagName : tagNamesInUse) {
 
   95             notableString = tagName.getKnownStatus() == TskData.FileKnown.BAD ? TagsManager.getNotableTagLabel() : 
"";
 
   96             tagNames.add(tagName.getDisplayName() + notableString);
 
   98         tagNamesFilter = 
new HashSet<>(tagNames);
 
  101     @SuppressWarnings(
"deprecation")
 
  102     private 
void getAllExistingArtiactTypes() throws NoCurrentCaseException, TskCoreException {
 
  104         ArrayList<BlackboardArtifact.Type> doNotReport = 
new ArrayList<>();
 
  105         doNotReport.add(
new BlackboardArtifact.Type(BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO.getTypeID(),
 
  106                 BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO.getLabel(),
 
  107                 BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO.getDisplayName()));
 
  108         doNotReport.add(
new BlackboardArtifact.Type(BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getTypeID(),
 
  109                 BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getLabel(),
 
  110                 BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getDisplayName())); 
 
  111         doNotReport.add(
new BlackboardArtifact.Type(
 
  112                 BlackboardArtifact.ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT.getTypeID(),
 
  113                 BlackboardArtifact.ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT.getLabel(),
 
  114                 BlackboardArtifact.ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT.getDisplayName()));
 
  115         doNotReport.add(
new BlackboardArtifact.Type(
 
  116                 BlackboardArtifact.ARTIFACT_TYPE.TSK_TL_EVENT.getTypeID(),
 
  117                 BlackboardArtifact.ARTIFACT_TYPE.TSK_TL_EVENT.getLabel(),
 
  118                 BlackboardArtifact.ARTIFACT_TYPE.TSK_TL_EVENT.getDisplayName()));
 
  120         Case.getCurrentCaseThrows().getSleuthkitCase().getArtifactTypes().forEach(artifactTypes::add);
 
  121         artifactTypes.removeAll(doNotReport);
 
  124     protected void execute() {
 
  126         progressPanel.start();
 
  127         progressPanel.updateStatusLabel(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.readingTagsArtifacts.text"));
 
  129         if (settings.useStoredTagsAndArtifactsLists()) {
 
  131             artifactTypes = settings.getArtifactSelections();
 
  134             tagNamesFilter = 
new HashSet<>(settings.getTagSelections());
 
  139                 if (settings.getSelectedReportOption() == TableReportSettings.TableReportOption.ALL_TAGGED_RESULTS) {
 
  140                     getAllExistingTags();
 
  144                 getAllExistingArtiactTypes();
 
  145             } 
catch (NoCurrentCaseException | TskCoreException ex) {
 
  146                 errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetAllTagsArtifacts"));
 
  147                 logger.log(Level.SEVERE, 
"Failed get all possible tag names and artifact types", ex); 
 
  153         progressPanel.setIndeterminate(
false);
 
  154         progressPanel.setMaximumProgress(this.artifactTypes.size() + 2); 
 
  157         if (progressPanel.getStatus() != ReportProgressPanel.ReportStatus.CANCELED) {
 
  158             makeBlackboardArtifactTables();
 
  162         if (progressPanel.getStatus() != ReportProgressPanel.ReportStatus.CANCELED) {
 
  163             makeContentTagsTables();
 
  166         if (progressPanel.getStatus() != ReportProgressPanel.ReportStatus.CANCELED) {
 
  167             makeBlackboardArtifactTagsTables();
 
  170         if (progressPanel.getStatus() != ReportProgressPanel.ReportStatus.CANCELED) {
 
  172             makeThumbnailTable();
 
  179     private void makeBlackboardArtifactTables() {
 
  182         if (!tagNamesFilter.isEmpty()) {
 
  183             comment += NbBundle.getMessage(this.getClass(), 
"ReportGenerator.artifactTable.taggedResults.text");
 
  184             comment += makeCommaSeparatedList(tagNamesFilter);
 
  188         for (BlackboardArtifact.Type type : artifactTypes) {
 
  191             if (progressPanel.getStatus() == ReportProgressPanel.ReportStatus.CANCELED) {
 
  195             progressPanel.updateStatusLabel(
 
  196                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processing",
 
  197                             type.getDisplayName()));
 
  200             if (type.getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID()) {
 
  201                 writeKeywordHits(tableReport, comment, tagNamesFilter);
 
  203             } 
else if (type.getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID()) {
 
  204                 writeHashsetHits(tableReport, comment, tagNamesFilter);
 
  208             List<ArtifactData> artifactList = getFilteredArtifacts(type, tagNamesFilter);
 
  210             if (artifactList.isEmpty()) {
 
  219             if (type.getTypeID() == BlackboardArtifact.ARTIFACT_TYPE.TSK_ACCOUNT.getTypeID()) {
 
  221                 ListMultimap<String, ArtifactData> groupedArtifacts = Multimaps.index(artifactList,
 
  224                                 return artifactData.getArtifact().getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ACCOUNT_TYPE)).getValueString();
 
  225                             } 
catch (TskCoreException ex) {
 
  226                                 logger.log(Level.SEVERE, 
"Unable to get value of TSK_ACCOUNT_TYPE attribute. Defaulting to \"unknown\"", ex);
 
  230                 for (String accountTypeStr : groupedArtifacts.keySet()) {
 
  237                     String accountDisplayname = accountTypeStr;
 
  238                     if (accountTypeStr != null) {
 
  240                             Account.Type acctType = Case.getCurrentCaseThrows().getSleuthkitCase().getCommunicationsManager().getAccountType(accountTypeStr);
 
  241                             if (acctType != null) {
 
  242                                 accountDisplayname = acctType.getDisplayName();
 
  244                         } 
catch (TskCoreException | NoCurrentCaseException ex) {
 
  245                             logger.log(Level.SEVERE, 
"Unable to get display name for account type " + accountTypeStr, ex);
 
  249                     final String compundDataTypeName = BlackboardArtifact.ARTIFACT_TYPE.TSK_ACCOUNT.getDisplayName() + 
": " + accountDisplayname;
 
  250                     writeTableForDataType(
new ArrayList<>(groupedArtifacts.get(accountTypeStr)), type, compundDataTypeName, comment);
 
  254                 writeTableForDataType(artifactList, type, type.getDisplayName(), comment);
 
  269     private void writeTableForDataType(List<ArtifactData> artifactList, BlackboardArtifact.Type type, String tableName, String comment) {
 
  274         Set<BlackboardAttribute.Type> attrTypeSet = 
new TreeSet<>(Comparator.comparing(BlackboardAttribute.Type::getDisplayName));
 
  275         for (ArtifactData data : artifactList) {
 
  276             List<BlackboardAttribute> attributes = data.getAttributes();
 
  277             for (BlackboardAttribute attribute : attributes) {
 
  278                 attrTypeSet.add(attribute.getAttributeType());
 
  286         List<Column> columns = getArtifactTableColumns(type.getTypeID(), attrTypeSet);
 
  287         if (columns.isEmpty()) {
 
  290         columnHeaderMap.put(type.getTypeID(), columns);
 
  296         Collections.sort(artifactList);
 
  298         tableReport.startDataType(tableName, comment);
 
  301         for (ArtifactData artifactData : artifactList) {
 
  304             List<String> rowData = artifactData.getRow();
 
  305             if (rowData.isEmpty()) {
 
  309             tableReport.addRow(rowData);
 
  312         progressPanel.increment();
 
  313         tableReport.endTable();
 
  314         tableReport.endDataType();
 
  320     @Messages({
"ReportGenerator.tagTable.header.userName=User Name"})
 
  321     @SuppressWarnings(
"deprecation")
 
  322     private 
void makeContentTagsTables() {
 
  325         List<ContentTag> tags;
 
  327             tags = Case.getCurrentCaseThrows().getServices().getTagsManager().getAllContentTags();
 
  328         } 
catch (TskCoreException | NoCurrentCaseException ex) {
 
  329             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetContentTags"));
 
  330             logger.log(Level.SEVERE, 
"failed to get content tags", ex); 
 
  337         progressPanel.updateStatusLabel(
 
  338                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processing",
 
  339                         BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE.getDisplayName()));
 
  340         ArrayList<String> columnHeaders = 
new ArrayList<>(Arrays.asList(
 
  341                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.tag"),
 
  342                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.file"),
 
  343                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.comment"),
 
  344                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.tagTable.header.userName"),
 
  345                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.timeModified"),
 
  346                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.timeChanged"),
 
  347                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.timeAccessed"),
 
  348                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.timeCreated"),
 
  349                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.size"),
 
  350                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.htmlOutput.header.hash")));
 
  352         StringBuilder comment = 
new StringBuilder();
 
  353         if (!tagNamesFilter.isEmpty()) {
 
  355                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.makeContTagTab.taggedFiles.msg"));
 
  356             comment.append(makeCommaSeparatedList(tagNamesFilter));
 
  358         if (tableReport instanceof HTMLReport) {
 
  359             HTMLReport htmlReportModule = (HTMLReport) tableReport;
 
  360             htmlReportModule.startDataType(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE.getDisplayName(), comment.toString());
 
  361             htmlReportModule.startContentTagsTable(columnHeaders);
 
  363             tableReport.startDataType(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_FILE.getDisplayName(), comment.toString());
 
  364             tableReport.startTable(columnHeaders);
 
  368         for (ContentTag tag : tags) {
 
  370                 if(shouldFilterFromReport(tag.getContent())) {
 
  373             } 
catch (TskCoreException ex) {
 
  374                 errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetContentTags"));
 
  375                 logger.log(Level.SEVERE, 
"Failed to access content data from the case database.", ex); 
 
  380             String notableString = tag.getName().getKnownStatus() == TskData.FileKnown.BAD ? TagsManager.getNotableTagLabel() : 
"";
 
  381             if (passesTagNamesFilter(tag.getName().getDisplayName() + notableString) == 
false) {
 
  387                 fileName = tag.getContent().getUniquePath();
 
  388             } 
catch (TskCoreException ex) {
 
  389                 fileName = tag.getContent().getName();
 
  392             ArrayList<String> rowData = 
new ArrayList<>(Arrays.asList(tag.getName().getDisplayName() + notableString, fileName, tag.getComment(), tag.getUserName()));
 
  393             Content content = tag.getContent();
 
  394             if (content instanceof AbstractFile) {
 
  395                 AbstractFile file = (AbstractFile) content;
 
  398                 rowData.add(file.getMtimeAsDate());
 
  399                 rowData.add(file.getCtimeAsDate());
 
  400                 rowData.add(file.getAtimeAsDate());
 
  401                 rowData.add(file.getCrtimeAsDate());
 
  402                 rowData.add(Long.toString(file.getSize()));
 
  403                 rowData.add(file.getMd5Hash());
 
  406             if (tableReport instanceof HTMLReport) {
 
  407                 HTMLReport htmlReportModule = (HTMLReport) tableReport;
 
  408                 htmlReportModule.addRowWithTaggedContentHyperlink(rowData, tag);
 
  410                 tableReport.addRow(rowData);
 
  414             checkIfTagHasImage(tag);
 
  418         progressPanel.increment();
 
  419         tableReport.endTable();
 
  420         tableReport.endDataType();
 
  426     @SuppressWarnings(
"deprecation")
 
  428         "ReportGenerator.errList.failedGetBBArtifactTags=Failed to get result tags." 
  430     private void makeBlackboardArtifactTagsTables() {
 
  432         List<BlackboardArtifactTag> tags;
 
  434             tags = Case.getCurrentCaseThrows().getServices().getTagsManager().getAllBlackboardArtifactTags();
 
  435         } 
catch (TskCoreException | NoCurrentCaseException ex) {
 
  436             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetBBArtifactTags"));
 
  437             logger.log(Level.SEVERE, 
"failed to get blackboard artifact tags", ex); 
 
  443         progressPanel.updateStatusLabel(
 
  444                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processing",
 
  445                         BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_ARTIFACT.getDisplayName()));
 
  446         StringBuilder comment = 
new StringBuilder();
 
  447         if (!tagNamesFilter.isEmpty()) {
 
  449                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.makeBbArtTagTab.taggedRes.msg"));
 
  450             comment.append(makeCommaSeparatedList(tagNamesFilter));
 
  452         tableReport.startDataType(BlackboardArtifact.ARTIFACT_TYPE.TSK_TAG_ARTIFACT.getDisplayName(), comment.toString());
 
  453         tableReport.startTable(
new ArrayList<>(Arrays.asList(
 
  454                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.tagTable.header.resultType"),
 
  455                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.tagTable.header.tag"),
 
  456                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.tagTable.header.comment"),
 
  457                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.tagTable.header.srcFile"),
 
  458                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.tagTable.header.userName"))));
 
  461         for (BlackboardArtifactTag tag : tags) {
 
  463                 if(shouldFilterFromReport(tag.getContent())) {
 
  466             }  
catch (TskCoreException ex) {
 
  467                 errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetBBArtifactTags"));
 
  468                 logger.log(Level.SEVERE, 
"Failed to access content data from the case database.", ex); 
 
  472             String notableString = tag.getName().getKnownStatus() == TskData.FileKnown.BAD ? TagsManager.getNotableTagLabel() : 
"";
 
  473             if (passesTagNamesFilter(tag.getName().getDisplayName() + notableString) == 
false) {
 
  478             row = 
new ArrayList<>(Arrays.asList(tag.getArtifact().getArtifactTypeName(), tag.getName().getDisplayName() + notableString,
 
  479                     tag.getComment(), tag.getContent().getName(), tag.getUserName()));
 
  480             tableReport.addRow(row);
 
  483             checkIfTagHasImage(tag);
 
  487         progressPanel.increment();
 
  488         tableReport.endTable();
 
  489         tableReport.endDataType();
 
  499     private boolean passesTagNamesFilter(String tagName) {
 
  500         return tagNamesFilter.isEmpty() || tagNamesFilter.contains(tagName);
 
  506     private void makeThumbnailTable() {
 
  507         progressPanel.updateStatusLabel(
 
  508                 NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.createdThumb.text"));
 
  510         if (tableReport instanceof HTMLReport) {
 
  511             HTMLReport htmlModule = (HTMLReport) tableReport;
 
  512             htmlModule.startDataType(
 
  513                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.thumbnailTable.name"),
 
  514                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.thumbnailTable.desc"));
 
  515             List<String> emptyHeaders = 
new ArrayList<>();
 
  516             for (
int i = 0; i < HTMLReport.THUMBNAIL_COLUMNS; i++) {
 
  517                 emptyHeaders.add(
"");
 
  519             htmlModule.startTable(emptyHeaders);
 
  521             htmlModule.addThumbnailRows(images);
 
  523             htmlModule.endTable();
 
  524             htmlModule.endDataType();
 
  535     private void checkIfTagHasImage(BlackboardArtifactTag artifactTag) {
 
  538             file = Case.getCurrentCaseThrows().getSleuthkitCase().getAbstractFileById(artifactTag.getArtifact().getObjectID());
 
  539         } 
catch (TskCoreException | NoCurrentCaseException ex) {
 
  541                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.errGetContentFromBBArtifact"));
 
  542             logger.log(Level.WARNING, 
"Error while getting content from a blackboard artifact to report on.", ex); 
 
  547             checkIfFileIsImage(file);
 
  558     private void checkIfTagHasImage(ContentTag contentTag) {
 
  559         Content c = contentTag.getContent();
 
  560         if (c instanceof AbstractFile == 
false) {
 
  563         checkIfFileIsImage((AbstractFile) c);
 
  571     private void checkIfFileIsImage(AbstractFile file) {
 
  574                 || file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNALLOC_BLOCKS
 
  575                 || file.getType() == TskData.TSK_DB_FILES_TYPE_ENUM.UNUSED_BLOCKS) {
 
  579         if (ImageUtils.thumbnailSupported(file)) {
 
  592     private String makeCommaSeparatedList(Collection<String> items) {
 
  594         for (Iterator<String> iterator = items.iterator(); iterator.hasNext();) {
 
  595             list += iterator.next() + (iterator.hasNext() ? 
", " : 
"");
 
  605     @SuppressWarnings(
"deprecation")
 
  606     @NbBundle.Messages({
"ReportGenerator.errList.noOpenCase=No open case available."})
 
  607     private void writeKeywordHits(TableReportModule tableModule, String comment, HashSet<String> tagNamesFilter) {
 
  614         String orderByClause;
 
  617             openCase = Case.getCurrentCaseThrows();
 
  618         } 
catch (NoCurrentCaseException ex) {
 
  619             errorList.add(Bundle.ReportGenerator_errList_noOpenCase());
 
  620             logger.log(Level.SEVERE, 
"Exception while getting open case: ", ex); 
 
  625         String tagIDList = 
"";
 
  626         if (!tagNamesFilter.isEmpty()) {
 
  628                 Map<String, TagName> tagNamesMap = Case.getCurrentCaseThrows().getServices().getTagsManager().getDisplayNamesToTagNamesMap();
 
  629                 for (String tagDisplayName : tagNamesFilter) {
 
  630                     if (tagNamesMap.containsKey(tagDisplayName)) {
 
  631                         if (!tagIDList.isEmpty()) {
 
  634                         tagIDList += tagNamesMap.get(tagDisplayName).getId();
 
  637                         if (tagDisplayName.endsWith(getNotableTagLabel())) {
 
  638                             String editedDisplayName = tagDisplayName.substring(0, tagDisplayName.length() - getNotableTagLabel().length());
 
  639                             if (tagNamesMap.containsKey(editedDisplayName)) {
 
  640                                 if (!tagIDList.isEmpty()) {
 
  643                                 tagIDList += tagNamesMap.get(editedDisplayName).getId();
 
  648             } 
catch (NoCurrentCaseException | TskCoreException ex) {
 
  649                 logger.log(Level.SEVERE, 
"Exception while getting tag info - proceeding without tag filter: ", ex); 
 
  655         String adHocCountQuery = 
"SELECT COUNT(*) FROM " 
  657                 "(SELECT art.artifact_id FROM blackboard_artifacts AS art, blackboard_attributes AS att1 ";
 
  658         if (!tagIDList.isEmpty()) {
 
  659             adHocCountQuery += 
", blackboard_artifact_tags as tag "; 
 
  661         adHocCountQuery += 
"WHERE (att1.artifact_id = art.artifact_id) AND (art.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() + 
") "; 
 
  662         if (!tagIDList.isEmpty()) {
 
  663             adHocCountQuery += 
" AND (art.artifact_id = tag.artifact_id) AND (tag.tag_name_id IN (" + tagIDList + 
")) "; 
 
  665         adHocCountQuery += 
"EXCEPT " 
  667                 "SELECT art.artifact_id FROM blackboard_artifacts AS art, blackboard_attributes AS att1 WHERE (att1.artifact_id = art.artifact_id) AND (art.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() + 
") AND (att1.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID() + 
")) AS adHocHits"; 
 
  670         try (SleuthkitCase.CaseDbQuery dbQuery = openCase.getSleuthkitCase().executeQuery(adHocCountQuery)) {
 
  671             ResultSet adHocCountResultSet = dbQuery.getResultSet();
 
  672             if (adHocCountResultSet.next()) {
 
  673                 adHocCount = adHocCountResultSet.getInt(1); 
 
  675                 throw new TskCoreException(
"Error counting ad hoc keywords");
 
  677         } 
catch (TskCoreException | SQLException ex) {
 
  678             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedQueryKWLists"));
 
  679             logger.log(Level.SEVERE, 
"Failed to count ad hoc searches with query " + adHocCountQuery, ex); 
 
  684         if (openCase.getCaseType() == Case.CaseType.MULTI_USER_CASE) {
 
  685             orderByClause = 
"ORDER BY convert_to(list, 'SQL_ASCII') ASC NULLS FIRST"; 
 
  687             orderByClause = 
"ORDER BY list ASC"; 
 
  689         String keywordListQuery
 
  690                 = 
"SELECT att.value_text AS list " 
  692                 "FROM blackboard_attributes AS att, blackboard_artifacts AS art "; 
 
  693         if (!tagIDList.isEmpty()) {
 
  694             keywordListQuery += 
", blackboard_artifact_tags as tag "; 
 
  696         keywordListQuery += 
"WHERE att.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID() + 
" " 
  698                 "AND art.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() + 
" " 
  700                 "AND att.artifact_id = art.artifact_id ";
 
  701         if (!tagIDList.isEmpty()) {
 
  702             keywordListQuery += 
"AND (art.artifact_id = tag.artifact_id) " 
  704                     "AND (tag.tag_name_id IN (" + tagIDList + 
")) "; 
 
  706         if (adHocCount > 0) {
 
  707             keywordListQuery += 
" UNION SELECT \'\' AS list ";
 
  709         keywordListQuery = 
"SELECT * FROM ( " + keywordListQuery + 
" ) kwListNames ";
 
  710         keywordListQuery += 
"GROUP BY list " + orderByClause; 
 
  713         try (SleuthkitCase.CaseDbQuery dbQuery = openCase.getSleuthkitCase().executeQuery(keywordListQuery)) {
 
  714             ResultSet listsRs = dbQuery.getResultSet();
 
  715             List<String> lists = 
new ArrayList<>();
 
  716             while (listsRs.next()) {
 
  717                 String list = listsRs.getString(
"list"); 
 
  718                 if (list.isEmpty()) {
 
  719                     list = NbBundle.getMessage(this.getClass(), 
"ReportGenerator.writeKwHits.userSrchs");
 
  725             tableModule.startDataType(BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getDisplayName(), comment);
 
  726             tableModule.addSetIndex(lists);
 
  727             progressPanel.updateStatusLabel(
 
  728                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processing",
 
  729                             BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getDisplayName()));
 
  730         } 
catch (TskCoreException | SQLException ex) {
 
  731             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedQueryKWLists"));
 
  732             logger.log(Level.SEVERE, 
"Failed to query keyword lists with query " + keywordListQuery, ex); 
 
  737         if (openCase.getCaseType() == Case.CaseType.MULTI_USER_CASE) {
 
  738             orderByClause = 
"ORDER BY convert_to(list, 'SQL_ASCII') ASC NULLS FIRST, "  
  739                     + 
"convert_to(keyword, 'SQL_ASCII') ASC NULLS FIRST, "  
  740                     + 
"convert_to(parent_path, 'SQL_ASCII') ASC NULLS FIRST, "  
  741                     + 
"convert_to(name, 'SQL_ASCII') ASC NULLS FIRST, "  
  742                     + 
"convert_to(preview, 'SQL_ASCII') ASC NULLS FIRST"; 
 
  744             orderByClause = 
"ORDER BY list ASC, keyword ASC, parent_path ASC, name ASC, preview ASC"; 
 
  748         String keywordListsQuery
 
  749                 = 
"SELECT art.artifact_id AS artifact_id, art.obj_id AS 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 " 
  751                 "FROM blackboard_artifacts AS art, blackboard_attributes AS att1, blackboard_attributes AS att2, blackboard_attributes AS att3, tsk_files AS f " 
  753                 "WHERE (att1.artifact_id = art.artifact_id) " 
  755                 "AND (att2.artifact_id = art.artifact_id) " 
  757                 "AND (att3.artifact_id = art.artifact_id) " 
  759                 "AND (f.obj_id = art.obj_id) " 
  761                 "AND (att1.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID() + 
") " 
  763                 "AND (att2.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_PREVIEW.getTypeID() + 
") " 
  765                 "AND (att3.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID() + 
") " 
  767                 "AND (art.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() + 
") ";
 
  770         String keywordAdHocQuery
 
  771                 = 
"SELECT art.artifact_id AS artifact_id, art.obj_id AS obj_id, att1.value_text AS keyword, att2.value_text AS preview, \'\' AS list, f.name AS name, f.parent_path AS parent_path " 
  773                 "FROM blackboard_artifacts AS art, blackboard_attributes AS att1, blackboard_attributes AS att2, tsk_files AS f " 
  777                 " (art.artifact_id IN (SELECT art.artifact_id FROM blackboard_artifacts AS art, blackboard_attributes AS att1 WHERE (att1.artifact_id = art.artifact_id) AND (art.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() + 
") " 
  781                 "SELECT art.artifact_id FROM blackboard_artifacts AS art, blackboard_attributes AS att1 WHERE (att1.artifact_id = art.artifact_id) AND (art.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() + 
") AND (att1.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID() + 
"))) " 
  783                 "AND (att1.artifact_id = art.artifact_id) " 
  785                 "AND (att2.artifact_id = art.artifact_id) " 
  787                 "AND (f.obj_id = art.obj_id) " 
  789                 "AND (att1.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID() + 
") " 
  791                 "AND (att2.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_PREVIEW.getTypeID() + 
") " 
  793                 "AND (art.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() + 
") "; 
 
  795         String keywordsQuery = 
"SELECT * FROM ( " + keywordListsQuery + 
" UNION " + keywordAdHocQuery + 
" ) kwHits " + orderByClause;
 
  797         try (SleuthkitCase.CaseDbQuery dbQuery = openCase.getSleuthkitCase().executeQuery(keywordsQuery)) {
 
  798             ResultSet resultSet = dbQuery.getResultSet();
 
  800             String currentKeyword = 
"";
 
  801             String currentList = 
"";
 
  802             while (resultSet.next()) {
 
  804                 if (progressPanel.getStatus() == ReportProgressPanel.ReportStatus.CANCELED) {
 
  809                 HashSet<String> uniqueTagNames = getUniqueTagNames(resultSet.getLong(
"artifact_id")); 
 
  810                 if (failsTagFilter(uniqueTagNames, tagNamesFilter)) {
 
  813                 String tagsList = makeCommaSeparatedList(uniqueTagNames);
 
  815                 Long objId = resultSet.getLong(
"obj_id"); 
 
  816                 String keyword = resultSet.getString(
"keyword"); 
 
  817                 String preview = resultSet.getString(
"preview"); 
 
  818                 String list = resultSet.getString(
"list"); 
 
  819                 String uniquePath = 
"";
 
  822                     AbstractFile f = openCase.getSleuthkitCase().getAbstractFileById(objId);
 
  824                         uniquePath = openCase.getSleuthkitCase().getAbstractFileById(objId).getUniquePath();
 
  825                         if(shouldFilterFromReport(f)) {
 
  829                 } 
catch (TskCoreException ex) {
 
  831                             NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetAbstractFileByID"));
 
  832                     logger.log(Level.WARNING, 
"Failed to get Abstract File by ID.", ex); 
 
  836                 if ((!list.equals(currentList) && !list.isEmpty()) || (list.isEmpty() && !currentList.equals(
 
  837                         NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.writeKwHits.userSrchs")))) {
 
  838                     if (!currentList.isEmpty()) {
 
  839                         tableModule.endTable();
 
  840                         tableModule.endSet();
 
  842                     currentList = list.isEmpty() ? NbBundle
 
  843                             .getMessage(this.getClass(), 
"ReportGenerator.writeKwHits.userSrchs") : list;
 
  845                     tableModule.startSet(currentList);
 
  846                     progressPanel.updateStatusLabel(
 
  847                             NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processingList",
 
  848                                     BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getDisplayName(), currentList));
 
  850                 if (!keyword.equals(currentKeyword)) {
 
  852                     if (!currentKeyword.equals(
"")) {
 
  853                         tableModule.endTable();
 
  857                     currentKeyword = keyword;
 
  858                     tableModule.addSetElement(currentKeyword);
 
  859                     List<String> columnHeaderNames = 
new ArrayList<>();
 
  860                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.preview"));
 
  861                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.srcFile"));
 
  862                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tags"));
 
  863                     tableModule.startTable(columnHeaderNames);
 
  866                 tableModule.addRow(Arrays.asList(
new String[]{preview, uniquePath, tagsList}));
 
  870             if (!currentKeyword.isEmpty()) {
 
  871                 tableModule.endTable();
 
  875             progressPanel.increment();
 
  876             tableModule.endDataType();
 
  877         } 
catch (TskCoreException | SQLException ex) {
 
  878             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedQueryKWs"));
 
  879             logger.log(Level.SEVERE, 
"Failed to query keywords with query " + keywordsQuery, ex); 
 
  888     @SuppressWarnings(
"deprecation")
 
  889     private 
void writeHashsetHits(TableReportModule tableModule, String comment, HashSet<String> tagNamesFilter) {
 
  890         String orderByClause;
 
  893             openCase = Case.getCurrentCaseThrows();
 
  894         } 
catch (NoCurrentCaseException ex) {
 
  895             errorList.add(Bundle.ReportGenerator_errList_noOpenCase());
 
  896             logger.log(Level.SEVERE, 
"Exception while getting open case: ", ex); 
 
  899         if (openCase.getCaseType() == Case.CaseType.MULTI_USER_CASE) {
 
  900             orderByClause = 
"ORDER BY convert_to(att.value_text, 'SQL_ASCII') ASC NULLS FIRST"; 
 
  902             orderByClause = 
"ORDER BY att.value_text ASC"; 
 
  905                 = 
"SELECT att.value_text AS list " 
  907                 "FROM blackboard_attributes AS att, blackboard_artifacts AS art " 
  909                 "WHERE att.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID() + 
" " 
  911                 "AND art.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID() + 
" " 
  913                 "AND att.artifact_id = art.artifact_id " 
  915                 "GROUP BY list " + orderByClause; 
 
  917         try (SleuthkitCase.CaseDbQuery dbQuery = openCase.getSleuthkitCase().executeQuery(hashsetsQuery)) {
 
  919             ResultSet listsRs = dbQuery.getResultSet();
 
  920             List<String> lists = 
new ArrayList<>();
 
  921             while (listsRs.next()) {
 
  922                 lists.add(listsRs.getString(
"list")); 
 
  925             tableModule.startDataType(BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getDisplayName(), comment);
 
  926             tableModule.addSetIndex(lists);
 
  927             progressPanel.updateStatusLabel(
 
  928                     NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processing",
 
  929                             BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getDisplayName()));
 
  930         } 
catch (TskCoreException | SQLException ex) {
 
  931             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedQueryHashsetLists"));
 
  932             logger.log(Level.SEVERE, 
"Failed to query hashset lists: ", ex); 
 
  936         if (openCase.getCaseType() == Case.CaseType.MULTI_USER_CASE) {
 
  937             orderByClause = 
"ORDER BY convert_to(att.value_text, 'SQL_ASCII') ASC NULLS FIRST, "  
  938                     + 
"convert_to(f.parent_path, 'SQL_ASCII') ASC NULLS FIRST, "  
  939                     + 
"convert_to(f.name, 'SQL_ASCII') ASC NULLS FIRST, "  
  940                     + 
"size ASC NULLS FIRST"; 
 
  942             orderByClause = 
"ORDER BY att.value_text ASC, f.parent_path ASC, f.name ASC, size ASC"; 
 
  944         String hashsetHitsQuery
 
  945                 = 
"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 " 
  947                 "FROM blackboard_artifacts AS art, blackboard_attributes AS att, tsk_files AS f " 
  949                 "WHERE (att.artifact_id = art.artifact_id) " 
  951                 "AND (f.obj_id = art.obj_id) " 
  953                 "AND (att.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME.getTypeID() + 
") " 
  955                 "AND (art.artifact_type_id = " + BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID() + 
") " 
  959         try (SleuthkitCase.CaseDbQuery dbQuery = openCase.getSleuthkitCase().executeQuery(hashsetHitsQuery)) {
 
  961             ResultSet resultSet = dbQuery.getResultSet();
 
  962             String currentSet = 
"";
 
  963             while (resultSet.next()) {
 
  965                 if (progressPanel.getStatus() == ReportProgressPanel.ReportStatus.CANCELED) {
 
  970                 HashSet<String> uniqueTagNames = getUniqueTagNames(resultSet.getLong(
"artifact_id")); 
 
  971                 if (failsTagFilter(uniqueTagNames, tagNamesFilter)) {
 
  974                 String tagsList = makeCommaSeparatedList(uniqueTagNames);
 
  976                 Long objId = resultSet.getLong(
"obj_id"); 
 
  977                 String set = resultSet.getString(
"setname"); 
 
  978                 String size = resultSet.getString(
"size"); 
 
  979                 String uniquePath = 
"";
 
  982                     AbstractFile f = openCase.getSleuthkitCase().getAbstractFileById(objId);
 
  984                         uniquePath = openCase.getSleuthkitCase().getAbstractFileById(objId).getUniquePath();
 
  985                         if(shouldFilterFromReport(f)) {
 
  989                 } 
catch (TskCoreException ex) {
 
  991                             NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetAbstractFileFromID"));
 
  992                     logger.log(Level.WARNING, 
"Failed to get Abstract File from ID.", ex); 
 
  997                 if (!set.equals(currentSet)) {
 
  998                     if (!currentSet.isEmpty()) {
 
  999                         tableModule.endTable();
 
 1000                         tableModule.endSet();
 
 1003                     tableModule.startSet(currentSet);
 
 1004                     List<String> columnHeaderNames = 
new ArrayList<>();
 
 1005                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.file"));
 
 1006                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.size"));
 
 1007                     columnHeaderNames.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tags"));
 
 1008                     tableModule.startTable(columnHeaderNames);
 
 1009                     progressPanel.updateStatusLabel(
 
 1010                             NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.progress.processingList",
 
 1011                                     BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getDisplayName(), currentSet));
 
 1015                 tableModule.addRow(Arrays.asList(
new String[]{uniquePath, size, tagsList}));
 
 1019             progressPanel.increment();
 
 1020             tableModule.endDataType();
 
 1021         } 
catch (TskCoreException | SQLException ex) {
 
 1022             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedQueryHashsetHits"));
 
 1023             logger.log(Level.SEVERE, 
"Failed to query hashsets hits: ", ex); 
 
 1030     List<String> getErrorList() {
 
 1043         private List<String> rowData = null;
 
 1046         ArtifactData(BlackboardArtifact artifact, List<BlackboardAttribute> attrs, HashSet<String> tags) {
 
 1048             this.attributes = attrs;
 
 1052             } 
catch (TskCoreException | NoCurrentCaseException ex) {
 
 1053                 logger.log(Level.SEVERE, 
"Could not get content from database", ex);
 
 1070             return artifact.getArtifactID();
 
 1074             return artifact.getObjectID();
 
 1095             List<String> thisRow = 
getRow();
 
 1096             List<String> otherRow = otherArtifactData.
getRow();
 
 1097             for (
int i = 0; i < thisRow.size(); i++) {
 
 1098                 int compare = thisRow.get(i).compareTo(otherRow.get(i));
 
 1114             if (rowData == null) {
 
 1119                     if (rowData.size() > 0) {
 
 1121                         for (
int i = 0; i < rowData.size(); i++) {
 
 1122                             if (rowData.get(i) == null) {
 
 1128                         return new ArrayList<>();
 
 1130                 } 
catch (TskCoreException ex) {
 
 1132                             NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.coreExceptionWhileGenRptRow"));
 
 1133                     logger.log(Level.WARNING, 
"Core exception while generating row data for artifact report.", ex); 
 
 1134                     rowData = Collections.<String>emptyList();
 
 1151             List<String> orderedRowData = 
new ArrayList<>();
 
 1152             if (BlackboardArtifact.ARTIFACT_TYPE.TSK_EXT_MISMATCH_DETECTED.getTypeID() == 
getArtifact().getArtifactTypeID()) {
 
 1153                 if (content != null && content instanceof AbstractFile) {
 
 1154                     AbstractFile file = (AbstractFile) content;
 
 1155                     orderedRowData.add(file.getName());
 
 1156                     orderedRowData.add(file.getNameExtension());
 
 1157                     String mimeType = file.getMIMEType();
 
 1158                     if (mimeType == null) {
 
 1159                         orderedRowData.add(
"");
 
 1161                         orderedRowData.add(mimeType);
 
 1163                     orderedRowData.add(file.getUniquePath());
 
 1166                     orderedRowData.add(null);
 
 1167                     orderedRowData.add(null);
 
 1168                     orderedRowData.add(null);
 
 1169                     orderedRowData.add(null);
 
 1171                 orderedRowData.add(makeCommaSeparatedList(
getTags()));
 
 1173             } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID() == 
getArtifact().getArtifactTypeID()) {
 
 1174                 String[] attributeDataArray = 
new String[5];
 
 1176                 for (BlackboardAttribute attr : attributes) {
 
 1177                     if (attr.getAttributeType().equals(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME))) {
 
 1178                         attributeDataArray[0] = attr.getDisplayString();
 
 1179                     } 
else if (attr.getAttributeType().equals(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY))) {
 
 1180                         attributeDataArray[1] = attr.getDisplayString();
 
 1181                     } 
else if (attr.getAttributeType().equals(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_COMMENT))) {
 
 1182                         attributeDataArray[3] = attr.getDisplayString();
 
 1183                     } 
else if (attr.getAttributeType().equals(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DESCRIPTION))) {
 
 1184                         attributeDataArray[4] = attr.getDisplayString();
 
 1188                 attributeDataArray[2] = content.getUniquePath();
 
 1189                 orderedRowData.addAll(Arrays.asList(attributeDataArray));
 
 1191                 HashSet<String> allTags = 
getTags();
 
 1194                     for (ContentTag ct : contentTags) {
 
 1196                         allTags.add(ct.getName().getDisplayName() + notableString);
 
 1198                 } 
catch (TskCoreException | NoCurrentCaseException ex) {
 
 1199                     errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetContentTags"));
 
 1200                     logger.log(Level.SEVERE, 
"Failed to get content tags", ex); 
 
 1202                 orderedRowData.add(makeCommaSeparatedList(allTags));
 
 1204             } 
else if (columnHeaderMap.containsKey(
this.artifact.getArtifactTypeID())) {
 
 1206                 for (
Column currColumn : columnHeaderMap.get(
this.artifact.getArtifactTypeID())) {
 
 1207                     String cellData = currColumn.getCellData(
this);
 
 1208                     orderedRowData.add(cellData);
 
 1212             return orderedRowData;
 
 1226     private List<ArtifactData> getFilteredArtifacts(BlackboardArtifact.Type type, HashSet<String> tagNamesFilter) {
 
 1227         List<ArtifactData> artifacts = 
new ArrayList<>();
 
 1230                 if(shouldFilterFromReport(artifact)) {
 
 1234                 List<BlackboardArtifactTag> tags = Case.getCurrentCaseThrows().getServices().getTagsManager().getBlackboardArtifactTagsByArtifact(artifact);
 
 1235                 HashSet<String> uniqueTagNames = 
new HashSet<>();
 
 1236                 for (BlackboardArtifactTag tag : tags) {
 
 1237                     String notableString = tag.getName().getKnownStatus() == TskData.FileKnown.BAD ? TagsManager.getNotableTagLabel() : 
"";
 
 1238                     uniqueTagNames.add(tag.getName().getDisplayName() + notableString);
 
 1240                 if (failsTagFilter(uniqueTagNames, tagNamesFilter)) {
 
 1244                     artifacts.add(
new ArtifactData(artifact, Case.getCurrentCaseThrows().getSleuthkitCase().getBlackboardAttributes(artifact), uniqueTagNames));
 
 1245                 } 
catch (TskCoreException ex) {
 
 1246                     errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetBBAttribs"));
 
 1247                     logger.log(Level.SEVERE, 
"Failed to get Blackboard Attributes when generating report.", ex); 
 
 1250         } 
catch (TskCoreException | NoCurrentCaseException ex) {
 
 1251             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetBBArtifacts"));
 
 1252             logger.log(Level.SEVERE, 
"Failed to get Blackboard Artifacts when generating report.", ex); 
 
 1257     private Boolean failsTagFilter(HashSet<String> tagNames, HashSet<String> tagsNamesFilter) {
 
 1258         if (null == tagsNamesFilter || tagsNamesFilter.isEmpty()) {
 
 1262         HashSet<String> filteredTagNames = 
new HashSet<>(tagNames);
 
 1263         filteredTagNames.retainAll(tagsNamesFilter);
 
 1264         return filteredTagNames.isEmpty();
 
 1277     @Messages({
"ReportGenerator.artTableColHdr.comment=Comment"})
 
 1278     @SuppressWarnings(
"deprecation")
 
 1279     private List<Column> getArtifactTableColumns(
int artifactTypeId, Set<BlackboardAttribute.Type> attributeTypeSet) {
 
 1280         ArrayList<Column> columns = 
new ArrayList<>();
 
 1284         if (BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID() == artifactTypeId) {
 
 1285             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.url"),
 
 1286                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL)));
 
 1288             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.title"),
 
 1289                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TITLE)));
 
 1291             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateCreated"),
 
 1292                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_CREATED)));
 
 1294             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1295                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1297         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID() == artifactTypeId) {
 
 1298             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.url"),
 
 1299                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL)));
 
 1301             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1302                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1304             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1305                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1307             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.value"),
 
 1308                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_VALUE)));
 
 1310             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1311                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1313         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID() == artifactTypeId) {
 
 1314             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.url"),
 
 1315                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL)));
 
 1317             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateAccessed"),
 
 1318                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED)));
 
 1320             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.referrer"),
 
 1321                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_REFERRER)));
 
 1323             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.title"),
 
 1324                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TITLE)));
 
 1326             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1327                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1329             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.urlDomainDecoded"),
 
 1330                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL_DECODED)));
 
 1332         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID() == artifactTypeId) {
 
 1333             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dest"),
 
 1334                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH)));
 
 1336             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.sourceUrl"),
 
 1337                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL)));
 
 1339             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateAccessed"),
 
 1340                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED)));
 
 1342             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1343                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1345             attributeTypeSet.remove(
new Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH_ID));
 
 1346         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_RECENT_OBJECT.getTypeID() == artifactTypeId) {
 
 1347             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.path"),
 
 1348                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH)));
 
 1350             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1351                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED )));
 
 1353             attributeTypeSet.remove(
new Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH_ID));
 
 1354         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_INSTALLED_PROG.getTypeID() == artifactTypeId) {
 
 1355             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.progName"),
 
 1356                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1358             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.instDateTime"),
 
 1359                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1361         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID() == artifactTypeId) {
 
 1362             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.preview")));
 
 1364         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT.getTypeID() == artifactTypeId) {
 
 1365             columns.add(
new SourceFileColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.file")));
 
 1367             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.size")));
 
 1369         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID() == artifactTypeId) {
 
 1370             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.devMake"),
 
 1371                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_MAKE)));
 
 1373             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.devModel"),
 
 1374                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_MODEL)));
 
 1376             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.deviceId"),
 
 1377                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_ID)));
 
 1379             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1380                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1382         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_SEARCH_QUERY.getTypeID() == artifactTypeId) {
 
 1383             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.text"),
 
 1384                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TEXT)));
 
 1386             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.domain"),
 
 1387                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DOMAIN)));
 
 1389             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateAccessed"),
 
 1390                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_ACCESSED)));
 
 1392             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.progName"),
 
 1393                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1395         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF.getTypeID() == artifactTypeId) {
 
 1396             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTaken"),
 
 1397                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_CREATED)));
 
 1399             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.devManufacturer"),
 
 1400                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_MAKE)));
 
 1402             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.devModel"),
 
 1403                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_MODEL)));
 
 1405             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitude"),
 
 1406                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE)));
 
 1408             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitude"),
 
 1409                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE)));
 
 1411             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.altitude"),
 
 1412                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE)));
 
 1414         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT.getTypeID() == artifactTypeId) {
 
 1415             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.personName"),
 
 1416                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1418             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.phoneNumber"),
 
 1419                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER)));
 
 1421             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.phoneNumHome"),
 
 1422                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_HOME)));
 
 1424             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.phoneNumOffice"),
 
 1425                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_OFFICE)));
 
 1427             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.phoneNumMobile"),
 
 1428                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_MOBILE)));
 
 1430             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.email"),
 
 1431                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL)));
 
 1433         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE.getTypeID() == artifactTypeId) {
 
 1434             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.msgType"),
 
 1435                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MESSAGE_TYPE)));
 
 1437             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.direction"),
 
 1438                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DIRECTION)));
 
 1440             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.readStatus"),
 
 1441                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_READ_STATUS)));
 
 1443             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1444                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1446             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.fromPhoneNum"),
 
 1447                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM)));
 
 1449             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.fromEmail"),
 
 1450                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_FROM)));
 
 1452             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.toPhoneNum"),
 
 1453                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO)));
 
 1455             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.toEmail"),
 
 1456                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_TO)));
 
 1458             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.subject"),
 
 1459                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT)));
 
 1461             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.text"),
 
 1462                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_TEXT)));
 
 1464         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG.getTypeID() == artifactTypeId) {
 
 1465             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.personName"),
 
 1466                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1468             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.fromPhoneNum"),
 
 1469                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM)));
 
 1471             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.toPhoneNum"),
 
 1472                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO)));
 
 1474             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1475                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START)));
 
 1477             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.direction"),
 
 1478                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DIRECTION)));
 
 1480         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_CALENDAR_ENTRY.getTypeID() == artifactTypeId) {
 
 1481             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.calendarEntryType"),
 
 1482                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CALENDAR_ENTRY_TYPE)));
 
 1484             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.description"),
 
 1485                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DESCRIPTION)));
 
 1487             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.startDateTime"),
 
 1488                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_START)));
 
 1490             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.endDateTime"),
 
 1491                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_END)));
 
 1493             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.location"),
 
 1494                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCATION)));
 
 1496         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_SPEED_DIAL_ENTRY.getTypeID() == artifactTypeId) {
 
 1497             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.shortCut"),
 
 1498                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SHORTCUT)));
 
 1500             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.personName"),
 
 1501                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME_PERSON)));
 
 1503             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.phoneNumber"),
 
 1504                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER)));
 
 1506         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING.getTypeID() == artifactTypeId) {
 
 1507             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.deviceName"),
 
 1508                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_NAME)));
 
 1510             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.deviceAddress"),
 
 1511                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DEVICE_ID)));
 
 1513             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1514                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1516         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID() == artifactTypeId) {
 
 1517             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitude"),
 
 1518                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE)));
 
 1520             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitude"),
 
 1521                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE)));
 
 1523             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1524                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1526         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_BOOKMARK.getTypeID() == artifactTypeId) {
 
 1527             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitude"),
 
 1528                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE)));
 
 1530             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitude"),
 
 1531                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE)));
 
 1533             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.altitude"),
 
 1534                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE)));
 
 1536             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1537                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1539             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.locationAddress"),
 
 1540                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCATION)));
 
 1542             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1543                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1545         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_LAST_KNOWN_LOCATION.getTypeID() == artifactTypeId) {
 
 1546             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitude"),
 
 1547                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE)));
 
 1549             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitude"),
 
 1550                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE)));
 
 1552             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.altitude"),
 
 1553                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE)));
 
 1555             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1556                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1558             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.locationAddress"),
 
 1559                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCATION)));
 
 1561             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1562                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1564         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_SEARCH.getTypeID() == artifactTypeId) {
 
 1565             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitude"),
 
 1566                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE)));
 
 1568             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitude"),
 
 1569                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE)));
 
 1571             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.altitude"),
 
 1572                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE)));
 
 1574             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1575                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1577             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.locationAddress"),
 
 1578                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCATION)));
 
 1580             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1581                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1583         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_SERVICE_ACCOUNT.getTypeID() == artifactTypeId) {
 
 1584             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.category"),
 
 1585                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY)));
 
 1587             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.userId"),
 
 1588                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_USER_ID)));
 
 1590             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.password"),
 
 1591                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PASSWORD)));
 
 1593             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.personName"),
 
 1594                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1596             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.appName"),
 
 1597                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1599             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.url"),
 
 1600                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_URL)));
 
 1602             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.appPath"),
 
 1603                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH)));
 
 1605             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.description"),
 
 1606                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DESCRIPTION)));
 
 1608             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.replytoAddress"),
 
 1609                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_REPLYTO)));
 
 1611             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.mailServer"),
 
 1612                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SERVER_NAME)));
 
 1614         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_DETECTED.getTypeID() == artifactTypeId
 
 1615                 || BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_SUSPECTED.getTypeID() == artifactTypeId) {
 
 1616             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1617                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1619         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_EXT_MISMATCH_DETECTED.getTypeID() == artifactTypeId) {
 
 1620             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.file")));
 
 1622             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.extension.text")));
 
 1624             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.mimeType.text")));
 
 1626             columns.add(
new HeaderOnlyColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.path")));
 
 1628         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_OS_INFO.getTypeID() == artifactTypeId) {
 
 1629             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.processorArchitecture.text"),
 
 1630                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROCESSOR_ARCHITECTURE)));
 
 1632             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.osName.text"),
 
 1633                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1635             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.osInstallDate.text"),
 
 1636                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1638         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG.getTypeID() == artifactTypeId) {
 
 1639             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskEmailTo"),
 
 1640                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_TO)));
 
 1642             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskEmailFrom"),
 
 1643                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_FROM)));
 
 1645             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskSubject"),
 
 1646                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SUBJECT)));
 
 1648             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskDateTimeSent"),
 
 1649                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_SENT)));
 
 1651             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskDateTimeRcvd"),
 
 1652                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME_RCVD)));
 
 1654             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskPath"),
 
 1655                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH)));
 
 1657             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskEmailCc"),
 
 1658                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_CC)));
 
 1660             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskEmailBcc"),
 
 1661                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_EMAIL_BCC)));
 
 1663             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskMsgId"),
 
 1664                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_MSG_ID)));
 
 1666         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_FILE_HIT.getTypeID() == artifactTypeId) {
 
 1667             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskSetName"),
 
 1668                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME)));
 
 1670             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskInterestingFilesCategory"),
 
 1671                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY)));
 
 1673             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskPath"),
 
 1674                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH)));
 
 1676             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.comment"),
 
 1677                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_COMMENT)));
 
 1679             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.description"),
 
 1680                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DESCRIPTION)));
 
 1682         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_ROUTE.getTypeID() == artifactTypeId) {
 
 1683             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskGpsRouteCategory"),
 
 1684                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_CATEGORY)));
 
 1686             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1687                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1689             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitudeEnd"),
 
 1690                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE_END)));
 
 1692             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitudeEnd"),
 
 1693                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE_END)));
 
 1695             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.latitudeStart"),
 
 1696                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE_START)));
 
 1698             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.longitudeStart"),
 
 1699                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE_START)));
 
 1701             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.name"),
 
 1702                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME)));
 
 1704             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.location"),
 
 1705                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCATION)));
 
 1707             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1708                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1710         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID() == artifactTypeId) {
 
 1711             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tskSetName"),
 
 1712                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME)));
 
 1714             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.associatedArtifact"),
 
 1715                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT)));
 
 1717             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1718                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1720         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_PROG_RUN.getTypeID() == artifactTypeId) {
 
 1721             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.program"),
 
 1722                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME)));
 
 1724             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.associatedArtifact"),
 
 1725                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT)));
 
 1727             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.dateTime"),
 
 1728                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME)));
 
 1730             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.count"),
 
 1731                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_COUNT)));
 
 1733         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_OS_ACCOUNT.getTypeID() == artifactTypeId) {
 
 1734             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.userName"),
 
 1735                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_USER_NAME)));
 
 1737             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.userId"),
 
 1738                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_USER_ID)));
 
 1740         } 
else if (BlackboardArtifact.ARTIFACT_TYPE.TSK_REMOTE_DRIVE.getTypeID() == artifactTypeId) {
 
 1741             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.localPath"),
 
 1742                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_LOCAL_PATH)));
 
 1744             columns.add(
new AttributeColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.remotePath"),
 
 1745                     new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_REMOTE_PATH)));
 
 1746         } 
else if (artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_ACCOUNT.getTypeID()) {
 
 1747             columns.add(
new StatusColumn());
 
 1748             attributeTypeSet.remove(
new Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ACCOUNT_TYPE));
 
 1749             attributeTypeSet.remove(
new Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT));
 
 1750             attributeTypeSet.remove(
new Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME));
 
 1751             attributeTypeSet.remove(
new Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_SEARCH_DOCUMENT_ID));
 
 1752         } 
else if (artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_CACHE.getTypeID()) {
 
 1753             attributeTypeSet.remove(
new Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH_ID));
 
 1757             for (BlackboardAttribute.Type type : attributeTypeSet) {
 
 1758                 columns.add(
new AttributeColumn(type.getDisplayName(), type));
 
 1760             columns.add(
new SourceFileColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.srcFile")));
 
 1761             columns.add(
new TaggedResultsColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tags")));
 
 1769         for (Column column : columns) {
 
 1770             attributeTypeSet = column.removeTypeFromSet(attributeTypeSet);
 
 1773         for (BlackboardAttribute.Type type : attributeTypeSet) {
 
 1774             columns.add(
new AttributeColumn(type.getDisplayName(), type));
 
 1777         if (artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID()
 
 1778                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID()
 
 1779                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID()
 
 1780                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID()
 
 1781                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_RECENT_OBJECT.getTypeID()
 
 1782                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_INSTALLED_PROG.getTypeID()
 
 1783                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID()
 
 1784                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_WEB_SEARCH_QUERY.getTypeID()
 
 1785                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_METADATA_EXIF.getTypeID()
 
 1786                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_CONTACT.getTypeID()
 
 1787                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE.getTypeID()
 
 1788                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALLLOG.getTypeID()
 
 1789                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_CALENDAR_ENTRY.getTypeID()
 
 1790                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_SPEED_DIAL_ENTRY.getTypeID()
 
 1791                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING.getTypeID()
 
 1792                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID()
 
 1793                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_BOOKMARK.getTypeID()
 
 1794                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_LAST_KNOWN_LOCATION.getTypeID()
 
 1795                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_SEARCH.getTypeID()
 
 1796                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_AREA.getTypeID()
 
 1797                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_SERVICE_ACCOUNT.getTypeID()
 
 1798                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_DETECTED.getTypeID()
 
 1799                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_ENCRYPTION_SUSPECTED.getTypeID()
 
 1800                 || artifactTypeId == BlackboardArtifact.ARTIFACT_TYPE.TSK_OS_INFO.getTypeID()) {
 
 1801             columns.add(
new SourceFileColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.srcFile")));
 
 1803         columns.add(
new TaggedResultsColumn(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.artTableColHdr.tags")));
 
 1815     private String getFileUniquePath(Content content) {
 
 1817             if (content != null) {
 
 1818                 return content.getUniquePath();
 
 1822         } 
catch (TskCoreException ex) {
 
 1823             errorList.add(NbBundle.getMessage(
this.getClass(), 
"ReportGenerator.errList.failedGetAbstractFileByID"));
 
 1824             logger.log(Level.WARNING, 
"Failed to get Abstract File by ID.", ex); 
 
 1833     private boolean shouldFilterFromReport(Content content) 
throws TskCoreException {
 
 1834         if(this.settings.getSelectedDataSources() == null) {
 
 1838         long dataSourceId = content.getDataSource().getId();
 
 1839         return !this.settings.getSelectedDataSources().contains(dataSourceId);
 
 1851     @SuppressWarnings(
"deprecation")
 
 1852     private HashSet<String> getUniqueTagNames(
long artifactId) throws TskCoreException {
 
 1853         HashSet<String> uniqueTagNames = 
new HashSet<>();
 
 1855         String query = 
"SELECT display_name, artifact_id, knownStatus FROM tag_names AS tn, blackboard_artifact_tags AS bat " 
 1857                 "WHERE tn.tag_name_id = bat.tag_name_id AND bat.artifact_id = " + artifactId; 
 
 1859         try (SleuthkitCase.CaseDbQuery dbQuery = Case.getCurrentCaseThrows().getSleuthkitCase().executeQuery(query)) {
 
 1860             ResultSet tagNameRows = dbQuery.getResultSet();
 
 1861             while (tagNameRows.next()) {
 
 1862                 String notableString = tagNameRows.getInt(
"knownStatus") == TskData.FileKnown.BAD.ordinal() ? getNotableTagLabel() : 
"";
 
 1863                 uniqueTagNames.add(tagNameRows.getString(
"display_name") + notableString); 
 
 1865         } 
catch (TskCoreException | SQLException | NoCurrentCaseException ex) {
 
 1866             throw new TskCoreException(
"Error getting tag names for artifact: ", ex);
 
 1869         return uniqueTagNames;
 
 1879         Set<BlackboardAttribute.Type> 
removeTypeFromSet(Set<BlackboardAttribute.Type> types);
 
 1884         @NbBundle.Messages(
"TableReportGenerator.StatusColumn.Header=Review Status")
 
 1887             return Bundle.TableReportGenerator_StatusColumn_Header();
 
 1892             return artData.
getArtifact().getReviewStatus().getDisplayName();
 
 1915             this.columnHeader = Objects.requireNonNull(columnHeader);
 
 1926             List<BlackboardAttribute> attributes = artData.
getAttributes();
 
 1927             for (BlackboardAttribute attribute : attributes) {
 
 1928                 if (attribute.getAttributeType().equals(this.
attributeType)) {
 
 1929                     if (attribute.getAttributeType().getValueType() != BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.DATETIME) {
 
 1930                         return attribute.getDisplayString();
 
 1961             return getFileUniquePath(artData.
getContent());
 
 1986             return makeCommaSeparatedList(artData.
getTags());
 
 2011             throw new UnsupportedOperationException(
"Cannot get cell data of unspecified column");
 
BlackboardArtifact getArtifact()
 
final String columnHeader
 
String getCellData(ArtifactData artData)
 
List< String > getOrderedRowDataAsStrings()
 
List< BlackboardAttribute > attributes
 
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)
 
static String getStringTime(long epochSeconds, TimeZone tzone)
 
String getCellData(ArtifactData artData)
 
int compareTo(ArtifactData otherArtifactData)
 
final BlackboardAttribute.Type attributeType
 
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)
 
String getCellData(ArtifactData artData)
 
HashSet< String > getTags()
 
List< BlackboardAttribute > getAttributes()
 
String getCellData(ArtifactData artData)
 
String getCellData(ArtifactData artData)
 
final String columnHeader
 
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)
 
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)
 
BlackboardArtifact artifact
 
final String columnHeader
 
TagsManager getTagsManager()
 
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)
 
SleuthkitCase getSleuthkitCase()
 
String getCellData(ArtifactData artData)
 
Set< BlackboardAttribute.Type > removeTypeFromSet(Set< BlackboardAttribute.Type > types)
 
static Case getCurrentCaseThrows()
 
final String columnHeader