19package org.sleuthkit.autopsy.datamodel;
21import java.beans.PropertyChangeEvent;
22import java.beans.PropertyChangeListener;
23import java.util.ArrayList;
24import java.util.EnumSet;
26import java.util.Optional;
27import java.util.function.Function;
28import java.util.logging.Level;
29import java.util.stream.Collectors;
30import javax.swing.Action;
31import org.openide.nodes.ChildFactory;
33import org.openide.nodes.Children;
34import org.openide.nodes.Node;
35import org.openide.nodes.Sheet;
36import org.openide.util.NbBundle;
37import org.openide.util.NbBundle.Messages;
38import org.openide.util.WeakListeners;
39import org.openide.util.lookup.Lookups;
40import org.sleuthkit.autopsy.casemodule.Case;
41import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
42import org.sleuthkit.autopsy.casemodule.events.HostsUpdatedEvent;
43import org.sleuthkit.autopsy.coreutils.Logger;
44import org.sleuthkit.autopsy.datamodel.hosts.AssociatePersonsMenuAction;
45import org.sleuthkit.autopsy.datamodel.hosts.MergeHostMenuAction;
46import org.sleuthkit.autopsy.datamodel.hosts.RemoveParentPersonAction;
47import org.sleuthkit.datamodel.DataSource;
48import org.sleuthkit.datamodel.Host;
49import org.sleuthkit.datamodel.Person;
50import org.sleuthkit.datamodel.SleuthkitVisitableItem;
51import org.sleuthkit.datamodel.TskCoreException;
57@NbBundle.Messages(value = {
"HostGroupingNode_unknownHostNode_title=Unknown Host"})
63 private static class HostGroupingChildren
extends ChildFactory.Detachable<DataSourceGrouping> {
88 public void propertyChange(PropertyChangeEvent evt) {
89 String eventType = evt.getPropertyName();
113 return this.dataSourceToNode.apply(key);
117 protected boolean createKeys(List<DataSourceGrouping> toPopulate) {
118 List<DataSource> dataSources =
null;
122 String hostName =
host ==
null ||
host.getName() ==
null ?
"<unknown>" :
host.getName();
123 logger.log(Level.WARNING, String.format(
"Unable to get data sources for host: %s", hostName), ex);
126 if (dataSources !=
null) {
127 toPopulate.addAll(dataSources.stream()
128 .filter(ds -> ds !=
null)
129 .map(DataSourceGrouping::new)
131 .collect(Collectors.toList()));
145 return (dsGroup ==
null || dsGroup.getDataSource() ==
null || dsGroup.getDataSource().getName() ==
null)
147 : dsGroup.getDataSource().getName();
152 private static final String
ICON_PATH =
"org/sleuthkit/autopsy/images/host.png";
160 if (key.getDataSource() instanceof SleuthkitVisitableItem) {
171 if (key ==
null || key.getDataSource() ==
null) {
175 return new DataSourceGroupingNode(key.getDataSource());
181 private final PropertyChangeListener
hostChangePcl =
new PropertyChangeListener() {
183 public void propertyChange(PropertyChangeEvent evt) {
184 String eventType = evt.getPropertyName();
187 .filter(h -> h !=
null && h.getHostId() ==
hostId)
189 .ifPresent((newHost) -> {
190 setName(newHost.getName());
191 setDisplayName(newHost.getName());
206 return (
host ==
null ||
host.getName() ==
null)
207 ? Bundle.HostGroupingNode_unknownHostNode_title()
231 this(Children.create(
new HostGroupingChildren(HOST_GROUPING_CONVERTER, hostGrouping.getHost()),
true), hostGrouping.getHost());
253 host ==
null ? Lookups.fixed(displayName) : Lookups.fixed(
host, displayName));
257 super.setName(displayName);
258 super.setDisplayName(displayName);
259 this.setIconBaseWithExtension(
ICON_PATH);
270 return getClass().getName();
275 return visitor.
visit(
this);
279 "HostNode_createSheet_nameProperty=Name",})
282 Sheet sheet = Sheet.createDefault();
283 Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
284 if (sheetSet ==
null) {
285 sheetSet = Sheet.createPropertiesSet();
289 sheetSet.put(
new NodeProperty<>(
"Name", Bundle.HostNode_createSheet_nameProperty(),
"", getDisplayName()));
295 @Messages({
"HostNode_actions_associateWithExisting=Associate with existing person...",
296 "HostNode_actions_associateWithNew=Associate with new person...",
298 "HostNode_actions_removeFromPerson=Remove from person ({0})"})
301 List<Action> actionsList =
new ArrayList<>();
304 if (this.host !=
null) {
307 Optional<Person> parent;
311 logger.log(Level.WARNING, String.format(
"Error fetching parent person of host: %s",
this.host.getName() ==
null ?
"<null>" :
this.host.getName()), ex);
312 return new Action[0];
316 if (parent.isPresent()) {
325 return actionsList.toArray(
new Action[actionsList.size()]);
static void removeEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
SleuthkitCase getSleuthkitCase()
static Case getCurrentCaseThrows()
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
synchronized static Logger getLogger(String name)
DisplayableItemNode(Children children)
String getNameOrEmpty(DataSourceGrouping dsGroup)
boolean createKeys(List< DataSourceGrouping > toPopulate)
static final Logger logger
Node createNodeForKey(DataSourceGrouping key)
final PropertyChangeListener dataSourceAddedPcl
final PropertyChangeListener weakPcl
final Function< DataSourceGrouping, Node > dataSourceToNode
final PropertyChangeListener weakPcl
Action[] getActions(boolean context)
final PropertyChangeListener hostChangePcl
HostNode(Children children, Host host)
static final Function< DataSourceGrouping, Node > HOST_GROUPING_CONVERTER
static final String ICON_PATH
static final Function< DataSourceGrouping, Node > HOST_DATA_SOURCES
static final CreateSleuthkitNodeVisitor CREATE_TSK_NODE_VISITOR
HostNode(Children children, Host host, String displayName)
static final Logger logger
static String getHostName(Host host)
T visit(DataSourceFilesNode in)