Autopsy 4.22.1
Graphical digital forensics platform for The Sleuth Kit and other tools.
AbstractWaypointFetcher.java
Go to the documentation of this file.
1/*
2 * Autopsy Forensic Browser
3 *
4 * Copyright 2019-2020 Basis Technology Corp.
5 * Contact: carrier <at> sleuthkit <dot> org
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19package org.sleuthkit.autopsy.geolocation;
20
21import java.util.ArrayList;
22import java.util.List;
23import java.util.Set;
24import java.util.logging.Level;
25import org.sleuthkit.autopsy.casemodule.Case;
26import org.sleuthkit.autopsy.coreutils.Logger;
27import org.sleuthkit.autopsy.geolocation.datamodel.GeoLocationDataException;
28import org.sleuthkit.autopsy.geolocation.datamodel.GeoLocationParseResult;
29import org.sleuthkit.autopsy.geolocation.datamodel.Area;
30import org.sleuthkit.autopsy.geolocation.datamodel.Track;
31import org.sleuthkit.autopsy.geolocation.datamodel.Waypoint;
32import org.sleuthkit.autopsy.geolocation.datamodel.WaypointBuilder;
33import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
34
38public abstract class AbstractWaypointFetcher implements WaypointBuilder.WaypointFilterQueryCallBack {
39
40 private static final Logger logger = Logger.getLogger(AbstractWaypointFetcher.class.getName());
41
42 private final GeoFilter filters;
43
50 this.filters = filters;
51 }
52
62 void getWaypoints() throws GeoLocationDataException {
63 Case currentCase = Case.getCurrentCase();
65 filters.getDataSources(),
66 filters.getArtifactTypes(),
67 filters.showAllWaypoints(),
68 filters.getMostRecentNumDays(),
69 filters.showWaypointsWithoutTimeStamp(),
70 this);
71
72 }
73
83 protected abstract void handleFilteredWaypointSet(Set<MapWaypoint> mapWaypoints, List<Set<MapWaypoint>> tracks,
84 List<Set<MapWaypoint>> areas, boolean wasEntirelySuccessful);
85
86 @Override
87 public void process(GeoLocationParseResult<Waypoint> waypointResults) {
88 GeoLocationParseResult<Track> trackResults = null;
89 if (filters.getArtifactTypes().contains(ARTIFACT_TYPE.TSK_GPS_TRACK)) {
90 try {
91 trackResults = Track.getTracks(Case.getCurrentCase().getSleuthkitCase(), filters.getDataSources());
92 } catch (GeoLocationDataException ex) {
93 logger.log(Level.WARNING, "Exception thrown while retrieving list of Tracks", ex);
94 }
95 }
96
97 GeoLocationParseResult<Area> areaResults = null;
98 if (filters.getArtifactTypes().contains(ARTIFACT_TYPE.TSK_GPS_AREA)) {
99 try {
100 areaResults = Area.getAreas(Case.getCurrentCase().getSleuthkitCase(), filters.getDataSources());
101 } catch (GeoLocationDataException ex) {
102 logger.log(Level.WARNING, "Exception thrown while retrieving list of Areas", ex);
103 }
104 }
105
106 GeoDataSet geoDataSet = createWaypointList(
107 waypointResults.getItems(),
108 (trackResults == null) ? new ArrayList<>() : trackResults.getItems(),
109 (areaResults == null) ? new ArrayList<>() : areaResults.getItems());
110
111
112 final Set<MapWaypoint> pointSet = MapWaypoint.getWaypoints(geoDataSet.getWaypoints());
113 final List<Set<MapWaypoint>> trackSets = new ArrayList<>();
114 for (List<Waypoint> t : geoDataSet.getTracks()) {
115 trackSets.add(MapWaypoint.getWaypoints(t));
116 }
117 final List<Set<MapWaypoint>> areaSets = new ArrayList<>();
118 for (List<Waypoint> t : geoDataSet.getAreas()) {
119 areaSets.add(MapWaypoint.getWaypoints(t));
120 }
121
123 pointSet, trackSets, areaSets,
124 (trackResults == null || trackResults.isSuccessfullyParsed())
125 && (areaResults == null || areaResults.isSuccessfullyParsed())
126 && waypointResults.isSuccessfullyParsed());
127 }
128
140 private GeoDataSet createWaypointList(List<Waypoint> waypoints, List<Track> tracks, List<Area> areas) {
141 final List<Waypoint> completeList = new ArrayList<>();
142 List<List<Waypoint>> filteredTracks = new ArrayList<>();
143 List<List<Waypoint>> filteredAreas = new ArrayList<>();
144
145 if (tracks != null) {
146 Long timeRangeEnd;
147 Long timeRangeStart;
148 if (!filters.showAllWaypoints()) {
149 // Figure out what the most recent time is given the filtered
150 // waypoints and the tracks.
151 timeRangeEnd = getMostRecent(waypoints, tracks);
152 timeRangeStart = timeRangeEnd - (86400 * filters.getMostRecentNumDays());
153
154 completeList.addAll(getWaypointsInRange(timeRangeStart, timeRangeEnd, waypoints));
155
156 filteredTracks = getTracksInRange(timeRangeStart, timeRangeEnd, tracks);
157 for (List<Waypoint> filteredTrack : filteredTracks) {
158 completeList.addAll(filteredTrack);
159 }
160 } else {
161 completeList.addAll(waypoints);
162 for (Track track : tracks) {
163 completeList.addAll(track.getPath());
164 filteredTracks.add(track.getPath());
165 }
166 }
167 } else {
168 completeList.addAll(waypoints);
169 }
170
171 // Areas don't have timestamps so add all of them
172 for (Area area : areas) {
173 completeList.addAll(area.getPath());
174 filteredAreas.add(area.getPath());
175 }
176
177 return new GeoDataSet(completeList, filteredTracks, filteredAreas);
178 }
179
189 private List<Waypoint> getWaypointsInRange(Long timeRangeStart, Long timeRangeEnd, List<Waypoint> waypoints) {
190 List<Waypoint> completeList = new ArrayList<>();
191 // Add all of the waypoints that fix into the time range.
192 if (waypoints != null) {
193 for (Waypoint point : waypoints) {
194 Long time = point.getTimestamp();
195 if ((time == null && filters.showWaypointsWithoutTimeStamp())
196 || (time != null && (time >= timeRangeStart && time <= timeRangeEnd))) {
197
198 completeList.add(point);
199 }
200 }
201 }
202 return completeList;
203 }
204
217 private List<List<Waypoint>> getTracksInRange(Long timeRangeStart, Long timeRangeEnd, List<Track> tracks) {
218 List<List<Waypoint>> ret = new ArrayList<>();
219 if (tracks != null) {
220 for (Track track : tracks) {
221 Long trackTime = track.getStartTime();
222
223 if ((trackTime == null && filters.showWaypointsWithoutTimeStamp())
224 || (trackTime != null && (trackTime >= timeRangeStart && trackTime <= timeRangeEnd))) {
225 ret.add(track.getPath());
226 }
227 }
228 }
229 return ret;
230 }
231
239 private Long findMostRecentTimestamp(List<Waypoint> points) {
240
241 Long mostRecent = null;
242
243 for (Waypoint point : points) {
244 if (mostRecent == null) {
245 mostRecent = point.getTimestamp();
246 } else {
247 mostRecent = Math.max(mostRecent, point.getTimestamp());
248 }
249 }
250
251 return mostRecent;
252 }
253
261 private Long findMostRecentTracks(List<Track> tracks) {
262 Long mostRecent = null;
263
264 for (Track track : tracks) {
265 if (mostRecent == null) {
266 mostRecent = track.getStartTime();
267 } else if (track.getStartTime() != null) {
268 mostRecent = Math.max(mostRecent, track.getStartTime());
269 }
270 }
271
272 return mostRecent;
273 }
274
284 private Long getMostRecent(List<Waypoint> points, List<Track> tracks) {
285 Long waypointMostRecent = findMostRecentTimestamp(points);
286 Long trackMostRecent = findMostRecentTracks(tracks);
287
288 if (waypointMostRecent != null && trackMostRecent != null) {
289 return Math.max(waypointMostRecent, trackMostRecent);
290 } else if (waypointMostRecent == null && trackMostRecent != null) {
291 return trackMostRecent;
292 } else if (waypointMostRecent != null && trackMostRecent == null) {
293 return waypointMostRecent;
294 }
295
296 return -1L;
297 }
298
302 static class GeoDataSet {
303 private final List<Waypoint> waypoints;
304 private final List<List<Waypoint>> tracks;
305 private final List<List<Waypoint>> areas;
306
307 GeoDataSet(List<Waypoint> waypoints, List<List<Waypoint>> tracks, List<List<Waypoint>> areas) {
308 this.waypoints = waypoints;
309 this.tracks = tracks;
310 this.areas = areas;
311 }
312
313 List<Waypoint> getWaypoints() {
314 return waypoints;
315 }
316
317 List<List<Waypoint>> getTracks() {
318 return tracks;
319 }
320
321 List<List<Waypoint>> getAreas() {
322 return areas;
323 }
324 }
325}
synchronized static Logger getLogger(String name)
Definition Logger.java:124
Long getMostRecent(List< Waypoint > points, List< Track > tracks)
List< List< Waypoint > > getTracksInRange(Long timeRangeStart, Long timeRangeEnd, List< Track > tracks)
abstract void handleFilteredWaypointSet(Set< MapWaypoint > mapWaypoints, List< Set< MapWaypoint > > tracks, List< Set< MapWaypoint > > areas, boolean wasEntirelySuccessful)
GeoDataSet createWaypointList(List< Waypoint > waypoints, List< Track > tracks, List< Area > areas)
List< Waypoint > getWaypointsInRange(Long timeRangeStart, Long timeRangeEnd, List< Waypoint > waypoints)
void process(GeoLocationParseResult< Waypoint > waypointResults)
static GeoLocationParseResult< Track > getTracks(SleuthkitCase skCase, List<? extends Content > sourceList)
Definition GeoPath.java:80
static GeoLocationParseResult< Area > getAreas(SleuthkitCase skCase, List<? extends Content > sourceList)
Definition GeoPath.java:115
static List< Waypoint > getAllWaypoints(SleuthkitCase skCase)

Copyright © 2012-2024 Sleuth Kit Labs. Generated on:
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.