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)