19 package org.sleuthkit.autopsy.timeline.explorernodes;
21 import java.lang.reflect.InvocationTargetException;
22 import java.text.MessageFormat;
23 import java.util.ArrayList;
24 import java.util.Collection;
25 import java.util.Collections;
26 import java.util.HashSet;
27 import java.util.List;
28 import java.util.logging.Level;
29 import javax.annotation.Nonnull;
30 import javax.swing.Action;
31 import org.joda.time.DateTime;
32 import org.joda.time.DateTimeZone;
33 import org.openide.nodes.Children;
34 import org.openide.nodes.PropertySupport;
35 import org.openide.nodes.Sheet;
36 import org.openide.util.NbBundle;
37 import org.openide.util.Utilities;
38 import org.openide.util.lookup.Lookups;
69 private final TimelineEvent
event;
80 EventNode(@Nonnull TimelineEvent event, @Nonnull Content file, @Nonnull BlackboardArtifact artifact) {
81 super(Children.LEAF, Lookups.fixed(event, file, artifact));
83 TimelineEventType evenType =
event.getEventType();
93 EventNode(@Nonnull TimelineEvent event, @Nonnull Content file) {
94 super(Children.LEAF, Lookups.fixed(event, file));
96 TimelineEventType evenType =
event.getEventType();
102 "NodeProperty.displayName.icon=Icon",
103 "NodeProperty.displayName.description=Description",
104 "NodeProperty.displayName.eventType=Event Type",
105 "NodeProperty.displayName.known=Known",
106 "NodeProperty.displayName.dateTime=Date/Time"})
108 Sheet sheet = super.createSheet();
109 Sheet.Set properties = sheet.get(Sheet.PROPERTIES);
110 if (properties == null) {
111 properties = Sheet.createPropertiesSet();
112 sheet.put(properties);
115 properties.put(
new NodeProperty<>(
"icon", Bundle.NodeProperty_displayName_icon(),
"icon",
true));
117 properties.put(
new NodeProperty<>(
"description", Bundle.NodeProperty_displayName_description(),
"description",
event.getDescription(TimelineLevelOfDetail.HIGH)));
118 properties.put(
new NodeProperty<>(
"eventType", Bundle.NodeProperty_displayName_eventType(),
"event type",
event.getEventType().getDisplayName()));
136 "EventNode.getAction.errorTitle=Error getting actions",
137 "EventNode.getAction.linkedFileMessage=There was a problem getting actions for the selected result. "
138 +
" The 'View File in Timeline' action will not be available."})
140 List<Action> actionsList =
new ArrayList<>();
141 Collections.addAll(actionsList, super.getActions(context));
146 final BlackboardArtifact artifact = getLookup().lookup(BlackboardArtifact.class);
147 final Content sourceFile = getLookup().lookup(Content.class);
148 if (artifact != null) {
151 AbstractFile linkedfile =
findLinked(artifact);
152 if (linkedfile != null) {
155 }
catch (TskCoreException ex) {
156 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting linked file from blackboard artifact{0}.", artifact.getArtifactID()), ex);
161 if (sourceFile instanceof AbstractFile) {
168 actionsList.addAll(factoryActions);
169 if (factoryActions.isEmpty()) {
176 return actionsList.toArray(
new Action[actionsList.size()]);
188 private static AbstractFile
findLinked(BlackboardArtifact artifact)
throws TskCoreException {
189 BlackboardAttribute pathIDAttribute = artifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH_ID));
190 if (pathIDAttribute != null) {
191 long contentID = pathIDAttribute.getValueLong();
192 if (contentID != -1) {
193 return artifact.getSleuthkitCase().getAbstractFileById(contentID);
206 throw new UnsupportedOperationException(
"Not supported yet.");
211 return getClass().getName();
218 final private class TimeProperty extends PropertySupport.ReadWrite<String> {
227 TimeProperty(String name, String displayName, String shortDescription, String value) {
228 super(name, String.class, displayName, shortDescription);
229 setValue(
"suppressCustomEditor", Boolean.TRUE);
234 }
catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
235 logger.log(Level.SEVERE,
"Unexpected error setting date/time property on EventNode explorer node", ex);
242 public String
getValue() throws IllegalAccessException, InvocationTargetException {
247 public void setValue(String newValue)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
250 firePropertyChange(
"time", oldValue, newValue);
266 SleuthkitCase sleuthkitCase = eventsModel.getSleuthkitCase();
272 final TimelineEvent eventById = eventsModel.getEventById(eventID);
273 Content file = sleuthkitCase.getContentById(eventById.getContentObjID());
275 if (eventById.getArtifactID().isPresent()) {
276 BlackboardArtifact blackboardArtifact = sleuthkitCase.getBlackboardArtifact(eventById.getArtifactID().get());
277 return new EventNode(eventById, file, blackboardArtifact);
284 final Collection<BlackboardArtifact> selectedArtifactsList
285 =
new HashSet<>(Utilities.actionsGlobalContext().lookupAll(BlackboardArtifact.class));
286 return selectedArtifactsList.size() == 1;
Action[] getActions(boolean context)
static boolean isExactlyOneArtifactSelected()
static List< Action > getActions(File file, boolean isArtifactSource)
static synchronized AddBlackboardArtifactTagAction getInstance()
static synchronized DeleteFileBlackboardArtifactTagAction getInstance()
static EventNode createEventNode(final Long eventID, EventsModel eventsModel)
String getDateTimeString()
static ViewFileInTimelineAction createViewSourceFileAction(AbstractFile file)
static ReadOnlyObjectProperty< TimeZone > timeZoneProperty()
static AbstractFile findLinked(BlackboardArtifact artifact)
void setValue(String newValue)
static void error(String title, String message)
synchronized static Logger getLogger(String name)
final TimelineEvent event
static String getImagePath(TimelineEventType type)
static DateTimeFormatter getZonedFormatter()
static final Logger logger
static ViewFileInTimelineAction createViewFileAction(AbstractFile file)