// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.oauth; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.Component; import java.io.IOException; import javax.swing.JOptionPane; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.oauth.OAuthParameters; import org.openstreetmap.josm.data.oauth.OAuthToken; import org.openstreetmap.josm.gui.HelpAwareOptionPane; import org.openstreetmap.josm.gui.PleaseWaitRunnable; import org.openstreetmap.josm.gui.help.HelpUtil; import org.openstreetmap.josm.gui.util.GuiHelper; import org.openstreetmap.josm.io.OsmTransferCanceledException; import org.openstreetmap.josm.io.OsmTransferException; import org.openstreetmap.josm.tools.CheckParameterUtil; import org.xml.sax.SAXException; /** * Asynchronous task for retrieving an Access Token. * */ public class RetrieveAccessTokenTask extends PleaseWaitRunnable { private boolean canceled; private OAuthToken accessToken; private final OAuthParameters parameters; private OsmOAuthAuthorizationClient client; private final OAuthToken requestToken; private final Component parent; /** * Creates the task * * @param parent the parent component relative to which the {@link PleaseWaitRunnable}-Dialog * is displayed * @param parameters the OAuth parameters. Must not be null. * @param requestToken the request token for which an Access Token is retrieved. Must not be null. * @throws IllegalArgumentException if parameters is null. * @throws IllegalArgumentException if requestToken is null. */ public RetrieveAccessTokenTask(Component parent, OAuthParameters parameters, OAuthToken requestToken) { super(parent, tr("Retrieving OAuth Access Token..."), false /* don't ignore exceptions */); CheckParameterUtil.ensureParameterNotNull(parameters, "parameters"); CheckParameterUtil.ensureParameterNotNull(requestToken, "requestToken"); this.parameters = parameters; this.requestToken = requestToken; this.parent = parent; } @Override protected void cancel() { canceled = true; synchronized (this) { if (client != null) { client.cancel(); } } } @Override protected void finish() { /* not used in this task */} protected void alertRetrievingAccessTokenFailed() { HelpAwareOptionPane.showOptionDialog( parent, tr( "<html>Retrieving an OAuth Access Token from ''{0}'' failed.</html>", parameters.getAccessTokenUrl() ), tr("Request Failed"), JOptionPane.ERROR_MESSAGE, HelpUtil.ht("/OAuth#NotAuthorizedException") ); } @Override protected void realRun() throws SAXException, IOException, OsmTransferException { try { synchronized (this) { client = new OsmOAuthAuthorizationClient(parameters, requestToken); } accessToken = client.getAccessToken(getProgressMonitor().createSubTaskMonitor(0, false)); } catch (OsmTransferCanceledException e) { Main.trace(e); return; } catch (final OsmOAuthAuthorizationException e) { Main.error(e); GuiHelper.runInEDT(this::alertRetrievingAccessTokenFailed); accessToken = null; } finally { synchronized (this) { client = null; } } } /** * Replies true if the task was canceled. * * @return {@code true} if user aborted operation */ public boolean isCanceled() { return canceled; } /** * Replies the retrieved Access Token. null, if something went wrong. * * @return the retrieved Access Token */ public OAuthToken getAccessToken() { return accessToken; } }