20 package org.sleuthkit.autopsy.commonfilesearch;
 
   22 import java.sql.ResultSet;
 
   23 import java.sql.SQLException;
 
   24 import java.util.ArrayList;
 
   25 import java.util.HashMap;
 
   26 import java.util.HashSet;
 
   27 import java.util.List;
 
   30 import java.util.stream.Collectors;
 
   31 import java.util.stream.Stream;
 
   32 import org.openide.util.NbBundle;
 
   37 import org.
sleuthkit.datamodel.SleuthkitCase.CaseDbQuery;
 
   48 @SuppressWarnings(
"PMD.AbstractNaming")
 
   49 abstract class CommonFilesMetadataBuilder {
 
   51     private final Map<Long, String> dataSourceIdToNameMap;
 
   52     private final boolean filterByMedia;
 
   53     private final boolean filterByDoc;
 
   54     private static final String filterByMimeTypesWhereClause = 
" and mime_type in (%s)"; 
 
   63     private static final Set<String> MEDIA_PICS_VIDEO_MIME_TYPES = Stream.of(
 
   69             "image/vnd.adobe.photoshop", 
 
   84             "application/vnd.ms-asf", 
 
   85             "application/vnd.rn-realmedia", 
 
   86             "application/x-shockwave-flash"  
   87     ).collect(Collectors.toSet());
 
   97     private static final Set<String> TEXT_FILES_MIME_TYPES = Stream.of(
 
  105             "application/javascript", 
 
  108             "application/x-msoffice", 
 
  109             "application/x-ooxml", 
 
  110             "application/msword", 
 
  111             "application/vnd.openxmlformats-officedocument.wordprocessingml.document", 
 
  112             "application/vnd.ms-powerpoint", 
 
  113             "application/vnd.openxmlformats-officedocument.presentationml.presentation", 
 
  114             "application/vnd.ms-excel", 
 
  115             "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 
 
  116             "application/vnd.oasis.opendocument.presentation", 
 
  117             "application/vnd.oasis.opendocument.spreadsheet", 
 
  118             "application/vnd.oasis.opendocument.text"  
  119     ).collect(Collectors.toSet());
 
  130     CommonFilesMetadataBuilder(Map<Long, String> dataSourceIdMap, 
boolean filterByMediaMimeType, 
boolean filterByDocMimeType) {
 
  131         dataSourceIdToNameMap = dataSourceIdMap;
 
  132         filterByMedia = filterByMediaMimeType;
 
  133         filterByDoc = filterByDocMimeType;
 
  145     static final String SELECT_PREFIX = 
"SELECT obj_id, md5, data_source_obj_id from tsk_files where"; 
 
  157     protected abstract String buildSqlSelectStatement();
 
  169     public CommonFilesMetadata findCommonFiles() throws TskCoreException, NoCurrentCaseException, SQLException {
 
  171         Map<String, Md5Metadata> commonFiles = 
new HashMap<>();
 
  173         SleuthkitCase sleuthkitCase = Case.getOpenCase().getSleuthkitCase();
 
  174         String selectStatement = this.buildSqlSelectStatement();
 
  177                 CaseDbQuery query = sleuthkitCase.executeQuery(selectStatement);
 
  178                 ResultSet resultSet = query.getResultSet()) {
 
  180             while (resultSet.next()) {
 
  181                 Long objectId = resultSet.getLong(1);
 
  182                 String md5 = resultSet.getString(2);
 
  183                 Long dataSourceId = resultSet.getLong(3);
 
  184                 String dataSource = this.dataSourceIdToNameMap.get(dataSourceId);
 
  186                 if (md5 == null || HashUtility.isNoDataMd5(md5)) {
 
  190                 if (commonFiles.containsKey(md5)) {
 
  191                     final Md5Metadata md5Metadata = commonFiles.get(md5);
 
  192                     md5Metadata.addFileInstanceMetadata(
new FileInstanceMetadata(objectId, dataSource));
 
  194                     final List<FileInstanceMetadata> fileInstances = 
new ArrayList<>();
 
  195                     fileInstances.add(
new FileInstanceMetadata(objectId, dataSource));
 
  196                     Md5Metadata md5Metadata = 
new Md5Metadata(md5, fileInstances);
 
  197                     commonFiles.put(md5, md5Metadata);
 
  202         return new CommonFilesMetadata(commonFiles);
 
  215     String determineMimeTypeFilter() {
 
  217         Set<String> mimeTypesToFilterOn = 
new HashSet<>();
 
  218         String mimeTypeString = 
"";
 
  220             mimeTypesToFilterOn.addAll(MEDIA_PICS_VIDEO_MIME_TYPES);
 
  223             mimeTypesToFilterOn.addAll(TEXT_FILES_MIME_TYPES);
 
  225         StringBuilder mimeTypeFilter = 
new StringBuilder(mimeTypesToFilterOn.size());
 
  226         if (!mimeTypesToFilterOn.isEmpty()) {
 
  227             for (String mimeType : mimeTypesToFilterOn) {
 
  228                 mimeTypeFilter.append(
'"').append(mimeType).append(
"\",");
 
  230             mimeTypeString = mimeTypeFilter.toString().substring(0, mimeTypeFilter.length() - 1);
 
  231             mimeTypeString = String.format(filterByMimeTypesWhereClause, 
new Object[]{mimeTypeString});
 
  233         return mimeTypeString;
 
  237         "CommonFilesMetadataBuilder.buildTabTitle.titleAll=Common Files (All Data Sources, %s)",
 
  238         "CommonFilesMetadataBuilder.buildTabTitle.titleSingle=Common Files (Match Within Data Source: %s, %s)" 
  240     protected abstract String buildTabTitle();
 
  243         "CommonFilesMetadataBuilder.buildCategorySelectionString.doc=Documents",
 
  244         "CommonFilesMetadataBuilder.buildCategorySelectionString.media=Media",
 
  245         "CommonFilesMetadataBuilder.buildCategorySelectionString.all=All File Categories" 
  247     protected String buildCategorySelectionString() {
 
  248         if (!this.filterByDoc && !this.filterByMedia) {
 
  249             return Bundle.CommonFilesMetadataBuilder_buildCategorySelectionString_all();
 
  251             List<String> filters = 
new ArrayList<>();
 
  252             if (this.filterByDoc) {
 
  253                 filters.add(Bundle.CommonFilesMetadataBuilder_buildCategorySelectionString_doc());
 
  255             if (this.filterByMedia) {
 
  256                 filters.add(Bundle.CommonFilesMetadataBuilder_buildCategorySelectionString_media());
 
  258             return String.join(
", ", filters);