/*
* Copyright (C) 2010 LluĂs Esquerda
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.homelinux.penecoptero.android.citybikes.app;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.AuthState;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HttpContext;
import android.content.Context;
public class RESTHelper {
private final String USERNAME;
private final String PASSWORD;
private final boolean authenticated;
public RESTHelper(boolean authenticated, String username,
String password) {
this.authenticated = authenticated;
this.USERNAME = username;
this.PASSWORD = password;
}
private static String convertStreamToString(InputStream is) {
/*
* To convert the InputStream to String we use the
* BufferedReader.readLine() method. We iterate until the BufferedReader
* return null which means there's no more data to read. Each line will
* appended to a StringBuilder and returned as String.
*/
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
private static DefaultHttpClient setCredentials(
DefaultHttpClient httpclient, String url, String username,
String password) throws HttpException, IOException {
HttpHost targetHost = new HttpHost(url);
final UsernamePasswordCredentials access = new UsernamePasswordCredentials(
username, password);
httpclient.getCredentialsProvider().setCredentials(
new AuthScope(targetHost.getHostName(), targetHost.getPort()),
access);
httpclient.addRequestInterceptor(new HttpRequestInterceptor() {
@Override
public void process(HttpRequest request, HttpContext context)
throws HttpException, IOException {
AuthState authState = (AuthState) context
.getAttribute(ClientContext.TARGET_AUTH_STATE);
if (authState.getAuthScheme() == null) {
authState.setAuthScheme(new BasicScheme());
authState.setCredentials(access);
}
}
}, 0);
return httpclient;
}
private DefaultHttpClient setCredentials(DefaultHttpClient httpclient,
String url) throws HttpException, IOException {
HttpHost targetHost = new HttpHost(url);
final UsernamePasswordCredentials access = new UsernamePasswordCredentials(
USERNAME, PASSWORD);
httpclient.getCredentialsProvider().setCredentials(
new AuthScope(targetHost.getHostName(), targetHost.getPort()),
access);
httpclient.addRequestInterceptor(new HttpRequestInterceptor() {
@Override
public void process(HttpRequest request, HttpContext context)
throws HttpException, IOException {
AuthState authState = (AuthState) context
.getAttribute(ClientContext.TARGET_AUTH_STATE);
if (authState.getAuthScheme() == null) {
authState.setAuthScheme(new BasicScheme());
authState.setCredentials(access);
}
}
}, 0);
return httpclient;
}
public String restGET(String url) throws ClientProtocolException,
IOException, HttpException {
DefaultHttpClient httpclient = new DefaultHttpClient();
if (this.authenticated) {
httpclient = this.setCredentials(httpclient, url);
}
// Prepare a request object
HttpGet httpmethod = new HttpGet(url);
// Execute the request
HttpResponse response;
String result = null;
try {
response = httpclient.execute(httpmethod);
// Get hold of the response entity
HttpEntity entity = response.getEntity();
// If the response does not enclose an entity, there is no need
// to worry about connection release
if (entity != null) {
InputStream instream = entity.getContent();
result = convertStreamToString(instream);
instream.close();
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
public static final String restGET(String url, boolean authenticated,
String username, String password) throws ClientProtocolException,
IOException, HttpException {
DefaultHttpClient httpclient = new DefaultHttpClient();
if (authenticated) {
httpclient = setCredentials(httpclient, url, username, password);
}
// Prepare a request object
HttpGet httpmethod = new HttpGet(url);
// Execute the request
HttpResponse response;
String result = null;
try {
response = httpclient.execute(httpmethod);
// Get hold of the response entity
HttpEntity entity = response.getEntity();
// If the response does not enclose an entity, there is no need
// to worry about connection release
if (entity != null) {
InputStream instream = entity.getContent();
result = convertStreamToString(instream);
instream.close();
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
public String restPOST(String url, Map<String, String> kvPairs)
throws ClientProtocolException, IOException, HttpException {
DefaultHttpClient httpclient = new DefaultHttpClient();
if (this.authenticated)
httpclient = this.setCredentials(httpclient, url);
// Prepare a request object
HttpPost httpmethod = new HttpPost(url);
if (kvPairs != null && kvPairs.isEmpty() == false) {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
kvPairs.size());
String k, v;
Iterator<String> itKeys = kvPairs.keySet().iterator();
while (itKeys.hasNext()) {
k = itKeys.next();
v = kvPairs.get(k);
nameValuePairs.add(new BasicNameValuePair(k, v));
}
httpmethod.setEntity(new UrlEncodedFormEntity(nameValuePairs));
}
// Execute the request
HttpResponse response;
String result = null;
try {
response = httpclient.execute(httpmethod);
// Examine the response status
// Get hold of the response entity
HttpEntity entity = response.getEntity();
// If the response does not enclose an entity, there is no need
// to worry about connection release
if (entity != null) {
InputStream instream = entity.getContent();
result = convertStreamToString(instream);
instream.close();
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
}