001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.oauth;
003
004import org.openstreetmap.josm.data.Preferences;
005import org.openstreetmap.josm.data.oauth.OAuthParameters;
006import org.openstreetmap.josm.data.oauth.OAuthToken;
007import org.openstreetmap.josm.gui.widgets.VerticallyScrollablePanel;
008import org.openstreetmap.josm.tools.CheckParameterUtil;
009
010/**
011 * This is the abstract base class for the three authorisation UIs.
012 *
013 * @since 2746
014 */
015public abstract class AbstractAuthorizationUI extends VerticallyScrollablePanel {
016    /**
017     * The property name for the Access Token property
018     */
019    static public final String ACCESS_TOKEN_PROP = AbstractAuthorizationUI.class.getName() + ".accessToken";
020
021    private String apiUrl;
022    private final AdvancedOAuthPropertiesPanel pnlAdvancedProperties;
023    private OAuthToken accessToken;
024
025    protected void fireAccessTokenChanged(OAuthToken oldValue, OAuthToken newValue) {
026        firePropertyChange(ACCESS_TOKEN_PROP, oldValue, newValue);
027    }
028
029    /**
030     * Constructs a new {@code AbstractAuthorizationUI} for the given API URL.
031     * @param apiUrl The OSM API URL
032     * @since 5422
033     */
034    public AbstractAuthorizationUI(String apiUrl) {
035        pnlAdvancedProperties = new AdvancedOAuthPropertiesPanel();
036        setApiUrl(apiUrl);
037    }
038
039    /**
040     * Replies the URL of the OSM API for which this UI is currently trying to retrieve an OAuth
041     * Access Token
042     *
043     * @return the API URL
044     */
045    public String getApiUrl() {
046        return apiUrl;
047    }
048
049    /**
050     * Sets the URL of the OSM API for which this UI is currently trying to retrieve an OAuth
051     * Access Token
052     *
053     * @param apiUrl the api URL
054     */
055    public void setApiUrl(String apiUrl) {
056        this.apiUrl = apiUrl;
057        this.pnlAdvancedProperties.setApiUrl(apiUrl);
058    }
059
060    /**
061     * Replies the panel for entering advanced OAuth parameters (see {@link OAuthParameters})
062     *
063     * @return the panel for entering advanced OAuth parameters
064     * @see #getOAuthParameters()
065     */
066    protected AdvancedOAuthPropertiesPanel getAdvancedPropertiesPanel() {
067        return pnlAdvancedProperties;
068    }
069
070    /**
071     * Replies the current set of advanced OAuth parameters in this UI
072     *
073     * @return the current set of advanced OAuth parameters in this UI
074     */
075    public OAuthParameters getOAuthParameters() {
076        return pnlAdvancedProperties.getAdvancedParameters();
077    }
078
079    /**
080     * Replies the retrieved Access Token. null, if no Access Token was retrieved.
081     *
082     * @return the retrieved Access Token
083     */
084    public  OAuthToken getAccessToken() {
085        return accessToken;
086    }
087
088    /**
089     * Sets the current Access Token. This will fire a property change event for {@link #ACCESS_TOKEN_PROP}
090     * if the access token has changed
091     *
092     * @param accessToken the new access token. null, to clear the current access token
093     */
094    protected void setAccessToken(OAuthToken accessToken) {
095        OAuthToken oldValue = this.accessToken;
096        this.accessToken = accessToken;
097        if (oldValue == null ^ this.accessToken == null) {
098            fireAccessTokenChanged(oldValue, this.accessToken);
099        } else if (oldValue == null && this.accessToken == null) {
100            // no change - don't fire an event
101        } else if (! oldValue.equals(this.accessToken)) {
102            fireAccessTokenChanged(oldValue, this.accessToken);
103        }
104    }
105
106    /**
107     * Replies true if this UI currently has an Access Token
108     *
109     * @return true if this UI currently has an Access Token
110     */
111    public boolean hasAccessToken() {
112        return accessToken != null;
113    }
114
115    /**
116     * Replies whether the user has chosen to save the Access Token in the JOSM
117     * preferences or not.
118     *
119     * @return true if the user has chosen to save the Access Token
120     */
121    public abstract boolean isSaveAccessTokenToPreferences();
122
123    /**
124     * Initializes the authorisation UI with preference values in <code>pref</code>.
125     *
126     * @param pref the preferences. Must not be null.
127     * @throws IllegalArgumentException thrown if pref is null
128     */
129    public void initFromPreferences(Preferences pref) throws IllegalArgumentException{
130        CheckParameterUtil.ensureParameterNotNull(pref, "pref");
131        pnlAdvancedProperties.initFromPreferences(pref);
132    }
133}