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);
}
}
}