package com.vci.server.query.service; import java.io.BufferedReader; import java.io.IOException; import java.io.Reader; import java.lang.reflect.Field; import java.math.BigDecimal; import java.sql.Clob; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorCompletionService; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.commons.lang3.StringUtils; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.transform.Transformers; import org.omg.CORBA.IntHolder; import com.vci.omd.constants.BusinessConstants; import com.vci.omd.constants.LinkConstants; import com.vci.omd.constants.SystemAttribute; import com.vci.server.base.exception.ExceptionLocalHandler; import com.vci.server.base.persistence.dao.HibernateSessionFactory; import com.vci.server.base.utility.OQueryHelper; import com.vci.server.base.utility.OmdHelper; import com.vci.server.cache.OMCacheProvider; import com.vci.server.query.parsers.BtmRefQueryParser; import com.vci.server.query.parsers.Parser; import com.vci.server.query.parsers.ParserForOneLevel; import com.vci.server.query.util.ServerTool; import com.vci.corba.omd.atm.AttPoolServicePrx; import com.vci.corba.omd.atm.AttribItem; import com.vci.corba.omd.data.AttributeValue; import com.vci.corba.omd.data.BusinessObject; import com.vci.corba.omd.data.LinkObject; import com.vci.corba.omd.ltm.LinkType; import com.vci.corba.query.data.BOAndLO; import com.vci.corba.query.data.BtmRefQueryOption; import com.vci.common.exception.VciExceptionTool; import com.vci.common.log.ServerWithLog4j; import com.vci.common.qt.object.QTConstants; import com.vci.common.qt.object.QueryTemplate; import com.vci.common.qt.object.Symbol; import com.vci.common.utility.ObjectUtility; import com.vci.corba.common.VCIError; /** * 创建link的业务类型视图的查询策略 从linkTable和btmView查询,递归查询时不需要二次查询。 * * @author Administrator * */ public class QueryObjectService { private static QueryObjectService queryObj = null; private int nCpu = Runtime.getRuntime().availableProcessors(); private VCIError getLocalVciError(String key, Throwable e) { VCIError error = new VCIError(key, new String[] { VciExceptionTool.getExceptionStr(e), VciExceptionTool.getExceptionDetail(e) }); VCIError rsError = ExceptionLocalHandler.getInstance().getLocalString(error, "PLMOQ"); return rsError; } public static QueryObjectService getInstance() { if (queryObj == null) { queryObj = new QueryObjectService(); } return queryObj; } /** * 解析QueryTemplate 为sql 执行sql, 返回结果 * * @param queryTemplate * @return * @throws Throwable */ public List findBtmObjects(QueryTemplate queryTemplate) throws Throwable { return this.findBtmObjectsV2(queryTemplate, new IntHolder(0)); } /** * 解析QueryTemplate 为sql 执行sql, 返回结果 V2版 * * @param queryTemplate * @param count 查询结果的总数,通过 count.value 获取 * @return 查询到的业务类型数据 com.vci.corba.omd.BusinessObject * @since v1.1 2017.08.31 * @see com.vci.corba.omd.data.BusinessObject * @throws Throwable */ public List findBtmObjectsV2(QueryTemplate queryTemplate, IntHolder count) throws Throwable { List refOpts = new ArrayList(); List clauseList = queryTemplate.getClauseList(); // 当clauseList中含有*时, 应当解析为BtmObject的全部属性 if (clauseList.contains("*") || queryTemplate.isQueryChildren()) { clauseList = getAllAbNamesForBtm(queryTemplate.getBtmType()); } else if (clauseList.size() > 0) { // add by xchao 2017.12.20 begin boolean hasRefQuery = false; List list = queryTemplate.getClauseList(); Iterator its = list.iterator(); while (its.hasNext()) { String clause = its.next(); if (clause.indexOf(".") >= 0) { if (!hasRefQuery) { hasRefQuery = true; } String[] kvs = clause.split("\\."); int len = kvs.length; if (len == 2) { // 一层参照 a.b // 第二个参数给空,是此不处从属性中查其参数的业务类型,由下下专用掊中进行处理 BtmRefQueryOption refOpt = new BtmRefQueryOption(kvs[0], "", new String[] { kvs[1] }); refOpts.add(refOpt); } else if (len == 3) { // 二层参照 a.b.c // TODO } else { // 三层以的参照 a.b.c.d a.b.c.d.e // TODO } its.remove(); } } clauseList = list; queryTemplate.setClauseList(clauseList); if (hasRefQuery) { return this.findBtmObjectsV3(queryTemplate, count, refOpts.toArray(new BtmRefQueryOption[0])); } // add by xchao 2017.12.20 end clauseList = getSelectedAbNamesForBtm(queryTemplate.getBtmType(), queryTemplate.getClauseList()); } Parser parser = new Parser(queryTemplate); // add by xchao 2017.09.04 BEGIN // 添加总数特殊标识 clauseList.add(QTConstants.COUNT_OVER_ALIAS); // add by xchao 2017.09.04 END queryTemplate.setClauseList(clauseList); String sql = parser.parseToSql(); // 解析sql后, 去掉clauseList中加的表名 clauseList = removeTableName(clauseList); List objList = executeSqlForBtmAndClauseV2(clauseList, sql, count, parser); return objList; } /** * 解析QueryTemplate 为sql 执行sql, 返回结果 V3版:基于传入指定参照查询规则进行查询参照对象数据 * * @param queryTemplate * @param count 查询结果的总数,通过 count.value 获取 * @param btmRefQueryOptions 参照查询选项参数 * @return 查询到的业务类型数据 com.vci.corba.omd.BusinessObject * @since 2017.12.20 * @author xiongchao * @see com.vci.corba.omd.data.BusinessObject * @throws Throwable */ public List findBtmObjectsV3(QueryTemplate queryTemplate, IntHolder count, BtmRefQueryOption[] btmRefQueryOptions) throws Throwable { final List joinOnTables = new ArrayList(); final Map refBtmNameMap = new HashMap(); Map refSameBtmNameMap = new HashMap(); Map> refSameBtmNameAttrMap = new HashMap>(); // 参照业务类型查询列与别名之间的映射 final Map refBtmQueryAttrToAliasMap = new HashMap(); final Map refBtmQueryAliasToAttrMap = new HashMap(); // 不需要表名的clause final Map dotRemoveTableNameClauseMap = new HashMap(); List clauseList = queryTemplate.getClauseList(); // 当clauseList中含有*时, 应当解析为BtmObject的全部属性 if (clauseList.contains("*") || queryTemplate.isQueryChildren()) { return this.findBtmObjectsV2(queryTemplate, count); // clauseList = getAllAbNamesForBtm(queryTemplate.getBtmType()); } else if (clauseList.size() > 0) { String btmTableName = OmdHelper.getBTTableName(queryTemplate.getBtmType()); List list = queryTemplate.getClauseList(); // 对 参照属性进行处理 for (BtmRefQueryOption refOpt : btmRefQueryOptions) { if (StringUtils.isEmpty(refOpt.attrName)) { continue; } // 参照的业务类型为空 if (StringUtils.isEmpty(refOpt.refBtmName)) { // 根据属性,从属性池关系中查出参照的业务类型 String refBtmName = getAttrRefBtmName(refOpt.attrName); if (StringUtils.isEmpty(refBtmName)) { continue; } refOpt.refBtmName = refBtmName; } if (refOpt.refBtmQueryAttrs.length == 0) { continue; } // String refBtmTable = OmdHelper.getBTTableName(refOpt.refBtmName); // modify by weidy@2021-1-20 把1.2版本的参照查询转移过来,解决参照是自己这个业务类型的时候报错的问题,比如部门里的上级部门属性 String trueRefTable = refBtmTable.toLowerCase(); if (btmTableName.equals(refBtmTable)) {// 瑙e喅寮曠敤鏈韩鐨勬椂鍊� refBtmTable = refBtmTable.replace("PLATFORM", "") + "_1"; } if (refSameBtmNameMap.containsKey(refBtmTable)) { // 这个业务类型里有多个属性的是参照当前业务类型的 int max = 0; if (refSameBtmNameMap.containsKey(refBtmTable)) { max = refSameBtmNameMap.get(refBtmTable); } boolean isNewReferTable = true; if (refSameBtmNameAttrMap.containsKey(refBtmTable)) { Set attrSet = refSameBtmNameAttrMap.get(refBtmTable); if (attrSet.contains(refOpt.attrName.trim().toLowerCase())) { isNewReferTable = false; } else { attrSet.add(refOpt.attrName.trim().toLowerCase()); } refSameBtmNameAttrMap.put(refBtmTable, attrSet); } if (isNewReferTable) { refSameBtmNameMap.put(refBtmTable, max + 1); refBtmTable = String.valueOf((char) ('A' + (max + 1))); } } else { Set attrSet = new HashSet(); attrSet.add(refOpt.attrName.trim().toLowerCase()); refSameBtmNameAttrMap.put(refBtmTable, attrSet); refSameBtmNameMap.put(refBtmTable, 1); } for (String refBtmAttr : refOpt.refBtmQueryAttrs) { // 处理参照 String queryField = (refBtmTable + "." + refBtmAttr).toLowerCase(); char c = (char) (65 + refBtmQueryAttrToAliasMap.size() + 1); String alias = (String.valueOf(c) + "__" + refBtmAttr).toLowerCase(); String aliasColumnName = (refOpt.attrName + "." + refBtmAttr).toLowerCase();// 鐢ㄤ簬杩斿洖缁欏墠绔� refBtmQueryAttrToAliasMap.put(queryField, alias); refBtmQueryAliasToAttrMap.put(alias, aliasColumnName); list.add(queryField); // 昵称 String key = getAppendAliasClause(queryField, alias); dotRemoveTableNameClauseMap.put(key, key); } if (!refBtmNameMap.containsKey(refBtmTable)) { StringBuffer sb = new StringBuffer(); sb.append(Symbol.SPACE); sb.append(Symbol.LEFT_JOIN); sb.append(Symbol.SPACE); sb.append(trueRefTable); sb.append(Symbol.SPACE); sb.append(refBtmTable.toLowerCase()); sb.append(Symbol.SPACE); sb.append(Symbol.ON); sb.append(Symbol.SPACE); sb.append(refBtmTable.toLowerCase() + ".oid="); sb.append(btmTableName + "."); sb.append(refOpt.attrName); sb.append(Symbol.SPACE); joinOnTables.add(sb.toString()); refBtmNameMap.put(refBtmTable, refOpt.refBtmName); } } queryTemplate.setClauseList(list); clauseList = getSelectedAbNamesForBtmV3(queryTemplate.getBtmType(), queryTemplate.getClauseList(), refBtmQueryAttrToAliasMap); } Parser parser = new BtmRefQueryParser(queryTemplate) { @Override public String getQueryType() { // 重写 构建表关联的逻辑段 String res = super.getQueryType(); if (joinOnTables.size() > 0) { StringBuffer sb = new StringBuffer(res); for (String string : joinOnTables) { sb.append(Symbol.SPACE).append(string); } sb.append(Symbol.SPACE); res = sb.toString(); } return res; } }; // add by xchao 2017.09.04 BEGIN // 添加总数特殊标识 clauseList.add(QTConstants.COUNT_OVER_ALIAS); // add by xchao 2017.09.04 END queryTemplate.setClauseList(clauseList); String sql = parser.parseToSql(); // 解析sql后, 去掉clauseList中加的表名 clauseList = removeTableNameV3(clauseList, dotRemoveTableNameClauseMap); List objList = executeSqlForBtmAndClauseV3(clauseList, sql, count, parser, refBtmQueryAliasToAttrMap); return objList; } //private AttPoolServicePrx apImpl = null; private Map apMap = new HashMap(); protected String getAttrRefBtmName(String attrName) throws VCIError { String[] others = getAttribItem(attrName).other.split(";"); for (String string : others) { String[] kvs = string.split("="); String key = kvs[0].trim(); String val = kvs[1].trim(); if ("btm".equalsIgnoreCase(key)) { return val; } } return ""; } protected AttribItem getAttribItem(String attrName) throws VCIError { // if (apImpl == null) { // apImpl = ServerServiceProvider.getOMDService().getAttributeService(); // } AttribItem ai = apMap.get(attrName); if (ai == null) { //ai = apImpl.getAttribItemByName(attrName); ai = OMCacheProvider.getAttribute(attrName); apMap.put(attrName, ai); } return ai; } /** * @param clauseList * @param sql * @return */ private List executeSqlForBtmAndClauseV3(List clauseList, String sql, IntHolder count, Parser parser, Map refBtmQueryAliasToAttrMap) { List objList = new ArrayList(); Session session = HibernateSessionFactory.getSession(); ServerWithLog4j.logger.debug(sql); SQLQuery sqlquery = session.createSQLQuery(sql); // 根据查询模板中的查询列clauseList, 设置map List list = sqlquery.list(); String countOverAlias = QTConstants.COUNT_OVER_ALIAS; int countValue = 0; Map mapValue = new HashMap(); for (int i = 0; i < list.size(); i++) { BusinessObject bo = new BusinessObject(); List abList = new ArrayList(); // 当list.get(i)中有多个Object时, 类型为Object[] // 必须先判断Object[] 再判断Object Object[] objs = (Object[]) list.get(i); mapValue.clear(); for (int k = 0; k < clauseList.size(); k++) { String clauseField = clauseList.get(k); if (countOverAlias.equalsIgnoreCase(clauseField)) { countValue = Integer.valueOf(objs[k].toString()); if (count == null) { count = new IntHolder(); } count.value = countValue; continue; } AttributeValue ab = new AttributeValue(); // sessin查询出的值 Object value = objs[k]; // clauseList中对应的查询列 String abName = clauseField; if (clauseField.indexOf("'' as ") > -1) {// 对不存在的列的名字做修饰,因为查询时是以 “'' as 列名”查询的 abName = abName.substring(abName.lastIndexOf("'' as ") + "'' as ".length()); } // add by xchao 2017.12.20 begin // 参照数据查询列,专用处理 String asChar = " as "; // 分解出“别名” int asPos = clauseField.indexOf(asChar); if (asPos >= 0) { abName = clauseField.substring(asPos + asChar.length()); } // 基于 别名与 提取出 原始 配置的(查询模板中原始传入的 clauseList中的 ,如 xxx.name) String orignalField = refBtmQueryAliasToAttrMap.get(abName); // 如果值不为空,则添加到 AttributeValue if (StringUtils.isNotEmpty(orignalField)) { abName = orignalField; } // add by xchao 2017.12.20 end ab.attrName = abName; // 如果是clob字段,转换字符串 ab.attrVal = objValueToString(value); abList.add(ab); mapValue.put(ab.attrName.toLowerCase(), ab.attrVal); } AttributeValue[] abArray = abList.toArray(new AttributeValue[0]); bo.newAttrValList = new AttributeValue[0]; bo.hisAttrValList = abArray; // 为btm的系统属性赋值 // 改为动态根据查出列的数量赋值 setBOAttribute(bo, mapValue); objList.add(bo); } return objList; } private String objValueToString(Object value) { if (value == null) return ""; if (value instanceof Clob) { return clobToString((Clob) value); } else if (value instanceof java.sql.Timestamp) { java.sql.Timestamp ts = (java.sql.Timestamp)value; return String.valueOf(ts.getTime()); } else if (value instanceof java.sql.Date) { java.sql.Date date = (java.sql.Date)value; return String.valueOf(date.getTime()); } else { return String.valueOf(value); } } private void setBOAttribute(BusinessObject bo, Map mapValue) { Field[] fields = bo.getClass().getFields(); for (Field f : fields) { // 只甄选基本类型 if (!f.getType().isPrimitive() && !f.getType().equals(String.class)) continue; f.setAccessible(true); String name = f.getName(); if (name.equalsIgnoreCase("BTNAME")) name = "BTMNAME"; else if (name.equalsIgnoreCase("MODIFIER")) name = "LASTMODIFIER"; else if (name.equalsIgnoreCase("MODIFYTIME")) name = "LASTMODIFYTIME"; else if (name.equalsIgnoreCase("FROMVERSION")) name = "COPYFROMVERSION"; else if (name.equalsIgnoreCase("REVISIONOID")) name = "revisionid"; name = name.toLowerCase(); // f.getType().equals(String.class) if (mapValue.containsKey(name)) { String value = mapValue.get(name); try { if (f.getType().equals(String.class)) { f.set(bo, value); } else if (f.getType().equals(boolean.class)) { f.set(bo, StringUtils.isBlank(value) ? false : Integer.valueOf(value) != 0); } else if (f.getType().equals(short.class)) { f.set(bo, StringUtils.isBlank(value) ? 0 : Short.valueOf(value)); } else if (f.getType().equals(int.class)) { f.set(bo, StringUtils.isBlank(value) ? 0 : Integer.valueOf(value)); } else if (f.getType().equals(long.class) && value != null && value.length() > 0) { f.set(bo, StringUtils.isBlank(value) ? 0 : Long.valueOf(value)); } } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // try { // if (f.getName().equalsIgnoreCase(abArray[j].attrName)) { // if (f.getType().equals(String.class)) { // f.set(bo, abArray[j].attrVal); // } else if (f.getType().equals(int.class) && abArray[j].attrVal != null // && abArray[j].attrVal.length() > 0) { // f.set(bo, Integer.valueOf(abArray[j].attrVal)); // } // continue outer; // // 对象中属性名为revisionid,但是数据库字段名为revisionoid,反射不能正确匹配,所以特别匹配下 // } else if (f.getName().equalsIgnoreCase("revisionid") // && abArray[j].attrName.equalsIgnoreCase("REVISIONOID")) { // f.set(bo, abArray[j].attrVal); // } // } catch (Exception e) { // e.printStackTrace(); // } } } /** * @param clauseList * @param sql * @return */ private List executeSqlForBtmAndClauseV2(List clauseList, String sql, IntHolder count, Parser parser) { List objList = new ArrayList(); Session session = HibernateSessionFactory.getSession(); ServerWithLog4j.logger.debug(sql); SQLQuery sqlquery = session.createSQLQuery(sql); // 根据查询模板中的查询列clauseList, 设置map List list = sqlquery.list(); String countOverAlias = QTConstants.COUNT_OVER_ALIAS; int countValue = 0; Map mapValue = new HashMap(); for (int i = 0; i < list.size(); i++) { BusinessObject bo = new BusinessObject(); List abList = new ArrayList(); // 当list.get(i)中有多个Object时, 类型为Object[] // 必须先判断Object[] 再判断Object mapValue.clear(); Object[] objs = (Object[]) list.get(i); for (int k = 0; k < clauseList.size(); k++) { String clauseField = clauseList.get(k); if (countOverAlias.equalsIgnoreCase(clauseField)) { countValue = Integer.valueOf(objs[k].toString()); if (count == null) { count = new IntHolder(); } count.value = countValue; continue; } AttributeValue ab = new AttributeValue(); // sessin查询出的值 Object value = objs[k]; // clauseList中对应的查询列 String abName = clauseList.get(k); if (clauseList.get(k).indexOf("'' as ") > -1) {// 对不存在的列的名字做修饰,因为查询时是以 “'' as 列名”查询的 abName = abName.substring(abName.lastIndexOf("'' as ") + "'' as ".length()); } ab.attrName = abName; ab.attrVal = objValueToString(value); abList.add(ab); mapValue.put(ab.attrName.toLowerCase(), ab.attrVal); } AttributeValue[] abArray = abList.toArray(new AttributeValue[0]); bo.newAttrValList = new AttributeValue[0]; bo.hisAttrValList = abArray; // 为btm的系统属性赋值 // 改为动态根据查出列的数量赋值 setBOAttribute(bo, mapValue); // Field[] fields = bo.getClass().getFields(); // outer: for (int j = 0; j < abArray.length; j++) { // for (Field f : fields) { // // System.out.println(f.getName()+","+f.getType().equals(int.class)); // // 只甄选基本类型和字符串类型 // if (f.getType().isPrimitive() || f.getType().equals(String.class)) { // f.setAccessible(true); // try { // if (f.getName().equalsIgnoreCase(abArray[j].attrName)) { // if (f.getType().equals(String.class)) { // f.set(bo, abArray[j].attrVal); // } else if (f.getType().equals(int.class) && abArray[j].attrVal != null // && abArray[j].attrVal.length() > 0) { // f.set(bo, Integer.valueOf(abArray[j].attrVal)); // } // continue outer; // // 对象中属性名为revisionid,但是数据库字段名为revisionoid,反射不能正确匹配,所以特别匹配下 // } else if (f.getName().equalsIgnoreCase("revisionid") // && abArray[j].attrName.equalsIgnoreCase("REVISIONOID")) { // f.set(bo, abArray[j].attrVal); // } // } catch (Exception e) { // e.printStackTrace(); // } // } // } // } objList.add(bo); } return objList; } /** * clob转String * * @param value * @return */ private String clobToString(Clob value) { // TODO Auto-generated method stub String clobValue = ""; try { Reader is = value.getCharacterStream(); BufferedReader br = new BufferedReader(is); String s = br.readLine(); StringBuffer sb = new StringBuffer(); while (s != null) { sb.append(s); s = br.readLine(); } clobValue = sb.toString(); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return clobValue; } /** * 解析QueryTemplate 为sql 执行sql, 返回结果 * * @param queryTemplate * @return * @throws VCIError */ public List findLinkObject(QueryTemplate queryTemplate) throws Throwable { return this.findLinkObjectV2(queryTemplate, new IntHolder(0)); } /** * 解析QueryTemplate 为sql 执行sql, 返回结果 * * @param queryTemplate * @param count 查询结果的总数,通过 count.value 获取 * @return 查询到的业务类型数据 com.vci.corba.omd.LinkObject * @since v1.1 2017.08.31 * @see com.vci.corba.omd.data.LinkObject * @throws VCIError */ public List findLinkObjectV2(QueryTemplate queryTemplate, IntHolder count) throws Throwable { List clauseList = queryTemplate.getClauseList(); String ltName = queryTemplate.getLinkType(); String ltTableName = OmdHelper.getLTTableName(ltName); String btmName = queryTemplate.getBtmType(); boolean btmFlag = false; if (clauseList.contains(ltTableName + ".*") || clauseList.contains("*") || clauseList.size() > 0) { if (!clauseList.contains(ltTableName + ".*") && !clauseList.contains("*")) { clauseList = this.getSelectedLinkTypeFiledsWithTableName(ltName, ltTableName, clauseList); } else { clauseList = getAllLinkTypeFiledsWithTableName(ltName, ltTableName); } if (btmName != null && !btmName.equals("")) { btmFlag = true; String viewName = null; if (btmName.equals("*") || btmName.contains(",")) { if (queryTemplate.getDirection().equals(QTConstants.DIRECTION_POSITIVE)) { viewName = OmdHelper.getToViewName(ltName); } else { viewName = OmdHelper.getFromViewName(ltName); } } else { viewName = OmdHelper.getBTTableName(btmName); } clauseList.add(viewName + ".OID AS OID2"); clauseList.add(viewName + ".REVISIONOID AS REVISIONOID2"); } clauseList.add("CONNECT_BY_ISLEAF"); clauseList.add("LEVEL"); } Parser parser = new Parser(queryTemplate); // add by xchao 2017.09.04 BEGIN // 添加总数列查询 clauseList.add(QTConstants.COUNT_OVER_ALIAS); // add by xchao 2017.09.04 END queryTemplate.setClauseList(clauseList); String sql = parser.parseToSql(); List objList = null; clauseList = this.removeTableName(clauseList); if (btmFlag) { objList = executeSqlForLinkWithVersion(clauseList, sql, queryTemplate.getDirection(), ltName); } else { objList = executeSqlForLink(clauseList, sql, ltName); } return objList; } /** * 查询一层, 分查询是否有有下一级和不查询是否有有下一级 * * @param queryTemplate * @return * @throws Throwable */ public List findLinkObjectOneLevel(QueryTemplate queryTemplate) throws Throwable { return this.findLinkObjectOneLevelV2(queryTemplate, new IntHolder(0)); } /** * 查询一层, 分查询是否有有下一级和不查询是否有有下一级 * * @param queryTemplate * @return * @param count 查询结果的总数,通过 count.value 获取 * @return 查询到的业务类型数据 com.vci.corba.omd.LinkObject * @since v1.1 2017.08.31 * @see com.vci.corba.omd.data.LinkObject * @throws Throwable */ public List findLinkObjectOneLevelV2(QueryTemplate queryTemplate, IntHolder count) throws Throwable { List clauseList = queryTemplate.getClauseList(); String ltName = queryTemplate.getLinkType(); String ltTableName = OmdHelper.getLTTableName(ltName); String btmName = queryTemplate.getBtmType(); boolean btmFlag = false; if (clauseList.contains(ltTableName + ".*") || clauseList.contains("*") || clauseList.size() > 0) { if (!clauseList.contains("*") && !clauseList.contains(ltTableName + ".*")) { clauseList = getSelectedLinkTypeFiledsWithTableName(ltName, ltTableName, clauseList); } else { clauseList = getAllLinkTypeFiledsWithTableName(ltName, ltTableName); } if (btmName != null && !btmName.equals("")) { btmFlag = true; String viewName = null; if (btmName.equals("*") || btmName.contains(",")) { if (queryTemplate.getDirection().equals(QTConstants.DIRECTION_POSITIVE)) { viewName = OmdHelper.getToViewName(ltName); } else { viewName = OmdHelper.getFromViewName(ltName); } } else { viewName = OmdHelper.getBTTableName(btmName); } clauseList.add(viewName + ".OID AS OID2"); clauseList.add(viewName + ".REVISIONOID AS REVISIONOID2"); } } ParserForOneLevel parser = new ParserForOneLevel(queryTemplate); // add by xhao 2017.09.04 BEGIN // 添加上总数特殊标识查询 clauseList.add(QTConstants.COUNT_OVER_ALIAS); // add by xhao 2017.09.04 END queryTemplate.setClauseList(clauseList); String sql = parser.parseToSql(); Map isLeafMap = null; if (queryTemplate.isQueryISLeaf()) { String sql_ = parser.parseToSqlForLinkStartWith(); isLeafMap = getIsLeaf(sql_); } else { isLeafMap = new HashMap(); } List objList = null; clauseList = removeTableName(clauseList); if (btmFlag) { objList = executeSqlForLinkWithVersionOneLevelV2(clauseList, sql, queryTemplate.getDirection(), ltName, isLeafMap, count); } else { objList = executeSqlForLinkOneLevel(clauseList, sql, ltName, isLeafMap); } return objList; } /** * 获取特定业务类型属性, 包括系统属性和属性池属性 如果‘要求列’不是确实存在的列,咋在返回值中添加 '' as 别名 * * @param btmName * @param clauseList 返回列 * @return * @throws Throwable */ private List getSelectedAbNamesForBtm(String btmName, List clauseList) throws Throwable { try { String tableName = OmdHelper.getBTTableName(btmName); // 系统属性 String[] sysAbs = BusinessConstants.SELECT_CONSTANTS; List sysList = new ArrayList(); List abList = new ArrayList(); if (sysAbs != null && sysAbs.length > 0) { for (String sysAb : sysAbs) { String abLower = sysAb.toLowerCase(); sysList.add(abLower); abList.add(tableName + "." + abLower); } } // 属性池属性 //String[] abs = ServerServiceProvider.getOMDService().getBTMService().getBtmApNameArray(btmName);// OmdTools.getAbNames(btmName); String[] abs = OMCacheProvider.getBTAttributes(btmName); List absList = new ArrayList(); if (abs != null && abs.length > 0) { for (String ab : abs) { absList.add(ab.toLowerCase()); } } for (int i = 0; i < clauseList.size(); i++) { // 如果传入的clauseList确实存在于系统属性或属性池属性中,则保留,否则按“'' as 别名”查询 String lowerCaseName = clauseList.get(i).toLowerCase(); if (sysList.contains(lowerCaseName)) { continue; } if (absList.contains(lowerCaseName)) { abList.add(tableName + "." + clauseList.get(i)); } else { abList.add("'' as " + clauseList.get(i)); } } return abList; } catch (Throwable e) { e.printStackTrace(); throw e; } } private List getSelectedAbNamesForBtmV3(String btmName, List clauseList, Map refBtmQueryAttrToAliasMap) throws Throwable { try { String tableName = OmdHelper.getBTTableName(btmName); // 系统属性 String[] sysAbs = BusinessConstants.SELECT_CONSTANTS; List sysList = new ArrayList(); List abList = new ArrayList(); if (sysAbs != null && sysAbs.length > 0) { for (String sysAb : sysAbs) { String abLower = sysAb.toLowerCase(); sysList.add(abLower); abList.add(tableName + "." + abLower); } } // 属性池属性 //String[] abs = ServerServiceProvider.getOMDService().getBTMService().getBtmApNameArray(btmName);// OmdTools.getAbNames(btmName); String[] abs = OMCacheProvider.getBTAttributes(btmName); List absList = new ArrayList(); if (abs != null && abs.length > 0) { for (String ab : abs) { absList.add(ab.toLowerCase()); } } for (int i = 0; i < clauseList.size(); i++) { String clauseString = clauseList.get(i); // 如果传入的clauseList确实存在于系统属性或属性池属性中,则保留,否则按“'' as 别名”查询 String lowerCaseName = clauseString.toLowerCase(); if (sysList.contains(lowerCaseName)) { continue; } if (absList.contains(lowerCaseName)) { abList.add(tableName + "." + clauseString); } else { String alias = refBtmQueryAttrToAliasMap.get(lowerCaseName); if (StringUtils.isNotEmpty(alias)) { abList.add(getAppendAliasClause(lowerCaseName, alias)); } } } return abList; } catch (Throwable e) { e.printStackTrace(); throw e; } } private String getAppendAliasClause(String clause, String alias) { return clause + " as " + alias; } /** * 获取业务类型全部属性, 包括系统属性和属性池属性 * * @param btmName * @return * @throws Throwable */ private List getAllAbNamesForBtm(String btmName) throws Throwable { try { String tableName = OmdHelper.getBTTableName(btmName); List abList = new ArrayList(); String[] sysAbs = BusinessConstants.SELECT_CONSTANTS; for (int i = 0; i < sysAbs.length; i++) { abList.add(tableName + "." + sysAbs[i]); } //String[] abs = ServerServiceProvider.getOMDService().getBTMService().getBtmApNameArray(btmName);// OmdTools.getAbNames(btmName); String[] abs = OMCacheProvider.getBTAttributes(btmName); for (int i = 0; i < abs.length; i++) { abList.add(tableName + "." + abs[i]); } return abList; } catch (Throwable e) { e.printStackTrace(); throw e; } } /** * 解析sql后, 去掉clauseList中加的表名 * * @param clauseList */ private List removeTableName(List clauseList) { List list = new ArrayList(clauseList.size()); for (String clause : clauseList) { if (clause.contains(".")) { clause = clause.substring(clause.lastIndexOf(".") + 1); } list.add(clause); } return list; } private List removeTableNameV3(List clauseList, Map dotRemoveTableNameClauseMap) { List list = new ArrayList(clauseList.size()); for (String clause : clauseList) { if (dotRemoveTableNameClauseMap.containsKey(clause)) { list.add(clause); continue; } if (clause.contains(".")) { clause = clause.substring(clause.lastIndexOf(".") + 1); } list.add(clause); } return list; } /** * 将链接类型的全部属性加上表明返回, 用作查询列; 避免与业务类型做链接查询时, 出现列明不明确问题. tableName.ltName * * @param ltName * @param tableName * @return * @throws Throwable */ private List getSelectedLinkTypeFiledsWithTableName(String ltName, String tableName, List clauseList) throws Throwable { try { ServerWithLog4j.logger.debug("非全量查詢。。。。。。"); String[] sysAbs = LinkConstants.SELECT_CONSTANTS; List sysAbsList = new ArrayList(); if (sysAbs != null && sysAbs.length > 0) { sysAbsList = Arrays.asList(sysAbs); } //LinkType linkType = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName);// LinkTypeProvider.getInstance().getLinkTypeByName(ltName); LinkType linkType = OMCacheProvider.getLinkType(ltName); String[] abs = linkType.attributes; List absList = new ArrayList(); if (abs != null && abs.length > 0) { absList = Arrays.asList(abs); } List abList = new ArrayList(); for (int i = 0; i < clauseList.size(); i++) { // 如果传入的clauseList确实存在于系统属性或属性池属性中,则保留,否则按“'' as 别名”查询 if (sysAbsList.contains(clauseList.get(i)) || absList.contains(clauseList.get(i))) { abList.add(tableName + "." + clauseList.get(i)); } else { abList.add("'' as " + clauseList.get(i)); } } return abList; } catch (Throwable e) { e.printStackTrace(); throw e; } } /** * 将链接类型的全部属性加上表明返回, 用作查询列; 避免与业务类型做链接查询时, 出现列明不明确问题. tableName.ltName * * @param ltName * @param tableName * @return * @throws Throwable */ private List getAllLinkTypeFiledsWithTableName(String ltName, String tableName) throws Throwable { //LinkType linkType = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName); LinkType linkType = OMCacheProvider.getLinkType(ltName); return getAllLinkTypeFiledsWithTableName(linkType, tableName); /* * try{ List abList = new ArrayList(); String[] sysAbs = * LinkConstants.SELECT_CONSTANTS; for(int i = 0; i < sysAbs.length; i++){ * abList.add(tableName + "." + sysAbs[i]); } LinkType linkType = * ltService.getLinkType(ltName);//LinkTypeProvider.getInstance(). * getLinkTypeByName(ltName); String[] abs = linkType.attributes; for(int i = 0; * i < abs.length; i++){ abList.add(tableName + "." + abs[i].trim()); } return * abList; }catch(Throwable e){ e.printStackTrace(); throw e; } */ } /** * 将链接类型的全部属性加上表明返回, 用作查询列; 避免与业务类型做链接查询时, 出现列明不明确问题. tableName.ltName * * @param linkType 链接类型对象 * @param tableName * @return * @throws Throwable */ private List getAllLinkTypeFiledsWithTableName(LinkType linkType, String tableName) throws Throwable { try { List abList = new ArrayList(); String[] sysAbs = LinkConstants.SELECT_CONSTANTS; for (int i = 0; i < sysAbs.length; i++) { abList.add(tableName + "." + sysAbs[i]); } String[] abs = linkType.attributes; for (int i = 0; i < abs.length; i++) { abList.add(tableName + "." + abs[i].trim()); } return abList; } catch (Throwable e) { e.printStackTrace(); throw e; } } /** * 从linkTable和btmView查询BOAndLO * * @param qt * @return * @throws Throwable */ public List findBOAndLOByView(QueryTemplate qt, String btmOId) throws Throwable { List clauseList = qt.getClauseList(); String ltName = qt.getLinkType(); String btmName = qt.getBtmType(); String ltTableName = OmdHelper.getLTTableName(ltName); clauseList = getAllLinkTypeFiledsWithTableName(ltName, ltTableName); clauseList.add("CONNECT_BY_ISLEAF"); clauseList.add("LEVEL"); List viewCols = null; //LinkType linkType = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName);// LinkTypeProvider.getInstance().getLinkTypeByName(ltName); LinkType linkType = OMCacheProvider.getLinkType(ltName); String viewName = null; if (btmName != null && !btmName.equals("*") && !btmName.contains(",")) { viewName = OmdHelper.getBTTableName(btmName); } if (viewName == null) { if (qt.getDirection().equals(QTConstants.DIRECTION_POSITIVE)) { viewCols = OQueryHelper.getViewColsWithAlias(linkType.btmItemsTo, OmdHelper.getToViewName(ltName)); } else { viewCols = OQueryHelper.getViewColsWithAlias(linkType.btmItemsFrom, OmdHelper.getFromViewName(ltName)); } } else { viewCols = OQueryHelper.getViewColsWithAlias(new String[] { btmName }, viewName); } clauseList.addAll(viewCols); qt.setClauseList(clauseList); Parser parser = new Parser(qt); String sql = parser.parseToSql(); String key = "start with"; if ((sql.toLowerCase().indexOf("start with") > 0) && StringUtils.isNotEmpty(btmOId)) { String f_oidCondition = " " + ltTableName + ".f_oid = '" + btmOId + "' and "; sql = sql.replace(key, key + f_oidCondition); } List boAndLos = executeSqlForBOAndLO(clauseList, sql, ltName, qt.getDirection()); return boAndLos; } /** * 查询一层, 分查询是否有有下一级和不查询是否有有下一级 从linkTable和btmView查询BOAndLO * * @param qt * @return * @throws Throwable */ public List findBOAndLOByViewOneLevel(QueryTemplate qt) throws Throwable { List clauseList = qt.getClauseList(); String ltName = qt.getLinkType(); String btmName = qt.getBtmType(); String ltTableName = OmdHelper.getLTTableName(ltName); //LinkType linkType = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName); // weidy@2018-6-26 LinkType linkType = OMCacheProvider.getLinkType(ltName); clauseList = getAllLinkTypeFiledsWithTableName(linkType, ltTableName); List viewCols = null; // LinkTypeProvider.getInstance().getLinkTypeByName(ltName); String viewName = null; if (btmName != null && !btmName.equals("*") && !btmName.contains(",")) { viewName = OmdHelper.getBTTableName(btmName); } if (viewName == null) { if (qt.getDirection().equals(QTConstants.DIRECTION_POSITIVE)) { viewCols = ServerTool.getViewColsWithAlias(linkType.btmItemsTo, OmdHelper.getToViewName(ltName)); } else { viewCols = ServerTool.getViewColsWithAlias(linkType.btmItemsFrom, OmdHelper.getFromViewName(ltName)); } } else { viewCols = ServerTool.getViewColsWithAlias(new String[] { btmName }, viewName); } clauseList.addAll(viewCols); qt.setClauseList(clauseList); ParserForOneLevel parser = new ParserForOneLevel(qt); String sql = parser.parseToSql(); Map isLeafMap = null; if (qt.isQueryISLeaf()) { String sql_ = parser.parseToSqlForLinkStartWith(); isLeafMap = getIsLeaf(sql_); } else { isLeafMap = new HashMap(); } List boAndLos = executeSqlForBOAndLOOneLevel(clauseList, sql, ltName, qt.getDirection(), isLeafMap); return boAndLos; } /** * 查询linkoid 是否有下一级 * * @param sql_ * @return */ private Map getIsLeaf(String sql_) { Map isLeafMap = new HashMap(); Session session = HibernateSessionFactory.getSession(); ServerWithLog4j.logger.debug(sql_); SQLQuery sqlQuery = session.createSQLQuery(sql_); sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); List list = sqlQuery.list(); for (int i = 0; i < list.size(); i++) { Map map = (Map) list.get(i); String key = (String) map.get("OID"); String val = String.valueOf(((BigDecimal) (map.get("CONNECT_BY_ISLEAF"))).intValue()); isLeafMap.put(key, val); } return isLeafMap; } /** * 查询链接类型 * * @param clauseList * @param sql * @param queryType * @param direction * @param ltName : 目前系统属性没有ltName * @return * @throws VCIError */ public List executeSqlForLink(List clauseList, String sql, String ltName) throws VCIError { try { String[] ltSysAttrs = OmdHelper.getLTSysAbItems(); //LinkType linkType = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName);// LinkTypeProvider.getInstance().getLinkTypeByName(ltName); LinkType linkType = OMCacheProvider.getLinkType(ltName); String[] ltUserAttrs = linkType.attributes; // +2 for :CONNECT_BY_ISLEAF , LEVEL int loAttrSize = ltSysAttrs.length + ltUserAttrs.length + 2; List objList = new ArrayList(); Session session = HibernateSessionFactory.getSession(); ServerWithLog4j.logger.debug(sql); SQLQuery sqlQuery = session.createSQLQuery(sql); // 查询出的记录为Map的List集合 sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); List list = sqlQuery.list(); for (int i = 0; i < list.size(); i++) { Map map = (Map) list.get(i); LinkObject lo = getLO(map, ltUserAttrs, ltName, loAttrSize, clauseList); objList.add(lo); } return objList; } catch (Throwable e) { e.printStackTrace(); throw getLocalVciError("P0010QT-00009", e); } } public List executeSqlForLinkOneLevel(List clauseList, String sql, String ltName, Map isLeafMap) throws VCIError { try { String[] ltSysAttrs = OmdHelper.getLTSysAbItems(); //LinkType linkType = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName);// LinkTypeProvider.getInstance().getLinkTypeByName(ltName); LinkType linkType = OMCacheProvider.getLinkType(ltName); String[] ltUserAttrs = linkType.attributes; // +2 for :CONNECT_BY_ISLEAF , LEVEL int loAttrSize = ltSysAttrs.length + ltUserAttrs.length + 2; List objList = new ArrayList(); Session session = HibernateSessionFactory.getSession(); ServerWithLog4j.logger.debug(sql); SQLQuery sqlQuery = session.createSQLQuery(sql); // 查询出的记录为Map的List集合 sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); List list = sqlQuery.list(); for (int i = 0; i < list.size(); i++) { Map map = (Map) list.get(i); LinkObject lo = getLOOneLevel(map, ltUserAttrs, ltName, loAttrSize, isLeafMap, clauseList); objList.add(lo); } return objList; } catch (Throwable e) { e.printStackTrace(); throw getLocalVciError("P0010QT-00009", e); } } /** * 查询链接类型 正向查询时替换T_OId, T_RevisionOId * * @param clauseList * @param sql * @param queryType * @param direction * @return * @throws VCIError */ public List executeSqlForLinkWithVersion(List clauseList, String sql, String direction, String ltName) throws VCIError { try { ExecutorService exec = Executors.newFixedThreadPool(nCpu); ExecutorCompletionService exec_ = new ExecutorCompletionService(exec); String[] ltSysAttrs = OmdHelper.getLTSysAbItems(); //LinkType linkType = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName);// LinkTypeProvider.getInstance().getLinkTypeByName(ltName); LinkType linkType = OMCacheProvider.getLinkType(ltName); String[] ltUserAttrs = linkType.attributes; // +2 for :CONNECT_BY_ISLEAF , LEVEL int loAttrSize = ltSysAttrs.length + ltUserAttrs.length + 2; List objList = new ArrayList(); Session session = HibernateSessionFactory.getSession(); ServerWithLog4j.logger.debug(sql); SQLQuery sqlQuery = session.createSQLQuery(sql); // 查询出的记录为Map的List集合 sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); List list = sqlQuery.list(); for (int i = 0; i < list.size(); i++) { Map map = (Map) list.get(i); // LinkObject lo = getLOWithVersion(map, direction, ltUserAttrs, ltName, loAttrSize); // objList.add(lo); exec_.submit(new QueryLOWithVersion(map, direction, ltUserAttrs, ltName, loAttrSize, clauseList)); } for (int m = 0; m < list.size(); m++) { objList.add(exec_.take().get()); } exec.shutdown(); return objList; } catch (Throwable e) { e.printStackTrace(); throw getLocalVciError("P0010QT-00009", e); } } public List executeSqlForLinkWithVersionOneLevel(List clauseList, String sql, String direction, String ltName, Map isLeafMap) throws VCIError { return this.executeSqlForLinkWithVersionOneLevelV2(clauseList, sql, direction, ltName, isLeafMap, new IntHolder(0)); } public List executeSqlForLinkWithVersionOneLevelV2(List clauseList, String sql, String direction, String ltName, Map isLeafMap, IntHolder count) throws VCIError { try { String[] ltSysAttrs = OmdHelper.getLTSysAbItems(); //LinkType linkType = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName);// LinkTypeProvider.getInstance().getLinkTypeByName(ltName); LinkType linkType = OMCacheProvider.getLinkType(ltName); String[] ltUserAttrs = linkType.attributes; // +2 for :CONNECT_BY_ISLEAF , LEVEL int loAttrSize = ltSysAttrs.length + ltUserAttrs.length + 2; List objList = new ArrayList(); Session session = HibernateSessionFactory.getSession(); ServerWithLog4j.logger.debug(sql); SQLQuery sqlQuery = session.createSQLQuery(sql); // 查询出的记录为Map的List集合 sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); List list = sqlQuery.list(); for (int i = 0; i < list.size(); i++) { Map map = (Map) list.get(i); LinkObject lo = getLOWithVersionOneLevelV2(map, direction, ltUserAttrs, ltName, loAttrSize, isLeafMap, clauseList, count); objList.add(lo); } return objList; } catch (Throwable e) { e.printStackTrace(); throw getLocalVciError("P0010QT-00009", e); } } /** * 从linkTable和btmView查询BOAndLO * * @param clauseList * @param sql * @param queryType * @param direction * @param ltName : 目前系统属性没有ltName * @return * @throws VCIError */ public List executeSqlForBOAndLO(List clauseList, String sql, String ltName, String direction) throws VCIError { try { ExecutorService exec = Executors.newFixedThreadPool(nCpu); ServerWithLog4j.logger.debug("create exec"); ExecutorCompletionService exec_ = new ExecutorCompletionService(exec); String[] btSysAttrs = OmdHelper.getBTSysANames(); String[] ltSysAttrs = OmdHelper.getLTSysAbItems(); //LinkType linkType = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName); // LinkTypeProvider.getInstance().getLinkTypeByName(ltName); LinkType linkType = OMCacheProvider.getLinkType(ltName); String[] ltUserAttrs = linkType.attributes; // +2 for :CONNECT_BY_ISLEAF , LEVEL int loAttrSize = ltSysAttrs.length + ltUserAttrs.length + 2; int btSysAttrSize = btSysAttrs.length; // 缓存业务类型对应的用户属性 Map btUserAttrMap = new HashMap(); List boAndLoList = new ArrayList(); Session session = HibernateSessionFactory.getSession(); ServerWithLog4j.logger.debug(sql); SQLQuery sqlQuery = session.createSQLQuery(sql); // 查询出的记录为Map的List集合 sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); List list = sqlQuery.list(); for (int i = 0; i < list.size(); i++) { // modify by weidy@2019-02-25,原来的方式在数据量大的时候,会造成大量线程,并且查询业务类型也会重复查询 // 修改为。1,先行查询to端或者from端的业务类型包含的属性 Map map = (Map) list.get(i); String btName = ""; if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { Object value = map.get(SystemAttribute.T_BTWNAME.text()); btName = String.valueOf(value == null ? "" : value); } else { Object value = map.get(SystemAttribute.F_BTWNAME.text()); btName = String.valueOf(value == null ? "" : value); } if (!btUserAttrMap.containsKey(btName)) { //String[] btUserAttrs = ServerServiceProvider.getOMDService().getBTMService().getBtmApNameArray(btName);// BtmProvider.getInstance().getAbNames(btName); String[] btUserAttrs = OMCacheProvider.getBTAttributes(btName); btUserAttrMap.put(btName, btUserAttrs); } } for (int i = 0; i < list.size(); i++) { Map map = (Map) list.get(i);// 线程池已经是根据CPU的个数来执行的了 exec_.submit( new QueryBOAndLO(map, direction, ltUserAttrs, ltName, loAttrSize, btUserAttrMap, btSysAttrSize)); } for (int m = 0; m < list.size(); m++) { boAndLoList.add(exec_.take().get()); } exec.shutdown(); return boAndLoList; } catch (Throwable e) { e.printStackTrace(); throw getLocalVciError("P0010QT-00009", e); } } public List executeSqlForBOAndLOOneLevel(List clauseList, String sql, String ltName, String direction, Map isLeafMap) throws VCIError { try { String[] btSysAttrs = OmdHelper.getBTSysANames(); String[] ltSysAttrs = OmdHelper.getLTSysAbItems(); //LinkType linkType = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName);// LinkTypeProvider.getInstance().getLinkTypeByName(ltName); LinkType linkType = OMCacheProvider.getLinkType(ltName); String[] ltUserAttrs = linkType.attributes; // +2 for :CONNECT_BY_ISLEAF , LEVEL int loAttrSize = ltSysAttrs.length + ltUserAttrs.length + 2; int btSysAttrSize = btSysAttrs.length; // 缓存业务类型对应的用户属性 Map btUserAttrMap = new HashMap(); List boAndLoList = new ArrayList(); Session session = HibernateSessionFactory.getSession(); ServerWithLog4j.logger.debug(sql); SQLQuery sqlQuery = session.createSQLQuery(sql); // 查询出的记录为Map的List集合 sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); List list = sqlQuery.list(); for (int i = 0; i < list.size(); i++) { Map map = (Map) list.get(i); BOAndLO boAndLo = getBOAndLOOneLevel(map, direction, ltUserAttrs, ltName, loAttrSize, btUserAttrMap, btSysAttrSize, isLeafMap); boAndLoList.add(boAndLo); } return boAndLoList; } catch (Throwable e) { e.printStackTrace(); throw getLocalVciError("P0010QT-00009", e); } } /** * 对查询结果进行过滤 * * @param los */ public List filterLos(List los) { List list = new ArrayList(); Map map = new HashMap(); for (LinkObject lo : los) { if (!map.containsKey(lo.oid)) { list.add(lo); map.put(lo.oid, lo.oid); } } return list; } /** * 对查询结果进行过滤 * * @param list * @return */ public List filterLoAndBOs(List loAndBos) { List list = new ArrayList(); Map map = new HashMap(); for (BOAndLO loAndBo : loAndBos) { if (!map.containsKey(loAndBo.lo.oid)) { list.add(loAndBo); map.put(loAndBo.lo.oid, loAndBo.lo.oid); } } return list; } /** * 将一条查询出的记录封装成LO * * @param map: 一条从linkTable查询出的记录 * @param ltUserAttrs: 链接类型的用户属性 * @param ltName: 链接类型 * @param loAttrSize: 链接类型的属性长度(系统属性+用户属性) * @return */ @SuppressWarnings("unused") private LinkObject getLO(Map map, String[] ltUserAttrs, String ltName, int loAttrSize) { // 设置lo LinkObject lo = new LinkObject(); AttributeValue[] loAttrArray = new AttributeValue[loAttrSize]; // 为link的系统属性赋值 int k = 0; String attrName = SystemAttribute.OID.text(); Object value = map.get(attrName); lo.oid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.oid); attrName = SystemAttribute.CREATOR.text(); value = map.get(attrName); lo.creator = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.creator); attrName = SystemAttribute.CREATETIME.text(); value = map.get(attrName); lo.createTime = (int)(value == null ? 0 : value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.createTime)); attrName = SystemAttribute.LASTMODIFIER.text(); value = map.get(attrName); lo.modifier = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.modifier); attrName = SystemAttribute.LASTMODIFYTIME.text(); value = map.get(attrName); lo.modifyTime = (int)(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.modifyTime)); attrName = SystemAttribute.F_OID.text(); value = map.get(attrName); lo.fromOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromOid); attrName = SystemAttribute.F_REVISIONOID.text(); value = map.get(attrName); lo.fromRevOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromRevOid); attrName = SystemAttribute.F_NAMEOID.text(); value = map.get(attrName); lo.fromNameOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromNameOid); attrName = SystemAttribute.F_BTWNAME.text(); value = map.get(attrName); lo.fromBTName = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromBTName); attrName = SystemAttribute.T_OID.text(); value = map.get(attrName); lo.toOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toOid); attrName = SystemAttribute.T_REVISIONOID.text(); value = map.get(attrName); lo.toRevOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toRevOid); attrName = SystemAttribute.T_NAMEOID.text(); value = map.get(attrName); lo.toNameOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toNameOid); attrName = SystemAttribute.T_BTWNAME.text(); value = map.get(attrName); lo.toBTName = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toBTName); attrName = SystemAttribute.TS.text(); value = map.get(attrName); lo.ts = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.ts)); // lo自定义属性赋值 for (String userAttr : ltUserAttrs) { attrName = userAttr.toUpperCase(); value = map.get(attrName); loAttrArray[k++] = new AttributeValue(userAttr, getDbRetrunVal(value)); } // 将CONNECT_BY_ISLEAF , LEVEL加入lo.hisAttrValList value = map.get("CONNECT_BY_ISLEAF"); loAttrArray[k++] = new AttributeValue("_ISLEAF", String.valueOf(value == null ? "" : value)); value = map.get("LEVEL"); loAttrArray[k++] = new AttributeValue("_LEVEL", String.valueOf(value == null ? "" : value)); lo.hisAttrValList = loAttrArray; lo.newAttrValList = new AttributeValue[0]; // 目前系统属性没有ltName, 传参赋值 lo.ltName = ltName; return lo; } /** * 将一条查询出的记录封装成LO * * @param map: 一条从linkTable查询出的记录 * @param ltUserAttrs: 链接类型的用户属性 * @param ltName: 链接类型 * @param loAttrSize: 链接类型的属性长度(系统属性+用户属性) * @param clauseList 返回列 * @return */ private LinkObject getLO(Map map, String[] ltUserAttrs, String ltName, int loAttrSize, List clauseList) { // 设置lo LinkObject lo = new LinkObject(); // 为link的系统属性赋值 List attrList = new ArrayList(); AttributeValue[] loAttrArrayNew = new AttributeValue[clauseList.size()]; for (int i = 0; i < clauseList.size(); i++) { String attrName = clauseList.get(i).toUpperCase(); if (attrName.indexOf(" AS ") > -1) { attrName = attrName.substring(attrName.lastIndexOf(" AS ") + 4); } Object attrVal = map.get(attrName); if (!attrName.equals(SystemAttribute.REVISIONOID + "2") && !attrName.equals(SystemAttribute.OID + "2")) { String attrValStr = String.valueOf(attrVal == null ? "" : attrVal); attrList.add(new AttributeValue(attrName, attrValStr)); } } String attrName = SystemAttribute.OID.text(); Object value = map.get(attrName); lo.oid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.CREATOR.text(); value = map.get(attrName); lo.creator = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.CREATETIME.text(); value = map.get(attrName); lo.createTime = ObjectUtility.getTimeMillis(value); attrName = SystemAttribute.LASTMODIFIER.text(); value = map.get(attrName); lo.modifier = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.LASTMODIFYTIME.text(); value = map.get(attrName); lo.modifyTime = ObjectUtility.getTimeMillis(value); attrName = SystemAttribute.F_OID.text(); value = map.get(attrName); lo.fromOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.F_REVISIONOID.text(); value = map.get(attrName); lo.fromRevOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.F_NAMEOID.text(); value = map.get(attrName); lo.fromNameOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.F_BTWNAME.text(); value = map.get(attrName); lo.fromBTName = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.T_OID.text(); value = map.get(attrName); lo.toOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.T_REVISIONOID.text(); value = map.get(attrName); lo.toRevOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.T_NAMEOID.text(); value = map.get(attrName); lo.toNameOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.T_BTWNAME.text(); value = map.get(attrName); lo.toBTName = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.TS.text(); value = map.get(attrName); lo.ts = ObjectUtility.getTimeMillis(value); // lo自定义属性赋值 // 将CONNECT_BY_ISLEAF , LEVEL加入lo.hisAttrValList value = map.get("CONNECT_BY_ISLEAF"); attrList.add(new AttributeValue("_ISLEAF", String.valueOf(value == null ? "" : value))); value = map.get("LEVEL"); attrList.add(new AttributeValue("_LEVEL", String.valueOf(value == null ? "" : value))); loAttrArrayNew = attrList.toArray(new AttributeValue[0]); lo.hisAttrValList = loAttrArrayNew; lo.newAttrValList = new AttributeValue[0]; // 目前系统属性没有ltName, 传参赋值 lo.ltName = ltName; return lo; } @SuppressWarnings("unused") private LinkObject getLOOneLevel(Map map, String[] ltUserAttrs, String ltName, int loAttrSize, Map isLeafMap) { // 设置lo LinkObject lo = new LinkObject(); AttributeValue[] loAttrArray = new AttributeValue[loAttrSize]; // 为link的系统属性赋值 int k = 0; String attrName = SystemAttribute.OID.text(); Object value = map.get(attrName); lo.oid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.oid); attrName = SystemAttribute.CREATOR.text(); value = map.get(attrName); lo.creator = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.creator); attrName = SystemAttribute.CREATETIME.text(); value = map.get(attrName); lo.createTime = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.createTime)); attrName = SystemAttribute.LASTMODIFIER.text(); value = map.get(attrName); lo.modifier = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.modifier); attrName = SystemAttribute.LASTMODIFYTIME.text(); value = map.get(attrName); lo.modifyTime = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.modifyTime)); attrName = SystemAttribute.F_OID.text(); value = map.get(attrName); lo.fromOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromOid); attrName = SystemAttribute.F_REVISIONOID.text(); value = map.get(attrName); lo.fromRevOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromRevOid); attrName = SystemAttribute.F_NAMEOID.text(); value = map.get(attrName); lo.fromNameOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromNameOid); attrName = SystemAttribute.F_BTWNAME.text(); value = map.get(attrName); lo.fromBTName = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromBTName); attrName = SystemAttribute.T_OID.text(); value = map.get(attrName); lo.toOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toOid); attrName = SystemAttribute.T_REVISIONOID.text(); value = map.get(attrName); lo.toRevOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toRevOid); attrName = SystemAttribute.T_NAMEOID.text(); value = map.get(attrName); lo.toNameOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toNameOid); attrName = SystemAttribute.T_BTWNAME.text(); value = map.get(attrName); lo.toBTName = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toBTName); attrName = SystemAttribute.TS.text(); value = map.get(attrName); lo.ts = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.ts)); // lo自定义属性赋值 for (String userAttr : ltUserAttrs) { attrName = userAttr.toUpperCase(); value = map.get(attrName); loAttrArray[k++] = new AttributeValue(userAttr, getDbRetrunVal(value)); } // 将CONNECT_BY_ISLEAF , LEVEL加入lo.hisAttrValList value = isLeafMap.get(lo.oid); loAttrArray[k++] = new AttributeValue("_ISLEAF", String.valueOf(value == null ? "" : value)); value = map.get("LEVEL"); loAttrArray[k++] = new AttributeValue("_LEVEL", String.valueOf(value == null ? "" : value)); lo.hisAttrValList = loAttrArray; lo.newAttrValList = new AttributeValue[0]; // 目前系统属性没有ltName, 传参赋值 lo.ltName = ltName; return lo; } private LinkObject getLOOneLevel(Map map, String[] ltUserAttrs, String ltName, int loAttrSize, Map isLeafMap, List clauseList) { // 设置lo LinkObject lo = new LinkObject(); // 为link的系统属性赋值 List attrList = new ArrayList(); AttributeValue[] loAttrArrayNew = new AttributeValue[clauseList.size()]; for (int i = 0; i < clauseList.size(); i++) { String attrName = clauseList.get(i).toUpperCase(); if (attrName.indexOf(" AS ") > -1) { attrName = attrName.substring(attrName.lastIndexOf(" AS ") + 4); } Object attrVal = map.get(attrName); if (!attrName.equals(SystemAttribute.REVISIONOID + "2") && !attrName.equals(SystemAttribute.OID + "2")) { String attrValStr = String.valueOf(attrVal == null ? "" : attrVal); attrList.add(new AttributeValue(attrName, attrValStr)); } } String attrName = SystemAttribute.OID.text(); Object value = map.get(attrName); lo.oid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.CREATOR.text(); value = map.get(attrName); lo.creator = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.CREATETIME.text(); value = map.get(attrName); lo.createTime = ObjectUtility.getTimeMillis(value); attrName = SystemAttribute.LASTMODIFIER.text(); value = map.get(attrName); lo.modifier = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.LASTMODIFYTIME.text(); value = map.get(attrName); lo.modifyTime = ObjectUtility.getTimeMillis(value); attrName = SystemAttribute.F_OID.text(); value = map.get(attrName); lo.fromOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.F_REVISIONOID.text(); value = map.get(attrName); lo.fromRevOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.F_NAMEOID.text(); value = map.get(attrName); lo.fromNameOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.F_BTWNAME.text(); value = map.get(attrName); lo.fromBTName = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.T_OID.text(); value = map.get(attrName); lo.toOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.T_REVISIONOID.text(); value = map.get(attrName); lo.toRevOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.T_NAMEOID.text(); value = map.get(attrName); lo.toNameOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.T_BTWNAME.text(); value = map.get(attrName); lo.toBTName = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.TS.text(); value = map.get(attrName); lo.ts = ObjectUtility.getTimeMillis(value); // 将CONNECT_BY_ISLEAF , LEVEL加入lo.hisAttrValList value = isLeafMap.get(lo.oid); attrList.add(new AttributeValue("_ISLEAF", String.valueOf(value == null ? "" : value))); value = map.get("LEVEL"); attrList.add(new AttributeValue("_LEVEL", String.valueOf(value == null ? "" : value))); loAttrArrayNew = attrList.toArray(new AttributeValue[0]); lo.hisAttrValList = loAttrArrayNew; lo.newAttrValList = new AttributeValue[0]; // 目前系统属性没有ltName, 传参赋值 lo.ltName = ltName; return lo; } /** * 将一条查询出的记录封装成LO, 用btmView.OID, btmView.REVISIONOID作t_oid, t_revisionOid * * @param map: 一条从linkTable和btmView.OID, btmView.REVISIONOID查询出的记录 * @param direction: 链接查询的方向 * @param ltUserAttrs: 链接类型的用户属性 * @param ltName: 链接类型 * @param loAttrSize: 链接类型的属性长度(系统属性+用户属性) * @return */ private LinkObject getLOWithVersion(Map map, String direction, String[] ltUserAttrs, String ltName, int loAttrSize) { // 设置lo LinkObject lo = new LinkObject(); AttributeValue[] loAttrArray = new AttributeValue[loAttrSize]; // 为link的系统属性赋值 int k = 0; String attrName = SystemAttribute.OID.text(); Object value = map.get(attrName); lo.oid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.oid); attrName = SystemAttribute.CREATOR.text(); value = map.get(attrName); lo.creator = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.creator); attrName = SystemAttribute.CREATETIME.text(); value = map.get(attrName); lo.createTime = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.createTime)); attrName = SystemAttribute.LASTMODIFIER.text(); value = map.get(attrName); lo.modifier = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.modifier); attrName = SystemAttribute.LASTMODIFYTIME.text(); value = map.get(attrName); lo.modifyTime = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.modifyTime)); attrName = SystemAttribute.F_OID.text(); if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.OID + "2"; } value = map.get(attrName); lo.fromOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.F_OID.text(), lo.fromOid); attrName = SystemAttribute.F_REVISIONOID.text(); if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.REVISIONOID + "2"; } value = map.get(attrName); lo.fromRevOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.F_REVISIONOID.text(), lo.fromRevOid); attrName = SystemAttribute.F_NAMEOID.text(); value = map.get(attrName); lo.fromNameOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromNameOid); attrName = SystemAttribute.F_BTWNAME.text(); value = map.get(attrName); lo.fromBTName = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromBTName); attrName = SystemAttribute.T_OID.text(); if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.OID + "2"; } value = map.get(attrName); lo.toOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.T_OID.text(), lo.toOid); attrName = SystemAttribute.T_REVISIONOID.text(); if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.REVISIONOID + "2"; } value = map.get(attrName); lo.toRevOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.T_REVISIONOID.text(), lo.toRevOid); attrName = SystemAttribute.T_NAMEOID.text(); value = map.get(attrName); lo.toNameOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toNameOid); attrName = SystemAttribute.T_BTWNAME.text(); value = map.get(attrName); lo.toBTName = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toBTName); attrName = SystemAttribute.TS.text(); value = map.get(attrName); lo.ts = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.ts)); // lo自定义属性赋值 for (String userAttr : ltUserAttrs) { attrName = userAttr.toUpperCase(); value = map.get(attrName); loAttrArray[k++] = new AttributeValue(userAttr, getDbRetrunVal(value)); } // 将CONNECT_BY_ISLEAF , LEVEL加入lo.hisAttrValList value = map.get("CONNECT_BY_ISLEAF"); loAttrArray[k++] = new AttributeValue("_ISLEAF", String.valueOf(value == null ? "" : value)); value = map.get("LEVEL"); loAttrArray[k++] = new AttributeValue("_LEVEL", String.valueOf(value == null ? "" : value)); lo.hisAttrValList = loAttrArray; lo.newAttrValList = new AttributeValue[0]; // 目前系统属性没有ltName, 传参赋值 lo.ltName = ltName; return lo; } /** * 将一条查询出的记录封装成LO, 用btmView.OID, btmView.REVISIONOID作t_oid, t_revisionOid * * @param map * @param direction * @param ltUserAttrs * @param ltName * @param loAttrSize * @param isLeafMap * @return */ @SuppressWarnings("unused") private LinkObject getLOWithVersionOneLevel(Map map, String direction, String[] ltUserAttrs, String ltName, int loAttrSize, Map isLeafMap) { // 设置lo LinkObject lo = new LinkObject(); AttributeValue[] loAttrArray = new AttributeValue[loAttrSize]; // 为link的系统属性赋值 int k = 0; String attrName = SystemAttribute.OID.text(); Object value = map.get(attrName); lo.oid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.oid); attrName = SystemAttribute.CREATOR.text(); value = map.get(attrName); lo.creator = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.creator); attrName = SystemAttribute.CREATETIME.text(); value = map.get(attrName); lo.createTime = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.createTime)); attrName = SystemAttribute.LASTMODIFIER.text(); value = map.get(attrName); lo.modifier = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.modifier); attrName = SystemAttribute.LASTMODIFYTIME.text(); value = map.get(attrName); lo.modifyTime = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.modifyTime)); attrName = SystemAttribute.F_OID.text(); if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.OID + "2"; } value = map.get(attrName); lo.fromOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.F_OID.text(), lo.fromOid); attrName = SystemAttribute.F_REVISIONOID.text(); if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.REVISIONOID + "2"; } value = map.get(attrName); lo.fromRevOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.F_REVISIONOID.text(), lo.fromRevOid); attrName = SystemAttribute.F_NAMEOID.text(); value = map.get(attrName); lo.fromNameOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromNameOid); attrName = SystemAttribute.F_BTWNAME.text(); value = map.get(attrName); lo.fromBTName = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromBTName); attrName = SystemAttribute.T_OID.text(); if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.OID + "2"; } value = map.get(attrName); lo.toOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.T_OID.text(), lo.toOid); attrName = SystemAttribute.T_REVISIONOID.text(); if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.REVISIONOID + "2"; } value = map.get(attrName); lo.toRevOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.T_REVISIONOID.text(), lo.toRevOid); attrName = SystemAttribute.T_NAMEOID.text(); value = map.get(attrName); lo.toNameOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toNameOid); attrName = SystemAttribute.T_BTWNAME.text(); value = map.get(attrName); lo.toBTName = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toBTName); attrName = SystemAttribute.TS.text(); value = map.get(attrName); lo.ts = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.ts)); // lo自定义属性赋值 for (String userAttr : ltUserAttrs) { attrName = userAttr.toUpperCase(); value = map.get(attrName); loAttrArray[k++] = new AttributeValue(userAttr, getDbRetrunVal(value)); } // 将CONNECT_BY_ISLEAF , LEVEL加入lo.hisAttrValList value = isLeafMap.get(lo.oid); loAttrArray[k++] = new AttributeValue("_ISLEAF", String.valueOf(value == null ? "" : value)); value = map.get("LEVEL"); loAttrArray[k++] = new AttributeValue("_LEVEL", String.valueOf(value == null ? "" : value)); lo.hisAttrValList = loAttrArray; lo.newAttrValList = new AttributeValue[0]; // 目前系统属性没有ltName, 传参赋值 lo.ltName = ltName; return lo; } /** * add by liumh150909,更改为按列返回值 将一条查询出的记录封装成LO, 用btmView.OID, * btmView.REVISIONOID作t_oid, t_revisionOid * * @param map * @param direction * @param ltUserAttrs * @param ltName * @param loAttrSize * @param isLeafMap * @param clauseList * @return */ private LinkObject getLOWithVersionOneLevel(Map map, String direction, String[] ltUserAttrs, String ltName, int loAttrSize, Map isLeafMap, List clauseList) { return this.getLOWithVersionOneLevelV2(map, direction, ltUserAttrs, ltName, loAttrSize, isLeafMap, clauseList, new IntHolder(0)); } /** * add by liumh150909,更改为按列返回值 将一条查询出的记录封装成LO, 用btmView.OID, * btmView.REVISIONOID作t_oid, t_revisionOid * * @param map * @param direction * @param ltUserAttrs * @param ltName * @param loAttrSize * @param isLeafMap * @param clauseList * @return */ private LinkObject getLOWithVersionOneLevelV2(Map map, String direction, String[] ltUserAttrs, String ltName, int loAttrSize, Map isLeafMap, List clauseList, IntHolder count) { // 设置lo LinkObject lo = new LinkObject(); // 为link的系统属性赋值 List attrList = new ArrayList(); AttributeValue[] loAttrArrayNew = new AttributeValue[clauseList.size()]; for (int i = 0; i < clauseList.size(); i++) { String attrName = clauseList.get(i).toUpperCase(); if (attrName.indexOf(" AS ") > -1) { attrName = attrName.substring(attrName.lastIndexOf(" AS ") + 4); } Object attrVal = map.get(attrName); if (attrName.equalsIgnoreCase(QTConstants.COUNT_OVER_ALIAS)) { int countValue = Integer.valueOf(attrVal.toString()); if (count == null) { count = new IntHolder(0); } count.value = countValue; continue; } if (attrName.equalsIgnoreCase(SystemAttribute.F_OID.text())) { if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.OID + "2"; } attrVal = map.get(attrName); attrName = SystemAttribute.F_OID.text(); } else if (attrName.equalsIgnoreCase(SystemAttribute.F_REVISIONOID.text())) { if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.REVISIONOID + "2"; } attrVal = map.get(attrName); attrName = SystemAttribute.F_REVISIONOID.text(); } else if (attrName.equalsIgnoreCase(SystemAttribute.T_OID.text())) { if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.OID + "2"; } attrVal = map.get(attrName); attrName = SystemAttribute.T_OID.text(); } else if (attrName.equalsIgnoreCase(SystemAttribute.T_REVISIONOID.text())) { if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.REVISIONOID + "2"; } attrVal = map.get(attrName); attrName = SystemAttribute.T_REVISIONOID.text(); } if (!attrName.equals(SystemAttribute.REVISIONOID + "2") && !attrName.equals(SystemAttribute.OID + "2")) { String attrValStr = String.valueOf(attrVal == null ? "" : attrVal); attrList.add(new AttributeValue(attrName, attrValStr)); } } String attrName = SystemAttribute.OID.text(); Object value = map.get(attrName); lo.oid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.CREATOR.text(); value = map.get(attrName); lo.creator = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.CREATETIME.text(); value = map.get(attrName); lo.createTime = ObjectUtility.getTimeMillis(value); attrName = SystemAttribute.LASTMODIFIER.text(); value = map.get(attrName); lo.modifier = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.LASTMODIFYTIME.text(); value = map.get(attrName); lo.modifyTime = ObjectUtility.getTimeMillis(value); attrName = SystemAttribute.F_OID.text(); if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.OID + "2"; } value = map.get(attrName); lo.fromOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.F_REVISIONOID.text(); if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.REVISIONOID + "2"; } value = map.get(attrName); lo.fromRevOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.F_NAMEOID.text(); value = map.get(attrName); lo.fromNameOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.F_BTWNAME.text(); value = map.get(attrName); lo.fromBTName = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.T_OID.text(); if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.OID + "2"; } value = map.get(attrName); lo.toOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.T_REVISIONOID.text(); if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.REVISIONOID + "2"; } value = map.get(attrName); lo.toRevOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.T_NAMEOID.text(); value = map.get(attrName); lo.toNameOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.T_BTWNAME.text(); value = map.get(attrName); lo.toBTName = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.TS.text(); value = map.get(attrName); lo.ts = ObjectUtility.getTimeMillis(value); // 将CONNECT_BY_ISLEAF , LEVEL加入lo.hisAttrValList value = isLeafMap.get(lo.oid); attrList.add(new AttributeValue("_ISLEAF", String.valueOf(value == null ? "" : value))); value = map.get("LEVEL"); attrList.add(new AttributeValue("_LEVEL", String.valueOf(value == null ? "" : value))); loAttrArrayNew = attrList.toArray(new AttributeValue[0]); lo.hisAttrValList = loAttrArrayNew; lo.newAttrValList = new AttributeValue[0]; // 目前系统属性没有ltName, 传参赋值 lo.ltName = ltName; return lo; } /** * 将一条查询出的记录封装成BOAndLO * * @param map: 一条从linkTable和btmView查询出的记录 * @param direction: 链接查询的方向 * @param ltUserAttrs: 链接类型的用户属性 * @param ltName: 链接类型 * @param loAttrSize: 链接类型的属性长度(系统属性+用户属性) * @param btUserAttrMap: 业务类型及其对应的用户属性Map * @param btSysAttrSize: 业务类型的系统属性长度 * @return */ private BOAndLO getBOAndLO(Map map, String direction, String[] ltUserAttrs, String ltName, int loAttrSize, Map btUserAttrMap, int btSysAttrSize) throws VCIError { // 设置lo LinkObject lo = new LinkObject(); AttributeValue[] loAttrArray = new AttributeValue[loAttrSize]; // 为link的系统属性赋值 int k = 0; String attrName = SystemAttribute.OID.text(); Object value = map.get(attrName); lo.oid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.oid); attrName = SystemAttribute.CREATOR.text(); value = map.get(attrName); lo.creator = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.creator); attrName = SystemAttribute.CREATETIME.text(); value = map.get(attrName); lo.createTime = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.createTime)); attrName = SystemAttribute.LASTMODIFIER.text(); value = map.get(attrName); lo.modifier = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.modifier); attrName = SystemAttribute.LASTMODIFYTIME.text(); value = map.get(attrName); lo.modifyTime = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.modifyTime)); attrName = SystemAttribute.F_OID.text(); if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.OID + "2"; } value = map.get(attrName); lo.fromOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.F_OID.text(), lo.fromOid); attrName = SystemAttribute.F_REVISIONOID.text(); if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.REVISIONOID + "2"; } value = map.get(attrName); lo.fromRevOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.F_REVISIONOID.text(), lo.fromRevOid); attrName = SystemAttribute.F_NAMEOID.text(); value = map.get(attrName); lo.fromNameOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromNameOid); attrName = SystemAttribute.F_BTWNAME.text(); value = map.get(attrName); lo.fromBTName = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromBTName); attrName = SystemAttribute.T_OID.text(); if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.OID + "2"; } value = map.get(attrName); lo.toOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.T_OID.text(), lo.toOid); attrName = SystemAttribute.T_REVISIONOID.text(); if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.REVISIONOID + "2"; } value = map.get(attrName); lo.toRevOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.T_REVISIONOID.text(), lo.toRevOid); attrName = SystemAttribute.T_NAMEOID.text(); value = map.get(attrName); lo.toNameOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toNameOid); attrName = SystemAttribute.T_BTWNAME.text(); value = map.get(attrName); lo.toBTName = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toBTName); attrName = SystemAttribute.TS.text(); value = map.get(attrName); lo.ts = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.ts)); // lo自定义属性赋值 for (String userAttr : ltUserAttrs) { attrName = userAttr.toUpperCase(); value = map.get(attrName); loAttrArray[k++] = new AttributeValue(userAttr, getDbRetrunVal(value)); } // 将CONNECT_BY_ISLEAF , LEVEL加入lo.hisAttrValList value = map.get("CONNECT_BY_ISLEAF"); loAttrArray[k++] = new AttributeValue("_ISLEAF", String.valueOf(value == null ? "" : value)); value = map.get("LEVEL"); loAttrArray[k++] = new AttributeValue("_LEVEL", String.valueOf(value == null ? "" : value)); lo.hisAttrValList = loAttrArray; lo.newAttrValList = new AttributeValue[0]; // 目前系统属性没有ltName, 传参赋值 lo.ltName = ltName; // 设置bo String btName = null; if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { btName = lo.toBTName; } else { btName = lo.fromBTName; } String[] btUserAttrs = null; // 优先从缓存中取用户属性 if (btUserAttrMap.containsKey(btName)) { btUserAttrs = btUserAttrMap.get(btName); } else { //btUserAttrs = ServerServiceProvider.getOMDService().getBTMService().getBtmApNameArray(btName); btUserAttrs = OMCacheProvider.getBTAttributes(btName); btUserAttrMap.put(btName, btUserAttrs); } int boAttrSize = btSysAttrSize + btUserAttrs.length; AttributeValue[] boAttrArray = new AttributeValue[boAttrSize]; BusinessObject bo = new BusinessObject(); // bo系统属性赋值 k = 0; attrName = SystemAttribute.OID.text(); value = map.get(attrName + "2"); bo.oid = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.oid); attrName = SystemAttribute.REVISIONOID.text(); value = map.get(attrName + "2"); bo.revisionid = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.revisionid); attrName = SystemAttribute.NAMEOID.text(); value = map.get(attrName + "2"); bo.nameoid = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.nameoid); attrName = SystemAttribute.BTMNAME.text(); value = map.get(attrName + "2"); bo.btName = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.btName); attrName = SystemAttribute.ISLASTR.text(); value = map.get(attrName + "2"); bo.isLastR = Short.valueOf(String.valueOf(value == null ? "0" : value)) != 0; boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.isLastR)); attrName = SystemAttribute.ISFIRSTR.text(); value = map.get(attrName + "2"); bo.isFirstR = Short.valueOf(String.valueOf(value == null ? "0" : value)) != 0; boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.isFirstR)); attrName = SystemAttribute.ISLASTV.text(); value = map.get(attrName + "2"); bo.isLastV = Short.valueOf(String.valueOf(value == null ? "0" : value)) != 0; boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.isLastV)); attrName = SystemAttribute.ISFIRSTV.text(); value = map.get(attrName + "2"); bo.isFirstV = Short.valueOf(String.valueOf(value == null ? "0" : value)) != 0; boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.isFirstV)); attrName = SystemAttribute.CREATOR.text(); value = map.get(attrName + "2"); bo.creator = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.creator); attrName = SystemAttribute.CREATETIME.text(); value = map.get(attrName + "2"); bo.createTime = ObjectUtility.getTimeMillis(value); boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.createTime)); attrName = SystemAttribute.LASTMODIFIER.text(); value = map.get(attrName + "2"); bo.modifier = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.modifier); attrName = SystemAttribute.LASTMODIFYTIME.text(); value = map.get(attrName + "2"); bo.modifyTime = ObjectUtility.getTimeMillis(value); boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.modifyTime)); attrName = SystemAttribute.REVISIONRULE.text(); value = map.get(attrName + "2"); bo.revisionRule = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.revisionRule); attrName = SystemAttribute.VERSIONRULE.text(); value = map.get(attrName + "2"); bo.versionRule = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.versionRule); attrName = SystemAttribute.REVISIONSEQ.text(); value = map.get(attrName + "2"); bo.revisionSeq = Short.valueOf(String.valueOf(value == null ? "0" : value)); boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.revisionSeq)); attrName = SystemAttribute.REVISIONVALUE.text(); value = map.get(attrName + "2"); bo.revisionValue = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.revisionValue); attrName = SystemAttribute.VERSIONSEQ.text(); value = map.get(attrName + "2"); bo.versionSeq = Short.valueOf(String.valueOf(value == null ? "0" : value)); boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.versionSeq)); attrName = SystemAttribute.VERSIONVALUE.text(); value = map.get(attrName + "2"); bo.versionValue = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.versionValue); attrName = SystemAttribute.LCTID.text(); value = map.get(attrName + "2"); bo.lctId = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.lctId); attrName = SystemAttribute.LCSTATUS.text(); value = map.get(attrName + "2"); bo.lcStatus = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.lcStatus); attrName = SystemAttribute.TS.text(); value = map.get(attrName + "2"); bo.ts = ObjectUtility.getTimeMillis(value); boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.ts)); attrName = SystemAttribute.ID.text(); value = map.get(attrName + "2"); bo.id = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.id); attrName = SystemAttribute.NAME.text(); value = map.get(attrName + "2"); bo.name = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.name); attrName = SystemAttribute.DESCRIPTION.text(); value = map.get(attrName + "2"); bo.description = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.description); attrName = SystemAttribute.OWNER.text(); value = map.get(attrName + "2"); bo.owner = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.owner); // attrName = SystemAttribute.CHECKINBY.text(); // value = map.get(attrName + "2"); // bo.checkinBy = String.valueOf(value == null ? "" : value); // boAttrArray[k++] = new AttributeValue(attrName, bo.checkinBy); // // attrName = SystemAttribute.CHECKINTIME.text(); // value = map.get(attrName + "2"); // bo.checkinTime = String.valueOf(value == null ? "" : value); // boAttrArray[k++] = new AttributeValue(attrName, bo.checkinTime); // // attrName = SystemAttribute.CHECKOUTBY.text(); // value = map.get(attrName + "2"); // bo.checkoutBy = String.valueOf(value == null ? "" : value); // boAttrArray[k++] = new AttributeValue(attrName, bo.checkoutBy); // // attrName = SystemAttribute.CHECKOUTTIME.text(); // value = map.get(attrName + "2"); // bo.checkoutTime = String.valueOf(value == null ? "" : value); // boAttrArray[k++] = new AttributeValue(attrName, bo.checkoutTime); attrName = SystemAttribute.COPYFROMVERSION.text(); value = map.get(attrName + "2"); bo.fromVersion = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.fromVersion); // bo用户属性赋值 for (String userAttr : btUserAttrs) { attrName = userAttr.toUpperCase() + "2"; value = map.get(attrName); boAttrArray[k++] = new AttributeValue(userAttr, getDbRetrunVal(value)); } bo.hisAttrValList = boAttrArray; bo.newAttrValList = new AttributeValue[0]; // 设置boAndLo BOAndLO boAndLo = new BOAndLO(); boAndLo.bo = bo; boAndLo.btmName = bo.btName; boAndLo.lo = lo; boAndLo.ltName = ltName; return boAndLo; } private BOAndLO getBOAndLOOneLevel(Map map, String direction, String[] ltUserAttrs, String ltName, int loAttrSize, Map btUserAttrMap, int btSysAttrSize, Map isLeafMap) { // 设置lo LinkObject lo = new LinkObject(); AttributeValue[] loAttrArray = new AttributeValue[loAttrSize]; // 为link的系统属性赋值 int k = 0; String attrName = SystemAttribute.OID.text(); Object value = map.get(attrName); lo.oid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.oid); attrName = SystemAttribute.CREATOR.text(); value = map.get(attrName); lo.creator = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.creator); attrName = SystemAttribute.CREATETIME.text(); value = map.get(attrName); lo.createTime = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.createTime)); attrName = SystemAttribute.LASTMODIFIER.text(); value = map.get(attrName); lo.modifier = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.modifier); attrName = SystemAttribute.LASTMODIFYTIME.text(); value = map.get(attrName); lo.modifyTime = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.modifyTime)); attrName = SystemAttribute.F_OID.text(); if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.OID + "2"; } value = map.get(attrName); lo.fromOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.F_OID.text(), lo.fromOid); attrName = SystemAttribute.F_REVISIONOID.text(); if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.REVISIONOID + "2"; } value = map.get(attrName); lo.fromRevOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.F_REVISIONOID.text(), lo.fromRevOid); attrName = SystemAttribute.F_NAMEOID.text(); value = map.get(attrName); lo.fromNameOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromNameOid); attrName = SystemAttribute.F_BTWNAME.text(); value = map.get(attrName); lo.fromBTName = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromBTName); attrName = SystemAttribute.T_OID.text(); if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.OID + "2"; } value = map.get(attrName); lo.toOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.T_OID.text(), lo.toOid); attrName = SystemAttribute.T_REVISIONOID.text(); if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.REVISIONOID + "2"; } value = map.get(attrName); lo.toRevOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.T_REVISIONOID.text(), lo.toRevOid); attrName = SystemAttribute.T_NAMEOID.text(); value = map.get(attrName); lo.toNameOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toNameOid); attrName = SystemAttribute.T_BTWNAME.text(); value = map.get(attrName); lo.toBTName = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toBTName); attrName = SystemAttribute.TS.text(); value = map.get(attrName); lo.ts = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.ts)); // lo自定义属性赋值 for (String userAttr : ltUserAttrs) { attrName = userAttr.toUpperCase(); value = map.get(attrName); loAttrArray[k++] = new AttributeValue(userAttr, getDbRetrunVal(value)); } // 将CONNECT_BY_ISLEAF , LEVEL加入lo.hisAttrValList value = isLeafMap.get(lo.oid); loAttrArray[k++] = new AttributeValue("_ISLEAF", String.valueOf(value == null ? "" : value)); value = map.get("LEVEL"); loAttrArray[k++] = new AttributeValue("_LEVEL", String.valueOf(value == null ? "" : value)); lo.hisAttrValList = loAttrArray; lo.newAttrValList = new AttributeValue[0]; // 目前系统属性没有ltName, 传参赋值 lo.ltName = ltName; // 设置bo String btName = null; if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { btName = lo.toBTName; } else { btName = lo.fromBTName; } String[] btUserAttrs = null; // 优先从缓存中取用户属性 if (btUserAttrMap.containsKey(btName)) { btUserAttrs = btUserAttrMap.get(btName); } else { //btUserAttrs = ServerServiceProvider.getOMDService().getBTMService().getBtmApNameArray(btName); btUserAttrs = OMCacheProvider.getBTAttributes(btName); btUserAttrMap.put(btName, btUserAttrs); } int boAttrSize = btSysAttrSize + btUserAttrs.length; AttributeValue[] boAttrArray = new AttributeValue[boAttrSize]; BusinessObject bo = new BusinessObject(); // bo系统属性赋值 k = 0; attrName = SystemAttribute.OID.text(); value = map.get(attrName + "2"); bo.oid = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.oid); attrName = SystemAttribute.REVISIONOID.text(); value = map.get(attrName + "2"); bo.revisionid = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.revisionid); attrName = SystemAttribute.NAMEOID.text(); value = map.get(attrName + "2"); bo.nameoid = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.nameoid); attrName = SystemAttribute.BTMNAME.text(); value = map.get(attrName + "2"); bo.btName = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.btName); attrName = SystemAttribute.ISLASTR.text(); value = map.get(attrName + "2"); bo.isLastR = Short.valueOf(String.valueOf(value == null ? "0" : value)) != 0; boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.isLastR)); attrName = SystemAttribute.ISFIRSTR.text(); value = map.get(attrName + "2"); bo.isFirstR = Short.valueOf(String.valueOf(value == null ? "0" : value)) != 0; boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.isFirstR)); attrName = SystemAttribute.ISLASTV.text(); value = map.get(attrName + "2"); bo.isLastV = Short.valueOf(String.valueOf(value == null ? "0" : value)) != 0; boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.isLastV)); attrName = SystemAttribute.ISFIRSTV.text(); value = map.get(attrName + "2"); bo.isFirstV = Short.valueOf(String.valueOf(value == null ? "0" : value)) != 0; boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.isFirstV)); attrName = SystemAttribute.CREATOR.text(); value = map.get(attrName + "2"); bo.creator = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.creator); attrName = SystemAttribute.CREATETIME.text(); value = map.get(attrName + "2"); bo.createTime = ObjectUtility.getTimeMillis(value); boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.createTime)); attrName = SystemAttribute.LASTMODIFIER.text(); value = map.get(attrName + "2"); bo.modifier = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.modifier); attrName = SystemAttribute.LASTMODIFYTIME.text(); value = map.get(attrName + "2"); bo.modifyTime = ObjectUtility.getTimeMillis(value); boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.modifyTime)); attrName = SystemAttribute.REVISIONRULE.text(); value = map.get(attrName + "2"); bo.revisionRule = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.revisionRule); attrName = SystemAttribute.VERSIONRULE.text(); value = map.get(attrName + "2"); bo.versionRule = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.versionRule); attrName = SystemAttribute.REVISIONSEQ.text(); value = map.get(attrName + "2"); bo.revisionSeq = Short.valueOf(String.valueOf(value == null ? "0" : value)); boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.revisionSeq)); attrName = SystemAttribute.REVISIONVALUE.text(); value = map.get(attrName + "2"); bo.revisionValue = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.revisionValue); attrName = SystemAttribute.VERSIONSEQ.text(); value = map.get(attrName + "2"); bo.versionSeq = Short.valueOf(String.valueOf(value == null ? "0" : value)); boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.versionSeq)); attrName = SystemAttribute.VERSIONVALUE.text(); value = map.get(attrName + "2"); bo.versionValue = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.versionValue); attrName = SystemAttribute.LCTID.text(); value = map.get(attrName + "2"); bo.lctId = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.lctId); attrName = SystemAttribute.LCSTATUS.text(); value = map.get(attrName + "2"); bo.lcStatus = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.lcStatus); attrName = SystemAttribute.TS.text(); value = map.get(attrName + "2"); bo.ts = ObjectUtility.getTimeMillis(value); boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.ts)); attrName = SystemAttribute.ID.text(); value = map.get(attrName + "2"); bo.id = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.id); attrName = SystemAttribute.NAME.text(); value = map.get(attrName + "2"); bo.name = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.name); attrName = SystemAttribute.DESCRIPTION.text(); value = map.get(attrName + "2"); bo.description = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.description); attrName = SystemAttribute.OWNER.text(); value = map.get(attrName + "2"); bo.owner = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.owner); // attrName = SystemAttribute.CHECKINBY.text(); // value = map.get(attrName + "2"); // bo.checkinBy = String.valueOf(value == null ? "" : value); // boAttrArray[k++] = new AttributeValue(attrName, bo.checkinBy); // // attrName = SystemAttribute.CHECKINTIME.text(); // value = map.get(attrName + "2"); // bo.checkinTime = String.valueOf(value == null ? "" : value); // boAttrArray[k++] = new AttributeValue(attrName, bo.checkinTime); // // attrName = SystemAttribute.CHECKOUTBY.text(); // value = map.get(attrName + "2"); // bo.checkoutBy = String.valueOf(value == null ? "" : value); // boAttrArray[k++] = new AttributeValue(attrName, bo.checkoutBy); // // attrName = SystemAttribute.CHECKOUTTIME.text(); // value = map.get(attrName + "2"); // bo.checkoutTime = String.valueOf(value == null ? "" : value); // boAttrArray[k++] = new AttributeValue(attrName, bo.checkoutTime); attrName = SystemAttribute.COPYFROMVERSION.text(); value = map.get(attrName + "2"); bo.fromVersion = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.fromVersion); // bo用户属性赋值 for (String userAttr : btUserAttrs) { attrName = userAttr.toUpperCase() + "2"; value = map.get(attrName); boAttrArray[k++] = new AttributeValue(userAttr, getDbRetrunVal(value)); } bo.hisAttrValList = boAttrArray; bo.newAttrValList = new AttributeValue[0]; // 设置boAndLo BOAndLO boAndLo = new BOAndLO(); boAndLo.bo = bo; boAndLo.btmName = bo.btName; boAndLo.lo = lo; boAndLo.ltName = ltName; return boAndLo; } /** * 将数据库返回值转换为字符串,主要处理clob类型字段 * * @param value * @return */ public String getDbRetrunVal(Object value) { String attrVal = ""; if (value instanceof Clob) { attrVal = String.valueOf(value == null ? "" : clobToString((Clob) value)); } else { attrVal = String.valueOf(value == null ? "" : value); } return attrVal; } } /** * GetBOAndLO Callable * * @author zhouhui * */ class QueryBOAndLO implements Callable { private Map map; private String direction; private String[] ltUserAttrs; private String ltName; private int loAttrSize; private Map btUserAttrMap; private int btSysAttrSize; /** * 将一条查询出的记录封装成BOAndLO * * @param map: 一条从linkTable和btmView查询出的记录 * @param direction: 链接查询的方向 * @param ltUserAttrs: 链接类型的用户属性 * @param ltName: 链接类型 * @param loAttrSize: 链接类型的属性长度(系统属性+用户属性) * @param btUserAttrMap: 业务类型及其对应的用户属性Map * @param btSysAttrSize: 业务类型的系统属性长度 * @param map * @param direction * @param ltUserAttrs * @param ltName * @param loAttrSize * @param btUserAttrMap * @param btSysAttrSize */ public QueryBOAndLO(Map map, String direction, String[] ltUserAttrs, String ltName, int loAttrSize, Map btUserAttrMap, int btSysAttrSize) { this.map = map; this.direction = direction; this.ltUserAttrs = ltUserAttrs; this.ltName = ltName; this.loAttrSize = loAttrSize; this.btUserAttrMap = btUserAttrMap; this.btSysAttrSize = btSysAttrSize; } @Override public BOAndLO call() throws Exception { Thread.currentThread().setName("bolocall"); // 设置lo LinkObject lo = new LinkObject(); AttributeValue[] loAttrArray = new AttributeValue[loAttrSize]; // 为link的系统属性赋值 int k = 0; String attrName = SystemAttribute.OID.text(); Object value = map.get(attrName); lo.oid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.oid); attrName = SystemAttribute.CREATOR.text(); value = map.get(attrName); lo.creator = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.creator); attrName = SystemAttribute.CREATETIME.text(); value = map.get(attrName); lo.createTime = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.createTime)); attrName = SystemAttribute.LASTMODIFIER.text(); value = map.get(attrName); lo.modifier = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.modifier); attrName = SystemAttribute.LASTMODIFYTIME.text(); value = map.get(attrName); lo.modifyTime = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.modifyTime)); attrName = SystemAttribute.F_OID.text(); if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.OID + "2"; } value = map.get(attrName); lo.fromOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.F_OID.text(), lo.fromOid); attrName = SystemAttribute.F_REVISIONOID.text(); if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.REVISIONOID + "2"; } value = map.get(attrName); lo.fromRevOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.F_REVISIONOID.text(), lo.fromRevOid); attrName = SystemAttribute.F_NAMEOID.text(); value = map.get(attrName); lo.fromNameOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromNameOid); attrName = SystemAttribute.F_BTWNAME.text(); value = map.get(attrName); lo.fromBTName = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.fromBTName); attrName = SystemAttribute.T_OID.text(); if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.OID + "2"; } value = map.get(attrName); lo.toOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.T_OID.text(), lo.toOid); attrName = SystemAttribute.T_REVISIONOID.text(); if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.REVISIONOID + "2"; } value = map.get(attrName); lo.toRevOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(SystemAttribute.T_REVISIONOID.text(), lo.toRevOid); attrName = SystemAttribute.T_NAMEOID.text(); value = map.get(attrName); lo.toNameOid = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toNameOid); attrName = SystemAttribute.T_BTWNAME.text(); value = map.get(attrName); lo.toBTName = String.valueOf(value == null ? "" : value); loAttrArray[k++] = new AttributeValue(attrName, lo.toBTName); attrName = SystemAttribute.TS.text(); value = map.get(attrName); lo.ts = ObjectUtility.getTimeMillis(value); loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.ts)); // lo自定义属性赋值 for (String userAttr : ltUserAttrs) { attrName = userAttr.toUpperCase(); value = map.get(attrName); loAttrArray[k++] = new AttributeValue(userAttr, QueryObjectService.getInstance().getDbRetrunVal(value)); } // 将CONNECT_BY_ISLEAF , LEVEL加入lo.hisAttrValList value = map.get("CONNECT_BY_ISLEAF"); loAttrArray[k++] = new AttributeValue("_ISLEAF", String.valueOf(value == null ? "" : value)); value = map.get("LEVEL"); loAttrArray[k++] = new AttributeValue("_LEVEL", String.valueOf(value == null ? "" : value)); lo.hisAttrValList = loAttrArray; lo.newAttrValList = new AttributeValue[0]; // 目前系统属性没有ltName, 传参赋值 lo.ltName = ltName; // 设置bo String btName = null; if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { btName = lo.toBTName; } else { btName = lo.fromBTName; } String[] btUserAttrs = null; // 优先从缓存中取用户属性 if (btUserAttrMap.containsKey(btName)) { btUserAttrs = btUserAttrMap.get(btName); } else { btUserAttrs = OMCacheProvider.getBTAttributes(btName);// BtmProvider.getInstance().getAbNames(btName); btUserAttrMap.put(btName, btUserAttrs); } int boAttrSize = btSysAttrSize + btUserAttrs.length; AttributeValue[] boAttrArray = new AttributeValue[boAttrSize]; BusinessObject bo = new BusinessObject(); // bo系统属性赋值 k = 0; attrName = SystemAttribute.OID.text(); value = map.get(attrName + "2"); bo.oid = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.oid); attrName = SystemAttribute.REVISIONOID.text(); value = map.get(attrName + "2"); bo.revisionid = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.revisionid); attrName = SystemAttribute.NAMEOID.text(); value = map.get(attrName + "2"); bo.nameoid = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.nameoid); attrName = SystemAttribute.BTMNAME.text(); value = map.get(attrName + "2"); bo.btName = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.btName); attrName = SystemAttribute.ISLASTR.text(); value = map.get(attrName + "2"); bo.isLastR = Short.valueOf(String.valueOf(value == null ? "0" : value)) != 0; boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.isLastR)); attrName = SystemAttribute.ISFIRSTR.text(); value = map.get(attrName + "2"); bo.isFirstR = Short.valueOf(String.valueOf(value == null ? "0" : value)) != 0; boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.isFirstR)); attrName = SystemAttribute.ISLASTV.text(); value = map.get(attrName + "2"); bo.isLastV = Short.valueOf(String.valueOf(value == null ? "0" : value)) != 0; boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.isLastV)); attrName = SystemAttribute.ISFIRSTV.text(); value = map.get(attrName + "2"); bo.isFirstV = Short.valueOf(String.valueOf(value == null ? "0" : value)) != 0; boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.isFirstV)); attrName = SystemAttribute.CREATOR.text(); value = map.get(attrName + "2"); bo.creator = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.creator); attrName = SystemAttribute.CREATETIME.text(); value = map.get(attrName + "2"); bo.createTime = ObjectUtility.getTimeMillis(value); boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.createTime)); attrName = SystemAttribute.LASTMODIFIER.text(); value = map.get(attrName + "2"); bo.modifier = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.modifier); attrName = SystemAttribute.LASTMODIFYTIME.text(); value = map.get(attrName + "2"); bo.modifyTime = ObjectUtility.getTimeMillis(value); boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.modifyTime)); attrName = SystemAttribute.REVISIONRULE.text(); value = map.get(attrName + "2"); bo.revisionRule = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.revisionRule); attrName = SystemAttribute.VERSIONRULE.text(); value = map.get(attrName + "2"); bo.versionRule = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.versionRule); attrName = SystemAttribute.REVISIONSEQ.text(); value = map.get(attrName + "2"); bo.revisionSeq = Short.valueOf(String.valueOf(value == null ? "0" : value)); boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.revisionSeq)); attrName = SystemAttribute.REVISIONVALUE.text(); value = map.get(attrName + "2"); bo.revisionValue = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.revisionValue); attrName = SystemAttribute.VERSIONSEQ.text(); value = map.get(attrName + "2"); bo.versionSeq = Short.valueOf(String.valueOf(value == null ? "0" : value)); boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.versionSeq)); attrName = SystemAttribute.VERSIONVALUE.text(); value = map.get(attrName + "2"); bo.versionValue = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.versionValue); attrName = SystemAttribute.LCTID.text(); value = map.get(attrName + "2"); bo.lctId = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.lctId); attrName = SystemAttribute.LCSTATUS.text(); value = map.get(attrName + "2"); bo.lcStatus = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.lcStatus); attrName = SystemAttribute.TS.text(); value = map.get(attrName + "2"); bo.ts = ObjectUtility.getTimeMillis(value); boAttrArray[k++] = new AttributeValue(attrName, String.valueOf(bo.ts)); attrName = SystemAttribute.ID.text(); value = map.get(attrName + "2"); bo.id = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.id); attrName = SystemAttribute.NAME.text(); value = map.get(attrName + "2"); bo.name = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.name); attrName = SystemAttribute.DESCRIPTION.text(); value = map.get(attrName + "2"); bo.description = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.description); attrName = SystemAttribute.OWNER.text(); value = map.get(attrName + "2"); bo.owner = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.owner); // attrName = SystemAttribute.CHECKINBY.text(); // value = map.get(attrName + "2"); // bo.checkinBy = String.valueOf(value == null ? "" : value); // boAttrArray[k++] = new AttributeValue(attrName, bo.checkinBy); // // attrName = SystemAttribute.CHECKINTIME.text(); // value = map.get(attrName + "2"); // bo.checkinTime = String.valueOf(value == null ? "" : value); // boAttrArray[k++] = new AttributeValue(attrName, bo.checkinTime); // // attrName = SystemAttribute.CHECKOUTBY.text(); // value = map.get(attrName + "2"); // bo.checkoutBy = String.valueOf(value == null ? "" : value); // boAttrArray[k++] = new AttributeValue(attrName, bo.checkoutBy); // // attrName = SystemAttribute.CHECKOUTTIME.text(); // value = map.get(attrName + "2"); // bo.checkoutTime = String.valueOf(value == null ? "" : value); // boAttrArray[k++] = new AttributeValue(attrName, bo.checkoutTime); attrName = SystemAttribute.COPYFROMVERSION.text(); value = map.get(attrName + "2"); bo.fromVersion = String.valueOf(value == null ? "" : value); boAttrArray[k++] = new AttributeValue(attrName, bo.fromVersion); // bo用户属性赋值 for (String userAttr : btUserAttrs) { attrName = userAttr.toUpperCase() + "2"; value = map.get(attrName); boAttrArray[k++] = new AttributeValue(userAttr, QueryObjectService.getInstance().getDbRetrunVal(value)); } bo.hisAttrValList = boAttrArray; bo.newAttrValList = new AttributeValue[0]; // 设置boAndLo BOAndLO boAndLo = new BOAndLO(); boAndLo.bo = bo; boAndLo.btmName = bo.btName; boAndLo.lo = lo; boAndLo.ltName = ltName; return boAndLo; } } class QueryLOWithVersion implements Callable { private Map map; private String direction; private String[] ltUserAttrs; private String ltName; private int loAttrSize; private List clauseList; /** * * 将一条查询出的记录封装成LO, 用btmView.OID, btmView.REVISIONOID作t_oid, t_revisionOid * * @param map: 一条从linkTable和btmView.OID, btmView.REVISIONOID查询出的记录 * @param direction: 链接查询的方向 * @param ltUserAttrs: 链接类型的用户属性 * @param ltName: 链接类型 * @param loAttrSize: 链接类型的属性长度(系统属性+用户属性) */ public QueryLOWithVersion(Map map, String direction, String[] ltUserAttrs, String ltName, int loAttrSize) { this.map = map; this.direction = direction; this.ltUserAttrs = ltUserAttrs; this.ltName = ltName; this.loAttrSize = loAttrSize; } /** * * 将一条查询出的记录封装成LO, 用btmView.OID, btmView.REVISIONOID作t_oid, t_revisionOid * * @param map: 一条从linkTable和btmView.OID, btmView.REVISIONOID查询出的记录 * @param direction: 链接查询的方向 * @param ltUserAttrs: 链接类型的用户属性 * @param ltName: 链接类型 * @param loAttrSize: 链接类型的属性长度(系统属性+用户属性) * @param clauseList 返回列 */ public QueryLOWithVersion(Map map, String direction, String[] ltUserAttrs, String ltName, int loAttrSize, List clauseList) { this.map = map; this.direction = direction; this.ltUserAttrs = ltUserAttrs; this.ltName = ltName; this.loAttrSize = loAttrSize; this.clauseList = clauseList; } @Override public LinkObject call() throws Exception { // 设置lo LinkObject lo = new LinkObject(); // 为link的系统属性赋值 List attrList = new ArrayList(); AttributeValue[] loAttrArrayNew = new AttributeValue[clauseList.size()]; for (int i = 0; i < clauseList.size(); i++) { String attrName = clauseList.get(i).toUpperCase(); if (attrName.indexOf(" AS ") > -1) { attrName = attrName.substring(attrName.lastIndexOf(" AS ") + 4); } Object attrVal = map.get(attrName); if (attrName.equalsIgnoreCase(SystemAttribute.F_OID.text())) { if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.OID + "2"; } attrVal = map.get(attrName); attrName = SystemAttribute.F_OID.text(); } else if (attrName.equalsIgnoreCase(SystemAttribute.F_REVISIONOID.text())) { if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.REVISIONOID + "2"; } attrVal = map.get(attrName); attrName = SystemAttribute.F_REVISIONOID.text(); } else if (attrName.equalsIgnoreCase(SystemAttribute.T_OID.text())) { if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.OID + "2"; } attrVal = map.get(attrName); attrName = SystemAttribute.T_OID.text(); } else if (attrName.equalsIgnoreCase(SystemAttribute.T_REVISIONOID.text())) { if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.REVISIONOID + "2"; } attrVal = map.get(attrName); attrName = SystemAttribute.T_REVISIONOID.text(); } if (!attrName.equals(SystemAttribute.REVISIONOID + "2") && !attrName.equals(SystemAttribute.OID + "2")) { String attrValStr = String.valueOf(attrVal == null ? "" : attrVal); attrList.add(new AttributeValue(attrName, attrValStr)); } } String attrName = SystemAttribute.OID.text(); Object value = map.get(attrName); lo.oid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.CREATOR.text(); value = map.get(attrName); lo.creator = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.CREATETIME.text(); value = map.get(attrName); lo.createTime = ObjectUtility.getTimeMillis(value); attrName = SystemAttribute.LASTMODIFIER.text(); value = map.get(attrName); lo.modifier = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.LASTMODIFYTIME.text(); value = map.get(attrName); lo.modifyTime = ObjectUtility.getTimeMillis(value); attrName = SystemAttribute.F_OID.text(); if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.OID + "2"; } value = map.get(attrName); lo.fromOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.F_REVISIONOID.text(); if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) { attrName = SystemAttribute.REVISIONOID + "2"; } value = map.get(attrName); lo.fromRevOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.F_NAMEOID.text(); value = map.get(attrName); lo.fromNameOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.F_BTWNAME.text(); value = map.get(attrName); lo.fromBTName = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.T_OID.text(); if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.OID + "2"; } value = map.get(attrName); lo.toOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.T_REVISIONOID.text(); if (direction.equals(QTConstants.DIRECTION_POSITIVE)) { attrName = SystemAttribute.REVISIONOID + "2"; } value = map.get(attrName); lo.toRevOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.T_NAMEOID.text(); value = map.get(attrName); lo.toNameOid = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.T_BTWNAME.text(); value = map.get(attrName); lo.toBTName = String.valueOf(value == null ? "" : value); attrName = SystemAttribute.TS.text(); value = map.get(attrName); lo.ts = ObjectUtility.getTimeMillis(value); // 将CONNECT_BY_ISLEAF , LEVEL加入lo.hisAttrValList value = map.get("CONNECT_BY_ISLEAF"); attrList.add(new AttributeValue("_ISLEAF", String.valueOf(value == null ? "" : value))); value = map.get("LEVEL"); attrList.add(new AttributeValue("_LEVEL", String.valueOf(value == null ? "" : value))); loAttrArrayNew = attrList.toArray(new AttributeValue[0]); lo.hisAttrValList = loAttrArrayNew; lo.newAttrValList = new AttributeValue[0]; // 目前系统属性没有ltName, 传参赋值 lo.ltName = ltName; return lo; } // @Override // public LinkObject call() throws Exception { // //设置lo // LinkObject lo = new LinkObject(); // AttributeValue[] loAttrArray = new AttributeValue[loAttrSize]; // //为link的系统属性赋值 // int k = 0; // String attrName = SystemAttribute.OID.text(); // Object value = map.get(attrName); // lo.oid = String.valueOf(value == null ? "" : value); // loAttrArray[k++] = new AttributeValue(attrName, lo.oid); // // attrName = SystemAttribute.CREATOR.text(); // value = map.get(attrName); // lo.creator = String.valueOf(value == null ? "" : value); // loAttrArray[k++] = new AttributeValue(attrName, lo.creator); // // attrName = SystemAttribute.CREATETIME.text(); // value = map.get(attrName); // lo.createTime = String.valueOf(value == null ? "" : value); // loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.createTime)); // // attrName = SystemAttribute.LASTMODIFIER.text(); // value = map.get(attrName); // lo.lastModifier = String.valueOf(value == null ? "" : value); // loAttrArray[k++] = new AttributeValue(attrName, lo.lastModifier); // // attrName = SystemAttribute.LASTMODIFYTIME.text(); // value = map.get(attrName); // lo.lastModifyTime = String.valueOf(value == null ? "" : value); // loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.lastModifyTime)); // // attrName = SystemAttribute.F_OID.text(); // if(direction.equals(QTConstants.DIRECTION_OPPOSITE)){ // attrName = SystemAttribute.OID + "2"; // } // value = map.get(attrName); // lo.fromOid = String.valueOf(value == null ? "" : value); // loAttrArray[k++] = new AttributeValue(SystemAttribute.F_OID.text(), lo.fromOid); // // attrName = SystemAttribute.F_REVISIONOID.text(); // if(direction.equals(QTConstants.DIRECTION_OPPOSITE)){ // attrName = SystemAttribute.REVISIONOID + "2"; // } // value = map.get(attrName); // lo.fromRevisionOid = String.valueOf(value == null ? "" : value); // loAttrArray[k++] = new AttributeValue(SystemAttribute.F_REVISIONOID.text(), lo.fromRevisionOid); // // attrName = SystemAttribute.F_NAMEOID.text(); // value = map.get(attrName); // lo.fromNameOid = String.valueOf(value == null ? "" : value); // loAttrArray[k++] = new AttributeValue(attrName, lo.fromNameOid); // // attrName = SystemAttribute.F_BTWNAME.text(); // value = map.get(attrName); // lo.fromBTMName = String.valueOf(value == null ? "" : value); // loAttrArray[k++] = new AttributeValue(attrName, lo.fromBTMName); // // attrName = SystemAttribute.T_OID.text(); // if(direction.equals(QTConstants.DIRECTION_POSITIVE)){ // attrName = SystemAttribute.OID + "2"; // } // value = map.get(attrName); // lo.toOid = String.valueOf(value == null ? "" : value); // loAttrArray[k++] = new AttributeValue(SystemAttribute.T_OID.text(), lo.toOid); // // attrName = SystemAttribute.T_REVISIONOID.text(); // if(direction.equals(QTConstants.DIRECTION_POSITIVE)){ // attrName = SystemAttribute.REVISIONOID + "2"; // } // value = map.get(attrName); // lo.toRevisionOid = String.valueOf(value == null ? "" : value); // loAttrArray[k++] = new AttributeValue(SystemAttribute.T_REVISIONOID.text(), lo.toRevisionOid); // // attrName = SystemAttribute.T_NAMEOID.text(); // value = map.get(attrName); // lo.toNameOid = String.valueOf(value == null ? "" : value); // loAttrArray[k++] = new AttributeValue(attrName, lo.toNameOid); // // attrName = SystemAttribute.T_BTWNAME.text(); // value = map.get(attrName); // lo.toBTMName = String.valueOf(value == null ? "" : value); // loAttrArray[k++] = new AttributeValue(attrName, lo.toBTMName); // // attrName = SystemAttribute.TS.text(); // value = map.get(attrName); // lo.ts = String.valueOf(value == null ? "" : value); // loAttrArray[k++] = new AttributeValue(attrName, String.valueOf(lo.ts)); // // //lo自定义属性赋值 // for(String userAttr : ltUserAttrs){ // attrName = userAttr.toUpperCase(); // value = map.get(attrName); // loAttrArray[k++] = new AttributeValue(userAttr, String.valueOf(value == null ? "" : value)); // } // // //将CONNECT_BY_ISLEAF , LEVEL加入lo.hisAttrValList // value = map.get("CONNECT_BY_ISLEAF"); // loAttrArray[k++] = new AttributeValue("_ISLEAF", String.valueOf(value == null ? "" : value)); // // value = map.get("LEVEL"); // loAttrArray[k++] = new AttributeValue("_LEVEL", String.valueOf(value == null ? "" : value)); // // lo.hisAttrValList = loAttrArray; // lo.newAttrValList = new AttributeValue[0]; // //目前系统属性没有ltName, 传参赋值 // lo.linkTypeName = ltName; // return lo; // } }