package in.srain.cube.request; import android.text.TextUtils; import java.io.File; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class RequestData { private static final String EMPTY = ""; private static final String CHAR_QM = "?"; private static final String CHAR_AND = "&"; private static final String CHAR_EQ = "="; private static final String CHAR_SET = "UTF-8"; public String mUrl; private HashMap<String, Object> mQueryData; private HashMap<String, Object> mPostData; private HashMap<String, Object> mHeaderData; private HashMap<String, UploadFileInfo> mUploadFileInfoHashMap; private boolean mUsePost = false; private String mTag; public static String buildQueryString(Map<String, ?> data, String url) { if (data == null || data.size() == 0) { return url; } StringBuilder sb = new StringBuilder(); boolean append = false; if (url != null) { sb.append(url); if (url.contains(CHAR_QM)) { append = true; } else { sb.append(CHAR_QM); } } Iterator<? extends Map.Entry<String, ?>> it = data.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, ?> item = it.next(); if (append) { sb.append(CHAR_AND); } else { append = true; } try { if (TextUtils.isEmpty(item.getKey())) { continue; } sb.append(URLEncoder.encode(item.getKey(), CHAR_SET)); sb.append(CHAR_EQ); if (item.getValue() != null) { sb.append(URLEncoder.encode(item.getValue().toString(), CHAR_SET)); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } return sb.toString(); } public RequestData addPostData(String key, Object data) { if (mPostData == null) { mPostData = new HashMap<String, Object>(); } mPostData.put(key, data); return this; } public RequestData addHeader(String key, Object data) { if (mHeaderData == null) { mHeaderData = new HashMap<String, Object>(); } mHeaderData.put(key, data); return this; } public RequestData addPostData(Map<String, ?> data) { if (mPostData == null) { mPostData = new HashMap<String, Object>(); } mPostData.putAll(data); return this; } public RequestData addQueryData(String key, Object data) { if (mQueryData == null) { mQueryData = new HashMap<String, Object>(); } mQueryData.put(key, data); return this; } public RequestData addQueryData(Map<String, ?> data) { if (mQueryData == null) { mQueryData = new HashMap<String, Object>(); } mQueryData.putAll(data); return this; } public String getRequestUrl() { if (mQueryData != null) { return buildQueryString(mQueryData, mUrl); } return mUrl; } public RequestData setRequestUrl(String url) { mUrl = url; return this; } public HashMap<String, Object> getHeaderData() { return mHeaderData; } public HashMap<String, Object> getQueryData() { return mQueryData; } public HashMap<String, Object> getPostData() { return mPostData; } public RequestData usePost(boolean use) { mUsePost = use; return this; } /** * add file to be uploaded * * @param fieldName * @param uploadFile, will extract extension from the file name * @return */ @SuppressWarnings({"unused"}) public RequestData addFile(String fieldName, String uploadFile) { addFile(fieldName, uploadFile, null); return this; } /** * add file to be uploaded * * @param fieldName * @param uploadFile * @param fileName if provided, will use this as filename * @return */ @SuppressWarnings({"unused"}) public RequestData addFile(String fieldName, String uploadFile, String fileName) { addFile(fieldName, new File(uploadFile), fileName); return this; } /** * @param fieldName * @param uploadFile * @return */ @SuppressWarnings({"unused"}) public RequestData addFile(String fieldName, File uploadFile) { addFile(fieldName, uploadFile, null); return this; } @SuppressWarnings({"unused"}) public RequestData addFile(String fieldName, File uploadFile, String fileName) { if (mUploadFileInfoHashMap == null) { mUploadFileInfoHashMap = new HashMap<String, UploadFileInfo>(); } UploadFileInfo uploadFileInfo = new UploadFileInfo(); uploadFileInfo.fieldName = fieldName; uploadFileInfo.uploadFile = uploadFile; uploadFileInfo.fileName = fileName; mUploadFileInfoHashMap.put(fieldName, uploadFileInfo); return this; } public String getTag() { return mTag; } /** * Set a tag to mark this request */ public RequestData setTag(String tag) { mTag = tag; return this; } public String getPostString() { if (mPostData == null || mPostData.size() == 0) { return EMPTY; } return buildQueryString(mPostData, null); } public boolean shouldPost() { return mUsePost || (mPostData != null && mPostData.size() > 0) || isMultiPart(); } public HashMap<String, UploadFileInfo> getUploadFiles() { return mUploadFileInfoHashMap; } public boolean isMultiPart() { return mUploadFileInfoHashMap != null && mUploadFileInfoHashMap.size() > 0; } @Override public String toString() { return String.format("RequestData: [%s, G: %s, P: %s, F: %s]", getRequestUrl(), mQueryData, mPostData, mUploadFileInfoHashMap); } public static class UploadFileInfo { public File uploadFile; public String fileName; public String fieldName; @Override public String toString() { return String.format("UploadFileInfo:[%s %s %s]", fieldName, fileName, uploadFile); } } }