package io.github.ibuildthecloud.gdapi.request;
import io.github.ibuildthecloud.gdapi.condition.Condition;
import io.github.ibuildthecloud.gdapi.factory.SchemaFactory;
import io.github.ibuildthecloud.gdapi.model.Include;
import io.github.ibuildthecloud.gdapi.model.Pagination;
import io.github.ibuildthecloud.gdapi.model.Sort;
import io.github.ibuildthecloud.gdapi.server.model.ApiServletContext;
import io.github.ibuildthecloud.gdapi.url.UrlBuilder;
import io.github.ibuildthecloud.gdapi.util.ProxyUtils;
import io.github.ibuildthecloud.gdapi.util.RequestUtils;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
public class ApiRequest {
Locale locale;
String type;
String id;
String link;
String action;
String method;
String clientIp;
String queryString;
String staticResourceBase = "static";
boolean committed = false;
int responseCode = HttpServletResponse.SC_OK;
ApiServletContext apiServletContext;
Object responseObject;
Object requestObject;
Map<String, Object> requestParams;
String requestUrl;
String version;
String schemaVersion;
String responseUrlBase;
String responseFormat;
String responseContentType;
String subContext = "";
long startTime = System.currentTimeMillis();
UrlBuilder urlBuilder;
Map<String, List<Condition>> conditions = new LinkedHashMap<String, List<Condition>>();
Sort sort;
Pagination pagination;
Include include;
Map<Object, Object> attributes = new HashMap<Object, Object>();
Map<String, String> options = new HashMap<String, String>();
SchemaFactory schemaFactory;
Map<String, Object> createDefaults = new HashMap<String, Object>();
List<Throwable> exceptions = new ArrayList<Throwable>();
public ApiRequest(ApiRequest request) {
this.locale = request.getLocale();
this.type = request.getType();
this.id = request.getId();
this.link = request.getLink();
this.action = request.getAction();
this.method = request.getMethod();
this.clientIp = request.getClientIp();
this.queryString = request.getQueryString();
this.committed = request.isCommitted();
this.responseCode = request.getResponseCode();
this.requestObject = request.getRequestObject();
this.requestParams = request.getRequestParams();
this.requestUrl = request.getRequestUrl();
this.version = request.getVersion();
this.schemaVersion = request.getSchemaVersion();
this.responseUrlBase = request.getResponseUrlBase();
this.responseFormat = request.getResponseFormat();
this.responseContentType = request.getResponseContentType();
this.startTime = request.getStartTime();
this.urlBuilder = request.getUrlBuilder();
this.conditions = request.getConditions();
this.sort = request.getSort();
this.pagination = request.getPagination();
this.include = request.getInclude();
this.schemaFactory = request.getSchemaFactory();
this.createDefaults = request.getCreateDefaults();
this.exceptions = request.getExceptions();
this.options = request.getOptions();
this.staticResourceBase = request.getStaticResourceBase();
this.subContext = request.getSubContext();
}
public ApiRequest(ApiServletContext requestServletContext, SchemaFactory schemaFactory) {
super();
this.apiServletContext = requestServletContext;
this.locale = requestServletContext == null ? null : requestServletContext.getRequest().getLocale();
this.schemaFactory = schemaFactory;
}
public ApiRequest reset() {
type = null;
id = null;
link = null;
action = null;
method = null;
queryString = null;
committed = false;
responseCode = HttpServletResponse.SC_OK;
responseObject = null;
requestObject = null;
requestParams = null;
version = null;
schemaVersion = null;
startTime = System.currentTimeMillis();
conditions = new LinkedHashMap<String, List<Condition>>();
sort = null;
pagination = null;
include = null;
attributes = new HashMap<Object, Object>();
options = new HashMap<String, String>();
createDefaults = new HashMap<String, Object>();
exceptions = new ArrayList<Throwable>();
subContext = "";
return this;
}
public InputStream getInputStream() throws IOException {
if (apiServletContext == null) {
return null;
}
return apiServletContext.getRequest().getInputStream();
}
public OutputStream getOutputStream() throws IOException {
if (committed) {
throw new IllegalStateException("Response is commited");
}
commit();
committed = true;
return apiServletContext.getResponse().getOutputStream();
}
public <T> T proxyRequestObject(Class<T> type) {
Map<String, Object> map = RequestUtils.toMap(requestObject);
return ProxyUtils.proxy(map, type);
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
public boolean isCommitted() {
return committed;
}
public int getResponseCode() {
return responseCode;
}
public void setResponseCode(int responseCode) {
this.responseCode = responseCode;
}
public Object getResponseObject() {
return responseObject;
}
public void setResponseObject(Object responseObject) {
this.responseObject = responseObject;
}
public Object getRequestObject() {
return requestObject;
}
public void setRequestObject(Object requestObject) {
this.requestObject = requestObject;
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public Map<String, Object> getRequestParams() {
return requestParams;
}
public void setRequestParams(Map<String, Object> requestParams) {
this.requestParams = requestParams;
}
public String getClientIp() {
return clientIp;
}
public void setClientIp(String clientIp) {
this.clientIp = clientIp;
}
public String getRequestUrl() {
return requestUrl;
}
public void setRequestUrl(String requestUrl) {
this.requestUrl = requestUrl;
}
public String getResponseUrlBase() {
return responseUrlBase;
}
public void setResponseUrlBase(String responseUrlBase) {
this.responseUrlBase = responseUrlBase;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getResponseFormat() {
return responseFormat;
}
public void setResponseFormat(String responseType) {
this.responseFormat = responseType;
}
public void setResponseContentType(String contentType) {
this.responseContentType = contentType;
}
public String getResponseContentType() {
return responseContentType;
}
public String getQueryString() {
return queryString;
}
public void setQueryString(String queryString) {
this.queryString = queryString;
}
public ApiServletContext getServletContext() {
return apiServletContext;
}
public void setRequestServletContext(ApiServletContext requestServletContext) {
this.apiServletContext = requestServletContext;
}
public long getStartTime() {
return startTime;
}
public void commit() {
if (!committed) {
if (responseContentType != null) {
apiServletContext.getResponse().setHeader("Content-Type", responseContentType);
}
apiServletContext.getResponse().setStatus(responseCode);
committed = true;
}
}
public UrlBuilder getUrlBuilder() {
return urlBuilder;
}
public void setUrlBuilder(UrlBuilder urlWriter) {
this.urlBuilder = urlWriter;
}
public Map<String, List<Condition>> getConditions() {
return conditions;
}
public void setConditions(Map<String, List<Condition>> conditions) {
this.conditions = conditions;
}
public Sort getSort() {
return sort;
}
public void setSort(Sort sort) {
this.sort = sort;
}
public Pagination getPagination() {
return pagination;
}
public void setPagination(Pagination pagination) {
this.pagination = pagination;
}
public Locale getLocale() {
return locale;
}
public void setLocale(Locale locale) {
this.locale = locale;
}
public Include getInclude() {
return include;
}
public void setInclude(Include include) {
this.include = include;
}
public Object getAttribute(Object object) {
return this.attributes.get(object);
}
public void setAttribute(Object key, Object value) {
this.attributes.put(key, value);
}
public SchemaFactory getSchemaFactory() {
return schemaFactory;
}
public void setSchemaFactory(SchemaFactory schemaFactory) {
this.schemaFactory = schemaFactory;
this.urlBuilder = null;
}
public Map<String, Object> getCreateDefaults() {
return createDefaults;
}
public void setCreateDefaults(Map<String, Object> createDefaults) {
this.createDefaults = createDefaults;
}
public List<Throwable> getExceptions() {
return exceptions;
}
public Map<String, String> getOptions() {
return options;
}
public String getStaticResourceBase() {
return staticResourceBase;
}
public void setStaticResourceBase(String staticResourceBase) {
this.staticResourceBase = staticResourceBase;
}
public String getSubContext() {
return subContext;
}
public void setSubContext(String subContext) {
this.subContext = subContext;
}
@Override
public String toString() {
return requestUrl == null ? "" : requestUrl;
}
public String getSchemaVersion() {
if (schemaVersion == null) {
return version;
}
return schemaVersion;
}
public void setSchemaVersion(String schemaVersion) {
this.schemaVersion = schemaVersion;
}
}