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