Commit d5776e73 by WeiCong

第四版

1.分页请求参数优化
2.分页响应数据优化
3.Alias增加缓存机制
4.优化部分底层代码
parent 49da27e1
......@@ -7,10 +7,7 @@ import org.apache.commons.beanutils.MethodUtils;
import org.hibernate.Session;
import org.hibernate.query.Query;
import org.hibernate.transform.Transformers;
import org.sss.common.model.Argument;
import org.sss.common.model.IModule;
import org.sss.common.model.IModuleRoot;
import org.sss.common.model.IParent;
import org.sss.common.model.*;
import org.sss.module.hibernate.HibernateUtils;
import org.sss.presentation.noui.context.NoUiContext;
import org.sss.presentation.noui.util.PropertyUtil;
......@@ -101,12 +98,7 @@ public class PreHandle {
}
String grpNam = (String) otherParams[0];
String toTrs = (String) otherParams[1];
String packageName = ((AbstractPOJOImpl) ctx.getSupport()).getPackageName(toTrs);
String className = packageName + "." + toTrs.substring(0, 1).toUpperCase() + toTrs.substring(1);
Class clazz = Class.forName(AbstractPOJOImpl.modulePackageName + ".Sysmod");
IModuleRoot root = (IModuleRoot) ConstructorUtils.invokeConstructor(Class.forName(className),
new Object[]{toTrs, (IModule) ConstructorUtils.invokeConstructor(clazz, new Object[0])}
, new Class[]{String.class, IModule.class});
IModuleRoot root = getModuleRoot(ctx, toTrs);
IModule grp = (IModule) ctx.getSession().getBaseObject(root, grpNam + "\\rec");
ctx.getSupport().get(grp, new Argument[]{new Argument("inr", paramsMap.get("__modelinr"))});
ctx.getError();
......@@ -153,4 +145,14 @@ public class PreHandle {
session.close();
return true;
}
public static IModuleRoot getModuleRoot(IContext ctx, String trnName) throws Exception {
String packageName = ((AbstractPOJOImpl) ctx.getSupport()).getPackageName(trnName);
String className = packageName + "." + trnName.substring(0, 1).toUpperCase() + trnName.substring(1);
Class clazz = Class.forName(AbstractPOJOImpl.modulePackageName + ".Sysmod");
IModuleRoot root = (IModuleRoot) ConstructorUtils.invokeConstructor(Class.forName(className),
new Object[]{trnName, (IModule) ConstructorUtils.invokeConstructor(clazz, new Object[0])}
, new Class[]{String.class, IModule.class});
return root;
}
}
package org.sss.presentation.noui.api.model;
import java.io.IOException;
import log.Log;
import log.LogFactory;
import org.sss.common.model.IBaseObject;
import org.sss.common.model.IContext;
import org.sss.common.model.IModuleList;
import org.sss.common.model.IModuleRoot;
import org.sss.module.pojo.PreHandle;
import org.sss.presentation.noui.util.PropertyUtil;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.sss.presentation.noui.util.PropertyUtil;
public class Alias {
protected static final Log log = LogFactory.getLog(Alias.class);
private static String PRE = "noUiMapping_";
private String trnName;
private String aliasActionUrl;
public String getAliasActionUrl() {
return aliasActionUrl;
}
public void setAliasActionUrl(String aliasActionUrl) {
this.aliasActionUrl = aliasActionUrl;
}
private Map<String, String> rel;
private Map<String, String> revertRel = new HashMap<>();
private List<String> lstPths = new LinkedList<>();//集合路径缓存
@SuppressWarnings("unchecked")
public Alias(String mappingUrl) {
public Alias(String mappingUrl, IContext context) {
String[] mappingArgs = mappingUrl.split("/");
this.trnName = mappingArgs[mappingArgs.length - 2];
this.aliasActionUrl = mappingArgs[mappingArgs.length - 1];
try {
this.rel = new HashMap<String, String>((Map) PropertyUtil.load(PRE + trnName + ".properties"));
IModuleRoot root = PreHandle.getModuleRoot(context, trnName);
for (String key : this.rel.keySet()) {
this.revertRel.put(this.rel.get(key), key);
String pth = this.rel.get(key);
IBaseObject baseObject = context.getSession().getBaseObject(root, pth);
if (baseObject instanceof IModuleList) {
lstPths.add(pth);
}
} catch (IOException e) {
e.printStackTrace();
this.revertRel.put(pth, key);
}
} catch (Exception e) {
log.error("构建模型映射出现异常:" + e.getMessage());
}
}
public String getAliasActionUrl() {
return aliasActionUrl;
}
public void setAliasActionUrl(String aliasActionUrl) {
this.aliasActionUrl = aliasActionUrl;
}
public String getRelPath(String alias) {
return this.rel.get(alias);
}
......@@ -48,14 +60,14 @@ public class Alias {
return trnName;
}
public Map<String, String> getRel() {
return rel;
}
public void setTrnName(String trnName) {
this.trnName = trnName;
}
public Map<String, String> getRel() {
return rel;
}
public void setRel(Map<String, String> rel) {
this.rel = rel;
}
......@@ -68,4 +80,19 @@ public class Alias {
this.revertRel = revertRel;
}
public String getPrimaryLstPth() {
if (lstPths.isEmpty()) {
return null;
} else {
return lstPths.get(0);
}
}
public boolean isSingleLst() {
if (lstPths.isEmpty()) {
return false;
} else {
return lstPths.size() == 1;
}
}
}
package org.sss.presentation.noui.api.model;
import org.sss.common.model.IContext;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Alias工厂,支持缓存
*/
public class AliasFactory {
private static Map<String, Alias> cache = new ConcurrentHashMap<>();
/**
* 构建服务请求模型映射别名对象(以mappingUrl进行缓存)
*/
public static Alias getAlias(String mappingUrl, IContext context) {
Alias alias = cache.get(mappingUrl);
if (alias != null) {
return alias;
}
alias = new Alias(mappingUrl, context);
cache.put(mappingUrl, alias);
return alias;
}
}
......@@ -27,6 +27,7 @@ public class NoUiRequest {
private String trnName;
private String cid;
private String oid;
private boolean isSelByPagination;
public NoUiRequest() {
......@@ -85,6 +86,8 @@ public class NoUiRequest {
}
if (this.paginationMap == null) {
this.paginationMap = new HashMap<>();
}else{
isSelByPagination=true;
}
if (this.headMap == null) {
this.headMap = new HashMap<>();
......@@ -203,4 +206,8 @@ public class NoUiRequest {
public void setOid(String oid) {
this.oid = oid;
}
public boolean isSelByPagination() {
return isSelByPagination;
}
}
......@@ -8,7 +8,6 @@ public class Result {
private String retmsg;
private Map<String, Object> error;// 错误信息
private Map<String, Object> codetable;
private Object pagination;
private Object data;
private String verison;
private static final String EMPTY="";
......@@ -81,11 +80,4 @@ public class Result {
this.codetable = codetable;
}
public Object getPagination() {
return pagination;
}
public void setPagination(Object pagination) {
this.pagination = pagination;
}
}
......@@ -12,13 +12,6 @@ public class ResultUtil {
return new Result(retcod, retmsg, error, codetable, data,version);
}
public static Result result(String retcod, String retmsg, Map<String, Object> data,Map<String, Object> paginationData, Map<String, Object> error, Map<String, Object> codetable,String version) {
Result result = new Result(retcod, retmsg, error, codetable, data,version);
if(!paginationData.isEmpty())
result.setPagination(paginationData);
return result;
}
public static Result result(String retcod, String retmsg, Object data) {
return new Result(retcod, retmsg, data,DEFAULT_VERSION);
}
......
......@@ -26,6 +26,7 @@ public class Constants {
public static final String PAGINATION_INDEX = "index";
public static final String PAGINATION_PAGESIZE = "pageSize";
public static final String PAGINATION_TOTAL = "total";
public static final String SIGNLE_LST = "__lst";
//光大e结算新增常量
public static final String CIFNO = "cifno";
......
......@@ -13,6 +13,7 @@ import org.sss.module.pojo.PreHandle;
import org.sss.presentation.noui.api.exception.ExitTransactionException;
import org.sss.presentation.noui.api.exception.NoUiException;
import org.sss.presentation.noui.api.model.Alias;
import org.sss.presentation.noui.api.model.AliasFactory;
import org.sss.presentation.noui.api.request.NoUiRequest;
import org.sss.presentation.noui.api.response.ErrorCodes;
import org.sss.presentation.noui.api.response.NoUiVersion;
......@@ -60,17 +61,11 @@ public abstract class AbstractCommonController {
NoUiRequest noUiRequest = null;
try {
noUiRequest = new NoUiRequest(request, mappingUrl, dataMap);
Alias alias = new Alias(mappingUrl);
String trnName = alias.getTrnName();
putTxInfo(alias, mappingUrl);//记录交易信息
Map<String, ?> paramsMap = noUiRequest.getParamsMap();
context = NoUiContextManager.createNoUiContext(noUiRequest);
Alias alias = AliasFactory.getAlias(mappingUrl, context);
String trnName = alias.getTrnName();
putTxInfo(alias, mappingUrl);//记录交易信息
if (PreHandle.needPreHandle(trnName, paramsMap)) {
PreHandle.preHandle(trnName, paramsMap, context);
}
......@@ -178,8 +173,7 @@ public abstract class AbstractCommonController {
loginInfo.setSysmod(sysmodBytes);
EhcacheUtils.set(StringUtil.userUniqueId(noUiRequest), loginInfo);
}
Map<String, Object> paginationData = new HashMap<>();
Map<String, Object> afterReturnData = handleReturnData(eventType, context, noUiRequest, alias, paginationData);
Map<String, Object> afterReturnData = handleReturnData(eventType, context, noUiRequest, alias);
//数据安全性拦截-篡改数据加密
if (DataSecurityUtil.isSafeMode() && noUiRequest.isSecurity()) {
if (DataSecurityUtil.needEncrypt(noUiRequest.getReqUrl())) {
......@@ -194,7 +188,7 @@ public abstract class AbstractCommonController {
}
}
ret = ResultUtil.result(NoUiPresentationUtil.retCode(context), NoUiPresentationUtil.retMsg(context), afterReturnData, paginationData,
ret = ResultUtil.result(NoUiPresentationUtil.retCode(context), NoUiPresentationUtil.retMsg(context), afterReturnData,
NoUiPresentationUtil.handleErrorReturnData(context, alias), NoUiPresentationUtil.handleCodeTableReturnData(context, alias), noUiVersion.getVersion());
} catch (Throwable e) {
if (e.getCause() instanceof ExitTransactionException) {
......@@ -233,20 +227,27 @@ public abstract class AbstractCommonController {
return baseObject;
}
private void putModuleListPagination(String aliasKey, Map<String, Object> paginationMap, IModuleList moduleList) {
//没有做分页
if (moduleList.getPageSize() == 0)
return;
private void doHandleReturnDataForModuleList(Alias alias, String aliasKey, Map<String, Object> dataMap, IModuleList moduleList, List<Map> lst, NoUiRequest noUiRequest) {
Map<String, Object> item = new HashMap<>();
//查询数据
item.put(Constants.DATA, lst);
if (noUiRequest.isSelByPagination()) {
//分页信息
int total = moduleList.fullSize();
int index = moduleList.getPage();
Map<String, Integer> map = new HashMap<>();
map.put("total", total);
map.put("index", index);
paginationMap.put(aliasKey, map);
Map<String, Object> pagination = new HashMap<>();
pagination.put(Constants.PAGINATION_TOTAL, total);
pagination.put(Constants.PAGINATION_INDEX, index);
item.put(Constants.PAGINATION, pagination);
}
if (alias.isSingleLst()) {
dataMap.put(Constants.SIGNLE_LST, item);
} else {
dataMap.put(aliasKey, item);
}
}
private Map<String, Object> handleReturnData(String eventType, NoUiContext context, NoUiRequest noUiRequest, Alias alias, Map<String, Object> paginationMap) {
private Map<String, Object> handleReturnData(String eventType, NoUiContext context, NoUiRequest noUiRequest, Alias alias) {
Map<String, Object> data = new HashMap<String, Object>();
// 初始化事件
if (eventType.equals(INIT)) {
......@@ -256,10 +257,7 @@ public abstract class AbstractCommonController {
}
String realPath = alias.getRelPath(aliasKey);
IBaseObject baseObject = context.getSession().getBaseObject(context.getRoot(), realPath);
if (baseObject instanceof IModuleList) {
putModuleListPagination(aliasKey, paginationMap, (IModuleList) baseObject);
}
data.put(aliasKey, NoUiPresentationUtil.handIBaseObject(context, baseObject, realPath));
doHandleReturnData(baseObject, aliasKey, realPath, context, alias, data);
}
return data;
}
......@@ -288,11 +286,7 @@ public abstract class AbstractCommonController {
if (aliasKey == null) {
continue;
}
if (val instanceof IModuleList) {
putModuleListPagination(aliasKey, paginationMap, (IModuleList) val);
aliasPath = alias.getRel().get(aliasPath);
}
data.put(aliasKey, NoUiPresentationUtil.handIBaseObject(context, val, aliasPath));
doHandleReturnData(val, aliasKey, aliasPath, context, alias, data);
containsKeys.add(modifyEntry.getKey());
}
......@@ -306,13 +300,19 @@ public abstract class AbstractCommonController {
continue;
}
Object baseObject = modifyMap.get(key);
if (baseObject instanceof IModuleList) {
putModuleListPagination(key, paginationMap, (IModuleList) baseObject);
doHandleReturnData(baseObject, key, key, context, alias, data);
}
data.put(key, NoUiPresentationUtil.handIBaseObject(context, baseObject, key));
}
return data;
}
return data;
private void doHandleReturnData(Object val, String aliasKey, String aliasPath, NoUiContext context, Alias alias, Map<String, Object> data) {
if (val instanceof IModuleList) {
aliasPath = alias.getRel().get(aliasPath);
List<Map> lst = (List<Map>) NoUiPresentationUtil.handIBaseObject(context, val, aliasPath);
doHandleReturnDataForModuleList(alias, aliasKey, data, (IModuleList) val, lst, context.getNoUiRequest());
} else {
data.put(aliasKey, NoUiPresentationUtil.handIBaseObject(context, val, aliasPath));
}
}
}
......@@ -4,11 +4,13 @@ import log.Log;
import log.LogFactory;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.util.Assert;
import org.sss.common.impl.StreamImpl;
import org.sss.common.model.*;
import org.sss.module.pojo.AbstractPOJOModuleSession;
import org.sss.presentation.noui.api.exception.NoUiException;
import org.sss.presentation.noui.api.model.Alias;
import org.sss.presentation.noui.api.model.AliasFactory;
import org.sss.presentation.noui.api.request.NoUiRequest;
import org.sss.presentation.noui.api.response.ErrorCodes;
import org.sss.presentation.noui.cache.AbstractCache;
......@@ -31,10 +33,12 @@ public class NoUiPresentationUtil {
Map<String, ?> dataMap = request.getDataMap();
for (String aliasKey : dataMap.keySet()) {
if (aliasKey.startsWith(Constants.MAPPING_PRE)) {
//忽略具有事件的字段
continue;
}
String url = alias.getRelPath(aliasKey);
if (StringUtils.isEmpty(url)) {
//忽略没有映射具体字段的配置
continue;
}
......@@ -49,10 +53,6 @@ public class NoUiPresentationUtil {
if (baseObject instanceof IDatafield<?>) {
IDatafield<Object> dataField = (IDatafield<Object>) baseObject;
handleDatafield(context, dataField, value);
// dataField.invokeDefaultRules(context);
// dataField.invokeCheckRules(context);
// dataField.invokeEventRules(context,
// EventType.ON_CHANGE, null, 0);
}
if (baseObject instanceof IModuleList<?> && value instanceof List<?>) {
IModuleList<IModule> moduleList = (IModuleList<IModule>) baseObject;
......@@ -60,27 +60,42 @@ public class NoUiPresentationUtil {
List<Map<String, Object>> valueList = (List<Map<String, Object>>) value;
for (Map<String, Object> m : valueList) {
IModule module = moduleList.add();
for (Map.Entry<String, Object> entry : m.entrySet())
for (Map.Entry<String, Object> entry : m.entrySet()) {
handleDatafield(context, (IDatafield<Object>) module.get(obfuscationPath(entry.getKey())), entry.getValue());
}
}
}
}
}
} catch (Exception e) {
log.error("Input command error", e);
throw new NoUiException("Input command error", e);
}
}
//处理分页信息
Map<String, ?> paginationMap = request.getPaginationMap();
if (paginationMap.containsKey(Constants.PAGINATION_INDEX) && paginationMap.containsKey(Constants.PAGINATION_PAGESIZE)) {
String primaryLstPth = alias.getPrimaryLstPth();
Assert.hasText(primaryLstPth, alias.getAliasActionUrl() + "请求的list模型路径未知");
IBaseObject baseObject = context.getSession().getBaseObject(context.getRoot(), primaryLstPth);
if (null == baseObject) {
throw new NoUiException("not found url :" + primaryLstPth);
}
if (!(baseObject instanceof IModuleList)) {
throw new NoUiException(primaryLstPth + " is not a moduleList");
}
IModuleList moduleList = (IModuleList) baseObject;
HashMap<String, Integer> tmp = new HashMap<String, Integer>();
tmp.put(Constants.PAGINATION_INDEX, Integer.parseInt(paginationMap.get(Constants.PAGINATION_INDEX) + ""));
tmp.put(Constants.PAGINATION_PAGESIZE, Integer.parseInt(paginationMap.get(Constants.PAGINATION_PAGESIZE) + ""));
putPaginationCache(tmp, moduleList);
} else {
for (String aliasKey : paginationMap.keySet()) {
String url = alias.getRelPath(aliasKey);
if (StringUtils.isEmpty(url)) {
url = aliasKey;
}
IBaseObject baseObject = null;
try {
baseObject = context.getSession().getBaseObject(context.getRoot(), url);
......@@ -98,7 +113,7 @@ public class NoUiPresentationUtil {
throw new NoUiException("Pagination command error", e);
}
}
}
}
private static void putPaginationCache(Map<String, Integer> paginationItem, IModuleList moduleList) {
......@@ -116,11 +131,6 @@ public class NoUiPresentationUtil {
Class<?> dataType = dataField.getDataType();
if (dataType.equals(String.class)) {
String valStr = value.toString();
// if ("true".equalsIgnoreCase(valStr.trim()))
// dataField.setValue("X");
// else if ("false".equalsIgnoreCase(valStr.trim()))
// dataField.setValue("");
// else
dataField.setValue(valStr);
return;
}
......@@ -275,7 +285,7 @@ public class NoUiPresentationUtil {
if (val == null)
return null;
if ((val instanceof IModuleList)) {
List list = new ArrayList();
List<Map> list = new ArrayList();
IModuleList moduleList = (IModuleList) val;
boolean isAll = true;
if (!StringUtil.isEmpty(path)) {
......@@ -288,7 +298,6 @@ public class NoUiPresentationUtil {
Collection<IDatafield> datafields = module.getDatafields();
for (IDatafield datafield : datafields) {
String dataFieldName = obfuscationPath(datafield.getName());
map.put(dataFieldName, handle(datafield.getValue(), datafield));
}
} else {
......@@ -316,7 +325,7 @@ public class NoUiPresentationUtil {
public static Map<String, Object> getWholeAliasData(IContext context, String mappingUrl) {
Map<String, Object> data = new HashMap<String, Object>();
Alias alias = new Alias(mappingUrl);
Alias alias = AliasFactory.getAlias(mappingUrl, context);
for (String aliasKey : alias.getRel().keySet()) {
if (aliasKey.startsWith(Constants.MAPPING_PRE)) {
continue;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment