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));
147 final BlackboardArtifact artifact = getLookup().lookup(BlackboardArtifact.class);
148 final Content sourceFile = getLookup().lookup(Content.class);
149 if (artifact != null) {
152 AbstractFile linkedfile =
findLinked(artifact);
153 if (linkedfile != null) {
156 }
catch (TskCoreException ex) {
157 logger.log(Level.SEVERE, MessageFormat.format(
"Error getting linked file from blackboard artifact{0}.", artifact.getArtifactID()), ex);
162 if (sourceFile instanceof AbstractFile) {
169 actionsList.addAll(factoryActions);
170 if (factoryActions.isEmpty()) {
177 return actionsList.toArray(
new Action[actionsList.size()]);
189 private static AbstractFile
findLinked(BlackboardArtifact artifact)
throws TskCoreException {
190 BlackboardAttribute pathIDAttribute = artifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PATH_ID));
191 if (pathIDAttribute != null) {
192 long contentID = pathIDAttribute.getValueLong();
193 if (contentID != -1) {
194 return artifact.getSleuthkitCase().getAbstractFileById(contentID);
207 throw new UnsupportedOperationException(
"Not supported yet.");
212 return getClass().getName();
219 final private class TimeProperty extends PropertySupport.ReadWrite<String> {
228 TimeProperty(String name, String displayName, String shortDescription, String value) {
229 super(name, String.class, displayName, shortDescription);
230 setValue(
"suppressCustomEditor", Boolean.TRUE);
235 }
catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
236 logger.log(Level.SEVERE,
"Unexpected error setting date/time property on EventNode explorer node", ex);
243 public String
getValue() throws IllegalAccessException, InvocationTargetException {
248 public void setValue(String newValue)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
251 firePropertyChange(
"time", oldValue, newValue);
267 SleuthkitCase sleuthkitCase = eventsModel.getSleuthkitCase();
273 final TimelineEvent eventById = eventsModel.getEventById(eventID);
274 Content file = sleuthkitCase.getContentById(eventById.getContentObjID());
276 if (eventById.getArtifactID().isPresent()) {
277 BlackboardArtifact blackboardArtifact = sleuthkitCase.getBlackboardArtifact(eventById.getArtifactID().get());
278 return new EventNode(eventById, file, blackboardArtifact);
285 final Collection<BlackboardArtifact> selectedArtifactsList
286 =
new HashSet<>(Utilities.actionsGlobalContext().lookupAll(BlackboardArtifact.class));
287 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)