mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-12 16:06:15 +00:00
exposing geolocation and button setup
This commit is contained in:
parent
3b5463a53d
commit
83c4a64fc2
@ -230,6 +230,13 @@ public class WhereUsedSummary implements DefaultArtifactUpdateGovernor {
|
||||
this.provider = provider;
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Returns all the geolocation artifact types.
|
||||
*/
|
||||
public List<ARTIFACT_TYPE> getGeoTypes() {
|
||||
return GPS_ARTIFACT_TYPES;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<Integer> getArtifactTypeIdsForRefresh() {
|
||||
|
@ -182,7 +182,11 @@
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/datasourcesummary/ui/Bundle.properties" key="WhereUsedPanel.viewInGeolocationBtn.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="enabled" type="boolean" value="false"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="viewInGeolocationBtnActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.Box$Filler" name="filler5">
|
||||
<Properties>
|
||||
|
@ -20,21 +20,31 @@ package org.sleuthkit.autopsy.datasourcesummary.ui;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.openide.util.actions.CallableSystemAction;
|
||||
import org.openide.windows.TopComponent;
|
||||
import org.openide.windows.WindowManager;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.WhereUsedSummary;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.WhereUsedSummary.CityCount;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.datamodel.WhereUsedSummary.CityRecord;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.CellModelTableCellRenderer.DefaultCellModel;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchResult;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.DataFetchWorker.DataFetchComponents;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.IngestRunningLabel;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.JTablePanel;
|
||||
import org.sleuthkit.autopsy.datasourcesummary.uiutils.JTablePanel.ColumnModel;
|
||||
import org.sleuthkit.autopsy.geolocation.GeoFilter;
|
||||
import org.sleuthkit.autopsy.geolocation.GeolocationTopComponent;
|
||||
import org.sleuthkit.autopsy.geolocation.OpenGeolocationAction;
|
||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||
import org.sleuthkit.datamodel.DataSource;
|
||||
|
||||
/**
|
||||
* A tab shown in data source summary displaying information about a data source's geolocation data.
|
||||
* A tab shown in data source summary displaying information about a data
|
||||
* source's geolocation data.
|
||||
*/
|
||||
@Messages({
|
||||
"WhereUsedPanel_cityColumn_title=Closest City",
|
||||
@ -45,10 +55,11 @@ public class WhereUsedPanel extends BaseDataSourceSummaryPanel {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final String GPX_FACTORY = "org.python.proxies.GPX_Parser_Module$GPXParserFileIngestModuleFactory";
|
||||
private static final String GPX_NAME = "GPX Parser";
|
||||
private static final String GPX_NAME = "GPX Parser";
|
||||
|
||||
/**
|
||||
* Retrieves the city name to display from the record.
|
||||
*
|
||||
* @param record The record for the city to display.
|
||||
* @return The display name (city, country).
|
||||
*/
|
||||
@ -56,14 +67,14 @@ public class WhereUsedPanel extends BaseDataSourceSummaryPanel {
|
||||
if (record == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
if (StringUtils.isBlank(record.getCountry())) {
|
||||
return record.getCityName();
|
||||
}
|
||||
|
||||
|
||||
return String.format("%s, %s", record.getCityName(), record.getCountry());
|
||||
}
|
||||
|
||||
|
||||
private static final ColumnModel<CityCount> CITY_COL = new ColumnModel<>(
|
||||
Bundle.WhereUsedPanel_cityColumn_title(),
|
||||
(cityCount) -> new DefaultCellModel(getCityName(cityCount.getCityRecord())),
|
||||
@ -90,6 +101,8 @@ public class WhereUsedPanel extends BaseDataSourceSummaryPanel {
|
||||
|
||||
private final IngestRunningLabel ingestRunningLabel = new IngestRunningLabel();
|
||||
|
||||
private final WhereUsedSummary whereUsedData;
|
||||
|
||||
/**
|
||||
* Main constructor.
|
||||
*/
|
||||
@ -99,25 +112,52 @@ public class WhereUsedPanel extends BaseDataSourceSummaryPanel {
|
||||
|
||||
/**
|
||||
* Main constructor.
|
||||
* @param geolocationData The GeolocationSummary instance to use.
|
||||
*
|
||||
* @param whereUsedData The GeolocationSummary instance to use.
|
||||
*/
|
||||
public WhereUsedPanel(WhereUsedSummary geolocationData) {
|
||||
public WhereUsedPanel(WhereUsedSummary whereUsedData) {
|
||||
this.whereUsedData = whereUsedData;
|
||||
// set up data acquisition methods
|
||||
dataFetchComponents = Arrays.asList(
|
||||
new DataFetchWorker.DataFetchComponents<>(
|
||||
(dataSource) -> geolocationData.getCityCounts(dataSource),
|
||||
(result) -> showResultWithModuleCheck(cityCountsTable, result, GPX_FACTORY, GPX_NAME)));
|
||||
(dataSource) -> whereUsedData.getCityCounts(dataSource),
|
||||
(result) -> handleData(result)));
|
||||
|
||||
initComponents();
|
||||
}
|
||||
|
||||
private void handleData(DataFetchResult<List<CityCount>> result) {
|
||||
if (result != null && result.getResultType() == DataFetchResult.ResultType.SUCCESS && CollectionUtils.isNotEmpty(result.getData())) {
|
||||
viewInGeolocationBtn.setEnabled(true);
|
||||
}
|
||||
|
||||
showResultWithModuleCheck(cityCountsTable, result, GPX_FACTORY, GPX_NAME);
|
||||
}
|
||||
|
||||
private void openGeolocationWindow(DataSource dataSource) {
|
||||
// open the window
|
||||
OpenGeolocationAction geoAction = CallableSystemAction.get(OpenGeolocationAction.class);
|
||||
if (geoAction != null) {
|
||||
geoAction.performAction();
|
||||
}
|
||||
|
||||
// set the filter
|
||||
TopComponent topComponent = WindowManager.getDefault().findTopComponent(GeolocationTopComponent.class.getSimpleName());
|
||||
if (topComponent instanceof GeolocationTopComponent) {
|
||||
GeolocationTopComponent geoComponent = (GeolocationTopComponent) topComponent;
|
||||
geoComponent.fetchAndShowWaypoints(new GeoFilter(true, false, 0, Arrays.asList(dataSource), whereUsedData.getGeoTypes()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void fetchInformation(DataSource dataSource) {
|
||||
viewInGeolocationBtn.setEnabled(false);
|
||||
fetchInformation(dataFetchComponents, dataSource);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onNewDataSource(DataSource dataSource) {
|
||||
viewInGeolocationBtn.setEnabled(false);
|
||||
onNewDataSource(dataFetchComponents, tables, dataSource);
|
||||
}
|
||||
|
||||
@ -180,6 +220,12 @@ public class WhereUsedPanel extends BaseDataSourceSummaryPanel {
|
||||
mainContentPanel.add(filler3);
|
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(viewInGeolocationBtn, org.openide.util.NbBundle.getMessage(WhereUsedPanel.class, "WhereUsedPanel.viewInGeolocationBtn.text")); // NOI18N
|
||||
viewInGeolocationBtn.setEnabled(false);
|
||||
viewInGeolocationBtn.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
viewInGeolocationBtnActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
mainContentPanel.add(viewInGeolocationBtn);
|
||||
|
||||
filler5.setAlignmentX(0.0F);
|
||||
@ -199,6 +245,10 @@ public class WhereUsedPanel extends BaseDataSourceSummaryPanel {
|
||||
);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void viewInGeolocationBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_viewInGeolocationBtnActionPerformed
|
||||
openGeolocationWindow(getDataSource());
|
||||
}//GEN-LAST:event_viewInGeolocationBtnActionPerformed
|
||||
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton viewInGeolocationBtn;
|
||||
|
@ -39,14 +39,14 @@ abstract class AbstractWaypointFetcher implements WaypointBuilder.WaypointFilter
|
||||
|
||||
private static final Logger logger = Logger.getLogger(AbstractWaypointFetcher.class.getName());
|
||||
|
||||
private final GeoFilterPanel.GeoFilter filters;
|
||||
private final GeoFilter filters;
|
||||
|
||||
/**
|
||||
* Constructs the Waypoint Runner
|
||||
*
|
||||
* @param filters
|
||||
*/
|
||||
AbstractWaypointFetcher(GeoFilterPanel.GeoFilter filters) {
|
||||
AbstractWaypointFetcher(GeoFilter filters) {
|
||||
this.filters = filters;
|
||||
}
|
||||
|
||||
|
@ -356,98 +356,6 @@ class GeoFilterPanel extends javax.swing.JPanel {
|
||||
private javax.swing.JCheckBox showWaypointsWOTSCheckBox;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
/**
|
||||
* Class to store the values of the Geolocation user set filter parameters
|
||||
*/
|
||||
final class GeoFilter {
|
||||
|
||||
private final boolean showAll;
|
||||
private final boolean showWithoutTimeStamp;
|
||||
private final int mostRecentNumDays;
|
||||
private final List<DataSource> dataSources;
|
||||
private final List<ARTIFACT_TYPE> artifactTypes;
|
||||
|
||||
/**
|
||||
* Construct a Geolocation filter. showAll and mostRecentNumDays are
|
||||
* exclusive filters, ie they cannot be used together.
|
||||
*
|
||||
* withoutTimeStamp is only applicable if mostRecentNumDays is true.
|
||||
*
|
||||
* When using the filters "most recent days" means to include waypoints
|
||||
* for the numbers of days after the most recent waypoint, not the
|
||||
* current date.
|
||||
*
|
||||
* @param showAll True if all waypoints should be shown
|
||||
* @param withoutTimeStamp True to show waypoints without timeStamps,
|
||||
* this filter is only applicable if mostRecentNumDays is true
|
||||
* @param mostRecentNumDays Show Waypoint for the most recent given
|
||||
* number of days. This parameter is ignored if showAll is true.
|
||||
* @param dataSources A list of dataSources to filter waypoint for.
|
||||
* @param artifactTypes A list of artifactTypes to filter waypoint for.
|
||||
*/
|
||||
GeoFilter(boolean showAll, boolean withoutTimeStamp,
|
||||
int mostRecentNumDays, List<DataSource> dataSources,
|
||||
List<ARTIFACT_TYPE> artifactTypes) {
|
||||
this.showAll = showAll;
|
||||
this.showWithoutTimeStamp = withoutTimeStamp;
|
||||
this.mostRecentNumDays = mostRecentNumDays;
|
||||
this.dataSources = dataSources;
|
||||
this.artifactTypes = artifactTypes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether or not to show all waypoints.
|
||||
*
|
||||
* @return True if all waypoints should be shown.
|
||||
*/
|
||||
boolean showAllWaypoints() {
|
||||
return showAll;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether or not to include waypoints with time stamps.
|
||||
*
|
||||
* This filter is only applicable if "showAll" is true.
|
||||
*
|
||||
* @return True if waypoints with time stamps should be shown.
|
||||
*/
|
||||
boolean showWaypointsWithoutTimeStamp() {
|
||||
return showWithoutTimeStamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of most recent days to show waypoints for. This
|
||||
* value should be ignored if showAll is true.
|
||||
*
|
||||
* @return The number of most recent days to show waypoints for
|
||||
*/
|
||||
int getMostRecentNumDays() {
|
||||
return mostRecentNumDays;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of data sources to filter the waypoints by, or null if
|
||||
* all datasources should be include.
|
||||
*
|
||||
* @return A list of dataSources or null if all dataSources should be
|
||||
* included.
|
||||
*/
|
||||
List<DataSource> getDataSources() {
|
||||
return Collections.unmodifiableList(dataSources);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of artifact types to filter the waypoints by, or null
|
||||
* if all types should be include.
|
||||
*
|
||||
* @return A list of artifactTypes or null if all artifactTypes should
|
||||
* be included.
|
||||
*/
|
||||
List<ARTIFACT_TYPE> getArtifactTypes() {
|
||||
return Collections.unmodifiableList(artifactTypes);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Container for data sources and artifact types to be given as filter
|
||||
* options
|
||||
|
@ -48,7 +48,6 @@ import static org.sleuthkit.autopsy.casemodule.Case.Events.CURRENT_CASE;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
|
||||
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
|
||||
import org.sleuthkit.autopsy.geolocation.GeoFilterPanel.GeoFilter;
|
||||
import org.sleuthkit.autopsy.geolocation.datamodel.GeoLocationDataException;
|
||||
import org.sleuthkit.autopsy.ingest.IngestManager;
|
||||
import static org.sleuthkit.autopsy.ingest.IngestManager.IngestModuleEvent.DATA_ADDED;
|
||||
@ -295,6 +294,15 @@ public final class GeolocationTopComponent extends TopComponent {
|
||||
return;
|
||||
}
|
||||
|
||||
fetchAndShowWaypoints(filters);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads and shows waypoints based on the filters.
|
||||
*
|
||||
* @param filters The filters to use.
|
||||
*/
|
||||
public void fetchAndShowWaypoints(GeoFilter filters) {
|
||||
setWaypointLoading(true);
|
||||
geoFilterPanel.setEnabled(false);
|
||||
|
||||
@ -491,8 +499,8 @@ public final class GeolocationTopComponent extends TopComponent {
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
/**
|
||||
* Extends AbstractWaypointFetcher to handle the returning of
|
||||
* the filters set of MapWaypoints.
|
||||
* Extends AbstractWaypointFetcher to handle the returning of the filters
|
||||
* set of MapWaypoints.
|
||||
*/
|
||||
@Messages({
|
||||
"GeolocationTopComponent.WaypointFetcher.onErrorTitle=Error gathering GPS Track Data",
|
||||
@ -507,13 +515,13 @@ public final class GeolocationTopComponent extends TopComponent {
|
||||
@Override
|
||||
void handleFilteredWaypointSet(Set<MapWaypoint> mapWaypoints, List<Set<MapWaypoint>> tracks, boolean wasEntirelySuccessful) {
|
||||
addWaypointsToMap(mapWaypoints, tracks);
|
||||
|
||||
|
||||
// if there is an error, present to the user.
|
||||
if (!wasEntirelySuccessful) {
|
||||
JOptionPane.showMessageDialog(GeolocationTopComponent.this,
|
||||
Bundle.GeolocationTopComponent_WaypointFetcher_onErrorDescription(),
|
||||
Bundle.GeolocationTopComponent_WaypointFetcher_onErrorTitle(),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
JOptionPane.showMessageDialog(GeolocationTopComponent.this,
|
||||
Bundle.GeolocationTopComponent_WaypointFetcher_onErrorDescription(),
|
||||
Bundle.GeolocationTopComponent_WaypointFetcher_onErrorTitle(),
|
||||
JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user