package com.androidol.layer;
import java.util.HashMap;
import android.content.Context;
import android.util.AttributeSet;
import com.androidol.util.Util;
public class HTTPRequest extends Layer {
protected double URL_HASH_FACTOR = (Math.sqrt(5) - 1)/2;
protected String url = null;
protected String[] altUrls = null;
protected HashMap<String, String> params = null;
// ===========================================================
// Constructors
// ===========================================================
public HTTPRequest(Context context) {
super(context);
// TODO: set default url and params
}
public HTTPRequest(Context context, AttributeSet attrs) {
super(context, attrs);
this.url = attrs.getAttributeValue(ANDROIDOL_NAMESPACE, "url");
// TODO: properly handle case when "url" is empty or an invalid url
// TODO: initialize other request parameters
}
public void setParams(HashMap<String, String> params) {
this.params = Util.upperCases(params);
}
/**
* Old Constructor HTTPRequest
*
* @param name
* @param url
* @param params
* @param options
*/
/*
public HTTPRequest(String name, String url, HashMap<String, String> params, HashMap<String, Object> options) {
super(name, options);
this.url = url;
// upper case all parameters
this.params = Util.upperCases(params); //extra HTTP request parameters you want to append
}
*/
/**
* API Method: destroy
*
* @param setNewBaseLayer
*/
@Override
public void destroy(boolean setNewBaseLayer) {
this.url = null;
this.params = null;
super.destroy(setNewBaseLayer);
}
/**
* API Method: clone()
*
* @return
* a clone of the layer
*/
@Override
public HTTPRequest clone() {
// TODO: to be implemented
return null;
}
/**
* API Method: mergeNewParams
*
* @param newParams
* merge additional HTTP request parameters into existing list
*/
public void mergeNewParams(HashMap<String, String> newParams) {
this.params = Util.extend(this.params, newParams);
//this.redraw(); // should redraw after new request parameters being merged?
}
/**
* API Method: selectUrl
*
* @param paramString
* @param urls
* @return
* return a url from alternative urls
*/
public String selectUrl(String paramString, String[] urls) {
// TODO: to be understood
/*
double product = 1;
for(int i=0,len=paramString.length(); i<len; i++) {
product *= paramString.charAt(i) * this.URL_HASH_FACTOR;
product -= Math.floor(product);
}
return urls[(int)Math.round(Math.floor(product * urls.length))];
*/
return urls[0]; // always return the first one now
}
/**
* API Method: getFullRequestString
*
* @param newParams
* @param altUrl
* @return
* construct the full url string for the layer
*/
public String getFullRequestString(HashMap<String, String> newParams, String altUrl) {
String url = (altUrl!=null) ? altUrl : this.url;
HashMap<String, String> allParams = Util.extend(null, this.params);
allParams = Util.extend(allParams, newParams);
String paramsString = Util.getQueryString(allParams);
if(this.altUrls != null) {
url = this.selectUrl(paramsString, this.getUrls());
}
// TODO: upper case all query string parameter key to avoid duplicate
//paramsString = Util.getQueryString(allParams);
String requestString = url;
// add '?' or '&' in front of query string, right after base url
if(paramsString != "") {
String lastServerChar = url.substring(url.length() - 1);
if((lastServerChar == "&") || (lastServerChar == "?")) {
requestString += paramsString;
} else {
if(url.indexOf('?') == -1) {
requestString += '?' + paramsString;
} else {
requestString += '&' + paramsString;
}
}
}
return requestString;
}
/**
* API Method: getUrls
*
* @return
* return an array of urls which is a union of this.url and this.altUrls
*/
public String[] getUrls() {
String[] urls = null;
if((altUrls == null) || (altUrls.length == 0)) {
urls = new String[1];
urls[0] = this.url;
} else {
urls = new String[altUrls.length+1];
urls[0] = this.url;
for(int i=1; i<=altUrls.length; i++) {
urls[i] = altUrls[i-1];
}
}
return urls;
}
/**
* @return the url
*/
public String getUrl() {
return this.url;
}
/**
* @param url the url to set
*/
public void setUrl(String url) {
this.url = url;
}
}