/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.eas.server.httpservlet; import com.eas.client.settings.SettingsConstants; import com.eas.client.threetier.http.PlatypusHttpRequestParams; import com.eas.client.threetier.requests.AppQueryRequest; import com.eas.client.threetier.requests.CommitRequest; import com.eas.client.threetier.requests.ServerModuleStructureRequest; import com.eas.client.threetier.requests.DisposeServerModuleRequest; import com.eas.client.threetier.requests.ExecuteQueryRequest; import com.eas.client.threetier.requests.RPCRequest; import com.eas.client.threetier.requests.LogoutRequest; import com.eas.client.threetier.requests.PlatypusRequestVisitor; import com.eas.server.PlatypusServerCore; import com.eas.client.threetier.requests.CredentialRequest; import com.eas.client.threetier.requests.ModuleStructureRequest; import com.eas.client.threetier.requests.ResourceRequest; import com.eas.util.BinaryUtils; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; /** * * @author mg */ public class PlatypusHttpRequestReader implements PlatypusRequestVisitor { public static final String API_URI = "/api"; public static final String RESOURCES_URI = "/resources"; private static final String ARGUMENTS_ARRAY_PARAM_SUFFIX = "[]"; public static final String MODULE_NAME_PARAMETER_MISSING_MSG = "Module name parameter missing"; public static final String METHOD_NAME_PARAMETER_MISSING = "Method name parameter missing"; public static final String PROPERTY_NAME_PARAMETER_MISSING_MSG = "Property name parameter missing"; public static final String PROPERTY_VALUE_PARAMETER_MISSING_MSG = "Property value parameter missing."; public static final String MUST_BE_RESOURCE_MSG = "Application element requests must be resource requests."; protected PlatypusServerCore serverCore; protected HttpServletRequest httpRequest; public PlatypusHttpRequestReader(PlatypusServerCore aServerCore, HttpServletRequest aHttpRequest) { super(); serverCore = aServerCore; httpRequest = aHttpRequest; } @Override public void visit(AppQueryRequest rq) throws Exception { String queryName = httpRequest.getParameter(PlatypusHttpRequestParams.QUERY_ID); rq.setQueryName(queryName); } @Override public void visit(LogoutRequest rq) throws Exception { } @Override public void visit(CommitRequest rq) throws Exception { String jsonText = getRequestText(httpRequest); rq.setChangesJson(jsonText); } @Override public void visit(ServerModuleStructureRequest rq) throws Exception { String moduleName = httpRequest.getParameter(PlatypusHttpRequestParams.MODULE_NAME); rq.setModuleName(moduleName); } @Override public void visit(DisposeServerModuleRequest rq) throws Exception { String moduleName = httpRequest.getParameter(PlatypusHttpRequestParams.MODULE_NAME); rq.setModuleName(moduleName); } @Override public void visit(RPCRequest rq) throws Exception { // pure http String moduleName = httpRequest.getParameter(PlatypusHttpRequestParams.MODULE_NAME); if (moduleName == null || moduleName.isEmpty()) { throw new IllegalArgumentException(MODULE_NAME_PARAMETER_MISSING_MSG); } String methodName = httpRequest.getParameter(PlatypusHttpRequestParams.METHOD_NAME); if (methodName == null || methodName.isEmpty()) { throw new IllegalArgumentException(METHOD_NAME_PARAMETER_MISSING); } rq.setModuleName(moduleName); rq.setMethodName(methodName); String param = httpRequest.getParameter(PlatypusHttpRequestParams.PARAMS_ARRAY.substring(0, PlatypusHttpRequestParams.PARAMS_ARRAY.length() - 2)); if (param != null) { rq.setArgumentsJsons(new String[]{param}); } else { String[] params = httpRequest.getParameterValues(PlatypusHttpRequestParams.PARAMS_ARRAY); if (params != null) { rq.setArgumentsJsons(params); } else { rq.setArgumentsJsons(new String[]{}); } } } @Override public void visit(ResourceRequest rq) throws Exception { } @Override public void visit(CredentialRequest rq) throws Exception { } @Override public void visit(ModuleStructureRequest rq) throws Exception { String moduleName = httpRequest.getParameter(PlatypusHttpRequestParams.MODULE_NAME); rq.setModuleName(moduleName); } @Override public void visit(ExecuteQueryRequest rq) throws Exception { String queryName = httpRequest.getParameter(PlatypusHttpRequestParams.QUERY_ID); rq.setQueryName(queryName); Map<String, String> res = new HashMap<>(); httpRequest.getParameterMap().entrySet().forEach((Map.Entry<String, String[]> pEntry) -> { if (!PlatypusHttpRequestParams.isSystemParameter(pEntry.getKey())) { String[] pValues = pEntry.getValue(); if (pValues != null && pValues.length == 1) { res.put(pEntry.getKey(), pValues[0]); } } }); rq.setParamsJsons(res); } private static byte[] getRequestContent(HttpServletRequest aRequest) throws IOException { try (InputStream is = aRequest.getInputStream()) { return BinaryUtils.readStream(is, aRequest.getContentLength() >= 0 ? aRequest.getContentLength() : 0); } } private static String getRequestText(HttpServletRequest aRequest) throws IOException { return new String(getRequestContent(aRequest), aRequest.getCharacterEncoding() != null ? aRequest.getCharacterEncoding() : SettingsConstants.COMMON_ENCODING); } }