diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java index eb37895a30..ffd226d6d3 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/Case.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/Case.java @@ -82,11 +82,14 @@ import org.sleuthkit.autopsy.casemodule.events.ContentTagDeletedEvent; import org.sleuthkit.autopsy.casemodule.events.DataSourceAddedEvent; import org.sleuthkit.autopsy.casemodule.events.DataSourceDeletedEvent; import org.sleuthkit.autopsy.casemodule.events.DataSourceNameChangedEvent; -import org.sleuthkit.autopsy.casemodule.events.HostAddedEvent; -import org.sleuthkit.autopsy.casemodule.events.HostChangedEvent; -import org.sleuthkit.autopsy.casemodule.events.HostRemovedEvent; +import org.sleuthkit.autopsy.casemodule.events.HostsAddedEvent; +import org.sleuthkit.autopsy.casemodule.events.HostsChangedEvent; +import org.sleuthkit.autopsy.casemodule.events.HostsRemovedEvent; import org.sleuthkit.autopsy.casemodule.events.OsAccountAddedEvent; import org.sleuthkit.autopsy.casemodule.events.OsAccountChangedEvent; +import org.sleuthkit.autopsy.casemodule.events.PersonsAddedEvent; +import org.sleuthkit.autopsy.casemodule.events.PersonsChangedEvent; +import org.sleuthkit.autopsy.casemodule.events.PersonsRemovedEvent; import org.sleuthkit.autopsy.casemodule.events.ReportAddedEvent; import org.sleuthkit.autopsy.casemodule.multiusercases.CaseNodeData.CaseNodeDataException; import org.sleuthkit.autopsy.casemodule.multiusercases.CoordinationServiceUtils; @@ -135,11 +138,18 @@ import org.sleuthkit.datamodel.ContentTag; import org.sleuthkit.datamodel.DataSource; import org.sleuthkit.datamodel.FileSystem; import org.sleuthkit.datamodel.Host; +import org.sleuthkit.datamodel.HostManager.HostsCreationEvent; +import org.sleuthkit.datamodel.HostManager.HostsUpdateEvent; +import org.sleuthkit.datamodel.HostManager.HostsDeletionEvent; import org.sleuthkit.datamodel.Image; import org.sleuthkit.datamodel.OsAccount; import org.sleuthkit.datamodel.OsAccountManager; import org.sleuthkit.datamodel.OsAccountManager.OsAccountsCreationEvent; import org.sleuthkit.datamodel.OsAccountManager.OsAccountsUpdateEvent; +import org.sleuthkit.datamodel.Person; +import org.sleuthkit.datamodel.PersonManager.PersonsCreationEvent; +import org.sleuthkit.datamodel.PersonManager.PersonsUpdateEvent; +import org.sleuthkit.datamodel.PersonManager.PersonsDeletionEvent; import org.sleuthkit.datamodel.Report; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TimelineManager; @@ -517,7 +527,7 @@ public class Case { * @param event The sleuthkit event for the creation of hosts. */ @Subscribe - public void publishHostsAddedEvent(HostCreationEvent event) { + public void publishHostsAddedEvent(HostsCreationEvent event) { eventPublisher.publish(new HostsAddedEvent( event == null ? Collections.emptyList() : event.getHosts())); } @@ -529,7 +539,7 @@ public class Case { * @param event The sleuthkit event for the updating of hosts. */ @Subscribe - public void publishHostsChangedEvent(HostUpdateEvent event) { + public void publishHostsChangedEvent(HostsUpdateEvent event) { eventPublisher.publish(new HostsChangedEvent( event == null ? Collections.emptyList() : event.getHosts())); } @@ -541,7 +551,7 @@ public class Case { * @param event The sleuthkit event for the deleting of hosts. */ @Subscribe - public void publishHostsDeletedEvent(HostDeletedEvent event) { + public void publishHostsDeletedEvent(HostsDeletionEvent event) { eventPublisher.publish(new HostsRemovedEvent( event == null ? Collections.emptyList() : event.getHosts())); } @@ -553,7 +563,7 @@ public class Case { * @param event The sleuthkit event for the creation of persons. */ @Subscribe - public void publishPersonsAddedEvent(PersonCreationEvent event) { + public void publishPersonsAddedEvent(PersonsCreationEvent event) { eventPublisher.publish(new PersonsAddedEvent( event == null ? Collections.emptyList() : event.getPersons())); } @@ -565,7 +575,7 @@ public class Case { * @param event The sleuthkit event for the updating of persons. */ @Subscribe - public void publishPersonsChangedEvent(PersonUpdateEvent event) { + public void publishPersonsChangedEvent(PersonsUpdateEvent event) { eventPublisher.publish(new PersonsChangedEvent( event == null ? Collections.emptyList() : event.getPersons())); } @@ -577,7 +587,7 @@ public class Case { * @param event The sleuthkit event for the deleting of persons. */ @Subscribe - public void publishPersonsDeletedEvent(PersonDeletedEvent event) { + public void publishPersonsDeletedEvent(PersonsDeletionEvent event) { eventPublisher.publish(new PersonsRemovedEvent( event == null ? Collections.emptyList() : event.getPersons())); } @@ -1793,7 +1803,7 @@ public class Case { * @param host The host that has been added. */ public void notifyHostAdded(Host host) { - eventPublisher.publish(new HostAddedEvent(Collections.singletonList(host))); + eventPublisher.publish(new HostsAddedEvent(Collections.singletonList(host))); } /** @@ -1801,7 +1811,7 @@ public class Case { * @param newValue The host that has been updated. */ public void notifyHostChanged(Host newValue) { - eventPublisher.publish(new HostChangedEvent(Collections.singletonList(newValue))); + eventPublisher.publish(new HostsChangedEvent(Collections.singletonList(newValue))); } /** @@ -1809,7 +1819,7 @@ public class Case { * @param host The host that has been deleted. */ public void notifyHostDeleted(Host host) { - eventPublisher.publish(new HostRemovedEvent(Collections.singletonList(host))); + eventPublisher.publish(new HostsRemovedEvent(Collections.singletonList(host))); } /** @@ -1817,7 +1827,7 @@ public class Case { * @param person The person that has been added. */ public void notifyPersonAdded(Person person) { - eventPublisher.publish(new PersonAddedEvent(Collections.singletonList(person))); + eventPublisher.publish(new PersonsAddedEvent(Collections.singletonList(person))); } /** @@ -1825,7 +1835,7 @@ public class Case { * @param newValue The person that has been updated. */ public void notifyPersonChanged(Person newValue) { - eventPublisher.publish(new PersonChangedEvent(Collections.singletonList(newValue))); + eventPublisher.publish(new PersonsChangedEvent(Collections.singletonList(newValue))); } /** @@ -1833,7 +1843,7 @@ public class Case { * @param person The person that has been deleted. */ public void notifyPersonDeleted(Person person) { - eventPublisher.publish(new PersonRemovedEvent(Collections.singletonList(person))); + eventPublisher.publish(new PersonsRemovedEvent(Collections.singletonList(person))); } /** diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostAddedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsAddedEvent.java similarity index 86% rename from Core/src/org/sleuthkit/autopsy/casemodule/events/HostAddedEvent.java rename to Core/src/org/sleuthkit/autopsy/casemodule/events/HostsAddedEvent.java index 3676c475c0..c10b66face 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostAddedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsAddedEvent.java @@ -25,7 +25,7 @@ import org.sleuthkit.datamodel.Host; /** * Event fired when new hosts are added. */ -public class HostAddedEvent extends HostEvent { +public class HostsAddedEvent extends HostsEvent { private static final long serialVersionUID = 1L; @@ -33,7 +33,7 @@ public class HostAddedEvent extends HostEvent { * Main constructor. * @param dataModelObjects The hosts that have been added. */ - public HostAddedEvent(List dataModelObjects) { - super(Case.Events.HOST_ADDED.name(), dataModelObjects); + public HostsAddedEvent(List dataModelObjects) { + super(Case.Events.HOSTS_ADDED.name(), dataModelObjects); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostChangedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsChangedEvent.java similarity index 85% rename from Core/src/org/sleuthkit/autopsy/casemodule/events/HostChangedEvent.java rename to Core/src/org/sleuthkit/autopsy/casemodule/events/HostsChangedEvent.java index 37e589ea61..a5b8692c03 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostChangedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsChangedEvent.java @@ -25,7 +25,7 @@ import org.sleuthkit.datamodel.Host; /** * Event fired when hosts are changed. */ -public class HostChangedEvent extends HostEvent { +public class HostsChangedEvent extends HostsEvent { private static final long serialVersionUID = 1L; @@ -35,7 +35,7 @@ public class HostChangedEvent extends HostEvent { * @param dataModelObjects The new values for the hosts that have been * changed. */ - public HostChangedEvent(List dataModelObjects) { - super(Case.Events.HOST_CHANGED.name(), dataModelObjects); + public HostsChangedEvent(List dataModelObjects) { + super(Case.Events.HOSTS_CHANGED.name(), dataModelObjects); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsEvent.java similarity index 95% rename from Core/src/org/sleuthkit/autopsy/casemodule/events/HostEvent.java rename to Core/src/org/sleuthkit/autopsy/casemodule/events/HostsEvent.java index 0f2e1ed0e4..1ba225f4a2 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsEvent.java @@ -31,7 +31,7 @@ import org.sleuthkit.datamodel.TskCoreException; /** * Base event class for when something pertaining to hosts changes. */ -public class HostEvent extends TskDataModelChangeEvent { +public class HostsEvent extends TskDataModelChangeEvent { /** * Retrieves a list of ids from a list of hosts. @@ -62,7 +62,7 @@ public class HostEvent extends TskDataModelChangeEvent { * type. * @param dataModelObjects The list of hosts for the event. */ - protected HostEvent(String eventName, List dataModelObjects) { + protected HostsEvent(String eventName, List dataModelObjects) { super(eventName, getIds(dataModelObjects), new ArrayList<>(getSafeList(dataModelObjects))); } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostRemovedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsRemovedEvent.java similarity index 85% rename from Core/src/org/sleuthkit/autopsy/casemodule/events/HostRemovedEvent.java rename to Core/src/org/sleuthkit/autopsy/casemodule/events/HostsRemovedEvent.java index 22cd237629..407b83c32a 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/HostRemovedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/HostsRemovedEvent.java @@ -25,7 +25,7 @@ import org.sleuthkit.datamodel.Host; /** * Event fired when hosts are removed. */ -public class HostRemovedEvent extends HostEvent { +public class HostsRemovedEvent extends HostsEvent { private static final long serialVersionUID = 1L; @@ -33,7 +33,7 @@ public class HostRemovedEvent extends HostEvent { * Main constructor. * @param dataModelObjects The list of hosts that have been deleted. */ - public HostRemovedEvent(List dataModelObjects) { - super(Case.Events.HOST_DELETED.name(), dataModelObjects); + public HostsRemovedEvent(List dataModelObjects) { + super(Case.Events.HOSTS_DELETED.name(), dataModelObjects); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonAddedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsAddedEvent.java similarity index 85% rename from Core/src/org/sleuthkit/autopsy/casemodule/events/PersonAddedEvent.java rename to Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsAddedEvent.java index 2d33315f95..0b7a0f6a12 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonAddedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsAddedEvent.java @@ -25,7 +25,7 @@ import org.sleuthkit.datamodel.Person; /** * Event fired when new persons are added. */ -public class PersonAddedEvent extends PersonEvent { +public class PersonsAddedEvent extends PersonxEvent { private static final long serialVersionUID = 1L; @@ -33,7 +33,7 @@ public class PersonAddedEvent extends PersonEvent { * Main constructor. * @param dataModelObjects The persons that have been added. */ - public PersonAddedEvent(List dataModelObjects) { - super(Case.Events.PERSON_ADDED.name(), dataModelObjects); + public PersonsAddedEvent(List dataModelObjects) { + super(Case.Events.PERSONS_ADDED.name(), dataModelObjects); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonChangedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsChangedEvent.java similarity index 85% rename from Core/src/org/sleuthkit/autopsy/casemodule/events/PersonChangedEvent.java rename to Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsChangedEvent.java index 9209497de8..f3027cf22b 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonChangedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsChangedEvent.java @@ -25,7 +25,7 @@ import org.sleuthkit.datamodel.Person; /** * Event fired when persons are changed. */ -public class PersonChangedEvent extends PersonEvent { +public class PersonsChangedEvent extends PersonxEvent { private static final long serialVersionUID = 1L; @@ -35,7 +35,7 @@ public class PersonChangedEvent extends PersonEvent { * @param dataModelObjects The new values for the persons that have been * changed. */ - public PersonChangedEvent(List dataModelObjects) { - super(Case.Events.PERSON_CHANGED.name(), dataModelObjects); + public PersonsChangedEvent(List dataModelObjects) { + super(Case.Events.PERSONS_CHANGED.name(), dataModelObjects); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonRemovedEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsRemovedEvent.java similarity index 85% rename from Core/src/org/sleuthkit/autopsy/casemodule/events/PersonRemovedEvent.java rename to Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsRemovedEvent.java index a33af32cc7..4a5c717002 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonRemovedEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonsRemovedEvent.java @@ -25,7 +25,7 @@ import org.sleuthkit.datamodel.Person; /** * Event fired when persons are removed. */ -public class PersonRemovedEvent extends PersonEvent { +public class PersonsRemovedEvent extends PersonxEvent { private static final long serialVersionUID = 1L; @@ -33,7 +33,7 @@ public class PersonRemovedEvent extends PersonEvent { * Main constructor. * @param dataModelObjects The list of persons that have been deleted. */ - public PersonRemovedEvent(List dataModelObjects) { - super(Case.Events.PERSON_DELETED.name(), dataModelObjects); + public PersonsRemovedEvent(List dataModelObjects) { + super(Case.Events.PERSONS_DELETED.name(), dataModelObjects); } } diff --git a/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonEvent.java b/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonxEvent.java similarity index 94% rename from Core/src/org/sleuthkit/autopsy/casemodule/events/PersonEvent.java rename to Core/src/org/sleuthkit/autopsy/casemodule/events/PersonxEvent.java index f41ae6ff86..6582f7bc83 100644 --- a/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonEvent.java +++ b/Core/src/org/sleuthkit/autopsy/casemodule/events/PersonxEvent.java @@ -31,7 +31,7 @@ import org.sleuthkit.datamodel.TskCoreException; /** * Base event class for when something pertaining to persons changes. */ -public class PersonEvent extends TskDataModelChangeEvent { +public class PersonxEvent extends TskDataModelChangeEvent { /** * Retrieves a list of ids from a list of persons. @@ -62,7 +62,7 @@ public class PersonEvent extends TskDataModelChangeEvent { * type. * @param dataModelObjects The list of persons for the event. */ - protected PersonEvent(String eventName, List dataModelObjects) { + protected PersonxEvent(String eventName, List dataModelObjects) { super(eventName, getIds(dataModelObjects), new ArrayList<>(getSafeList(dataModelObjects))); } diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyTreeChildFactory.java b/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyTreeChildFactory.java index e7af2149d6..3f02162159 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyTreeChildFactory.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/AutopsyTreeChildFactory.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.Objects; import java.util.Set; import java.util.logging.Level; +import java.util.stream.Collectors; import org.apache.commons.collections.CollectionUtils; import org.openide.nodes.ChildFactory; import org.openide.nodes.Node; @@ -47,6 +48,18 @@ import org.sleuthkit.datamodel.TskCoreException; */ public final class AutopsyTreeChildFactory extends ChildFactory.Detachable { + private static final Set LISTENING_EVENTS = EnumSet.of( + Case.Events.DATA_SOURCE_ADDED, + Case.Events.HOSTS_ADDED, + Case.Events.HOSTS_DELETED, + Case.Events.PERSONS_ADDED, + Case.Events.PERSONS_DELETED + ); + + private static final Set LISTENING_EVENT_NAMES = LISTENING_EVENTS.stream() + .map(evt -> evt.name()) + .collect(Collectors.toSet()); + private static final Logger logger = Logger.getLogger(AutopsyTreeChildFactory.class.getName()); /** @@ -56,7 +69,7 @@ public final class AutopsyTreeChildFactory extends ChildFactory.Detachable h != null && h.getId() == hostId) + .findFirst() + .ifPresent((newHost) -> setDisplayName(newHost.getName())); + } + } + }; + private final Host host; + private final Long hostId; /** * Main constructor for HostDataSources key where data source children @@ -197,7 +215,9 @@ public class HostNode extends DisplayableItemNode { String safeName = (host == null || host.getName() == null) ? Bundle.HostGroupingNode_unknownHostNode_title() : host.getName(); - + + hostId = host == null ? null : host.getId(); + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.HOSTS_CHANGED), hostChangePcl); super.setName(safeName); super.setDisplayName(safeName); this.setIconBaseWithExtension(ICON_PATH); diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/PersonGroupingNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/PersonGroupingNode.java index 11b4c2e647..f1bb42665f 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/PersonGroupingNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/PersonGroupingNode.java @@ -23,7 +23,10 @@ import java.beans.PropertyChangeListener; import java.util.Collections; import java.util.EnumSet; import java.util.List; +import java.util.Optional; +import java.util.Set; import java.util.logging.Level; +import java.util.stream.Collectors; import javax.swing.Action; import org.openide.nodes.ChildFactory; import org.openide.nodes.Children; @@ -33,6 +36,8 @@ import org.openide.util.NbBundle.Messages; import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.casemodule.Case; import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException; +import org.sleuthkit.autopsy.casemodule.events.HostsChangedEvent; +import org.sleuthkit.autopsy.casemodule.events.PersonsChangedEvent; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.datamodel.persons.DeletePersonAction; import org.sleuthkit.autopsy.datamodel.persons.EditPersonAction; @@ -56,6 +61,11 @@ public class PersonGroupingNode extends DisplayableItemNode { private static final Logger logger = Logger.getLogger(PersonChildren.class.getName()); + private static final Set CHILD_EVENTS = EnumSet.of(Case.Events.HOSTS_ADDED, Case.Events.HOSTS_CHANGED); + private static final Set CHILD_EVENTS_STR = CHILD_EVENTS.stream() + .map(ev -> ev.name()) + .collect(Collectors.toSet()); + private final Person person; /** @@ -68,15 +78,13 @@ public class PersonGroupingNode extends DisplayableItemNode { } /** - * Listener for handling DATA_SOURCE_ADDED and DATA_SOURCE_DELETED - * events. + * Listener for handling adding and removing host events. */ - private final PropertyChangeListener pcl = new PropertyChangeListener() { + private final PropertyChangeListener hostAddedDeletedPcl = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { String eventType = evt.getPropertyName(); - if (eventType.equals(Case.Events.DATA_SOURCE_ADDED.toString()) - || eventType.equals(Case.Events.DATA_SOURCE_DELETED.toString())) { + if (eventType != null && CHILD_EVENTS_STR.contains(eventType)) { refresh(true); } } @@ -84,12 +92,12 @@ public class PersonGroupingNode extends DisplayableItemNode { @Override protected void addNotify() { - Case.addEventTypeSubscriber(EnumSet.of(Case.Events.DATA_SOURCE_ADDED), pcl); + Case.addEventTypeSubscriber(CHILD_EVENTS, hostAddedDeletedPcl); } @Override protected void removeNotify() { - Case.removeEventTypeSubscriber(EnumSet.of(Case.Events.DATA_SOURCE_ADDED), pcl); + Case.removeEventTypeSubscriber(CHILD_EVENTS, hostAddedDeletedPcl); } @Override @@ -117,7 +125,24 @@ public class PersonGroupingNode extends DisplayableItemNode { } private final Person person; + private final Long personId; + /** + * Listener for handling person change events. + */ + private final PropertyChangeListener personChangePcl = new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + String eventType = evt.getPropertyName(); + if (personId != null && eventType.equals(Case.Events.PERSONS_CHANGED.toString()) && evt instanceof PersonsChangedEvent) { + ((PersonsChangedEvent) evt).getNewValue().stream() + .filter(p -> p != null && p.getId() == personId) + .findFirst() + .ifPresent((newPerson) -> setDisplayName(newPerson.getName())); + } + } + }; + /** * Main constructor. * @@ -134,7 +159,11 @@ public class PersonGroupingNode extends DisplayableItemNode { super.setDisplayName(safeName); this.setIconBaseWithExtension(ICON_PATH); this.person = person; + this.personId = person == null ? null : person.getId(); + Case.addEventTypeSubscriber(EnumSet.of(Case.Events.PERSONS_CHANGED), personChangePcl); } + + @Override public boolean isLeafTypeNode() {