19 package org.sleuthkit.autopsy.report.modules.datasourcesummaryexport;
21 import java.awt.Color;
22 import java.sql.SQLException;
23 import java.util.ArrayList;
24 import java.util.Arrays;
25 import java.util.Collections;
26 import java.util.HashSet;
27 import java.util.List;
28 import java.util.stream.Collectors;
29 import java.util.stream.Stream;
30 import org.openide.util.NbBundle.Messages;
49 "ExportTypes_artifactsTypesPieChart_title=Artifact Types",
50 "ExportTypes_filesByCategoryTable_allocatedRow_title=Allocated Files",
51 "ExportTypes_filesByCategoryTable_unallocatedRow_title=Unallocated Files",
52 "ExportTypes_filesByCategoryTable_slackRow_title=Slack Files",
53 "ExportTypes_filesByCategoryTable_directoryRow_title=Directories",
54 "ExportTypes_fileMimeTypesChart_title=File Types",
55 "ExportTypes_fileMimeTypesChart_valueLabel=Count",
56 "ExportTypes_fileMimeTypesChart_audio_title=Audio",
57 "ExportTypes_fileMimeTypesChart_documents_title=Documents",
58 "ExportTypes_fileMimeTypesChart_executables_title=Executables",
59 "ExportTypes_fileMimeTypesChart_images_title=Images",
60 "ExportTypes_fileMimeTypesChart_videos_title=Videos",
61 "ExportTypes_fileMimeTypesChart_other_title=Other",
62 "ExportTypes_fileMimeTypesChart_unknown_title=Unknown",
63 "ExportTypes_fileMimeTypesChart_notAnalyzed_title=Not Analyzed",
64 "ExportTypes_usageLabel_title=Usage",
65 "ExportTypes_osLabel_title=OS",
66 "ExportTypes_sizeLabel_title=Size",
67 "ExportTypes_excelTabName=Types"})
86 this.pieSlices = pieSlices;
87 this.usefulContent = usefulContent;
93 List<PieChartItem> getPieSlices() {
100 boolean isUsefulContent() {
101 return usefulContent;
105 private final MimeTypeSummary mimeTypeSummary;
106 private final ContainerSummary containerSummary;
107 private final TypesSummary typesSummary;
108 private final SleuthkitCaseProvider provider;
110 private static final Color IMAGES_COLOR =
new Color(156, 39, 176);
111 private static final Color VIDEOS_COLOR = Color.YELLOW;
112 private static final Color AUDIO_COLOR = Color.BLUE;
113 private static final Color DOCUMENTS_COLOR = Color.GREEN;
114 private static final Color EXECUTABLES_COLOR =
new Color(0, 188, 212);
115 private static final Color UNKNOWN_COLOR = Color.ORANGE;
116 private static final Color OTHER_COLOR =
new Color(78, 52, 46);
117 private static final Color NOT_ANALYZED_COLOR = Color.WHITE;
120 private static final List<FileTypeCategoryData> FILE_MIME_TYPE_CATEGORIES = Arrays.asList(
121 new FileTypeCategoryData(Bundle.ExportTypes_fileMimeTypesChart_images_title(), FileTypeCategory.IMAGE.getMediaTypes(), IMAGES_COLOR),
122 new FileTypeCategoryData(Bundle.ExportTypes_fileMimeTypesChart_videos_title(), FileTypeCategory.VIDEO.getMediaTypes(), VIDEOS_COLOR),
123 new FileTypeCategoryData(Bundle.ExportTypes_fileMimeTypesChart_audio_title(), FileTypeCategory.AUDIO.getMediaTypes(), AUDIO_COLOR),
124 new FileTypeCategoryData(Bundle.ExportTypes_fileMimeTypesChart_documents_title(), FileTypeCategory.DOCUMENTS.getMediaTypes(), DOCUMENTS_COLOR),
125 new FileTypeCategoryData(Bundle.ExportTypes_fileMimeTypesChart_executables_title(), FileTypeCategory.EXECUTABLE.getMediaTypes(), EXECUTABLES_COLOR),
126 new FileTypeCategoryData(Bundle.ExportTypes_fileMimeTypesChart_unknown_title(),
new HashSet<>(Arrays.asList(
"application/octet-stream")), UNKNOWN_COLOR)
130 this.provider = SleuthkitCaseProvider.DEFAULT;
131 containerSummary =
new ContainerSummary();
132 typesSummary =
new TypesSummary();
133 mimeTypeSummary =
new MimeTypeSummary();
144 private TypesPieChartData getMimeTypeCategoriesModel(DataSource dataSource)
145 throws SQLException, TskCoreException, SleuthkitCaseProvider.SleuthkitCaseProviderException {
147 if (dataSource == null) {
152 List<PieChartItem> fileCategoryItems =
new ArrayList<>();
153 long categoryTotalCount = 0;
155 for (FileTypeCategoryData cat : FILE_MIME_TYPE_CATEGORIES) {
156 long thisValue = DataSourceInfoUtilities.getLongOrZero(mimeTypeSummary.getCountOfFilesForMimeTypes(dataSource, cat.getMimeTypes()));
157 categoryTotalCount += thisValue;
159 fileCategoryItems.add(
new PieChartItem(
166 long noMimeTypeCount = DataSourceInfoUtilities.getLongOrZero(mimeTypeSummary.getCountOfFilesWithNoMimeType(dataSource));
169 long allRegularFiles = DataSourceInfoUtilities.getLongOrZero(DataSourceInfoUtilities.getCountOfRegNonSlackFiles(provider.get(), dataSource, null));
172 long otherCount = allRegularFiles - (categoryTotalCount + noMimeTypeCount);
173 PieChartItem otherPieItem =
new PieChartItem(Bundle.ExportTypes_fileMimeTypesChart_other_title(),
174 otherCount, OTHER_COLOR);
177 boolean usefulContent = categoryTotalCount > 0 || otherCount > 0;
180 PieChartItem notAnalyzedItem =
new PieChartItem(Bundle.ExportTypes_fileMimeTypesChart_notAnalyzed_title(),
181 noMimeTypeCount, NOT_ANALYZED_COLOR);
184 List<PieChartItem> items = Stream.concat(
185 fileCategoryItems.stream(),
186 Stream.of(otherPieItem, notAnalyzedItem))
188 .filter(slice -> slice.getValue() > 0)
189 .collect(Collectors.toList());
191 return new TypesPieChartData(items, usefulContent);
203 private static KeyValueItemExportable getStrExportable(DataFetcher<DataSource, String> fetcher, String key, DataSource dataSource) {
204 String result = ExcelExportAction.getFetchResult(fetcher,
"Types", dataSource);
205 return (result == null) ? null :
new KeyValueItemExportable(key,
new DefaultCellModel<>(result));
218 private static KeyValueItemExportable getCountExportable(DataFetcher<DataSource, Long> fetcher, String key, DataSource dataSource) {
219 Long count = ExcelExportAction.getFetchResult(fetcher,
"Types", dataSource);
220 return (count == null) ? null :
new KeyValueItemExportable(key,
221 new DefaultCellModel<Long>(count, DataSourceInfoUtilities.COMMA_FORMATTER::format, DataSourceInfoUtilities.COMMA_FORMAT_STR));
224 List<ExcelExport.ExcelSheetExport> getExports(DataSource dataSource) {
225 if (dataSource == null) {
226 return Collections.emptyList();
229 DataFetcher<DataSource, String> usageFetcher = (ds) -> containerSummary.getDataSourceType(ds);
230 DataFetcher<DataSource, String> osFetcher = (ds) -> containerSummary.getOperatingSystems(ds);
231 DataFetcher<DataSource, Long> sizeFetcher = (ds) -> ds == null ? null : ds.getSize();
233 DataFetcher<DataSource, TypesPieChartData> typesFetcher = (ds) -> getMimeTypeCategoriesModel(ds);
235 DataFetcher<DataSource, Long> allocatedFetcher = (ds) -> typesSummary.getCountOfAllocatedFiles(ds);
236 DataFetcher<DataSource, Long> unallocatedFetcher = (ds) -> typesSummary.getCountOfUnallocatedFiles(ds);
237 DataFetcher<DataSource, Long> slackFetcher = (ds) -> typesSummary.getCountOfSlackFiles(ds);
238 DataFetcher<DataSource, Long> directoriesFetcher = (ds) -> typesSummary.getCountOfDirectories(ds);
241 TypesPieChartData typesData = ExcelExportAction.getFetchResult(typesFetcher,
"Types", dataSource);
242 PieChartExport typesChart = (typesData == null || !typesData.isUsefulContent()) ? null
243 :
new PieChartExport(
244 Bundle.ExportTypes_fileMimeTypesChart_title(),
245 Bundle.ExportTypes_fileMimeTypesChart_valueLabel(),
247 Bundle.ExportTypes_fileMimeTypesChart_title(),
248 typesData.getPieSlices());
250 return Arrays.asList(
new ExcelSpecialFormatExport(Bundle.ExportTypes_excelTabName(),
252 getStrExportable(usageFetcher, Bundle.ExportTypes_usageLabel_title(), dataSource),
253 getStrExportable(osFetcher, Bundle.ExportTypes_osLabel_title(), dataSource),
254 new KeyValueItemExportable(Bundle.ExportTypes_sizeLabel_title(),
255 SizeRepresentationUtil.getBytesCell(ExcelExportAction.getFetchResult(sizeFetcher,
"Types", dataSource))),
257 getCountExportable(allocatedFetcher, Bundle.ExportTypes_filesByCategoryTable_allocatedRow_title(), dataSource),
258 getCountExportable(unallocatedFetcher, Bundle.ExportTypes_filesByCategoryTable_unallocatedRow_title(), dataSource),
259 getCountExportable(slackFetcher, Bundle.ExportTypes_filesByCategoryTable_slackRow_title(), dataSource),
260 getCountExportable(directoriesFetcher, Bundle.ExportTypes_filesByCategoryTable_directoryRow_title(), dataSource))
261 .filter(sheet -> sheet != null)
262 .collect(Collectors.toList())
final boolean usefulContent
final List< PieChartItem > pieSlices