diff --git a/pom.xml b/pom.xml index 29c50fb0..376cc64b 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ uk.m0nom adif-processor - 1.4.3 + 1.4.4 ADIF Processor https://github.com/urbancamo/adif-processor diff --git a/src/main/java/uk/m0nom/adifproc/activity/ActivityDatabaseService.java b/src/main/java/uk/m0nom/adifproc/activity/ActivityDatabaseService.java index 3cd8590e..59878f48 100644 --- a/src/main/java/uk/m0nom/adifproc/activity/ActivityDatabaseService.java +++ b/src/main/java/uk/m0nom/adifproc/activity/ActivityDatabaseService.java @@ -15,6 +15,7 @@ import java.io.IOException; import java.io.InputStream; +import java.net.URI; import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; @@ -56,16 +57,35 @@ public ActivityDatabaseService() { */ public void loadData() { readers.values().forEach(reader -> { - InputStream inputStream = getClass().getClassLoader().getResourceAsStream(reader.getSourceFile()); - if (inputStream == null) { - logger.severe(String.format("Can't load %s using classloader %s", reader.getSourceFile(), getClass().getClassLoader().toString())); + boolean readingFromRemote = false; + InputStream inputStream = null; + if (reader instanceof RemoteActivitySource remoteActivitySource) { + // Attempt to download the file from the remote source + try { + inputStream = URI.create(remoteActivitySource.getRemoteUrl()).toURL().openStream(); + if (inputStream != null) { + logger.info(String.format("Loading %s from %s", reader.getType().getActivityName(), remoteActivitySource.getRemoteUrl())); + readingFromRemote = true; + } + } catch (IOException e) { + // problem downloading the file, so load the local copy instead + logger.warning(String.format("Problem downloading %s from %s", reader.getType().getActivityName(), remoteActivitySource.getRemoteUrl())); + } } + if (!readingFromRemote) { + inputStream = getClass().getClassLoader().getResourceAsStream(reader.getSourceFile()); + if (inputStream == null) { + logger.severe(String.format("Can't load %s using classloader %s", reader.getSourceFile(), getClass().getClassLoader().toString())); + } + } + try { ActivityDatabase database = reader.read(inputStream); databases.put(reader.getType().getActivityName(), database); } catch (IOException e) { logger.severe(String.format("Exception thrown reading activity databases: %s", e.getMessage())); } + //logger.info(String.format("%d %s records loaded", database.size(), reader.getType().getActivityDescription())); }); } diff --git a/src/main/java/uk/m0nom/adifproc/activity/RemoteActivitySource.java b/src/main/java/uk/m0nom/adifproc/activity/RemoteActivitySource.java new file mode 100644 index 00000000..a01314ea --- /dev/null +++ b/src/main/java/uk/m0nom/adifproc/activity/RemoteActivitySource.java @@ -0,0 +1,5 @@ +package uk.m0nom.adifproc.activity; + +public interface RemoteActivitySource { + String getRemoteUrl(); +} diff --git a/src/main/java/uk/m0nom/adifproc/activity/pota/PotaCsvReader.java b/src/main/java/uk/m0nom/adifproc/activity/pota/PotaCsvReader.java index 8a66fd17..deeecf29 100644 --- a/src/main/java/uk/m0nom/adifproc/activity/pota/PotaCsvReader.java +++ b/src/main/java/uk/m0nom/adifproc/activity/pota/PotaCsvReader.java @@ -5,16 +5,18 @@ import uk.m0nom.adifproc.activity.Activity; import uk.m0nom.adifproc.activity.ActivityType; import uk.m0nom.adifproc.activity.CsvActivityReader; +import uk.m0nom.adifproc.activity.RemoteActivitySource; /** * Reader for the Parks on the Air CSV extract */ -public class PotaCsvReader extends CsvActivityReader { +public class PotaCsvReader extends CsvActivityReader implements RemoteActivitySource { public PotaCsvReader(String sourceFile) { super(ActivityType.POTA, sourceFile); } + @Override protected Activity readRecord(CSVRecord record) throws IllegalArgumentException { PotaInfo info = new PotaInfo(); @@ -31,4 +33,9 @@ protected Activity readRecord(CSVRecord record) throws IllegalArgumentException info.setGrid(record.get("grid")); return info; } + + @Override + public String getRemoteUrl() { + return "https://pota.app/all_parks_ext.csv"; + } }