// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.trustosm.gui; import static org.openstreetmap.josm.tools.I18n.tr; import static org.openstreetmap.josm.tools.I18n.trn; import java.io.IOException; import java.util.Collection; import javax.swing.SwingUtilities; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.AutoScaleAction; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.gui.ExceptionDialogUtil; import org.openstreetmap.josm.gui.PleaseWaitRunnable; import org.openstreetmap.josm.gui.layer.OsmDataLayer; import org.openstreetmap.josm.gui.progress.ProgressMonitor; import org.openstreetmap.josm.io.MultiFetchServerObjectReader; import org.openstreetmap.josm.io.OsmTransferException; import org.openstreetmap.josm.plugins.trustosm.TrustOSMplugin; import org.openstreetmap.josm.plugins.trustosm.data.TrustOsmPrimitive; import org.xml.sax.SAXException; public class DownloadSignedOsmDataTask extends PleaseWaitRunnable { private boolean canceled; private Exception lastException; private final Collection<OsmPrimitive> missing; private final OsmDataLayer curLayer; private MultiFetchServerObjectReader objectReader; /** * Download the given OSMPrimitives to the given layer */ public DownloadSignedOsmDataTask(Collection<OsmPrimitive> missing, OsmDataLayer curLayer) { super(tr("Download signed data")); this.missing = missing; this.curLayer = curLayer; } @Override protected void cancel() { canceled = true; synchronized (this) { if (objectReader != null) { objectReader.cancel(); } } } @Override protected void finish() { Main.map.repaint(); if (canceled) return; if (lastException != null) { ExceptionDialogUtil.explainException(lastException); } } protected String buildDownloadFeedbackMessage() { return trn("Downloading {0} incomplete child of relation ''{1}''", "Downloading {0} incomplete children of relation ''{1}''", missing.size(), missing.size(), "Wurst" ); } @Override protected void realRun() throws SAXException, IOException, OsmTransferException { try { synchronized (this) { if (canceled) return; objectReader = MultiFetchServerObjectReader.create(); } objectReader.append(missing); progressMonitor.indeterminateSubTask( buildDownloadFeedbackMessage() ); final DataSet dataSet = objectReader.parseOsm(progressMonitor .createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false)); if (dataSet == null) return; synchronized (this) { if (canceled) return; objectReader = null; } SwingUtilities.invokeLater( () -> { curLayer.mergeFrom(dataSet); curLayer.onPostDownloadFromServer(); AutoScaleAction.zoomTo(dataSet.allPrimitives()); updateReferences(dataSet); } ); } catch (Exception e) { if (canceled) { System.out.println(tr("Warning: Ignoring exception because task was canceled. Exception: {0}", e.toString())); return; } lastException = e; } } public boolean updateReferences(DataSet ds) { for (TrustOsmPrimitive t : TrustOSMplugin.signedItems.values()) { OsmPrimitive osm = ds.getPrimitiveById(t.getOsmPrimitive().getPrimitiveId()); if (osm != null) { t.setOsmPrimitive(osm); return true; } else { System.out.println("No item found"); } } return false; } }