Autopsy 4.22.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
AutopsyTreeChildFactory.java
Go to the documentation of this file.
1/*
2 * Autopsy Forensic Browser
3 * Copyright 2018-2021 Basis Technology Corp.
4 * Contact: carrier <at> sleuthkit <dot> org
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18package org.sleuthkit.autopsy.datamodel;
19
20import java.beans.PropertyChangeEvent;
21import java.beans.PropertyChangeListener;
22import java.util.ArrayList;
23import java.util.Arrays;
24import java.util.Collections;
25import java.util.EnumSet;
26import java.util.List;
27import java.util.Objects;
28import java.util.Set;
29import java.util.logging.Level;
30import java.util.stream.Collectors;
31import org.apache.commons.collections.CollectionUtils;
32import org.openide.nodes.ChildFactory;
33import org.openide.nodes.Node;
34import org.openide.util.WeakListeners;
35import org.sleuthkit.autopsy.casemodule.Case;
36import org.sleuthkit.autopsy.casemodule.CasePreferences;
37import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
38import org.sleuthkit.autopsy.coreutils.Logger;
39import org.sleuthkit.datamodel.Person;
40import org.sleuthkit.datamodel.PersonManager;
41import org.sleuthkit.datamodel.SleuthkitCase;
42import org.sleuthkit.datamodel.SleuthkitVisitableItem;
43import org.sleuthkit.datamodel.TskCoreException;
44
51public final class AutopsyTreeChildFactory extends ChildFactory.Detachable<Object> {
52
53 private static final Set<Case.Events> EVENTS_OF_INTEREST = EnumSet.of(Case.Events.DATA_SOURCE_ADDED,
60 );
61
62 private static final Set<String> EVENTS_OF_INTEREST_NAMES = EVENTS_OF_INTEREST.stream()
63 .map(evt -> evt.name())
64 .collect(Collectors.toSet());
65
66 private static final Logger logger = Logger.getLogger(AutopsyTreeChildFactory.class.getName());
67
75 private final PropertyChangeListener pcl = new PropertyChangeListener() {
76 @Override
77 public void propertyChange(PropertyChangeEvent evt) {
78 String eventType = evt.getPropertyName();
79 if (EVENTS_OF_INTEREST_NAMES.contains(eventType)
80 && Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)) {
82 }
83 }
84 };
85
86 private final PropertyChangeListener weakPcl = WeakListeners.propertyChange(pcl, null);
87
88 @Override
89 protected void addNotify() {
90 super.addNotify();
92 }
93
94 @Override
95 protected void finalize() throws Throwable {
96 super.finalize();
98 }
99
114 @Override
115 protected boolean createKeys(List<Object> list) {
116 List<Object> nodes = Collections.emptyList();
117 try {
118 SleuthkitCase tskCase = Case.getCurrentCaseThrows().getSleuthkitCase();
119 if (Objects.equals(CasePreferences.getGroupItemsInTreeByDataSource(), true)) {
120 /*
121 * The user has selected the group by person/host tree view
122 * option.
123 */
124 PersonManager personManager = tskCase.getPersonManager();
125 List<Person> persons = personManager.getPersons();
126 // show persons level if there are persons to be shown
127 if (!CollectionUtils.isEmpty(persons)) {
128 nodes = persons.stream()
129 .map(PersonGrouping::new)
130 .sorted()
131 .collect(Collectors.toList());
132
133 if (CollectionUtils.isNotEmpty(personManager.getHostsWithoutPersons())) {
134 nodes.add(new PersonGrouping(null));
135 }
136 } else {
137 // otherwise, just show host level
138 nodes = tskCase.getHostManager().getAllHosts().stream()
139 .map(HostGrouping::new)
140 .sorted()
141 .collect(Collectors.toList());
142 }
143
144 // either way, add in reports node
145 nodes.add(new Reports());
146 } else {
147 SleuthkitCase skCase = Case.getCurrentCaseThrows().getSleuthkitCase();
148 // data source by type view
149 List<Object> nodeList = new ArrayList<>(Arrays.asList(
150 new DataSourcesByType(),
151 new Views(skCase),
152 new DataArtifacts(),
153 new AnalysisResults(),
154 new OsAccounts(skCase),
155 new Tags(),
156 new ScoreContent(skCase),
157 new Reports()
158 ));
160 nodeList.add(new CyberTriageData(skCase));
161 }
162 nodes = nodeList;
163 }
164 } catch (NoCurrentCaseException ex) {
165 logger.log(Level.SEVERE, "Failed to create tree because there is no current case", ex); //NON-NLS
166 } catch (TskCoreException ex) {
167 logger.log(Level.SEVERE, "Failed to create tree because of an error querying the case database", ex); //NON-NLS
168 }
169
170 // add all nodes to the netbeans node list
171 list.addAll(nodes);
172 return true;
173 }
174
183 @Override
184 protected Node createNodeForKey(Object key) {
185 Node node = null;
186 if (key != null) {
187 if (key instanceof SleuthkitVisitableItem) {
188 node = ((SleuthkitVisitableItem) key).accept(new CreateSleuthkitNodeVisitor());
189 } else if (key instanceof AutopsyVisitableItem) {
191 } else {
192 logger.log(Level.SEVERE, "Unknown key type: ", key.getClass().getName());
193 }
194 }
195 return node;
196 }
197
201 public void refreshChildren() {
202 refresh(true);
203 }
204
205}
static void removeEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
Definition Case.java:757
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
Definition Case.java:712
synchronized static Logger getLogger(String name)
Definition Logger.java:124
static boolean isCyberTriageDatabase(SleuthkitCase skCase)

Copyright © 2012-2024 Sleuth Kit Labs. Generated on:
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.