001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.data.oauth;
003
004import java.io.IOException;
005import java.io.InputStream;
006import java.net.URL;
007import java.util.Map;
008
009import org.openstreetmap.josm.tools.HttpClient;
010
011import oauth.signpost.AbstractOAuthConsumer;
012import oauth.signpost.AbstractOAuthProvider;
013
014/**
015 * Adapters to make {@code oauth.signpost} work with {@link HttpClient}.
016 */
017public final class SignpostAdapters {
018
019    private SignpostAdapters() {
020    }
021
022    /**
023     * OAuth provider.
024     */
025    public static class OAuthProvider extends AbstractOAuthProvider {
026
027        /**
028         * Constructs a new {@code OAuthProvider}.
029         * @param requestTokenEndpointUrl request token endpoint URL
030         * @param accessTokenEndpointUrl access token endpoint URL
031         * @param authorizationWebsiteUrl authorization website URL
032         */
033        public OAuthProvider(String requestTokenEndpointUrl, String accessTokenEndpointUrl, String authorizationWebsiteUrl) {
034            super(requestTokenEndpointUrl, accessTokenEndpointUrl, authorizationWebsiteUrl);
035        }
036
037        @Override
038        protected HttpRequest createRequest(String endpointUrl) throws Exception {
039            return new HttpRequest(HttpClient.create(new URL(endpointUrl), "GET"));
040        }
041
042        @Override
043        protected HttpResponse sendRequest(oauth.signpost.http.HttpRequest request) throws Exception {
044            return new HttpResponse(((HttpRequest) request).request.connect());
045        }
046
047        @Override
048        protected void closeConnection(oauth.signpost.http.HttpRequest request, oauth.signpost.http.HttpResponse response) throws Exception {
049            if (response != null) {
050                ((HttpResponse) response).response.disconnect();
051            } else if (request != null) {
052                ((HttpRequest) request).request.disconnect();
053            }
054        }
055    }
056
057    /**
058     * OAuth consumer.
059     */
060    public static class OAuthConsumer extends AbstractOAuthConsumer {
061
062        /**
063         * Constructs a new {@code OAuthConsumer}.
064         * @param consumerKey consumer key
065         * @param consumerSecret consumer secret
066         */
067        public OAuthConsumer(String consumerKey, String consumerSecret) {
068            super(consumerKey, consumerSecret);
069        }
070
071        @Override
072        protected HttpRequest wrap(Object request) {
073            return new HttpRequest((HttpClient) request);
074        }
075    }
076
077    static final class HttpRequest implements oauth.signpost.http.HttpRequest {
078        final HttpClient request;
079
080        HttpRequest(HttpClient request) {
081            this.request = request;
082        }
083
084        @Override
085        public void setHeader(String name, String value) {
086            request.setHeader(name, value);
087        }
088
089        @Override
090        public String getMethod() {
091            return request.getRequestMethod();
092        }
093
094        @Override
095        public String getRequestUrl() {
096            return request.getURL().toExternalForm();
097        }
098
099        @Override
100        public String getContentType() {
101            return request.getRequestHeader("Content-Type");
102        }
103
104        @Override
105        public String getHeader(String name) {
106            return request.getRequestHeader(name);
107        }
108
109        @Override
110        public InputStream getMessagePayload() throws IOException {
111            return null;
112        }
113
114        @Override
115        public void setRequestUrl(String url) {
116            throw new IllegalStateException();
117        }
118
119        @Override
120        public Map<String, String> getAllHeaders() {
121            throw new IllegalStateException();
122        }
123
124        @Override
125        public Object unwrap() {
126            throw new IllegalStateException();
127        }
128    }
129
130    static final class HttpResponse implements oauth.signpost.http.HttpResponse {
131        final HttpClient.Response response;
132
133        HttpResponse(HttpClient.Response response) {
134            this.response = response;
135        }
136
137        @Override
138        public int getStatusCode() throws IOException {
139            return response.getResponseCode();
140        }
141
142        @Override
143        public String getReasonPhrase() throws Exception {
144            return response.getResponseMessage();
145        }
146
147        @Override
148        public InputStream getContent() throws IOException {
149            return response.getContent();
150        }
151
152        @Override
153        public Object unwrap() {
154            throw new IllegalStateException();
155        }
156    }
157}