19 package org.sleuthkit.autopsy.datasourcesummary.ui;
21 import java.awt.Color;
22 import java.sql.SQLException;
23 import java.text.DecimalFormat;
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.HashSet;
27 import java.util.List;
29 import java.util.stream.Collectors;
30 import java.util.stream.Stream;
31 import org.openide.util.NbBundle.Messages;
57 "TypesPanel_artifactsTypesPieChart_title=Artifact Types",
58 "TypesPanel_filesByCategoryTable_allocatedRow_title=Allocated Files",
59 "TypesPanel_filesByCategoryTable_unallocatedRow_title=Unallocated Files",
60 "TypesPanel_filesByCategoryTable_slackRow_title=Slack Files",
61 "TypesPanel_filesByCategoryTable_directoryRow_title=Directories",
62 "TypesPanel_fileMimeTypesChart_title=File Types",
63 "TypesPanel_fileMimeTypesChart_audio_title=Audio",
64 "TypesPanel_fileMimeTypesChart_documents_title=Documents",
65 "TypesPanel_fileMimeTypesChart_executables_title=Executables",
66 "TypesPanel_fileMimeTypesChart_images_title=Images",
67 "TypesPanel_fileMimeTypesChart_videos_title=Videos",
68 "TypesPanel_fileMimeTypesChart_other_title=Other",
69 "TypesPanel_fileMimeTypesChart_unknown_title=Unknown",
70 "TypesPanel_fileMimeTypesChart_notAnalyzed_title=Not Analyzed",
71 "TypesPanel_usageLabel_title=Usage",
72 "TypesPanel_osLabel_title=OS",
73 "TypesPanel_sizeLabel_title=Size"})
74 class TypesPanel extends BaseDataSourceSummaryPanel {
92 this.pieSlices = pieSlices;
93 this.usefulContent = usefulContent;
107 return usefulContent;
129 this.mimeTypes = mimeTypes;
154 Set<String> getMimeTypes() {
166 private static final long serialVersionUID = 1L;
167 private static final DecimalFormat INTEGER_SIZE_FORMAT =
new DecimalFormat(
"#");
168 private static final DecimalFormat COMMA_FORMATTER =
new DecimalFormat(
"#,###");
169 private static final String FILE_TYPE_FACTORY = FileTypeIdModuleFactory.class.getCanonicalName();
170 private static final String FILE_TYPE_MODULE_NAME = FileTypeIdModuleFactory.getModuleName();
171 private static final Logger logger = Logger.getLogger(TypesPanel.class.getName());
173 private static final Color IMAGES_COLOR =
new Color(156, 39, 176);
174 private static final Color VIDEOS_COLOR = Color.YELLOW;
175 private static final Color AUDIO_COLOR = Color.BLUE;
176 private static final Color DOCUMENTS_COLOR = Color.GREEN;
177 private static final Color EXECUTABLES_COLOR =
new Color(0, 188, 212);
178 private static final Color UNKNOWN_COLOR = Color.ORANGE;
179 private static final Color OTHER_COLOR =
new Color(78, 52, 46);
180 private static final Color NOT_ANALYZED_COLOR = Color.WHITE;
183 private static final List<TypesPieCategory> FILE_MIME_TYPE_CATEGORIES = Arrays.asList(
184 new TypesPieCategory(Bundle.TypesPanel_fileMimeTypesChart_images_title(), FileTypeCategory.IMAGE.getMediaTypes(), IMAGES_COLOR),
185 new TypesPieCategory(Bundle.TypesPanel_fileMimeTypesChart_videos_title(), FileTypeCategory.VIDEO.getMediaTypes(), VIDEOS_COLOR),
186 new TypesPieCategory(Bundle.TypesPanel_fileMimeTypesChart_audio_title(), FileTypeCategory.AUDIO.getMediaTypes(), AUDIO_COLOR),
187 new TypesPieCategory(Bundle.TypesPanel_fileMimeTypesChart_documents_title(), FileTypeCategory.DOCUMENTS.getMediaTypes(), DOCUMENTS_COLOR),
188 new TypesPieCategory(Bundle.TypesPanel_fileMimeTypesChart_executables_title(), FileTypeCategory.EXECUTABLE.getMediaTypes(), EXECUTABLES_COLOR),
189 new TypesPieCategory(Bundle.TypesPanel_fileMimeTypesChart_unknown_title(),
new HashSet<>(Arrays.asList(
"application/octet-stream")), UNKNOWN_COLOR)
192 private final LoadableLabel usageLabel =
new LoadableLabel(Bundle.TypesPanel_usageLabel_title());
193 private final LoadableLabel osLabel =
new LoadableLabel(Bundle.TypesPanel_osLabel_title());
194 private final LoadableLabel sizeLabel =
new LoadableLabel(Bundle.TypesPanel_sizeLabel_title());
196 private final PieChartPanel fileMimeTypesChart =
new PieChartPanel(Bundle.TypesPanel_fileMimeTypesChart_title());
198 private final LoadableLabel allocatedLabel =
new LoadableLabel(Bundle.TypesPanel_filesByCategoryTable_allocatedRow_title());
199 private final LoadableLabel unallocatedLabel =
new LoadableLabel(Bundle.TypesPanel_filesByCategoryTable_unallocatedRow_title());
200 private final LoadableLabel slackLabel =
new LoadableLabel(Bundle.TypesPanel_filesByCategoryTable_slackRow_title());
201 private final LoadableLabel directoriesLabel =
new LoadableLabel(Bundle.TypesPanel_filesByCategoryTable_directoryRow_title());
204 private final List<LoadableComponent<?>> loadables = Arrays.asList(
215 private final IngestRunningLabel ingestRunningLabel =
new IngestRunningLabel();
218 private final List<DataFetchComponents<DataSource, ?>> dataFetchComponents;
223 public TypesPanel() {
224 this(
new MimeTypeSummary(),
new TypesSummary(),
new ContainerSummary());
228 public void close() {
229 ingestRunningLabel.unregister();
241 MimeTypeSummary mimeTypeData,
242 TypesSummary typeData,
243 ContainerSummary containerData) {
245 super(mimeTypeData, typeData, containerData);
247 this.dataFetchComponents = Arrays.asList(
249 new DataFetchWorker.DataFetchComponents<>(
250 containerData::getDataSourceType,
251 (result) -> usageLabel.showDataFetchResult(result)),
253 new DataFetchWorker.DataFetchComponents<>(
254 containerData::getOperatingSystems,
255 (result) -> osLabel.showDataFetchResult(result)),
257 new DataFetchWorker.DataFetchComponents<>(
259 Long size = dataSource == null ? null : dataSource.getSize();
260 return SizeRepresentationUtil.getSizeString(size, INTEGER_SIZE_FORMAT,
false);
262 sizeLabel::showDataFetchResult),
264 new DataFetchWorker.DataFetchComponents<>(
265 (dataSource) -> getMimeTypeCategoriesModel(mimeTypeData, dataSource),
266 this::showMimeTypeCategories),
268 new DataFetchWorker.DataFetchComponents<>(
269 (dataSource) -> getStringOrZero(typeData.getCountOfAllocatedFiles(dataSource)),
270 allocatedLabel::showDataFetchResult),
272 new DataFetchWorker.DataFetchComponents<>(
273 (dataSource) -> getStringOrZero(typeData.getCountOfUnallocatedFiles(dataSource)),
274 unallocatedLabel::showDataFetchResult),
276 new DataFetchWorker.DataFetchComponents<>(
277 (dataSource) -> getStringOrZero(typeData.getCountOfSlackFiles(dataSource)),
278 slackLabel::showDataFetchResult),
280 new DataFetchWorker.DataFetchComponents<>(
281 (dataSource) -> getStringOrZero(typeData.getCountOfDirectories(dataSource)),
282 directoriesLabel::showDataFetchResult)
289 protected void fetchInformation(DataSource dataSource) {
290 fetchInformation(dataFetchComponents, dataSource);
294 protected void onNewDataSource(DataSource dataSource) {
295 onNewDataSource(dataFetchComponents, loadables, dataSource);
306 private TypesPieChartData getMimeTypeCategoriesModel(MimeTypeSummary mimeTypeData, DataSource dataSource)
307 throws SQLException, SleuthkitCaseProviderException, TskCoreException {
309 if (dataSource == null) {
314 List<PieChartItem> fileCategoryItems =
new ArrayList<>();
315 long categoryTotalCount = 0;
317 for (TypesPieCategory cat : FILE_MIME_TYPE_CATEGORIES) {
318 long thisValue = getLongOrZero(mimeTypeData.getCountOfFilesForMimeTypes(dataSource, cat.getMimeTypes()));
319 categoryTotalCount += thisValue;
321 fileCategoryItems.add(
new PieChartItem(
328 long noMimeTypeCount = getLongOrZero(mimeTypeData.getCountOfFilesWithNoMimeType(dataSource));
331 long allRegularFiles = getLongOrZero(mimeTypeData.getCountOfAllRegularFiles(dataSource));
334 long otherCount = allRegularFiles - (categoryTotalCount + noMimeTypeCount);
335 PieChartItem otherPieItem =
new PieChartItem(Bundle.TypesPanel_fileMimeTypesChart_other_title(),
336 otherCount, OTHER_COLOR);
339 boolean usefulContent = categoryTotalCount > 0 || otherCount > 0;
342 PieChartItem notAnalyzedItem =
new PieChartItem(Bundle.TypesPanel_fileMimeTypesChart_notAnalyzed_title(),
343 noMimeTypeCount, NOT_ANALYZED_COLOR);
346 List<PieChartItem> items = Stream.concat(
347 fileCategoryItems.stream(),
348 Stream.of(otherPieItem, notAnalyzedItem))
350 .filter(slice -> slice.getValue() > 0)
351 .collect(Collectors.toList());
353 return new TypesPieChartData(items, usefulContent);
364 private void showMimeTypeCategories(DataFetchResult<TypesPieChartData> result) {
365 if (result == null) {
366 fileMimeTypesChart.showDataFetchResult(DataFetchResult.getSuccessResult(null));
371 if (result.getResultType() == ResultType.ERROR) {
372 fileMimeTypesChart.showDataFetchResult(DataFetchResult.getErrorResult(result.getException()));
376 TypesPieChartData data = result.getData();
378 fileMimeTypesChart.showDataFetchResult(DataFetchResult.getSuccessResult(null));
380 fileMimeTypesChart.showDataFetchResult(DataFetchResult.getSuccessResult(data.getPieSlices()));
391 private static long getLongOrZero(Long longVal) {
392 return longVal == null ? 0 : longVal;
403 private static String getStringOrZero(Long longVal) {
404 return longVal == null ?
"0" : COMMA_FORMATTER.format(longVal);
412 @SuppressWarnings(
"unchecked")
414 private
void initComponents() {
416 javax.swing.JScrollPane scrollParent =
new javax.swing.JScrollPane();
417 javax.swing.JPanel contentParent =
new javax.swing.JPanel();
418 javax.swing.JPanel ingestRunningPanel = ingestRunningLabel;
419 javax.swing.JPanel usagePanel = usageLabel;
420 javax.swing.JPanel osPanel = osLabel;
421 javax.swing.JPanel sizePanel = sizeLabel;
422 javax.swing.JPanel fileMimeTypesPanel = fileMimeTypesChart;
423 javax.swing.Box.Filler filler2 =
new javax.swing.Box.Filler(
new java.awt.Dimension(0, 5),
new java.awt.Dimension(0, 5),
new java.awt.Dimension(32767, 5));
424 javax.swing.JPanel allocatedPanel = allocatedLabel;
425 javax.swing.JPanel unallocatedPanel = unallocatedLabel;
426 javax.swing.JPanel slackPanel = slackLabel;
427 javax.swing.JPanel directoriesPanel = directoriesLabel;
428 javax.swing.Box.Filler filler3 =
new javax.swing.Box.Filler(
new java.awt.Dimension(0, 0),
new java.awt.Dimension(0, 0),
new java.awt.Dimension(0, 32767));
430 setLayout(
new java.awt.BorderLayout());
432 contentParent.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));
433 contentParent.setMaximumSize(
new java.awt.Dimension(32787, 32787));
434 contentParent.setMinimumSize(
new java.awt.Dimension(400, 490));
435 contentParent.setLayout(
new javax.swing.BoxLayout(contentParent, javax.swing.BoxLayout.PAGE_AXIS));
437 ingestRunningPanel.setAlignmentX(0.0F);
438 ingestRunningPanel.setMaximumSize(
new java.awt.Dimension(32767, 25));
439 ingestRunningPanel.setMinimumSize(
new java.awt.Dimension(10, 25));
440 ingestRunningPanel.setPreferredSize(
new java.awt.Dimension(10, 25));
441 contentParent.add(ingestRunningPanel);
443 usagePanel.setAlignmentX(0.0F);
444 usagePanel.setMaximumSize(
new java.awt.Dimension(32767, 20));
445 usagePanel.setMinimumSize(
new java.awt.Dimension(10, 20));
446 usagePanel.setName(
"");
447 usagePanel.setPreferredSize(
new java.awt.Dimension(800, 20));
448 contentParent.add(usagePanel);
450 osPanel.setAlignmentX(0.0F);
451 osPanel.setMaximumSize(
new java.awt.Dimension(32767, 20));
452 osPanel.setMinimumSize(
new java.awt.Dimension(10, 20));
453 osPanel.setPreferredSize(
new java.awt.Dimension(800, 20));
454 contentParent.add(osPanel);
456 sizePanel.setAlignmentX(0.0F);
457 sizePanel.setMaximumSize(
new java.awt.Dimension(32767, 20));
458 sizePanel.setMinimumSize(
new java.awt.Dimension(10, 20));
459 sizePanel.setPreferredSize(
new java.awt.Dimension(800, 20));
460 contentParent.add(sizePanel);
462 fileMimeTypesPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5));
463 fileMimeTypesPanel.setAlignmentX(0.0F);
464 fileMimeTypesPanel.setMaximumSize(
new java.awt.Dimension(400, 300));
465 fileMimeTypesPanel.setMinimumSize(
new java.awt.Dimension(400, 300));
466 fileMimeTypesPanel.setPreferredSize(
new java.awt.Dimension(400, 300));
467 contentParent.add(fileMimeTypesPanel);
468 contentParent.add(filler2);
470 allocatedPanel.setAlignmentX(0.0F);
471 allocatedPanel.setMaximumSize(
new java.awt.Dimension(32767, 16));
472 allocatedPanel.setMinimumSize(
new java.awt.Dimension(10, 16));
473 allocatedPanel.setPreferredSize(
new java.awt.Dimension(800, 16));
474 contentParent.add(allocatedPanel);
476 unallocatedPanel.setAlignmentX(0.0F);
477 unallocatedPanel.setMaximumSize(
new java.awt.Dimension(32767, 16));
478 unallocatedPanel.setMinimumSize(
new java.awt.Dimension(10, 16));
479 unallocatedPanel.setPreferredSize(
new java.awt.Dimension(800, 16));
480 contentParent.add(unallocatedPanel);
482 slackPanel.setAlignmentX(0.0F);
483 slackPanel.setMaximumSize(
new java.awt.Dimension(32767, 16));
484 slackPanel.setMinimumSize(
new java.awt.Dimension(10, 16));
485 slackPanel.setPreferredSize(
new java.awt.Dimension(800, 16));
486 contentParent.add(slackPanel);
488 directoriesPanel.setAlignmentX(0.0F);
489 directoriesPanel.setMaximumSize(
new java.awt.Dimension(32767, 16));
490 directoriesPanel.setMinimumSize(
new java.awt.Dimension(10, 16));
491 directoriesPanel.setPreferredSize(
new java.awt.Dimension(800, 16));
492 contentParent.add(directoriesPanel);
493 contentParent.add(filler3);
495 scrollParent.setViewportView(contentParent);
497 add(scrollParent, java.awt.BorderLayout.CENTER);
final List< PieChartItem > pieSlices
boolean isUsefulContent()
List< PieChartItem > getPieSlices()
final boolean usefulContent
ImmutableSet< String > getMediaTypes()
TypesPieChartData(List< PieChartItem > pieSlices, boolean usefulContent)
final Set< String > mimeTypes