001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.gui.oauth;
003
004 import static org.openstreetmap.josm.tools.I18n.tr;
005
006 import java.awt.Component;
007 import java.io.IOException;
008
009 import javax.swing.JOptionPane;
010
011 import org.openstreetmap.josm.data.oauth.OAuthParameters;
012 import org.openstreetmap.josm.data.oauth.OAuthToken;
013 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
014 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
015 import org.openstreetmap.josm.gui.help.HelpUtil;
016 import org.openstreetmap.josm.io.OsmTransferCanceledException;
017 import org.openstreetmap.josm.io.OsmTransferException;
018 import org.openstreetmap.josm.tools.CheckParameterUtil;
019 import org.xml.sax.SAXException;
020
021 /**
022 * Asynchronous task for retrieving a request token
023 */
024 public class RetrieveRequestTokenTask extends PleaseWaitRunnable {
025
026 private boolean canceled;
027 private OAuthToken requestToken;
028 private OAuthParameters parameters;
029 private OsmOAuthAuthorizationClient client;
030 private Component parent;
031
032 /**
033 * Creates the task
034 *
035 * @param parent the parent component relative to which the {@link PleaseWaitRunnable}-Dialog
036 * is displayed
037 * @param parameters the OAuth parameters. Must not be null.
038 * @throws IllegalArgumentException thrown if parameters is null.
039 */
040 public RetrieveRequestTokenTask(Component parent, OAuthParameters parameters ) {
041 super(parent, tr("Retrieving OAuth Request Token..."), false /* don't ignore exceptions */);
042 CheckParameterUtil.ensureParameterNotNull(parameters, "parameters");
043 this.parameters = parameters;
044 this.parent = parent;
045 }
046
047 @Override
048 protected void cancel() {
049 canceled = true;
050 synchronized(this) {
051 if (client != null) {
052 client.cancel();
053 }
054 }
055 }
056
057 @Override
058 protected void finish() { /* not used in this task */}
059
060 protected void alertRetrievingRequestTokenFailed(OsmOAuthAuthorizationException e) {
061 HelpAwareOptionPane.showOptionDialog(
062 parent,
063 tr(
064 "<html>Retrieving an OAuth Request Token from ''{0}'' failed.</html>",
065 parameters.getRequestTokenUrl()
066 ),
067 tr("Request Failed"),
068 JOptionPane.ERROR_MESSAGE,
069 HelpUtil.ht("/OAuth#NotAuthorizedException")
070 );
071 }
072
073 @Override
074 protected void realRun() throws SAXException, IOException, OsmTransferException {
075 try {
076 synchronized(this) {
077 client = new OsmOAuthAuthorizationClient(parameters);
078 }
079 requestToken = client.getRequestToken(getProgressMonitor().createSubTaskMonitor(0, false));
080 } catch(OsmTransferCanceledException e) {
081 return;
082 } catch (OsmOAuthAuthorizationException e) {
083 e.printStackTrace();
084 alertRetrievingRequestTokenFailed(e);
085 requestToken = null;
086 } finally {
087 synchronized(this) {
088 client = null;
089 }
090 }
091 }
092
093 /**
094 * Replies true if the task was canceled
095 *
096 * @return true if the task was canceled
097 */
098 public boolean isCanceled() {
099 return canceled;
100 }
101
102 /**
103 * Replies the request token. null, if something went wrong.
104 *
105 * @return the request token
106 */
107 public OAuthToken getRequestToken() {
108 return requestToken;
109 }
110 }