package com.vci.server.query.delegate; import java.math.BigDecimal; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.Map; import org.dom4j.DocumentException; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.transform.Transformers; import org.omg.CORBA.IntHolder; 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.ServerServiceProvider; import com.vci.server.cache.ConfigCacheProvider; import com.vci.server.cache.OMCacheProvider; import com.vci.server.query.parsers.Parser; import com.vci.server.query.service.QueryObjectService; import com.vci.server.query.util.QTSqlUtil; import com.vci.server.query.util.SecretUtil; import com.vci.corba.omd.btm.BtmItem; 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.corba.query.data.KV; import com.vci.common.exception.VciExceptionTool; import com.vci.common.log.ServerWithLog4j; import com.vci.common.qt.object.Condition; import com.vci.common.qt.object.QTConstants; import com.vci.common.qt.object.QueryTemplate; import com.vci.common.resource.CommonProperties; import com.vci.corba.framework.data.CheckValue; import com.vci.corba.common.VCIError; public class ObjectQueryServiceDelegate { private static ObjectQueryServiceDelegate instance = null; public static ObjectQueryServiceDelegate getInstance() { if (instance == null) { instance = new ObjectQueryServiceDelegate(); } return instance; } private DateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd"); private Date date = Calendar.getInstance().getTime(); 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; } protected QueryTemplate getQTByNamAndText(String qtName, String qtText) throws DocumentException, VCIError{ // Document doc = DocumentHelper.parseText(qtText); // if(doc == null) return null; return OQueryHelper.getQTByQTText(qtName, qtText); } /** * 根据查询模板名, 查询模板内容查询业务对象 * @param qtName 查询模板的名称(内部名称) * @param qtText 查询模板结构化内容XML形式的字符串(需要在调用客户端进行转化) * @param count 查询结果的总数,通过 count.value 获取 * @return 查询到的业务类型数据 com.vci.corba.omd.BusinessObject * findBTMObjectsV2 能够在返回数据的同时,返回数据总数 */ public BusinessObject[] findBTMObjects(String qtName, String qtText) throws VCIError { return this.findBTMObjectsV2(qtName, qtText, new IntHolder(0)); } /** * 根据查询模板名, 查询模板内容查询业务对象-V2版 * * @param qtName 查询模板的名称(内部名称) * @param qtText 查询模板结构化内容XML形式的字符串(需要在调用客户端进行转化) * @param count 查询结果的总数,通过 count.value 获取 * @return 查询到的业务类型数据 com.vci.corba.omd.BusinessObject * @since v1.1 2017.08.31 * @see com.vci.corba.omd.data.BusinessObject */ public BusinessObject[] findBTMObjectsV2(String qtName, String qtText, IntHolder count) throws VCIError { try { List boList = new ArrayList(); QueryTemplate qt = getQTByNamAndText(qtName, qtText); if(qt == null){ return boList.toArray(new BusinessObject[0]); } return findBTMObjectsV2(qt, count); } catch (Throwable e) { ServerWithLog4j.logger.error("findBTMObjectsV2 Error", e); throw getLocalVciError("P0010QT-00001", e); } } /** * 查询模板数据查询业务对象-v3 : 查BO的同时,根据参照查询选项,查询参照数据 * * @param qtName 查询模板的名称(内部名称) * @param qtText 查询模板结构化内容XML形式的字符串(需要在调用客户端进行转化) * @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 */ public BusinessObject[] findBTMObjectsV3(String qtName, String qtText, IntHolder count, BtmRefQueryOption[] btmRefQueryOptions) throws VCIError{ try { List boList = new ArrayList(); QueryTemplate qt = getQTByNamAndText(qtName, qtText); if(qt == null){ return boList.toArray(new BusinessObject[0]); } return findBTMObjectsV3(qt, count, btmRefQueryOptions); } catch (Throwable e) { ServerWithLog4j.logger.error("findBTMObjectsV3 Error", e); throw getLocalVciError("P0010QT-00001", e); } } /** * 根据查询模板名, 查询模板内容查询业务对象 */ public BusinessObject[] findBTMObjects(QueryTemplate qt) throws VCIError { return this.findBTMObjectsV2(qt, new IntHolder(0)); } /** * 根据查询模板对象查询业务对象-V2版 * * @param qt 查询模板对象 * @param count 查询结果的总数,通过 count.value 获取 * @return 查询到的业务类型数据 com.vci.corba.omd.BusinessObject * @since v1.1 2017.08.31 * @see com.vci.corba.omd.data.BusinessObject */ public BusinessObject[] findBTMObjectsV2(QueryTemplate qt, IntHolder count) throws VCIError { try { List boList = new ArrayList(); if(qt == null){ return boList.toArray(new BusinessObject[0]); } if(count == null){ count = new IntHolder(0); } boList = QueryObjectService.getInstance().findBtmObjectsV2(qt, count); findBTMObjectChildrenDatas(qt, boList); return boList.toArray(new BusinessObject[0]); } catch (Throwable e) { ServerWithLog4j.logger.error("findBTMObjectsV2 Error", e); throw getLocalVciError("P0010QT-00001", e); } } /** * 根据查询模板对象查询业务对象-V2版 * * @param qt 查询模板对象 * @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 */ public BusinessObject[] findBTMObjectsV3(QueryTemplate qt, IntHolder count, BtmRefQueryOption[] btmRefQueryOptions) throws VCIError { try { List boList = new ArrayList(); if(qt == null){ return boList.toArray(new BusinessObject[0]); } if(count == null){ count = new IntHolder(0); } boList = QueryObjectService.getInstance().findBtmObjectsV3(qt, count, btmRefQueryOptions); findBTMObjectChildrenDatas(qt, boList); return boList.toArray(new BusinessObject[0]); } catch (Throwable e) { ServerWithLog4j.logger.error("findBTMObjectsV3 Error", e); throw getLocalVciError("P0010QT-00001", e); } } protected void findBTMObjectChildrenDatas(QueryTemplate qt, List boList) throws Throwable{ if(qt.isQueryChildren()){ //查询子类型 BtmItem[] btms = ServerServiceProvider.getOMDService().getBTMService().getChildrenBtms(qt.getBtmType()); for(int i = 0; i < btms.length; i++){ qt.setBtmType(btms[i].name); boList.addAll(QueryObjectService.getInstance().findBtmObjects(qt)); } } } /** * 根据查询模板名, 查询模板内容查询链接对象 */ public LinkObject[] findLTObjects(String qtName, String qtText) throws VCIError { return findLTObjectsV2(qtName, qtText, new IntHolder(0)); } /** * 根据查询模板名, 查询模板内容查询链接对象-V2版 * * @param qtName 查询模板的名称(内部名称) * @param qtText 查询模板结构化内容XML形式的字符串(需要在调用客户端进行转化) * @param count 查询结果的总数,通过 count.value 获取 * @return 查询到的业务类型数据 com.vci.corba.omd.LinkObject * @since v1.1 2017.08.31 * @see com.vci.corba.omd.data.LinkObject */ public LinkObject[] findLTObjectsV2(String qtName, String qtText, IntHolder count) throws VCIError { try { List loList = new ArrayList(); QueryTemplate qt = getQTByNamAndText(qtName, qtText); if(qt == null){ return loList.toArray(new LinkObject[0]); } //查询一层, 分查询是否有有下一级和不查询是否有有下一级 if(qt.getLevel() == 1){ loList = QueryObjectService.getInstance().findLinkObjectOneLevelV2(qt, count); //查询多层, 或者没有层数限制 }else{ loList = QueryObjectService.getInstance().findLinkObjectV2(qt, count); int recReturnMode = qt.getRecReturnMode(); //对查询结果进行过滤 if(recReturnMode == QTConstants.RECRETURNMODE_FILTER){ loList = QueryObjectService.getInstance().filterLos(loList); } } return loList.toArray(new LinkObject[0]); } catch (Throwable e) { ServerWithLog4j.logger.error("findLTObjectsV2 Error", e); throw getLocalVciError("P0010QT-00002", e); } } /** * 根据查询模板获取linkObject 和 关联的businessObject */ public BOAndLO[] getBOAndLOS(String qtName, String qtText, String btmOId) throws VCIError { try{ // Document doc = DocumentHelper.parseText(qtText); // if(doc == null){ // return new BOAndLO[0]; // } QueryTemplate qt = OQueryHelper.getQTByQTText(qtName, qtText); if(qt == null){ return new BOAndLO[0]; } List list = null; //查询一层, 分查询是否有有下一级和不查询是否有有下一级 if(qt.getLevel() == 1){ list = QueryObjectService.getInstance().findBOAndLOByViewOneLevel(qt); //查询多层, 或者没有层数限制 }else{ list = QueryObjectService.getInstance().findBOAndLOByView(qt,btmOId); //对查询结果进行过滤 int recReturnMode = qt.getRecReturnMode(); if(recReturnMode == QTConstants.RECRETURNMODE_FILTER){ list = QueryObjectService.getInstance().filterLoAndBOs(list); } } return list.toArray(new BOAndLO[0]); }catch(Throwable e){ ServerWithLog4j.logger.error("getBOAndLOS Error", e); throw getLocalVciError("P0010QT-00007", e); } } /** * 根据查询模板获取linkObject 和 关联的businessObject */ public BOAndLO[] getBOAndLOS(QueryTemplate qt, String btmOId) throws VCIError { try{ if(qt == null){ return new BOAndLO[0]; } List list = null; //查询一层, 分查询是否有有下一级和不查询是否有有下一级 if(qt.getLevel() == 1){ list = QueryObjectService.getInstance().findBOAndLOByViewOneLevel(qt); //查询多层, 或者没有层数限制 }else{ list = QueryObjectService.getInstance().findBOAndLOByView(qt,btmOId); //对查询结果进行过滤 int recReturnMode = qt.getRecReturnMode(); if(recReturnMode == QTConstants.RECRETURNMODE_FILTER){ list = QueryObjectService.getInstance().filterLoAndBOs(list); } } return list.toArray(new BOAndLO[0]); }catch(Throwable e){ ServerWithLog4j.logger.error("getBOAndLOS Error", e); throw getLocalVciError("P0010QT-00007", e); } } /** * 根据业务类型名, 版本条件查询业务对象 * version: 0:所有版次; 1:当前版本当前版次; 2:当前版本最新版次; 3:最新版本最新版次. */ public BusinessObject[] findBTMObjectsByTypeNameAndVersion(String typeName, int version) throws VCIError { try{ List boList = new ArrayList(); QueryTemplate qt = new QueryTemplate(); qt.setType(QTConstants.TYPE_BTM); qt.setBtmType(typeName); List clauseList = new ArrayList(); clauseList.add("*"); qt.setClauseList(clauseList); qt.setVersion(version); boList = QueryObjectService.getInstance().findBtmObjects(qt); return boList.toArray(new BusinessObject[0]); }catch(Throwable e){ ServerWithLog4j.logger.error("findBTMObjectsByTypeNameAndVersion Error", e); throw getLocalVciError("P0010QT-00010", e); } } /** * 根据查询模板名, 查询模板内容返回查询总数 */ public int findTotalCount(String qtName, String qtText) throws VCIError { StringBuilder sql = new StringBuilder(); try { int totalCount = 0; //Document doc = DocumentHelper.parseText(qtText); QueryTemplate qt = OQueryHelper.getQTByQTText(qtName, qtText); if(qt.getType().equals(QTConstants.TYPE_LINK) && qt.getBtmType().equals("*")){ String ltName = qt.getLinkType(); //LinkType lt = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName); LinkType lt = OMCacheProvider.getLinkType(ltName); String[] btmNames = null; if(qt.getDirection().equals(QTConstants.DIRECTION_OPPOSITE)){ btmNames = lt.btmItemsFrom; }else{ btmNames = lt.btmItemsTo; } for(int i = 0; i < btmNames.length; i++){ sql.setLength(0); qt.setBtmType(btmNames[i]); sql.append("select count(*) from "); Parser parser = new Parser(qt); String queryType = parser.getQueryType(); sql.append(queryType); sql.append(" where 1 = 1 "); Condition condition = qt.getCondition(); if(condition != null){ sql.append("and "); sql.append(QTSqlUtil.getSql(qt, true)); //sql.append(condition.getSql(qt, true)); } sql.append(parser.getRevConstraint()); sql.append(parser.getVerConstraint()); //String rightSwitch = CommonProperties.getStringProperty("right.switch"); if (parser.isRightSwitch() && qt.getType().equals(QTConstants.TYPE_BTM)){ if(qt.isRightFlag()){ sql.append(parser.getGrandRightSQL()); } } sql.append(getSecretCheckSql(parser)); Session session = HibernateSessionFactory.getSession(); SQLQuery sqlQuery = session.createSQLQuery(sql.toString()); List list = sqlQuery.list(); totalCount += ((BigDecimal)list.get(0)).intValue(); } return totalCount; }else{ //StringBuilder sql = new StringBuilder(); sql.append("select count(*) from "); Parser parser = new Parser(qt); String queryType = parser.getQueryType(); sql.append(queryType); sql.append(" where 1 = 1 "); Condition condition = qt.getCondition(); if(condition != null){ sql.append("and "); sql.append(QTSqlUtil.getSql(qt, true)); //sql.append(condition.getSql(qt, true)); } sql.append(parser.getRevConstraint()); sql.append(parser.getVerConstraint()); //String rightSwitch = CommonProperties.getStringProperty("right.switch"); if(parser.isRightSwitch() && qt.getType().equals(QTConstants.TYPE_BTM)){ if(qt.isRightFlag()){ sql.append(parser.getGrandRightSQL()); } } sql.append(getSecretCheckSql(parser)); Session session = HibernateSessionFactory.getSession(); SQLQuery sqlQuery = session.createSQLQuery(sql.toString()); List list = sqlQuery.list(); totalCount = ((BigDecimal)list.get(0)).intValue(); return totalCount; } }catch(Throwable e){ ServerWithLog4j.logger.error("findTotalCount Error", e); throw getLocalVciError("P0010QT-00012", e); } } /** 用户密级校验和IP密级校验 * @param parser * @throws Exception */ public String getSecretCheckSql(Parser parser) throws Exception{ StringBuffer sqlBu = new StringBuffer(); boolean isUserCheckOpen = ConfigCacheProvider.isUserSecurity();//isCheckOpen("userSecuritySwith"); if(isUserCheckOpen){ String userFilterSQL = getUserFilterSQL(parser); sqlBu.append(userFilterSQL); //用户密级校验开启才进行IP密集校验 boolean isIPCheckOpen = ConfigCacheProvider.isIpSecurity();//isCheckOpen("ipSecuritySwitch"); if(isIPCheckOpen){ String ipFilterSQL = getIPFilterSQL(parser); sqlBu.append(ipFilterSQL); } } return sqlBu.toString(); } // private boolean isCheckOpen(String keyName){ // UserEntityInfo userEnt = new UserEntityInfo(); // // VCIInvocationInfo info = HibernateSessionFactory.getVciSessionInfo(); // userEnt.userName = info.userName; // userEnt.modules = "QT"; // userEnt.ip = info.clientIPInfo; // // String value = AppConfigProvider.getAppConfig(keyName); // if(value != null && "on".equals(value)){ // return true; // } // //// AppConfigDetailInfo cfgDetail; //// try { //// cfgDetail = ServerServiceProvider.getFrameService().getAppConfigDetailByKey(keyName, userEnt); //// if(cfgDetail != null && "on".equals(cfgDetail.value)){ //// return true; //// } //// } catch (VCIError e) { //// // TODO Auto-generated catch block //// e.printStackTrace(); //// } // return false; // } public String getUserFilterSQL(Parser parser) throws Exception { String where = ""; CheckValue value = parser.getCheckValue(); try { //where = ServerServiceProvider.getAuth2Service().checkUserSecret(value); where = new SecretUtil().checkUserSecret(value); } catch (VCIError e) { ServerWithLog4j.logger.error("getUserFilterSQL Error", e); } return where; } public String getIPFilterSQL(Parser parser) throws Exception { String where = ""; CheckValue value = parser.getCheckValue(); try { //where = ServerServiceProvider.getAuth2Service().checkIPSecret(value); where = new SecretUtil().checkIPSecret(value); } catch (VCIError e) { ServerWithLog4j.logger.error("getIPFilterSQL Error", e); } return where; } /** * 用标准sql查询数据 */ public KV[][] queryBySql(String sql) throws VCIError { try { Session session = HibernateSessionFactory.getSession(); SQLQuery sqlQuery = session.createSQLQuery(sql); sqlQuery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); List list = sqlQuery.list(); List listKVs = new ArrayList(); for(int i = 0; i < list.size(); i++){ List listKV = new ArrayList(); Map map = (Map)list.get(i); for(String key : map.keySet()){ Object value = map.get(key); listKV.add(new KV(key, getValueString(value))); } listKVs.add(listKV.toArray(new KV[0])); } return listKVs.toArray(new KV[0][0]); } catch (Throwable e) { ServerWithLog4j.logger.error("queryBySql Error", e); throw getLocalVciError("P0010QT-00014", e); } } private String getValueString(Object value) { if (value == null) { return ""; } 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 ts = (java.sql.Date)value; return String.valueOf(ts.getTime()); } else return value.toString(); } /** * 用标准sql查询数据 */ public String[][] queryBySqlWithoutKey(String sql) throws VCIError { return queryBySqlWithoutKeyExec(sql, null); } /** * 使用标准sql查询数据(基于绑定变量的实现) */ public String[][] queryBySqlAndValuesWithoutKey(String sql, String[] paramValues) throws VCIError{ return queryBySqlWithoutKeyExec(sql, paramValues); } protected String[][] queryBySqlWithoutKeyExec(String sql, String[] paramValues) throws VCIError { try { Session session = HibernateSessionFactory.getSession(); SQLQuery sqlQuery = session.createSQLQuery(sql); if(paramValues != null && paramValues.length > 0){ for (int i = 0; i < paramValues.length; i++) { sqlQuery.setString(i, paramValues[i]); } } List re = sqlQuery.list(); List lists = new ArrayList(); if(re.size() > 0){ if(re.get(0) instanceof Object[]){ for(Object obj : re){ Object[] objs = (Object[]) obj; List list = new ArrayList(); for(Object obj_ : objs){ list.add(getValueString(obj)); } lists.add(list.toArray(new String[0])); } }else{ for(Object obj : re){ List list = new ArrayList(); list.add(getValueString(obj)); lists.add(list.toArray(new String[0])); } } } return lists.toArray(new String[0][0]); } catch (Throwable e) { ServerWithLog4j.logger.error("queryBySqlWithoutKeyExec Error", e); throw getLocalVciError("P0010QT-00014", e); } } }