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 }