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