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