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}