package com.stxnext.management.android.web.api.services; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.List; import org.apache.commons.io.IOUtils; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.utils.URLEncodedUtils; import org.apache.http.cookie.Cookie; import org.apache.http.message.AbstractHttpMessage; import android.util.Log; import com.stxnext.management.android.AppIntranet; import com.stxnext.management.android.storage.prefs.StoragePrefs; import com.stxnext.management.android.web.api.HTTPResponse; import com.stxnext.management.android.web.api.HttpErrorResolver; public abstract class AbstractService { private final static String TAG = "AbstractService"; protected HttpErrorResolver errorResolver; protected WebServiceState serviceState; protected StoragePrefs prefs; protected abstract String getServiceDomain(); protected AbstractService(){ errorResolver = new HttpErrorResolver(); serviceState = new WebServiceState(); prefs = StoragePrefs.getInstance(AppIntranet.getApp()); } @SuppressWarnings("rawtypes") protected HttpResponse executeRequestAndParseError(HttpUriRequest request, final HTTPResponse result) throws Exception { serviceState.getClient().getConnectionManager().closeExpiredConnections(); HttpResponse response = serviceState.getClient().execute(request, serviceState.getLocalContext()); if (result != null) { // if (response.containsHeader("Location")) { // Header[] locations = response.getAllHeaders(); // if (locations.length > 0){ // Log.e("redirect to",locations[0].getValue()); // } // //context.setAttribute(LAST_REDIRECT_URL, locations[0].getValue()); // } result.setError(errorResolver.resolve(response)); } return response; } public void clearCookies(){ serviceState.clearCookies(); } protected void saveCookies(){ serviceState.saveCookies(); } public enum RequestType { POST, GET, PUT, DELETE } public enum RequestHeader { JSON("application/json"); public static final String HEADER_ACCEPT = "Accept"; public static final String HEADER_CONTENT_TYPE = "Content-Type"; private final String acceptHeader; RequestHeader(String acceptHeader) { this.acceptHeader = acceptHeader; } public String getAcceptHeader() { return this.acceptHeader; } } protected byte[] getEntityBytesAndConsume(HttpEntity entity) throws IllegalStateException, IOException { byte[] bytes = null; InputStream stream = entity.getContent(); bytes = IOUtils.toByteArray(stream); stream.close(); return bytes; } private String resolveUrl(String path) { return String.format("https://%s/%s", getServiceDomain(), path); } protected void setAcceptHeader(AbstractHttpMessage message, RequestHeader header) { message.setHeader(RequestHeader.HEADER_ACCEPT, header.getAcceptHeader()); } protected void setContentType(AbstractHttpMessage message, RequestHeader header){ message.setHeader(RequestHeader.HEADER_CONTENT_TYPE, header.getAcceptHeader()); } protected void setAuthHeaders(AbstractHttpMessage message){ StringBuilder sb = new StringBuilder(); for(Cookie cookie : prefs.getCookies()){ sb.append(cookie.getName()).append("="); sb.append(cookie.getValue()); sb.append(";"); } message.addHeader("Cookie", sb.toString()); } protected void setRequiredExtraHeaders(AbstractHttpMessage message){ message.setHeader("X-Requested-With","XMLHttpRequest"); } protected HttpPost postRequest(String path, List<NameValuePair> dictionary) { String url = resolveUrl(path); HttpPost request = new HttpPost(url); setRequiredExtraHeaders(request); if (dictionary != null) { try { request.setEntity(new UrlEncodedFormEntity(dictionary)); } catch (UnsupportedEncodingException e) { Log.e(TAG,"",e); } } request.setParams(serviceState.getClient().getParams()); return request; } protected HttpPut putRequest(String path, List<NameValuePair> dictionary) { String url = resolveUrl(path); HttpPut request = new HttpPut(url); setRequiredExtraHeaders(request); if (dictionary != null) { try { request.setEntity(new UrlEncodedFormEntity(dictionary)); } catch (UnsupportedEncodingException e) { Log.e(TAG,"",e); } } request.setParams(serviceState.getClient().getParams()); return request; } protected HttpDelete deleteRequest(String path, List<NameValuePair> dictionary) { String url = resolveUrl(path); if (dictionary != null) { String paramString = "?" + URLEncodedUtils.format(dictionary, "utf-8"); url = url + paramString; } HttpDelete request = new HttpDelete(url); setRequiredExtraHeaders(request); request.setParams(serviceState.getClient().getParams()); return request; } protected HttpGet getRequest(String path, List<NameValuePair> dictionary, boolean doNotEncode) { String url = resolveUrl(path); if (dictionary != null) { url = url + getQueryParamsFromNameValuePairs(dictionary, doNotEncode); } HttpGet request = new HttpGet(url); setRequiredExtraHeaders(request); request.setParams(serviceState.getClient().getParams()); return request; } protected String getQueryParamsFromNameValuePairs(List<NameValuePair> dictionary, boolean doNotEncode) { String paramString = "?"; if (doNotEncode) { for (NameValuePair pair : dictionary) { paramString += pair.getName() + "=" + pair.getValue() + "&"; } paramString = paramString.substring(0, paramString.length() - 1); } else { for (NameValuePair pair : dictionary) { paramString += pair.getName() + "=" + URLEncoder.encode(pair.getValue()) + "&"; } } return paramString; } protected void consume(HttpEntity entity) { if (entity != null) { try { entity.consumeContent(); } catch (Exception e) { Log.e("service","entity consumption issues",e); } } } }