diff --git a/bindings/java/src/org/sleuthkit/datamodel/TimelineEventTypes.java b/bindings/java/src/org/sleuthkit/datamodel/TimelineEventTypes.java index 1fb7cd76292126b94ace0eb621e79f904a04ded4..6444791cbf280a30ffa749c84a99f8b32148a0db 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/TimelineEventTypes.java +++ b/bindings/java/src/org/sleuthkit/datamodel/TimelineEventTypes.java @@ -25,8 +25,8 @@ import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; import static org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_TRACKPOINTS; -import org.sleuthkit.datamodel.blackboardutils.attributes.TskGeoTrackpointsUtil; -import org.sleuthkit.datamodel.blackboardutils.attributes.TskGeoTrackpointsUtil.GeoTrackPointList; +import org.sleuthkit.datamodel.blackboardutils.attributes.BlackboardJsonAttrUtil; +import org.sleuthkit.datamodel.blackboardutils.attributes.GeoTrackPoints; /** * Container class for various types of timeline events @@ -124,9 +124,7 @@ TimelineEventDescription parseDescription(String fullDescriptionRaw, String medD * JSON list of waypoints from which a start time can be extracted. */ static class GPSTrackArtifactEventType extends TimelineEventArtifactTypeSingleDescription { - - private final TskGeoTrackpointsUtil trackpointUtil = new TskGeoTrackpointsUtil(); - + GPSTrackArtifactEventType(int typeID, String displayName, TimelineEventType superType, BlackboardArtifact.Type artifactType, BlackboardAttribute.Type descriptionAttribute) { // Passing TSK_GEO_TRACKPOINTS as the "time attribute" as more of a place filler, to avoid any null issues super(typeID, displayName, superType, artifactType, new BlackboardAttribute.Type(TSK_GEO_TRACKPOINTS), descriptionAttribute); @@ -142,7 +140,12 @@ public TimelineEventDescriptionWithTime makeEventDescription(BlackboardArtifact } // Get the waypoint list "start time" - GeoTrackPointList pointsList = trackpointUtil.fromAttribute(attribute); + GeoTrackPoints pointsList; + try { + pointsList = BlackboardJsonAttrUtil.fromAttribute(attribute, GeoTrackPoints.class); + } catch (BlackboardJsonAttrUtil.InvalidJsonException ex) { + throw new TskCoreException("Unable to parse track points in TSK_GEO_TRACKPOINTS attribute", ex); + } Long startTime = pointsList.getStartTime(); // If we didn't find a startime do not create an event. diff --git a/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/GeoArtifactsHelper.java b/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/GeoArtifactsHelper.java index 838c8e601166a379477cdb454adccacc92b76c4d..558fda9b7f66d63e807050840ece29fa3bb63e84 100755 --- a/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/GeoArtifactsHelper.java +++ b/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/GeoArtifactsHelper.java @@ -19,7 +19,6 @@ package org.sleuthkit.datamodel.blackboardutils; import java.util.ArrayList; -import org.sleuthkit.datamodel.blackboardutils.attributes.TskGeoTrackpointsUtil.GeoTrackPointList; import java.util.List; import org.sleuthkit.datamodel.Blackboard.BlackboardException; import org.sleuthkit.datamodel.BlackboardArtifact; @@ -27,9 +26,9 @@ import org.sleuthkit.datamodel.Content; import org.sleuthkit.datamodel.SleuthkitCase; import org.sleuthkit.datamodel.TskCoreException; -import org.sleuthkit.datamodel.blackboardutils.attributes.TskGeoWaypointsUtil.GeoWaypointList; -import org.sleuthkit.datamodel.blackboardutils.attributes.TskGeoTrackpointsUtil; -import org.sleuthkit.datamodel.blackboardutils.attributes.TskGeoWaypointsUtil; +import org.sleuthkit.datamodel.blackboardutils.attributes.BlackboardJsonAttrUtil; +import org.sleuthkit.datamodel.blackboardutils.attributes.GeoWaypoints; +import org.sleuthkit.datamodel.blackboardutils.attributes.GeoTrackPoints; /** * An artifact creation helper that adds geolocation artifacts to the case @@ -37,9 +36,9 @@ */ public final class GeoArtifactsHelper extends ArtifactHelperBase { + private static final BlackboardAttribute.Type WAYPOINTS_ATTR_TYPE = new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_WAYPOINTS); + private static final BlackboardAttribute.Type TRACKPOINTS_ATTR_TYPE = new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_TRACKPOINTS); private final String programName; - private final TskGeoTrackpointsUtil trackPointAttributeUtil; - private final TskGeoWaypointsUtil waypointsAttributeUtil; /** * Constructs an artifact creation helper that adds geolocation artifacts to @@ -58,8 +57,6 @@ public final class GeoArtifactsHelper extends ArtifactHelperBase { public GeoArtifactsHelper(SleuthkitCase caseDb, String moduleName, String programName, Content srcContent) { super(caseDb, moduleName, srcContent); this.programName = programName; - trackPointAttributeUtil = new TskGeoTrackpointsUtil(); - waypointsAttributeUtil = new TskGeoWaypointsUtil(); } /** @@ -80,7 +77,7 @@ public GeoArtifactsHelper(SleuthkitCase caseDb, String moduleName, String progra * @throws BlackboardException If there is a error posting the artifact to * the blackboard. */ - public BlackboardArtifact addTrack(String trackName, GeoTrackPointList trackPoints, List<BlackboardAttribute> moreAttributes) throws TskCoreException, BlackboardException { + public BlackboardArtifact addTrack(String trackName, GeoTrackPoints trackPoints, List<BlackboardAttribute> moreAttributes) throws TskCoreException, BlackboardException { if (trackPoints == null) { throw new IllegalArgumentException(String.format("addTrack was passed a null list of track points")); } @@ -92,7 +89,7 @@ public BlackboardArtifact addTrack(String trackName, GeoTrackPointList trackPoin attributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME, getModuleName(), trackName)); } - attributes.add(trackPointAttributeUtil.toAttribute(getModuleName(), trackPoints)); + attributes.add(BlackboardJsonAttrUtil.toAttribute(TRACKPOINTS_ATTR_TYPE, getModuleName(), trackPoints)); if (programName != null) { attributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PROG_NAME, getModuleName(), programName)); @@ -107,8 +104,8 @@ public BlackboardArtifact addTrack(String trackName, GeoTrackPointList trackPoin getSleuthkitCase().getBlackboard().postArtifact(artifact, getModuleName()); return artifact; - } - + } + /** * Adds a TSK_GPS_ROUTE artifact to the case database. A Global Positioning * System (GPS) route artifact records one or more waypoints entered into a @@ -130,7 +127,7 @@ public BlackboardArtifact addTrack(String trackName, GeoTrackPointList trackPoin * @throws BlackboardException If there is a error posting the artifact to * the blackboard. */ - public BlackboardArtifact addRoute(String routeName, Long creationTime, GeoWaypointList wayPoints, List<BlackboardAttribute> moreAttributes) throws TskCoreException, BlackboardException { + public BlackboardArtifact addRoute(String routeName, Long creationTime, GeoWaypoints wayPoints, List<BlackboardAttribute> moreAttributes) throws TskCoreException, BlackboardException { if (wayPoints == null) { throw new IllegalArgumentException(String.format("addRoute was passed a null list of waypoints")); } @@ -138,7 +135,7 @@ public BlackboardArtifact addRoute(String routeName, Long creationTime, GeoWaypo BlackboardArtifact artifact = getContent().newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_GPS_ROUTE); List<BlackboardAttribute> attributes = new ArrayList<>(); - attributes.add(waypointsAttributeUtil.toAttribute(getModuleName(), wayPoints)); + attributes.add(BlackboardJsonAttrUtil.toAttribute(WAYPOINTS_ATTR_TYPE, getModuleName(), wayPoints)); if (routeName != null) { attributes.add(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME, getModuleName(), routeName)); @@ -162,4 +159,5 @@ public BlackboardArtifact addRoute(String routeName, Long creationTime, GeoWaypo return artifact; } + } diff --git a/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/BlackboardAttributeUtil.java b/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/BlackboardAttributeUtil.java deleted file mode 100755 index d32b264a56a6309498990d944c4125089b9bb48a..0000000000000000000000000000000000000000 --- a/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/BlackboardAttributeUtil.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Sleuth Kit Data Model - * - * Copyright 2020 Basis Technology Corp. - * Contact: carrier <at> sleuthkit <dot> org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.datamodel.blackboardutils.attributes; - -import org.sleuthkit.datamodel.BlackboardAttribute; - -/** - * An interface for Utility classes to implement for translating - * BlackboardAttributes to and from a particular format. Initial use case is for - * BlackboardAttributes of type TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.JSON. - */ -public interface BlackboardAttributeUtil<T> { - - /** - * Translates the value of type T to a attribute. - * - * @param moduleName Name of module creating the artifact - * @param value Object to Translate to attribute - * - * @return BlackboardAttribute created from value - */ - BlackboardAttribute toAttribute(String moduleName, T value); - - /** - * Translates a attribute to an object of type T. - * - * @param attribute The attribute to be translated to T - * - * @return A new instance of T created from the attribute - */ - T fromAttribute(BlackboardAttribute attribute); -} diff --git a/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/BlackboardJsonAttrUtil.java b/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/BlackboardJsonAttrUtil.java new file mode 100755 index 0000000000000000000000000000000000000000..13a4888754a28a49786140b8dcb39aa2099cd43c --- /dev/null +++ b/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/BlackboardJsonAttrUtil.java @@ -0,0 +1,117 @@ +/* + * Sleuth Kit Data Model + * + * Copyright 2020 Basis Technology Corp. + * Contact: carrier <at> sleuthkit <dot> org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.datamodel.blackboardutils.attributes; + +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; +import org.sleuthkit.datamodel.BlackboardAttribute; + +/** + * A utility for converting between JSON and artifact attributes of value type + * TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.JSON. + */ +public final class BlackboardJsonAttrUtil { + + /** + * Creates an attribute of a given type with the string value set to an + * object of type T serialized to JSON. + * + * @param <T> The type of the attribute value object to be + * serialized. + * @param attrType The type of attribute to create. + * @param moduleName The name of the module creating the attribute. + * @param attrValue The attribute value object. + * + * @return The BlackboardAttribute object. + */ + public static <T> BlackboardAttribute toAttribute(BlackboardAttribute.Type attrType, String moduleName, T attrValue) { + if (attrType.getValueType() != BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.JSON) { + throw new IllegalArgumentException(String.format("Attribute type %s does not have value type BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.JSON", attrType.getTypeName())); + } + return new BlackboardAttribute(attrType, moduleName, (new Gson()).toJson(attrValue)); + } + + /** + * Creates an object of type T from the JSON in the string value of a + * BlackboardAttribute with a value type of + * TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.JSON. + * + * @param <T> The type of the object to be created from the JSON. + * @param attr The attribute. + * @param clazz The class object for class T. + * + * @return The T object from the attribute. + * + * @throws InvalidJsonException Thrown the JSON in an artifact attribute + * cannot be deserialized to an object of the + * specified type. + */ + public static <T> T fromAttribute(BlackboardAttribute attr, Class<T> clazz) throws InvalidJsonException { + BlackboardAttribute.Type attrType = attr.getAttributeType(); + if (attrType.getValueType() != BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.JSON) { + throw new IllegalArgumentException(String.format("Attribute type %s does not have value type BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE.JSON", attrType.getTypeName())); + } + String json = attr.getValueString(); + if (json == null || json.isEmpty()) { + throw new InvalidJsonException("The string value (JSON) of the attribute is null or empty"); + } + try { + return (new Gson()).fromJson(json, clazz); + } catch (JsonSyntaxException ex) { + throw new InvalidJsonException(String.format("The string value (JSON) could not be deserialized as a %s", clazz.getName()), ex); + } + } + + /** + * Constructs an exception to be thrown when the JSON in an artifact + * attribute cannot be deserialized to an object of the specified type. + */ + public static class InvalidJsonException extends Exception { + + private static final long serialVersionUID = 1L; + + /** + * Constructs an exception thrown when JSON in an artifact attribute + * cannot be deserialized to an object of the specified type. + * + * @param message An error message. + */ + public InvalidJsonException(String message) { + super(message); + } + + /** + * Constructs an exception thrown when JSON in an artifact attribute + * cannot be deserialized to an object of the specified type. + * + * @param message An error message. + * @param cause An excception that caused this exception to be thrown. + */ + public InvalidJsonException(String message, Throwable cause) { + super(message, cause); + } + } + + /** + * Prevents instantiation of this utility class. + */ + private BlackboardJsonAttrUtil() { + } + +} diff --git a/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/GeoTrackPoints.java b/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/GeoTrackPoints.java new file mode 100755 index 0000000000000000000000000000000000000000..fb61d5a53bd4234cf2d023a3e1a51fd0d20b807c --- /dev/null +++ b/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/GeoTrackPoints.java @@ -0,0 +1,232 @@ +/* + * Sleuth Kit Data Model + * + * Copyright 2020 Basis Technology Corp. + * Contact: carrier <at> sleuthkit <dot> org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.datamodel.blackboardutils.attributes; + +import com.google.gson.annotations.SerializedName; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * A GeoTrackPoints object is a collection of TrackPoint objects. A TrackPoint + * represents a track point, which is a location in a geographic coordinate + * system with latitude, longitude and altitude (elevation) axes. + * + * GeoTrackPoints objects are designed to be used as the string value of the + * TSK_GEO_TRACKPOINTS attribute of a TSK_GPS_TRACK artifact. TSK_GPS_TRACK + * artifacts are used to record a track, or path, of a GPS-enabled device as a + * connected series of track points. + * + */ +public class GeoTrackPoints implements Iterable<GeoTrackPoints.TrackPoint> { + + private final List<TrackPoint> pointList; + + /** + * Constructs an empty GeoTrackPoints object. + */ + public GeoTrackPoints() { + pointList = new ArrayList<>(); + } + + /** + * Adds a track point to this list of track points. + * + * @param trackPoint A track point. + */ + public void addPoint(TrackPoint trackPoint) { + if (trackPoint == null) { + throw new IllegalArgumentException("addPoint was passed a null track point"); + } + + pointList.add(trackPoint); + } + + @Override + public Iterator<TrackPoint> iterator() { + return pointList.iterator(); + } + + /** + * Returns whether or not this list of track points is empty. + * + * @return True or false. + */ + public boolean isEmpty() { + return pointList.isEmpty(); + } + + /** + * Gets the earliest track point timestamp in this list of track points, if + * timestamps are present. + * + * @return The timestamp in milliseconds from the Java epoch of + * 1970-01-01T00:00:00Z, may be null or zero. + */ + public Long getStartTime() { + List<TrackPoint> orderedPoints = getTimeOrderedPoints(); + if (orderedPoints != null) { + for (TrackPoint point : orderedPoints) { + if (point.getTimeStamp() != null) { + return point.getTimeStamp(); + } + } + } + return null; + } + + /** + * Gets the latest track point timestamp in this list of track points, if + * timestamps are present. + * + * @return The timestamp in milliseconds from the Java epoch of + * 1970-01-01T00:00:00Z, may be null or zero. + */ + public Long getEndTime() { + List<TrackPoint> orderedPoints = getTimeOrderedPoints(); + if (orderedPoints != null) { + for (int index = orderedPoints.size() - 1; index >= 0; index--) { + TrackPoint point = orderedPoints.get(index); + if (point.getTimeStamp() != null) { + return point.getTimeStamp(); + } + } + } + return null; + } + + /** + * Gets this list of track points as a list ordered by track point + * timestamp. + * + * @return The ordered list of track points. + */ + private List<TrackPoint> getTimeOrderedPoints() { + return pointList.stream().sorted().collect(Collectors.toCollection(ArrayList::new)); + } + + /** + * A representation of a track point, which is a location in a geographic + * coordinate system with latitude, longitude and altitude (elevation) axes. + */ + public final static class TrackPoint extends GeoWaypoints.Waypoint implements Comparable<TrackPoint> { + + @SerializedName("TSK_GEO_VELOCITY") + private final Double velocity; + @SerializedName("TSK_DISTANCE_FROM_HOMEPOINT") + private final Double distanceFromHomePoint; + @SerializedName("TSK_DISTANCE_TRAVELED") + private final Double distanceTraveled; + @SerializedName("TSK_DATETIME") + private final Long timestamp; + + /** + * Constructs a representation of a track point, which is a location in + * a geographic coordinate system with latitude, longitude and altitude + * (elevation) axes. + * + * @param latitude The latitude of the track point. + * @param longitude The longitude of the track point. + * @param altitude The altitude of the track point, may be + * null. + * @param name The name of the track point, may be + * null. + * @param velocity The velocity of the device at the track + * point in meters per second, may be null. + * @param distanceFromHomePoint The distance of the track point in + * meters from an established home point, + * may be null. + * @param distanceTraveled The distance the device has traveled in + * meters at the time this track point was + * created, may be null. + * @param timestamp The timestamp of the track point as + * milliseconds from the Java epoch of + * 1970-01-01T00:00:00Z, may be null. + */ + public TrackPoint(Double latitude, + Double longitude, + Double altitude, + String name, + Double velocity, + Double distanceFromHomePoint, + Double distanceTraveled, + Long timestamp) { + super(latitude, longitude, altitude, name); + this.velocity = velocity; + this.distanceFromHomePoint = distanceFromHomePoint; + this.distanceTraveled = distanceTraveled; + this.timestamp = timestamp; + } + + /** + * Gets the velocity of the device at this track point in meters per + * second, if known. + * + * @return The velocity in meters/sec, may be null or zero. + */ + public Double getVelocity() { + return velocity; + } + + /** + * Gets the distance of this track point from an established home point, + * if known. + * + * @return The distance in meters, may be null or zero. + */ + public Double getDistanceFromHomePoint() { + return distanceFromHomePoint; + } + + /** + * Gets the distance the device has traveled in meters at the time this + * track point was created, if known. + * + * @return The distance traveled in meters, may be null or zero. + */ + public Double getDistanceTraveled() { + return distanceTraveled; + } + + /** + * Gets the timestamp of this track point as milliseconds from the Java + * epoch of 1970-01-01T00:00:00Z, if known. + * + * @return The timestamp, may be null or zero. + */ + public Long getTimeStamp() { + return timestamp; + } + + @Override + public int compareTo(TrackPoint otherTP) { + Long otherTimeStamp = otherTP.getTimeStamp(); + + if (timestamp == null && otherTimeStamp != null) { + return -1; + } else if (timestamp != null && otherTimeStamp == null) { + return 1; + } else { + return timestamp.compareTo(otherTP.getTimeStamp()); + } + } + } + +} diff --git a/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/GeoWaypoints.java b/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/GeoWaypoints.java new file mode 100755 index 0000000000000000000000000000000000000000..4e5f3ca192dd5816e26927e8b9b30951f5b1f412 --- /dev/null +++ b/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/GeoWaypoints.java @@ -0,0 +1,153 @@ +/* + * Sleuth Kit Data Model + * + * Copyright 2020 Basis Technology Corp. + * Contact: carrier <at> sleuthkit <dot> org + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.sleuthkit.datamodel.blackboardutils.attributes; + +import com.google.gson.annotations.SerializedName; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * A GeoWaypoints object is a collection of Waypoint objects. A Waypoint object + * represents a waypoint for a GPS-enabled device with a navigation capability. + * Every waypoint is a location, possibly named, in a geographic coordinate + * system with latitude, longitude and altitude (elevation) axes. + * + * GeoWaypoints objects are designed to be used as the string value of the + * TSK_GEO_WAYPOINTS attribute of a TSK_GPS_ROUTE artifact. TSK_GPS_ROUTE + * artifacts are used to record one or more waypoints linked together as a route + * to be navigated from waypoint to waypoint. + */ +public class GeoWaypoints implements Iterable<GeoWaypoints.Waypoint> { + + private final List<Waypoint> points; + + /** + * Constructs an empty GeoWaypoints object. + */ + public GeoWaypoints() { + points = new ArrayList<>(); + } + + /** + * Adds a waypoint to this list of waypoints. + * + * @param wayPoint A waypoint. + */ + public void addPoint(Waypoint wayPoint) { + if (wayPoint == null) { + throw new IllegalArgumentException("addPoint was passed a null waypoint"); + } + + points.add(wayPoint); + } + + /** + * Returns whether or not this list of waypoints is empty. + * + * @return True or false. + */ + public boolean isEmpty() { + return points.isEmpty(); + } + + @Override + public Iterator<Waypoint> iterator() { + return points.iterator(); + } + + /** + * A representation of a waypoint, which is a a location, possibly named, in + * a geographic coordinate system with latitude, longitude and altitude + * (elevation) axes. + */ + public static class Waypoint { + + @SerializedName("TSK_GEO_LATITUDE") + private final Double latitude; + @SerializedName("TSK_GEO_LONGITUDE") + private final Double longitude; + @SerializedName("TSK_GEO_ALTITUDE") + private final Double altitude; + @SerializedName("TSK_NAME") + private final String name; + + /** + * Constructs a representation of a waypoint, which is a a location, + * possibly named, in a geographic coordinate system with latitude, + * longitude and altitude (elevation) axes. + * + * @param latitude The latitude of the waypoint. + * @param longitude The longitude of the waypoint. + * @param altitude The altitude of the waypoint, may be null. + * @param name The name of the waypoint, may be null. + */ + public Waypoint(Double latitude, Double longitude, Double altitude, String name) { + if (latitude == null) { + throw new IllegalArgumentException("Constructor was passed null latitude"); + } + + if (longitude == null) { + throw new IllegalArgumentException("Constructor was passed null longitude"); + } + + this.latitude = latitude; + this.longitude = longitude; + this.altitude = altitude; + this.name = name; + } + + /** + * Gets the latitude of this waypoint. + * + * @return The latitude. + */ + public Double getLatitude() { + return latitude; + } + + /** + * Gets the longitude of this waypoint. + * + * @return The longitude. + */ + public Double getLongitude() { + return longitude; + } + + /** + * Gets the altitude of this waypoint, if available. + * + * @return The altitude, may be null or zero. + */ + public Double getAltitude() { + return altitude; + } + + /** + * Gets the name of this waypoint, if available. + * + * @return The name, may be null or empty. + */ + public String getName() { + return name; + } + } + +} diff --git a/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/MessageAttachments.java b/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/MessageAttachments.java index 632268d7409e2ee5073e6f66c4cdbae36c2216d1..c8b26442fb30c3141aa8ef231638de017c0bb309 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/MessageAttachments.java +++ b/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/MessageAttachments.java @@ -333,7 +333,6 @@ public Long getObjId() { } } - private final Collection<FileAttachment> fileAttachments; private final Collection<URLAttachment> urlAttachments; diff --git a/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/TskGeoTrackpointsUtil.java b/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/TskGeoTrackpointsUtil.java deleted file mode 100755 index 1fb1f25594d208fef89e1a7a49c6fce9a039f7eb..0000000000000000000000000000000000000000 --- a/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/TskGeoTrackpointsUtil.java +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Sleuth Kit Data Model - * - * Copyright 2020 Basis Technology Corp. - * Contact: carrier <at> sleuthkit <dot> org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.datamodel.blackboardutils.attributes; - -import com.google.gson.Gson; -import com.google.gson.annotations.SerializedName; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.stream.Collectors; -import org.sleuthkit.datamodel.BlackboardAttribute; -import org.sleuthkit.datamodel.blackboardutils.attributes.TskGeoTrackpointsUtil.GeoTrackPointList; -import org.sleuthkit.datamodel.blackboardutils.attributes.TskGeoTrackpointsUtil.GeoTrackPointList.GeoTrackPoint; - -/** - * A utility class for converting between a TSK_GEO_TRACKPOINTS attribute and a - * GeoTrackPointList. A GeoTrackPointList is a collection of GeoTrackPoints. A - * GeoTrackPoint represents a track point, which is a location in a geographic - * coordinate system with latitude, longitude and altitude (elevation) axes. - * - * TSK_GEO_TRACKPOINTS attributes are used by TSK_GPS_TRACK artifacts to record - * a track, or path, of a GPS-enabled device as a connected series of track - * points. - */ -public final class TskGeoTrackpointsUtil implements BlackboardAttributeUtil<GeoTrackPointList> { - - @Override - public BlackboardAttribute toAttribute(String moduleName, GeoTrackPointList value) { - if (value == null) { - throw new IllegalArgumentException("toAttribute was passed a null list"); - } - - return new BlackboardAttribute( - BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_TRACKPOINTS, - moduleName, - toJSON(value)); - } - - @Override - public GeoTrackPointList fromAttribute(BlackboardAttribute attribute) { - if (attribute == null) { - throw new IllegalArgumentException("fromAttribute was passed a null attribute"); - } - - BlackboardAttribute.ATTRIBUTE_TYPE type = BlackboardAttribute.ATTRIBUTE_TYPE.fromID(attribute.getAttributeType().getTypeID()); - if (type != BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_TRACKPOINTS) { - throw new IllegalArgumentException(String.format("Invalid attribute of type %s passed to fromAttribute method. Attribute of type TSK_GEO_TRACKPOINTS is required", type.getDisplayName())); - } - - return fromJSON(attribute.getValueString()); - } - - /** - * Constructs a GeoTrackPointList object from its JSON representation. - * - * @param json A JSON representation of a GeoTrackPointList. - * - * @return The GeoTrackPointList object. - */ - private static GeoTrackPointList fromJSON(String json) { - if (json == null || json.isEmpty()) { - throw new IllegalArgumentException("fromJSON was passed a empty or null JSON string"); - } - - return (new Gson()).fromJson(json, GeoTrackPointList.class); - } - - /** - * Creates a JSON representation of a GeoTrackPointList object. - * - * @param trackPoints A GeoTrackPointList object. - * - * @return The JSON representation of the GeoTrackPointList object. - */ - private static String toJSON(GeoTrackPointList trackPoints) { - if (trackPoints == null) { - throw new IllegalArgumentException("toJSON was passed a null track points list"); - } - - Gson gson = new Gson(); - return gson.toJson(trackPoints); - } - - /** - * A list of GeoTrackPoints. A GeoTrackPoint represents a track point, which - * is a location in a geographic coordinate system with latitude, longitude - * and altitude (elevation) axes. - */ - public static class GeoTrackPointList implements Iterable<GeoTrackPointList.GeoTrackPoint> { - - private final List<GeoTrackPoint> pointList; - - /** - * Constructs an empty GeoTrackPointList. - */ - public GeoTrackPointList() { - pointList = new ArrayList<>(); - } - - /** - * Adds a track point to this list of track points. - * - * @param trackPoint A track point. - */ - public void addPoint(GeoTrackPoint trackPoint) { - if (trackPoint == null) { - throw new IllegalArgumentException("addPoint was passed a null track point"); - } - - pointList.add(trackPoint); - } - - @Override - public Iterator<GeoTrackPoint> iterator() { - return pointList.iterator(); - } - - /** - * Returns whether or not this list of track points is empty. - * - * @return True or false. - */ - public boolean isEmpty() { - return pointList.isEmpty(); - } - - /** - * Gets the earliest track point timestamp in this list of track points, - * if timestamps are present. - * - * @return The timestamp in milliseconds from the Java epoch of - * 1970-01-01T00:00:00Z, may be null or zero. - */ - public Long getStartTime() { - List<GeoTrackPoint> orderedPoints = getTimeOrderedPoints(); - if (orderedPoints != null) { - for (GeoTrackPoint point : orderedPoints) { - if (point.getTimeStamp() != null) { - return point.getTimeStamp(); - } - } - } - return null; - } - - /** - * Gets the latest track point timestamp in this list of track points, - * if timestamps are present. - * - * @return The timestamp in milliseconds from the Java epoch of - * 1970-01-01T00:00:00Z, may be null or zero. - */ - public Long getEndTime() { - List<GeoTrackPoint> orderedPoints = getTimeOrderedPoints(); - if (orderedPoints != null) { - for (int index = orderedPoints.size() - 1; index >= 0; index--) { - GeoTrackPoint point = orderedPoints.get(index); - if (point.getTimeStamp() != null) { - return point.getTimeStamp(); - } - } - } - return null; - } - - /** - * Gets this list of track points as a list ordered by track point - * timestamp. - * - * @return The ordered list of track points. - */ - private List<GeoTrackPoint> getTimeOrderedPoints() { - return pointList.stream().sorted().collect(Collectors.toCollection(ArrayList::new)); - } - - /** - * A representation of a track point, which is a location in a - * geographic coordinate system with latitude, longitude and altitude - * (elevation) axes. - */ - public final static class GeoTrackPoint extends TskGeoWaypointsUtil.GeoWaypointList.GeoWaypoint implements Comparable<GeoTrackPoint> { - - @SerializedName("TSK_GEO_VELOCITY") - private final Double velocity; - @SerializedName("TSK_DISTANCE_FROM_HOMEPOINT") - private final Double distanceFromHomePoint; - @SerializedName("TSK_DISTANCE_TRAVELED") - private final Double distanceTraveled; - @SerializedName("TSK_DATETIME") - private final Long timestamp; - - /** - * Constructs a representation of a track point, which is a location - * in a geographic coordinate system with latitude, longitude and - * altitude (elevation) axes. - * - * @param latitude The latitude of the track point. - * @param longitude The longitude of the track point. - * @param altitude The altitude of the track point, may - * be null. - * @param name The name of the track point, may be - * null. - * @param velocity The velocity of the device at the - * track point in meters per second, - * may be null. - * @param distanceFromHomePoint The distance of the track point in - * meters from an established home - * point, may be null. - * @param distanceTraveled The distance the device has traveled - * in meters at the time this track - * point was created, may be null. - * @param timestamp The timestamp of the track point as - * milliseconds from the Java epoch of - * 1970-01-01T00:00:00Z, may be null. - */ - public GeoTrackPoint(Double latitude, - Double longitude, - Double altitude, - String name, - Double velocity, - Double distanceFromHomePoint, - Double distanceTraveled, - Long timestamp) { - super(latitude, longitude, altitude, name); - this.velocity = velocity; - this.distanceFromHomePoint = distanceFromHomePoint; - this.distanceTraveled = distanceTraveled; - this.timestamp = timestamp; - } - - /** - * Gets the velocity of the device at this track point in meters per - * second, if known. - * - * @return The velocity in meters/sec, may be null or zero. - */ - public Double getVelocity() { - return velocity; - } - - /** - * Gets the distance of this track point from an established home - * point, if known. - * - * @return The distance in meters, may be null or zero. - */ - public Double getDistanceFromHomePoint() { - return distanceFromHomePoint; - } - - /** - * Gets the distance the device has traveled in meters at the time - * this track point was created, if known. - * - * @return The distance traveled in meters, may be null or zero. - */ - public Double getDistanceTraveled() { - return distanceTraveled; - } - - /** - * Gets the timestamp of this track point as milliseconds from the - * Java epoch of 1970-01-01T00:00:00Z, if known. - * - * @return The timestamp, may be null or zero. - */ - public Long getTimeStamp() { - return timestamp; - } - - @Override - public int compareTo(GeoTrackPoint otherTP) { - Long otherTimeStamp = otherTP.getTimeStamp(); - - if (timestamp == null && otherTimeStamp != null) { - return -1; - } else if (timestamp != null && otherTimeStamp == null) { - return 1; - } else { - return timestamp.compareTo(otherTP.getTimeStamp()); - } - } - } - } -} diff --git a/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/TskGeoWaypointsUtil.java b/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/TskGeoWaypointsUtil.java deleted file mode 100755 index 6b8a48fb8d9ac3fc64df0f251f528c0537907042..0000000000000000000000000000000000000000 --- a/bindings/java/src/org/sleuthkit/datamodel/blackboardutils/attributes/TskGeoWaypointsUtil.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Sleuth Kit Data Model - * - * Copyright 2020 Basis Technology Corp. - * Contact: carrier <at> sleuthkit <dot> org - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.sleuthkit.datamodel.blackboardutils.attributes; - -import com.google.gson.Gson; -import com.google.gson.annotations.SerializedName; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import org.sleuthkit.datamodel.BlackboardAttribute; -import org.sleuthkit.datamodel.blackboardutils.attributes.TskGeoWaypointsUtil.GeoWaypointList; -import org.sleuthkit.datamodel.blackboardutils.attributes.TskGeoWaypointsUtil.GeoWaypointList.GeoWaypoint; - -/** - * A utility class for converting between a TSK_GEO_WAYPOINTS attribute and a - * GeoWaypointList object. A GeoWaypointList is a collection of GeoWaypoints - * objects. A GeoWaypoint represents a waypoint for a GPS-enabled device with a - * navigation capability. Every waypoint is a location, possibly named, in a - * geographic coordinate system with latitude, longitude and altitude - * (elevation) axes. - * - * TSK_GEO_WAYPOINTS attributes are used by TSK_GPS_ROUTE artifacts to record - * one or more waypoints linked together as a route to be navigated from - * waypoint to waypoint. - */ -public final class TskGeoWaypointsUtil implements BlackboardAttributeUtil<GeoWaypointList> { - - @Override - public BlackboardAttribute toAttribute(String moduleName, GeoWaypointList value) { - if (value == null) { - throw new IllegalArgumentException("toAttribute was pass a null list"); - } - - return new BlackboardAttribute( - BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_WAYPOINTS, - moduleName, - toJSON(value)); - } - - @Override - public GeoWaypointList fromAttribute(BlackboardAttribute attribute) { - if (attribute == null) { - throw new IllegalArgumentException("fromAttribute was pass a null list"); - } - - BlackboardAttribute.ATTRIBUTE_TYPE type = BlackboardAttribute.ATTRIBUTE_TYPE.fromID(attribute.getAttributeType().getTypeID()); - if (type != BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_WAYPOINTS) { - throw new IllegalArgumentException(String.format("Invalid attribute of type %s passed to fromAttribute method. Attribute of type TSK_GEO_WAYPOINTS is required", type.getDisplayName())); - } - - return fromJSON(attribute.getValueString()); - } - - /** - * Constructs a GeoWaypointList object from its JSON representation. - * - * @param json A JSON representation of a GeoWaypointList. - * - * @return The GeoWaypointList object. - */ - private static GeoWaypointList fromJSON(String json) { - if (json == null || json.isEmpty()) { - return null; - } - - return (new Gson()).fromJson(json, GeoWaypointList.class); - } - - /** - * Creates a JSON representation of a GeoWaypointList object. - * - * @param waypoints A GeoWaypointList object. - * - * @return The JSON representation of the GeoWaypointList object. - */ - private static String toJSON(GeoWaypointList waypoints) { - Gson gson = new Gson(); - return gson.toJson(waypoints); - } - - /** - * A list of GeoWaypoints. A GeoWaypoint represents a waypoint, which is a a - * location, possibly named, in a geographic coordinate system with - * latitude, longitude and altitude (elevation) axes. - */ - public static final class GeoWaypointList implements Iterable<GeoWaypointList.GeoWaypoint> { - - private final List<GeoWaypoint> points; - - /** - * Constructs an empty GeoWaypointList. - */ - public GeoWaypointList() { - points = new ArrayList<>(); - } - - /** - * Adds a waypoint to this list of waypoints. - * - * @param wayPoint A waypoint. - */ - public void addPoint(GeoWaypoint wayPoint) { - if (wayPoint == null) { - throw new IllegalArgumentException("addPoint was passed a null waypoint"); - } - - points.add(wayPoint); - } - - /** - * Returns whether or not this list of waypoints is empty. - * - * @return True or false. - */ - public boolean isEmpty() { - return points.isEmpty(); - } - - @Override - public Iterator<GeoWaypointList.GeoWaypoint> iterator() { - return points.iterator(); - } - - /** - * A representation of a waypoint, which is a a location, possibly - * named, in a geographic coordinate system with latitude, longitude and - * altitude (elevation) axes. - */ - public static class GeoWaypoint { - - @SerializedName("TSK_GEO_LATITUDE") - private final Double latitude; - @SerializedName("TSK_GEO_LONGITUDE") - private final Double longitude; - @SerializedName("TSK_GEO_ALTITUDE") - private final Double altitude; - @SerializedName("TSK_NAME") - private final String name; - - /** - * Constructs a representation of a waypoint, which is a a location, - * possibly named, in a geographic coordinate system with latitude, - * longitude and altitude (elevation) axes. - * - * @param latitude The latitude of the waypoint. - * @param longitude The longitude of the waypoint. - * @param altitude The altitude of the waypoint, may be null. - * @param name The name of the waypoint, may be null. - */ - public GeoWaypoint(Double latitude, Double longitude, Double altitude, String name) { - if (latitude == null) { - throw new IllegalArgumentException("Constructor was passed null latitude"); - } - - if (longitude == null) { - throw new IllegalArgumentException("Constructor was passed null longitude"); - } - - this.latitude = latitude; - this.longitude = longitude; - this.altitude = altitude; - this.name = name; - } - - /** - * Gets the latitude of this waypoint. - * - * @return The latitude. - */ - public Double getLatitude() { - return latitude; - } - - /** - * Gets the longitude of this waypoint. - * - * @return The longitude. - */ - public Double getLongitude() { - return longitude; - } - - /** - * Get the altitude of this waypoint, if available. - * - * @return The altitude, may be null or zero. - */ - public Double getAltitude() { - return altitude; - } - - /** - * Get the name of this waypoint, if available. - * - * @return The name, may be null or empty. - */ - public String getName() { - return name; - } - } - } -}