// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.opendata.core.actions;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.Future;
import java.util.regex.Pattern;
import javax.swing.JOptionPane;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
import org.openstreetmap.josm.data.Bounds;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
import org.openstreetmap.josm.gui.progress.ProgressMonitor;
import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
import org.openstreetmap.josm.plugins.opendata.core.datasets.DataSetUpdater;
import org.openstreetmap.josm.plugins.opendata.core.gui.AskLicenseAgreementDialog;
import org.openstreetmap.josm.plugins.opendata.core.io.NetworkReader;
import org.openstreetmap.josm.plugins.opendata.core.layers.OdDataLayer;
import org.openstreetmap.josm.plugins.opendata.core.licenses.License;
import org.openstreetmap.josm.plugins.opendata.core.modules.Module;
import org.openstreetmap.josm.plugins.opendata.core.modules.ModuleHandler;
public class DownloadDataTask extends DownloadOsmTask {
private AbstractDataSetHandler handler;
@Override
public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
return null;
}
@Override
public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
downloadTask = new InternalDownloadTasK(newLayer, new NetworkReader(url, handler, true), progressMonitor);
currentBounds = null;
if (handler == null || !handler.hasLicenseToBeAccepted() || askLicenseAgreement(handler.getLicense())) {
return Main.worker.submit(downloadTask);
} else {
return null;
}
}
@Override
public boolean acceptsUrl(String url) {
this.handler = null;
for (Module module : ModuleHandler.moduleList) {
for (AbstractDataSetHandler handler : module.getNewlyInstanciatedHandlers()) {
if (handler.acceptsUrl(url)) {
this.handler = handler;
return true;
}
}
}
for (String ext : NetworkReader.FILE_AND_ARCHIVE_READERS.keySet()) {
if (Pattern.compile(".*\\."+ext, Pattern.CASE_INSENSITIVE).matcher(url).matches()) {
return true;
}
}
return false;
}
@Override
public String[] getPatterns() {
String pattern = "";
for (String ext : NetworkReader.FILE_AND_ARCHIVE_READERS.keySet()) {
if (!pattern.isEmpty()) {
pattern += "|";
}
pattern += "."+ext;
}
return new String[]{".*(" + pattern + ")"};
}
@Override
public String getTitle() {
return tr("Download open data");
}
protected class InternalDownloadTasK extends DownloadTask {
public InternalDownloadTasK(boolean newLayer, NetworkReader reader, ProgressMonitor progressMonitor) {
super(newLayer, reader, progressMonitor);
}
@Override
protected OsmDataLayer createNewLayer(String layerName) {
File associatedFile = ((NetworkReader) reader).getReadFile();
String filename = ((NetworkReader) reader).getReadFileName();
if (layerName == null || layerName.isEmpty()) {
if (associatedFile != null) {
layerName = associatedFile.getName();
} else if (filename != null && !filename.isEmpty()) {
layerName = filename;
} else {
layerName = OsmDataLayer.createNewName();
}
}
DataSetUpdater.updateDataSet(dataSet, handler, associatedFile);
return new OdDataLayer(dataSet, layerName, associatedFile, handler);
}
}
/**
* returns true if the user accepts the license, false if they refuse
*/
protected final boolean askLicenseAgreement(License license) {
if (license == null || (license.getURL() == null && license.getSummaryURL() == null)) {
return true;
}
try {
return new AskLicenseAgreementDialog(license).showDialog().getValue() == 1;
} catch (IOException e) {
JOptionPane.showMessageDialog(Main.parent, tr("License URL not available: {0}", license.toString()));
return false;
}
}
}