package foundation.handler;
|
|
import java.io.BufferedReader;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.io.InputStreamReader;
|
import java.util.Enumeration;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
|
import foundation.json.JObjectReader;
|
import foundation.route.Operation;
|
import foundation.token.IOnlineUser;
|
import foundation.util.MapList;
|
import foundation.util.Util;
|
|
public class DataPool implements IDataPool {
|
|
protected static Logger logger;
|
public static String ProviderName = "dataPool";
|
private IOnlineUser user;
|
private HttpServletRequest request;
|
private MapList<String, String> params;
|
private DataPoolType type;
|
private Operation operation;
|
private JObjectReader jObjectReader;
|
private String token;
|
private String body;
|
|
static {
|
logger = LogManager.getLogger();
|
}
|
|
public DataPool(HttpServletRequest request) throws Exception {
|
params = new MapList<String, String>();
|
this.request = request;
|
|
loadParams();
|
parseType(request);
|
}
|
|
private void parseType(HttpServletRequest request) {
|
String method = request.getMethod();
|
method = method.toLowerCase();
|
|
String contentCount = request.getContentType();
|
|
if (contentCount == null) {
|
contentCount = "";
|
}
|
contentCount = contentCount.toLowerCase();
|
|
if (contentCount.indexOf("multipart") >= 0) {
|
type = DataPoolType.MultiPart;
|
}
|
else if ("get".equals(method)) {
|
type = DataPoolType.Get;
|
}
|
else if ("options".equals(method)) {
|
type = DataPoolType.Options;
|
}
|
else {
|
type = DataPoolType.Post;
|
}
|
}
|
|
public String getToken() throws IOException {
|
//1. read from URL parameters
|
token = params.get("token");
|
|
if (!Util.isEmpty(token)) {
|
return token;
|
}
|
|
//2. read from body
|
getJObjectReader();
|
|
if (jObjectReader == null) {
|
return null;
|
}
|
|
token = jObjectReader.getString("token");
|
return token;
|
}
|
|
private void loadParams() throws Exception {
|
Enumeration<String> paramNames = request.getParameterNames();
|
|
while (paramNames.hasMoreElements()) {
|
String paramName = (String) paramNames.nextElement();
|
String value = request.getParameter(paramName);
|
loadOneParam(paramName, value);
|
}
|
}
|
|
public void loadOneParam(String name, String value) {
|
if (Util.isEmpty(name)) {
|
return;
|
}
|
|
params.add(name, value);
|
}
|
|
private void loadBody() throws IOException {
|
if (body != null) {
|
return;
|
}
|
|
InputStream inputStream = request.getInputStream();
|
|
//1. read stream
|
StringBuilder result = new StringBuilder();
|
String line;
|
|
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
|
|
while ((line = reader.readLine()) != null) {
|
result.append(line);
|
}
|
|
body = result.toString();
|
logger.debug("request: {}", body);
|
|
jObjectReader = new JObjectReader(body);
|
}
|
|
public String getParam(String name) {
|
return params.get(name);
|
}
|
|
public HttpServletRequest getRequest() {
|
return request;
|
}
|
|
public String getRemoteIP() {
|
return request.getRemoteAddr();
|
}
|
|
public Operation getOperation() {
|
return operation;
|
}
|
|
public void setOperation(Operation operation) {
|
this.operation = operation;
|
}
|
|
public String getBody() throws IOException {
|
if (body == null) {
|
loadBody();
|
}
|
|
return body;
|
}
|
|
@Override
|
public synchronized JObjectReader getJObjectReader() throws IOException {
|
if (jObjectReader == null && (DataPoolType.MultiPart != type)) {
|
loadBody();
|
}
|
|
return jObjectReader;
|
}
|
|
public MapList<String, String> getParams() {
|
return params;
|
}
|
|
public DataPoolType getType() {
|
return type;
|
}
|
|
public IOnlineUser getUser() {
|
return user;
|
}
|
|
public void setUser(IOnlineUser user) {
|
this.user = user;
|
}
|
}
|