fix issues found in code review

This commit is contained in:
millmanorama 2019-03-10 15:32:02 +01:00
parent 4bb8e44947
commit a500ef01e6
4 changed files with 50 additions and 22 deletions

View File

@ -33,7 +33,6 @@ import java.util.Optional;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.logging.Level; import java.util.logging.Level;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.beans.Observable; import javafx.beans.Observable;

View File

@ -21,7 +21,6 @@ package org.sleuthkit.autopsy.timeline.actions;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneId; import java.time.ZoneId;
import java.util.Arrays;
import static java.util.Arrays.asList; import static java.util.Arrays.asList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@ -75,7 +74,7 @@ import org.sleuthkit.datamodel.timeline.EventType;
public class AddManualEvent extends Action { public class AddManualEvent extends Action {
private final static Logger logger = Logger.getLogger(AddManualEvent.class.getName()); private final static Logger logger = Logger.getLogger(AddManualEvent.class.getName());
private static final String MANUAL_CREATION = "Manual Creation"; private static final String MANUAL_CREATION = "Manual Creation"; //NON-NLS
private static final Image ADD_EVENT_IMAGE = new Image("/org/sleuthkit/autopsy/timeline/images/add.png", 16, 16, true, true, true); // NON-NLS private static final Image ADD_EVENT_IMAGE = new Image("/org/sleuthkit/autopsy/timeline/images/add.png", 16, 16, true, true, true); // NON-NLS
private final TimeLineController controller; private final TimeLineController controller;
@ -118,7 +117,7 @@ public class AddManualEvent extends Action {
setLongText(Bundle.AddManualEvent_longText()); setLongText(Bundle.AddManualEvent_longText());
setEventHandler(actionEvent -> { setEventHandler(actionEvent -> {
//shoe the dialog and if it completed normally add the event. //show the dialog and if it completed normally add the event.
new EventCreationDialog(controller, epochMillis).showAndWait().ifPresent(this::addEvent); new EventCreationDialog(controller, epochMillis).showAndWait().ifPresent(this::addEvent);
}); });
} }
@ -158,11 +157,11 @@ public class AddManualEvent extends Action {
try { try {
sleuthkitCase.getBlackboard().postArtifact(artifact, source); sleuthkitCase.getBlackboard().postArtifact(artifact, source);
} catch (Blackboard.BlackboardException ex) { } catch (Blackboard.BlackboardException ex) {
logger.log(Level.SEVERE, "Error posting artifact to the blackboard.", ex); logger.log(Level.SEVERE, "Error posting artifact to the blackboard.", ex); //NON-NLS
new Alert(Alert.AlertType.ERROR, Bundle.AddManualEvent_postArtifactFailed(), ButtonType.OK).showAndWait(); new Alert(Alert.AlertType.ERROR, Bundle.AddManualEvent_postArtifactFailed(), ButtonType.OK).showAndWait();
} }
} catch (TskCoreException ex) { } catch (TskCoreException ex) {
logger.log(Level.SEVERE, "Error creatig new artifact.", ex); logger.log(Level.SEVERE, "Error creatig new artifact.", ex); //NON-NLS
new Alert(Alert.AlertType.ERROR, Bundle.AddManualEvent_createArtifactFailed(), ButtonType.OK).showAndWait(); new Alert(Alert.AlertType.ERROR, Bundle.AddManualEvent_createArtifactFailed(), ButtonType.OK).showAndWait();
} }
} }
@ -175,7 +174,7 @@ public class AddManualEvent extends Action {
EventCreationDialog(TimeLineController controller, Long epochMillis) { EventCreationDialog(TimeLineController controller, Long epochMillis) {
this.eventCreationDialogPane = new EventCreationDialogPane(controller, epochMillis); this.eventCreationDialogPane = new EventCreationDialogPane(controller, epochMillis);
setTitle("Add Event"); setTitle(Bundle.AddManualEvent_text());
setDialogPane(eventCreationDialogPane); setDialogPane(eventCreationDialogPane);
//We can't do these steps until after the dialog is shown or we get an error. //We can't do these steps until after the dialog is shown or we get an error.
@ -215,7 +214,7 @@ public class AddManualEvent extends Action {
EventCreationDialogPane(TimeLineController controller, Long epochMillis) { EventCreationDialogPane(TimeLineController controller, Long epochMillis) {
this.controller = controller; this.controller = controller;
FXMLConstructor.construct(this, "EventCreationDialog.fxml"); FXMLConstructor.construct(this, "EventCreationDialog.fxml"); //NON-NLS
if (epochMillis == null) { if (epochMillis == null) {
timePicker.setLocalDateTime(LocalDateTime.now()); timePicker.setLocalDateTime(LocalDateTime.now());
} else { } else {
@ -226,7 +225,7 @@ public class AddManualEvent extends Action {
@FXML @FXML
@NbBundle.Messages("AddManualEvent.EventCreationDialogPane.initialize.dataSourcesError=Error getting datasources in case.") @NbBundle.Messages("AddManualEvent.EventCreationDialogPane.initialize.dataSourcesError=Error getting datasources in case.")
void initialize() { void initialize() {
assert descriptionTextField != null : "fx:id=\"descriptionTextField\" was not injected: check your FXML file 'EventCreationDialog.fxml'."; assert descriptionTextField != null : "fx:id=\"descriptionTextField\" was not injected: check your FXML file 'EventCreationDialog.fxml'.";//NON-NLS
timeZoneChooser.getItems().setAll(timeZoneList); timeZoneChooser.getItems().setAll(timeZoneList);
timeZoneChooser.getSelectionModel().select(TimeZoneUtils.createTimeZoneString(TimeLineController.getTimeZone())); timeZoneChooser.getSelectionModel().select(TimeZoneUtils.createTimeZoneString(TimeLineController.getTimeZone()));
@ -241,9 +240,12 @@ public class AddManualEvent extends Action {
return dataSource.getName() + "(ID: " + dataSource.getId() + ")"; return dataSource.getName() + "(ID: " + dataSource.getId() + ")";
} }
/**
* This method should never get called.
*/
@Override @Override
public DataSource fromString(String string) { public DataSource fromString(String string) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. throw new UnsupportedOperationException("Not supported yet."); //NON-NLS
} }
}); });
} catch (TskCoreException ex) { } catch (TskCoreException ex) {
@ -255,10 +257,17 @@ public class AddManualEvent extends Action {
/** /**
* Install/Configure the ValidationSupport. * Install/Configure the ValidationSupport.
*/ */
@NbBundle.Messages({
"AddManualEvent.validation.description=Description is required.",
"AddManualEvent.validation.datetime=Invalid datetime",
"AddManualEvent.validation.timezone=Invalid time zone",})
void installValidation() { void installValidation() {
validationSupport.registerValidator(descriptionTextField, false, Validator.createEmptyValidator("Description is required")); validationSupport.registerValidator(descriptionTextField, false,
validationSupport.registerValidator(timePicker, false, Validator.createPredicateValidator(Objects::nonNull, "Invalid datetime")); Validator.createEmptyValidator(Bundle.AddManualEvent_validation_description()));
validationSupport.registerValidator(timeZoneChooser, false, Validator.createPredicateValidator((String zone) -> timeZoneList.contains(zone.trim()), "Invalid time zone")); validationSupport.registerValidator(timePicker, false,
Validator.createPredicateValidator(Objects::nonNull, Bundle.AddManualEvent_validation_description()));
validationSupport.registerValidator(timeZoneChooser, false,
Validator.createPredicateValidator((String zone) -> timeZoneList.contains(zone.trim()), Bundle.AddManualEvent_validation_timezone()));
validationSupport.initInitialDecoration(); validationSupport.initInitialDecoration();

View File

@ -3,6 +3,9 @@ AddManualEvent.EventCreationDialogPane.initialize.dataSourcesError=Error getting
AddManualEvent.longText=Manually add an event to the timeline. AddManualEvent.longText=Manually add an event to the timeline.
AddManualEvent.postArtifactFailed=Failed to post artifact to blackboard. AddManualEvent.postArtifactFailed=Failed to post artifact to blackboard.
AddManualEvent.text=Add Event AddManualEvent.text=Add Event
AddManualEvent.validation.datetime=Invalid datetime
AddManualEvent.validation.description=Description is required.
AddManualEvent.validation.timezone=Invalid time zone
# {0} - action accelerator keys # {0} - action accelerator keys
Back.longText=Back: {0}\nGo back to the last view settings. Back.longText=Back: {0}\nGo back to the last view settings.
Back.text=Back Back.text=Back

View File

@ -1,7 +1,7 @@
/* /*
* Autopsy Forensic Browser * Autopsy Forensic Browser
* *
* Copyright 2018 Basis Technology Corp. * Copyright 2018-2019 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org * Contact: carrier <at> sleuthkit <dot> org
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
@ -27,25 +27,41 @@ import org.sleuthkit.datamodel.TskCoreException;
import org.sleuthkit.datamodel.TskData; import org.sleuthkit.datamodel.TskData;
/** /**
* * Utilities to help work with databases.
*/ */
public class TimelineDBUtils { public class TimelineDBUtils {
private final SleuthkitCase sleuthkitCase; private final SleuthkitCase sleuthkitCase;
/**
* Create a TimelineDBUtils for the givecn SleuthlitCase.
*
* @param sleuthkitCase The case to make utilities for. The type of the
* underlying database is used in the implementation of
* these utilities.
*/
public TimelineDBUtils(SleuthkitCase sleuthkitCase) { public TimelineDBUtils(SleuthkitCase sleuthkitCase) {
this.sleuthkitCase = sleuthkitCase; this.sleuthkitCase = sleuthkitCase;
} }
public String csvAggFunction(String args) { /**
* Wrap the given columnName in the appropiate sql function to get a comma
* seperated list in the result.
*
* @param columnName
*
* @return An sql expression that will produce a comma seperated list of
* values from the given column in the result.
*/
public String csvAggFunction(String columnName) {
return (sleuthkitCase.getDatabaseType() == TskData.DbType.POSTGRESQL ? "string_agg" : "group_concat") return (sleuthkitCase.getDatabaseType() == TskData.DbType.POSTGRESQL ? "string_agg" : "group_concat")
+ "(Cast (" + args + " AS VARCHAR) , '" + "," + "')"; + "(Cast (" + columnName + " AS VARCHAR) , ',')"; //NON-NLS
} }
/** /**
* take the result of a group_concat SQLite operation and split it into a * Take the result of a group_concat / string_agg sql operation and split it
* set of X using the mapper to to convert from string to X If groupConcat * into a set of X using the mapper to convert from string to X. If
* is empty, null, or all whitespace, returns an empty list. * groupConcat is empty, null, or all whitespace, returns an empty list.
* *
* @param <X> the type of elements to return * @param <X> the type of elements to return
* @param groupConcat a string containing the group_concat result ( a comma * @param groupConcat a string containing the group_concat result ( a comma
@ -55,13 +71,14 @@ public class TimelineDBUtils {
* @return a Set of X, each element mapped from one element of the original * @return a Set of X, each element mapped from one element of the original
* comma delimited string * comma delimited string
* *
* @throws org.sleuthkit.datamodel.TskCoreException * @throws org.sleuthkit.datamodel.TskCoreException If the mapper throws a
* TskCoreException
*/ */
public static <X> List<X> unGroupConcat(String groupConcat, CheckedFunction<String, X, TskCoreException> mapper) throws TskCoreException { public static <X> List<X> unGroupConcat(String groupConcat, CheckedFunction<String, X, TskCoreException> mapper) throws TskCoreException {
if (isBlank(groupConcat)) { if (isBlank(groupConcat)) {
return Collections.emptyList(); return Collections.emptyList();
} }
List<X> result = new ArrayList<>(); List<X> result = new ArrayList<>();
for (String s : groupConcat.split(",")) { for (String s : groupConcat.split(",")) {