package com.litesuits.http.request.param;
import com.litesuits.http.listener.HttpListener;
import com.litesuits.http.request.JsonRequest;
import com.litesuits.http.request.content.HttpBody;
import com.litesuits.http.request.content.StringBody;
import com.litesuits.http.request.content.UrlEncodedFormBody;
import com.litesuits.http.request.content.multi.MultipartBody;
import com.litesuits.http.request.query.ModelQueryBuilder;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.LinkedHashMap;
/**
* mark a class as a http parameter modle.
* classes that implement this will be parsed to http parameter.
* 杂袍1只, 墨兰1对, 大红1对, 红鼻10条,金光10条,玻璃扯旗10条,三角10条,红绿灯10条。
*
* @author MaTianyu
* 2014-1-19上午2:39:31
*/
public abstract class HttpRichParamModel<T> implements HttpParamModel {
private HttpListener<T> httpListener;
public final LinkedHashMap<String, String> getHeaders() {
return createHeaders();
}
public ModelQueryBuilder getModelQueryBuilder() {
return createQueryBuilder();
}
public final HttpBody getHttpBody() {
return createHttpBody();
}
public final HttpListener<T> getHttpListener() {
if (httpListener == null) {
httpListener = createHttpListener();
}
return httpListener;
}
public boolean isFieldsAttachToUrl() {
return true;
}
/**
* craete headers for request.
*/
protected LinkedHashMap<String, String> createHeaders() {return null;}
/**
* craete uri query builder for request.
*/
protected ModelQueryBuilder createQueryBuilder() {
return null;
}
/**
* create http body for POST/PUT... request.
*
* @return such as {@link StringBody}, {@link UrlEncodedFormBody}, {@link MultipartBody}...
*/
protected HttpBody createHttpBody() {return null;}
/**
* create http listener for request.
*/
protected HttpListener<T> createHttpListener() {return null;}
/**
* build request and set http listener.
*/
@SuppressWarnings("unchecked")
public final <M extends HttpRichParamModel<T>> M setHttpListener(HttpListener<T> httpListener) {
this.httpListener = httpListener;
return (M) this;
}
/**
* build as a request.
*/
public JsonRequest<T> buildRequest() {
Type type = ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
return new JsonRequest<T>(this, type);
}
}