package com.vci.server.bof.service; import java.math.BigDecimal; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Timestamp; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.hibernate.SQLQuery; import org.hibernate.Session; import com.vci.omd.constants.LinkConstants; import com.vci.server.base.persistence.dao.HibernateSessionFactory; import com.vci.server.base.utility.OmdHelper; import com.vci.server.bof.objects.LinkTypeWrap; import com.vci.server.cache.OMCacheProvider; import com.vci.corba.common.VCIError; 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.common.log.ServerWithLog4j; import com.vci.common.utility.ObjectUtility; public class LOFactoryService extends BOFactoryBaseService { private int BATCHSIZE = 2000; private static LOFactoryService instance = null; private LOFactoryService() { } public static synchronized LOFactoryService getInstance() { if (instance == null) { instance = new LOFactoryService(); } return instance; } /** * 创建新对象 * * @param lo * @return * @throws Throwable * @throws Exception */ public LinkObject createLinkObject(LinkObject lo) throws Exception, Throwable { String tableName = OmdHelper.getLTTableName(lo.ltName); // Jason。wang 取消通过cobra服务获取LinkType的对象定义信息,直接使用服务器端服务的方式获取。 //LinkType linkType = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(lo.linkTypeName); LinkType linkType = OMCacheProvider.getLinkType(lo.ltName); // end Jason.Wang 2018.6.28 int count = 0; if (linkType.relationFrom.equals("1") && linkType.relationTo.equals("N")) { count = getLinkObjectCountByFromTOObject(lo.fromOid, lo.toOid, tableName, 2); } else if (linkType.relationFrom.equals("N") && linkType.relationTo.equals("1")) { count = getLinkObjectCountByFromTOObject(lo.fromOid, lo.toOid, tableName, 3); } else if (linkType.relationFrom.equals("1") && linkType.relationTo.equals("1")) { count = getLinkObjectCountByFromTOObject(lo.fromOid, lo.toOid, tableName, 1); } if (count > 0) { throw new VCIError("P0010LOL-00005", new String[] { linkType.relationFrom, linkType.relationTo }); } //AttribItem[] items = ServerServiceProvider.getOMDService().getAttributeService().getAttribItemsByNames(linkType.attributes); AttribItem[] items = OMCacheProvider.getAttributes(linkType.attributes); Map attrItemMap = new HashMap(); for (int i = 0; i < items.length; i++) { attrItemMap.put(items[i].name, items[i]); } // Map attrItemMap = getLOAttributeItemMap(lo.linkTypeName); String sql = getCreateLOSql(lo, tableName, attrItemMap); Session session = HibernateSessionFactory.getSession(); SQLQuery query = session.createSQLQuery(sql); prepareCreateLOPsmt(query, lo, attrItemMap); query.executeUpdate(); return lo; } private LinkObject createLinkObject(LinkObject lo, LinkType linkType, Map attrItemMap) throws Exception, Throwable { String tableName = OmdHelper.getLTTableName(lo.ltName); int count = 0; if (linkType.relationFrom.equals("1") && linkType.relationTo.equals("N")) { count = getLinkObjectCountByFromTOObject(lo.fromOid, lo.toOid, tableName, 2); } else if (linkType.relationFrom.equals("N") && linkType.relationTo.equals("1")) { count = getLinkObjectCountByFromTOObject(lo.fromOid, lo.toOid, tableName, 3); } else if (linkType.relationFrom.equals("1") && linkType.relationTo.equals("1")) { count = getLinkObjectCountByFromTOObject(lo.fromOid, lo.toOid, tableName, 1); } if (count > 0) { throw new VCIError("P0010LOL-00005", new String[] { linkType.relationFrom, linkType.relationTo }); } String sql = getCreateLOSql(lo, tableName, attrItemMap); Session session = HibernateSessionFactory.getSession(); SQLQuery query = session.createSQLQuery(sql); prepareCreateLOPsmt(query, lo, attrItemMap); query.executeUpdate(); return lo; } /** * 根据from、to端的类型获取已经建立类型的关系数 * * @param fromType * @param toType * @param linkType * @return * @throws SQLException */ @SuppressWarnings("rawtypes") private int getLinkObjectCountByFromTOObject(String fromOid, String toOid, String tableName, int type) throws SQLException { String sql = ""; if (type == 1) { sql = getSelectLOOneOneCountSql(fromOid, toOid, tableName); } else if (type == 2) { sql = getSelectLOOneManyCountSql(fromOid, toOid, tableName); } else if (type == 3) { sql = getSelectLOManyOneCountSql(fromOid, toOid, tableName); } Session session = HibernateSessionFactory.getSession(); SQLQuery query = session.createSQLQuery(sql); List queryList = query.list(); Object array = (Object) queryList.get(0); int count = ((BigDecimal) array).intValue(); return count; } /** * 获取关系为一对一时查询关系数据的SQL语句 * * @param fromOid * @param toOid * @param tableName * @return */ private String getSelectLOOneOneCountSql(String fromOid, String toOid, String tableName) { String sql = ""; StringBuffer sbFields = new StringBuffer("SELECT count(*) FROM ").append(tableName) .append(" p where p.F_OID = '").append(fromOid).append("'").append(" or p.T_OID = '").append(toOid) .append("'"); sql = sbFields.toString(); return sql; } /** * 获取关系为一对多时查询关系数据的sql语句 * * @param fromOid * @param toOid * @param tableName * @return */ private String getSelectLOOneManyCountSql(String fromOid, String toOid, String tableName) { String sql = ""; StringBuffer sbFields = new StringBuffer("SELECT count(*) FROM ").append(tableName) .append(" p where p.T_OID = '").append(toOid).append("'"); sql = sbFields.toString(); return sql; } /** * 获取关系为多对一时查询关系数据的sql语句 * * @param fromOid * @param toOid * @param tableName * @return */ private String getSelectLOManyOneCountSql(String fromOid, String toOid, String tableName) { String sql = ""; StringBuffer sbFields = new StringBuffer("SELECT count(*) FROM ").append(tableName) .append(" p where p.F_OID = '").append(fromOid).append("'"); sql = sbFields.toString(); return sql; } /** * 根据from、to端的类型获取已经建立类型的关系数的sql。 * * @param fromType * @param toType * @param tableName * @return */ @SuppressWarnings("unused") private String getSelectLOCountSql(String fromType, String toType, String tableName) { String sql = ""; StringBuffer sbFields = new StringBuffer("SELECT count(*) FROM ").append(tableName) .append(" p where p.F_BTWNAME = '").append(fromType).append("'").append(" and p.T_BTWNAME = '") .append(toType).append("'"); sql = sbFields.toString(); return sql; } @SuppressWarnings("deprecation") public LinkObject[] batchCreateLinkObjectNoCheck(LinkObject[] los, String currentTime) throws Exception { Map> mapLtLOs = new HashMap>(); List lstLO = null; Map mapLTWrap = new HashMap(); LinkTypeWrap ltWrap = null; String sql; for (LinkObject lo : los) { if (mapLTWrap.containsKey(lo.ltName)) { ltWrap = mapLTWrap.get(lo.ltName); } else { ltWrap = new LinkTypeWrap(); //ltWrap.ltItem = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(lo.linkTypeName); ltWrap.ltItem = OMCacheProvider.getLinkType(lo.ltName); mapLTWrap.put(lo.ltName, ltWrap); } if (ltWrap.mapAttr == null) { //AttribItem[] items = ServerServiceProvider.getOMDService().getAttributeService().getAttribItemsByNames(ltWrap.ltItem.attributes); AttribItem[] items = OMCacheProvider.getAttributes(ltWrap.ltItem.attributes); Map attrMap = new HashMap(); for (int i = 0; i < items.length; i++) { attrMap.put(items[i].name, items[i]); } ltWrap.mapAttr = attrMap; } if (ltWrap.tableName == null) { ltWrap.tableName = OmdHelper.getLTTableName(lo.ltName); } if (mapLtLOs.containsKey(lo.ltName)) lstLO = mapLtLOs.get(lo.ltName); else { lstLO = new ArrayList(); mapLtLOs.put(lo.ltName, lstLO); } lstLO.add(lo); } String sLType = ""; Session session = HibernateSessionFactory.getSession(); Iterator it = mapLtLOs.keySet().iterator(); while (it.hasNext()) { sLType = it.next(); if (mapLTWrap.containsKey(sLType)) { ltWrap = mapLTWrap.get(sLType); } else continue; sql = getInitParamSql(ltWrap); ServerWithLog4j.logger.debug(sql); lstLO = mapLtLOs.get(sLType); PreparedStatement pst = session.connection().prepareStatement(sql); int size = lstLO.size(); int i = 0; for (i = 0; i < size; i++) { setPreparedStatementParams(pst, ltWrap, lstLO.get(i)); pst.addBatch(); if ((i + 1) % BATCHSIZE == 0) { pst.executeBatch(); } } pst.executeBatch(); if (pst != null) { pst.close(); pst = null; } } return los; } private String constructCreateSql(String tableName, LinkObject lo, Map attrMap, Map initSqlMap, long currentTime) throws Exception { String initSql = null; if (initSqlMap.containsKey(tableName)) { initSql = initSqlMap.get(tableName); } else { initSql = getInitSql(tableName, lo); initSqlMap.put(tableName, initSql); } StringBuilder sbSql = new StringBuilder(initSql); // 对象固有属性 sbSql.append("'").append(lo.oid).append("'").append(",'").append(lo.creator).append("'") .append(",to_timestamp('").append(currentTime).append("','").append(DATEFORMATTER).append("')") .append(",'").append(lo.creator).append("'").append(",to_timestamp('").append(currentTime).append("','") .append(DATEFORMATTER).append("')").append(",'").append(lo.fromOid).append("'").append(",'") .append(lo.fromRevOid).append("'").append(",'").append(lo.fromNameOid).append("'").append(",'") .append(lo.fromBTName).append("'").append(",'").append(lo.toOid).append("'").append(",'") .append(lo.toRevOid).append("'").append(",'").append(lo.toNameOid).append("'").append(",'") .append(lo.toBTName).append("'").append(",to_timestamp('").append(currentTime).append("','") .append(DATEFORMATTER).append("')"); for (int i = 0; i < lo.newAttrValList.length; i++) { AttributeValue abValue = lo.newAttrValList[i]; AttribItem abItem = null; String attName = abValue.attrName.toLowerCase(); if (attrMap.containsKey(attName)) { abItem = attrMap.get(attName); } else { // abItem = ServerServiceProvider.getOMDService().getAttributeService() // .getAttribItemByName(abValue.attrName.toLowerCase()); abItem = OMCacheProvider.getAttribute(attName); attrMap.put(attName, abItem); } sbSql.append(",").append(getSqlAccordingType(abItem, lo.newAttrValList[i].attrVal)); } lo.createTime = currentTime; lo.modifyTime = currentTime; lo.ts = currentTime; sbSql.append(")"); String sql = sbSql.toString(); return sql; } // private void setPreparedStatementParams(PreparedStatement pst, LinkObject lo , Map attrMap) throws SQLException { // // Timestamp curTime = new Timestamp(System.currentTimeMillis()); // String sTime = curTime.toString(); // // int index = 1; // pst.setString(index++, lo.oid); // pst.setString(index++, lo.creator); // pst.setTimestamp(index++, curTime); // pst.setString(index++, lo.creator); // pst.setTimestamp(index++, curTime); // pst.setString(index++, lo.fromOid); // pst.setString(index++, lo.fromRevisionOid); // pst.setString(index++, lo.fromNameOid); // pst.setString(index++, lo.fromBTMName); // pst.setString(index++, lo.toOid); // pst.setString(index++, lo.toRevisionOid); // pst.setString(index++, lo.toNameOid); // pst.setString(index++, lo.toBTMName); // pst.setTimestamp(index++, curTime); // // for (int i = 0; i < lo.newAttrValList.length; i++) { // AttributeValue abValue = lo.newAttrValList[i]; // AttribItem abItem = null; // if (attrMap.containsKey(abValue.attrName.toLowerCase())) { // abItem = attrMap.get(abValue.attrName.toLowerCase()); // } else { // abItem = ApProvider.getInstance().getAbItemByName( // abValue.attrName.toLowerCase()); // attrMap.put(abValue.attrName.toLowerCase(), abItem); // } // // setQueryValueAccordingDataType(pst, abItem, index++, lo.newAttrValList[i].attrVal); // } // // // 对象固有属性 //// sbSql.append("'").append(lo.oid).append("'") //// .append(",'").append(lo.creator).append("'") //// .append(",to_timestamp('").append(currentTime).append("','").append(DATEFORMATTER).append("')") //// .append(",'").append(lo.creator).append("'") //// .append(",to_timestamp('").append(currentTime).append("','").append(DATEFORMATTER).append("')") //// .append(",'").append(lo.fromOid).append("'") //// .append(",'").append(lo.fromRevisionOid).append("'") //// .append(",'").append(lo.fromNameOid).append("'") //// .append(",'").append(lo.fromBTMName).append("'") //// .append(",'").append(lo.toOid).append("'") //// .append(",'").append(lo.toRevisionOid).append("'") //// .append(",'").append(lo.toNameOid).append("'") //// .append(",'").append(lo.toBTMName).append("'") //// .append(",to_timestamp('").append(currentTime).append("','").append(DATEFORMATTER).append("')"); //// for (int i = 0; i < lo.newAttrValList.length; i++) { //// AttributeValue abValue = lo.newAttrValList[i]; //// AttribItem abItem = null; //// if (attrMap.containsKey(abValue.attrName.toLowerCase())) { //// abItem = attrMap.get(abValue.attrName.toLowerCase()); //// } else { //// abItem = ApProvider.getInstance().getAbItemByName( //// abValue.attrName.toLowerCase()); //// attrMap.put(abValue.attrName.toLowerCase(), abItem); //// } //// //// sbSql.append(",").append( //// getSqlAccordingType(abItem, lo.newAttrValList[i].attrVal)); //// } // // lo.createTime = sTime; // lo.lastModifyTime = sTime; // lo.ts = sTime; // } // private void setPreparedStatementParams(PreparedStatement pst, LinkTypeWrap ltWrap, LinkObject lo) throws Exception { long time = System.currentTimeMillis(); Timestamp curTime = new Timestamp(time); String sTime = curTime.toString(); Map attrMap = ltWrap.mapAttr; Map mapValue = new HashMap(); for (AttributeValue av : lo.newAttrValList) { mapValue.put(av.attrName.toLowerCase(), av.attrVal); } int index = 1; pst.setString(index++, lo.oid); pst.setString(index++, lo.creator); pst.setTimestamp(index++, curTime); pst.setString(index++, lo.creator); pst.setTimestamp(index++, curTime); pst.setString(index++, lo.fromOid); pst.setString(index++, lo.fromRevOid); pst.setString(index++, lo.fromNameOid); pst.setString(index++, lo.fromBTName); pst.setString(index++, lo.toOid); pst.setString(index++, lo.toRevOid); pst.setString(index++, lo.toNameOid); pst.setString(index++, lo.toBTName); pst.setTimestamp(index++, curTime); String sField = "", sValue; for (int i = 0; i < ltWrap.ltItem.attributes.length; i++) { sField = ltWrap.ltItem.attributes[i].toLowerCase(); AttribItem atItem = null; if (attrMap.containsKey(sField)) { atItem = attrMap.get(sField); } else { //atItem = ServerServiceProvider.getOMDService().getAttributeService().getAttribItemByName(sField); atItem = OMCacheProvider.getAttribute(sField); attrMap.put(sField, atItem); } if (mapValue.containsKey(sField)) sValue = mapValue.get(sField); else sValue = null; setQueryValueAccordingDataType(pst, atItem, index++, sValue); } lo.createTime = time; lo.modifyTime = time; lo.ts = time; } private String getInitSql(String tableName, LinkObject lo) { String sql = ""; StringBuffer sbFields = new StringBuffer( "OID,CREATOR,CREATETIME,LASTMODIFIER,LASTMODIFYTIME,F_OID,F_REVISIONOID,F_NAMEOID,F_BTWNAME," + "T_OID,T_REVISIONOID,T_NAMEOID,T_BTWNAME,TS"); AttributeValue[] attrValList = lo.newAttrValList; for (int i = 0; i < attrValList.length; i++) { sbFields.append(","); sbFields.append(attrValList[i].attrName); } StringBuffer sbSql = new StringBuffer().append("INSERT INTO ").append(tableName).append("(") .append(sbFields.toString()).append(")").append(" VALUES ("); sql = sbSql.toString(); return sql; } // private String getInitParamSql(String tableName, LinkObject lo) { // String sql = ""; // StringBuffer sbFields = new StringBuffer( // "OID,CREATOR,CREATETIME,LASTMODIFIER,LASTMODIFYTIME,F_OID,F_REVISIONOID,F_NAMEOID,F_BTWNAME," // + "T_OID,T_REVISIONOID,T_NAMEOID,T_BTWNAME,TS"); // // StringBuffer sbParams = new StringBuffer("?,?,?,?,?,?,?,?,?,?,?,?,?,?"); // // AttributeValue[] attrValList = lo.newAttrValList; // for (int i = 0; i < attrValList.length; i++) { // sbFields.append(","); // sbFields.append(attrValList[i].attrName); // // sbParams.append(",?"); // } // // sql = String.format("INSERT INTO %s (%s) VALUES (%s)", tableName, sbFields.toString(), sbParams.toString()); // //// StringBuffer sbSql = new StringBuffer().append("INSERT INTO ") //// .append(tableName).append("(").append(sbFields.toString()) //// .append(")").append(" VALUES (").append(sbParams.toString()); //// sql = sbSql.toString(); // return sql; // } private String getInitParamSql(LinkTypeWrap ltWrap) { String sql = ""; StringBuffer sbFields = new StringBuffer( "OID,CREATOR,CREATETIME,LASTMODIFIER,LASTMODIFYTIME,F_OID,F_REVISIONOID,F_NAMEOID,F_BTWNAME," + "T_OID,T_REVISIONOID,T_NAMEOID,T_BTWNAME,TS"); StringBuffer sbParams = new StringBuffer("?,?,?,?,?,?,?,?,?,?,?,?,?,?"); // AttributeValue[] attrValList = lo.newAttrValList; for (int i = 0; i < ltWrap.ltItem.attributes.length; i++) { sbFields.append(","); sbFields.append(ltWrap.ltItem.attributes[i]); sbParams.append(",?"); } sql = String.format("INSERT INTO %s (%s) VALUES (%s)", ltWrap.tableName, sbFields.toString(), sbParams.toString()); // StringBuffer sbSql = new StringBuffer().append("INSERT INTO ") // .append(tableName).append("(").append(sbFields.toString()) // .append(")").append(" VALUES (").append(sbParams.toString()); // sql = sbSql.toString(); return sql; } /** * 批量保存LO对象 * * @param los * @return * @throws Throwable * @throws Exception */ public LinkObject[] batchCreateLinkObject(LinkObject[] los) throws Exception, Throwable { ServerWithLog4j.logger.info("====batchCreateLinkObject begin===="); Map> mapLOs = new HashMap>(); List lstLO = null; for (LinkObject lo : los) { if (mapLOs.containsKey(lo.ltName)) lstLO = mapLOs.get(lo.ltName); else { lstLO = new ArrayList(); mapLOs.put(lo.ltName, lstLO); } lstLO.add(lo); } ServerWithLog4j.logger.info("====batchCreateLinkObject Create LinkObjects===="); LinkTypeWrap ltWrap = null; Iterator its = mapLOs.keySet().iterator(); while (its.hasNext()) { String sLType = its.next(); ltWrap = new LinkTypeWrap(); //ltWrap.ltItem = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(sLType); ltWrap.ltItem = OMCacheProvider.getLinkType(sLType); ltWrap.tableName = OmdHelper.getLTTableName(sLType); Map attrMap = new HashMap(); //AttribItem[] items = ServerServiceProvider.getOMDService().getAttributeService().getAttribItemsByNames(ltWrap.ltItem.attributes); AttribItem[] items = OMCacheProvider.getAttributes(ltWrap.ltItem.attributes); for (int i = 0; i < items.length; i++) { attrMap.put(items[i].name, items[i]); } ltWrap.mapAttr = attrMap; // 调用单一业务类型的进行批量处理 String sql = getInitParamSql(ltWrap); ServerWithLog4j.logger.debug(sql); lstLO = mapLOs.get(sLType); PreparedStatement pst = HibernateSessionFactory.getSessionConnection().prepareStatement(sql); int size = lstLO.size(); int i = 0; for (i = 0; i < size; i++) { setPreparedStatementParams(pst, ltWrap, lstLO.get(i)); pst.addBatch(); if ((i + 1) % BATCHSIZE == 0) { pst.executeBatch(); } } pst.executeBatch(); if (pst != null) { pst.close(); pst = null; } // batchCreateLinkObjectNoCheck(lstLO.toArray(new LinkObject[]{}), currentTime); } ServerWithLog4j.logger.info("====batchCreateLinkObject end===="); return los; } public boolean createLinkObjectNotCommint(LinkObject lo) throws Exception, Throwable { String tableName = OmdHelper.getLTTableName(lo.ltName); Map attrItemMap = getLOAttributeItemMap(lo.ltName); Session session = HibernateSessionFactory.getSession(); String sql = getCreateLOSql(lo, tableName, attrItemMap); SQLQuery query = session.createSQLQuery(sql); prepareCreateLOPsmt(query, lo, attrItemMap); query.executeUpdate(); return true; } /** * 构建LO的创建SQL * * @param bo * @return */ private String getCreateLOSql(LinkObject lo, String tableName, Map attrItemMap) { String sql = ""; StringBuffer sbFields = new StringBuffer( "OID,CREATOR,CREATETIME,LASTMODIFIER,LASTMODIFYTIME,F_OID,F_REVISIONOID,F_NAMEOID,F_BTWNAME," + "T_OID,T_REVISIONOID,T_NAMEOID,T_BTWNAME,TS"); AttributeValue[] attrValList = lo.newAttrValList; for (int i = 0; i < attrValList.length; i++) { if (!attrItemMap.containsKey(attrValList[i].attrName.toLowerCase())) { continue; } sbFields.append(","); sbFields.append(attrValList[i].attrName); } String[] allFields = sbFields.toString().split(","); StringBuffer sbValues = new StringBuffer(); for (int i = 0; i < allFields.length; i++) { sbValues.append("?"); if (i != allFields.length - 1) { sbValues.append(","); } } StringBuffer sbSql = new StringBuffer().append("INSERT INTO ").append(tableName).append("(") .append(sbFields.toString()).append(")").append(" VALUES (").append(sbValues.toString()).append(")"); sql = sbSql.toString(); return sql; } /** * 准备创建数据 * * @param psmt * @param bo * @throws SQLException */ private void prepareCreateLOPsmt(SQLQuery query, LinkObject lo, Map attrItemMap) throws SQLException { int index = 0; // 对象固有属性 long curTime = System.currentTimeMillis(); Timestamp currentTime = new Timestamp(curTime); if (lo.oid.equals("")) { lo.oid = ObjectUtility.getNewObjectID36(); // modify by zhonggy 2015-1-16 } String userName = HibernateSessionFactory.getVciSessionInfo().userName; if (!StringUtils.isEmpty(userName)) lo.creator = userName; if (!StringUtils.isEmpty(userName)) lo.modifier = userName; query.setString(index++, lo.oid); query.setString(index++, lo.creator); query.setTimestamp(index++, currentTime); query.setString(index++, lo.modifier); query.setTimestamp(index++, currentTime); query.setString(index++, lo.fromOid); query.setString(index++, lo.fromRevOid); query.setString(index++, lo.fromNameOid); query.setString(index++, lo.fromBTName); query.setString(index++, lo.toOid); query.setString(index++, lo.toRevOid); query.setString(index++, lo.toNameOid); query.setString(index++, lo.toBTName); query.setTimestamp(index++, currentTime); // 对象特有属性 for (int i = 0; i < lo.newAttrValList.length; i++) { if (!attrItemMap.containsKey(lo.newAttrValList[i].attrName.toLowerCase())) { continue; } AttributeValue abValue = lo.newAttrValList[i]; AttribItem abItem = attrItemMap.get(abValue.attrName.toLowerCase()); setQueryValueAccordingDataType(query, abItem, index++, lo.newAttrValList[i].attrVal); } lo.createTime = curTime; lo.modifyTime = curTime; lo.ts = curTime; } /** * 关闭stamement连接 * * @param psmt */ private void close(Statement psmt) { try { if (psmt != null) { psmt.close(); psmt = null; } } catch (SQLException e) { ; } } private void close(ResultSet rs) { try { if (rs != null) { rs.close(); rs = null; } } catch (SQLException e) { ; } } /** * 更改LO的属性值 * * @param bo * @return * @throws SQLException */ public boolean updateLinkObject(LinkObject lo, Map attrMap) throws SQLException { String tableName = OmdHelper.getLTTableName(lo.ltName); Session session = HibernateSessionFactory.getSession(); String sql = getUpdateLOSql(lo, tableName, attrMap); SQLQuery query = session.createSQLQuery(sql); prepareUpdateLOPsmt(query, lo, attrMap); query.executeUpdate(); return true; } /** * 批量更改LO对象属性值 * * @param los * @return * @throws Throwable * @throws Exception */ public boolean batchUpdateLinkObject(LinkObject[] los) throws Exception, Throwable { Map> loAttrMap = new HashMap>(); for (LinkObject lo : los) { if (loAttrMap.get(lo.ltName) == null) { Map attrMap = this.getLOAttributeItemDefaultValMap(lo.ltName); loAttrMap.put(lo.ltName, attrMap); } updateLinkObject(lo, loAttrMap.get(lo.ltName)); } return true; } boolean isLOAttribute(String attrName, Map attrMap) { if (attrMap.containsKey(attrName.toLowerCase()) || attrMap.containsKey(attrName.toUpperCase()) || LinkConstants.isLinkConstants(attrName.toUpperCase())) { return true; } else { return false; } } /** * 准备更改LO属性的SQL语句 * * @param lo * @return */ private String getUpdateLOSql(LinkObject lo, String tableName, Map attrMap) { String sql = ""; StringBuffer sbSql = new StringBuffer().append("UPDATE ").append(tableName).append(" set ") .append("LASTMODIFIER = ?").append(", LASTMODIFYTIME = ?"); // Set set = LinkConstants.SELECT_NOT_TO_CONSTANTS.keySet(); for (int i = 0; i < lo.newAttrValList.length; i++) { /* * if (set.contains(lo.newAttrValList[i].attrName)) { continue; } */ if (!isLOAttribute(lo.newAttrValList[i].attrName, attrMap)) { // modify by zhonggy 2015-1-3 continue; } sbSql.append(", "); sbSql.append(lo.newAttrValList[i].attrName).append("=?"); } // 2013-12-03增加 更新"TS"逻辑(gaonb) sbSql.append(" ,TS = ?"); // 2013-12-03增加 更新"TS"逻辑(gaonb) sbSql.append(" WHERE OID = ? and TS = ?"); sql = sbSql.toString(); return sql; } /** * 准备更改属性值 * * @param psmt * @param bo * @throws SQLException */ private void prepareUpdateLOPsmt(SQLQuery query, LinkObject lo, Map attrMap) throws SQLException { int index = 0; long curTime = System.currentTimeMillis(); Timestamp ts = new Timestamp(curTime); // 对象特有属性 // query.setString(index++, lo.lastModifier); // 对象保存修改人后台统一处理 modify by zhonggy 2015-1-3 String userName = HibernateSessionFactory.getVciSessionInfo().userName; if (!StringUtils.isBlank(userName)) { lo.creator = userName; lo.modifier = userName; } query.setString(index++, lo.creator); query.setTimestamp(index++, ts); // Set set = LinkConstants.SELECT_NOT_TO_CONSTANTS.keySet(); for (int i = 0; i < lo.newAttrValList.length; i++) { /* * if (set.contains(lo.newAttrValList[i].attrName)) { continue; } */ if (!isLOAttribute(lo.newAttrValList[i].attrName, attrMap)) { // modify by zhonggy 2015-1-3 continue; } query.setString(index++, lo.newAttrValList[i].attrVal); } // 2013-12-03增加 更新"TS"逻辑(gaonb) query.setTimestamp(index++, ts); // 2013-12-03增加 更新"TS"逻辑(gaonb) // 对象固有属性 query.setString(index++, lo.oid); query.setTimestamp(index++, new Timestamp(lo.ts)); // lo.lastModifier = HibernateSessionFactory.getVciSessionInfo().userName; // //对象保存修改人后台统一处理 modify by zhonggy 2015-1-3 lo.ts = curTime; lo.modifyTime = curTime; } /** * 删除LO对象 * * @param lo * @return * @throws SQLException */ public boolean deleteLinkObject(LinkObject lo) throws SQLException { String tableName = OmdHelper.getLTTableName(lo.ltName); Session session = HibernateSessionFactory.getSession(); String sql = getDeleteLOSql(lo, tableName); SQLQuery query = session.createSQLQuery(sql); prepareDeleteLOPsmt(query, lo); query.executeUpdate(); return true; } /** * 批量删除LO对象 * * @param los * @return * @throws SQLException */ public boolean batchDeleteLinkObject(LinkObject[] los) throws SQLException { for (LinkObject lo : los) { deleteLinkObject(lo); } return true; } /** * 删除处于from端对象管理的Link * * @param los * @param bo */ public void deleteLinksByFromObj(String[] linkTypeNames, BusinessObject bo, int type) { for (int i = 0; i < linkTypeNames.length; i++) { deleteSingleLinkByFromObj(linkTypeNames[i], bo, type); } } public void getBatchDeleteLinksByFromObj(String[] linkTypeNames, BusinessObject bo, int type, List sqlList, Map tableMap) { String tableName; for (int i = 0; i < linkTypeNames.length; i++) { if (tableMap.get(linkTypeNames[i]) != null) { tableName = tableMap.get(linkTypeNames[i]); } else { tableName = OmdHelper.getLTTableName(linkTypeNames[i]); tableMap.put(linkTypeNames[i], tableName); } sqlList.add(getDeleteSingleLinkSqlByFromObj(tableName, bo, type)); } } public void deleteSingleLinkByFromObj(String linkTypeName, BusinessObject bo, int type) { String tableName = OmdHelper.getLTTableName(linkTypeName); String sql = ""; StringBuffer sbSql = new StringBuffer().append("DELETE FROM ").append(tableName).append(" WHERE "); if (type == 1) { sbSql.append("F_OID = '").append(bo.oid); } else if (type == 2) { sbSql.append("F_REVISIONOID = '").append(bo.revisionid); } else if (type == 3) { sbSql.append("F_NAMEOID = '").append(bo.nameoid); } sbSql.append("'"); sql = sbSql.toString(); SQLQuery query = HibernateSessionFactory.getSession().createSQLQuery(sql); query.executeUpdate(); } private String getDeleteSingleLinkSqlByFromObj(String tableName, BusinessObject bo, int type) { String sql = ""; StringBuffer sbSql = new StringBuffer().append("DELETE FROM ").append(tableName).append(" WHERE "); if (type == 1) { sbSql.append("F_OID = '").append(bo.oid); } else if (type == 2) { sbSql.append("F_REVISIONOID = '").append(bo.revisionid); } else if (type == 3) { sbSql.append("F_NAMEOID = '").append(bo.nameoid); } sbSql.append("'"); sql = sbSql.toString(); return sql; } /** * shanch * * @param los * @param bo */ public void deleteLinksbyToObj(String[] linkTypeNames, BusinessObject bo, int type) { for (int i = 0; i < linkTypeNames.length; i++) { deleteSingleLinkbyToObj(linkTypeNames[i], bo, type); } } public void getBatchDeleteLinksByToObj(String[] linkTypeNames, BusinessObject bo, int type, List sqlList, Map tableMap) { String tableName; for (int i = 0; i < linkTypeNames.length; i++) { if (tableMap.get(linkTypeNames[i]) != null) { tableName = tableMap.get(linkTypeNames[i]); } else { tableName = OmdHelper.getLTTableName(linkTypeNames[i]); tableMap.put(linkTypeNames[i], tableName); } sqlList.add(getDeleteSingleLinkSqlbyToObj(tableName, bo, type)); } } public void deleteSingleLinkbyToObj(String linkTypeName, BusinessObject bo, int type) { String tableName = OmdHelper.getLTTableName(linkTypeName); String sql = ""; StringBuffer sbSql = new StringBuffer().append("DELETE FROM ").append(tableName).append(" WHERE "); if (type == 1) { sbSql.append("T_OID = '").append(bo.oid); } else if (type == 2) { sbSql.append("T_REVISIONOID = '").append(bo.revisionid); } else if (type == 3) { sbSql.append("T_NAMEOID = '").append(bo.nameoid); } sbSql.append("'"); sql = sbSql.toString(); SQLQuery query = HibernateSessionFactory.getSession().createSQLQuery(sql); query.executeUpdate(); } private String getDeleteSingleLinkSqlbyToObj(String tableName, BusinessObject bo, int type) { String sql = ""; StringBuffer sbSql = new StringBuffer().append("DELETE FROM ").append(tableName).append(" WHERE "); if (type == 1) { sbSql.append("T_OID = '").append(bo.oid); } else if (type == 2) { sbSql.append("T_REVISIONOID = '").append(bo.revisionid); } else if (type == 3) { sbSql.append("T_NAMEOID = '").append(bo.nameoid); } sbSql.append("'"); sql = sbSql.toString(); return sql; } /** * 构建删除LO的SQL语句 * * @param lo * @return */ private String getDeleteLOSql(LinkObject lo, String tableName) { String sql = ""; StringBuffer sbSql = new StringBuffer().append("DELETE FROM ").append(tableName).append(" WHERE OID = ?"); // 2013-12-03 增加TS判断逻辑(gaonb) sql = sbSql.append(" and TS =? ").toString(); // 2013-12-03 增加TS判断逻辑(gaonb) return sql; } /** * 准备删除LO的数据 * * @param psmt * @param bo * @throws SQLException */ private void prepareDeleteLOPsmt(SQLQuery query, LinkObject lo) throws SQLException { int index = 0; // 对象固有属性 query.setString(index++, lo.oid); // 2013-12-03 删除增加TS判断逻辑 query.setTimestamp(index++, new Timestamp(lo.ts)); // 2013-12-03 删除增加TS判断逻辑 } /** * 根据对象ID获取对象的指定属性列值 * * @param oid * @param linkTypeName * @param queryColumns * @return * @throws Throwable * @throws Exception */ @SuppressWarnings("deprecation") public LinkObject[] getLinkObjectByBO(BusinessObject bo, String linkTypeName, boolean isFrom) throws Exception, Throwable { String tableName = OmdHelper.getLTTableName(linkTypeName); AttribItem[] loAttributes = getLOAttributeItem(linkTypeName); String sql = getSelectLOSql(bo.oid, tableName, loAttributes, isFrom); Session session = HibernateSessionFactory.getSession(); Statement stmt = session.connection().createStatement(); ResultSet rs = stmt.executeQuery(sql); ArrayList los = new ArrayList(); LinkObject lo = null; while (rs.next()) { lo = createLOByRS(rs, loAttributes); lo.ltName = linkTypeName; los.add(lo); } close(rs); close(stmt); return los.toArray(new LinkObject[0]); } private LinkObject createLOByRS(ResultSet rs, AttribItem[] loAttributes) throws SQLException { LinkObject lo = new LinkObject(); int index = 1; lo.oid = rs.getString(index++); lo.creator = rs.getString(index++); lo.createTime = rs.getTimestamp(index++).getTime(); lo.modifier = rs.getString(index++); lo.modifyTime = rs.getTimestamp(index++).getTime(); lo.fromOid = rs.getString(index++); lo.fromRevOid = rs.getString(index++); lo.fromNameOid = rs.getString(index++); lo.fromBTName = rs.getString(index++); lo.toOid = rs.getString(index++); lo.toRevOid = rs.getString(index++); lo.toNameOid = rs.getString(index++); lo.toBTName = rs.getString(index++); lo.ts = rs.getTimestamp(index++).getTime(); ArrayList list = new ArrayList(); for (int i = 0; i < loAttributes.length; i++) { AttributeValue attrVal = new AttributeValue(); attrVal.attrName = loAttributes[i].name; attrVal.attrVal = rs.getString(index++); list.add(attrVal); } lo.newAttrValList = new AttributeValue[0]; lo.hisAttrValList = list.toArray(new AttributeValue[list.size()]); return lo; } // // /** // * 根据对象ID获取对象的指定属性列值 // * // * @param oid // * @param linkTypeName // * @param queryColumns // * @return // * @throws Throwable // * @throws Exception // */ // @SuppressWarnings("deprecation") // public LinkObject[] getLinkObjectByToBO(BusinessObject bo, String linkTypeName, boolean isFrom) // throws Exception, Throwable { // String tableName = getLinkTypeTableName(linkTypeName); // // Session session = HibernateSessionFactory.getSession(); // // AttribItem[] loAttributes = getLOAttributeItem(linkTypeName); // // String sql = getSelectLOSql(bo.oid, tableName, loAttributes, isFrom); // Statement stmt = session.connection().createStatement(); // ResultSet rs = stmt.executeQuery(sql); // ArrayList los = new ArrayList(); // LinkObject lo = null; // while (rs.next()) { // lo = new LinkObject(); // int index = 1; // lo.oid = rs.getString(index++); // lo.creator = rs.getString(index++); // lo.createTime = String.valueOf(rs.getTimestamp(index++)); // lo.lastModifier = rs.getString(index++); // lo.lastModifyTime = String.valueOf(rs.getTimestamp(index++)); // lo.fromOid = rs.getString(index++); // lo.fromRevisionOid = rs.getString(index++); // lo.fromNameOid = rs.getString(index++); // lo.fromBTMName = rs.getString(index++); // lo.toOid = rs.getString(index++); // lo.toRevisionOid = rs.getString(index++); // lo.toNameOid = rs.getString(index++); // lo.toBTMName = rs.getString(index++); // lo.ts = String.valueOf(rs.getTimestamp(index++)); // // lo.linkTypeName = linkTypeName; // // ArrayList list = new ArrayList(); // for (int i = 0; i < loAttributes.length; i++) { // AttributeValue attrVal = new AttributeValue(); // attrVal.attrName = loAttributes[i].name; // attrVal.attrVal = rs.getString(index++); // list.add(attrVal); // } // lo.newAttrValList = new AttributeValue[0]; // lo.hisAttrValList = list.toArray(new AttributeValue[list.size()]); // los.add(lo); // } // close(rs); // close(stmt); // // return los.toArray(new LinkObject[0]); // } /** * 根据id和链接类型名称获取指定的链接对象 * * @param oid * @param linkTypeName * @return */ public LinkObject readLinkObjectById(String oid, String linkTypeName) throws Exception, Throwable { String tableName = OmdHelper.getLTTableName(linkTypeName); AttribItem[] loAttributes = getLOAttributeItem(linkTypeName); String sql = getSelectLOByIdSql(oid, tableName, loAttributes); Session session = HibernateSessionFactory.getSession(); Statement stmt = session.connection().createStatement(); ResultSet rs = stmt.executeQuery(sql); LinkObject lo = new LinkObject(); if (rs.next()) { lo = createLOByRS(rs, loAttributes); lo.ltName = linkTypeName; } close(rs); close(stmt); return lo; // SQLQuery query = session.createSQLQuery(sql); // List queryList = query.list(); // if (queryList == null || queryList.size() < 1) { // return new LinkObject(); // } // // Object[] array = (Object[]) queryList.get(0); // ServerLinkObject slo = new ServerLinkObject(); // String[] queryColumns = slo.getQueryColumnAccordingToSQL(sql, "SELECT", "FROM " + tableName); // // String attrType = ""; // int j = 0; // for (int i = 0; i < array.length; i++) { // if (i < array.length - loAttributes.length) { // attrType = ""; // } else { // attrType = loAttributes[j++].vtDataType; // } // slo.setAttributeValue(queryColumns[i], attrType, array[i]); // } // // LinkObject lo = slo.getLinkObject(); // lo.ltName = linkTypeName; // return slo.getLinkObject(); } /** * 构建查询SQL语句 * * @param oid * @param ltName * @param queryColumns * @return */ private String getSelectLOSql(String fromOId, String tableName, AttribItem[] queryColumns, boolean isFrom) { String sql = ""; StringBuffer sbFields = new StringBuffer( "SELECT OID,CREATOR,CREATETIME,LASTMODIFIER,LASTMODIFYTIME,F_OID,F_REVISIONOID,F_NAMEOID,F_BTWNAME," + "T_OID,T_REVISIONOID,T_NAMEOID,T_BTWNAME,TS"); for (int i = 0; i < queryColumns.length; i++) { sbFields.append(","); sbFields.append(queryColumns[i].name); } sbFields.append(" FROM ").append(tableName).append(" p where "); if (isFrom) { sbFields.append("p.F_OID"); } else { sbFields.append("p.T_OID"); } sbFields.append(" = '").append(fromOId).append("'"); sql = sbFields.toString(); return sql; } /** * 获取根据oid,类型获取链接对象的查询语句 * * @param oid * @param tableName * @param queryColumns * @return */ private String getSelectLOByIdSql(String oid, String tableName, AttribItem[] queryColumns) { String sql = ""; StringBuffer sbFields = new StringBuffer( "SELECT OID,CREATOR,CREATETIME,LASTMODIFIER,LASTMODIFYTIME,F_OID,F_REVISIONOID,F_NAMEOID,F_BTWNAME," + "T_OID,T_REVISIONOID,T_NAMEOID,T_BTWNAME,TS"); for (int i = 0; i < queryColumns.length; i++) { sbFields.append(","); sbFields.append(queryColumns[i].name); } sbFields.append(" FROM ").append(tableName).append(" p where p.OID = '").append(oid).append("'"); sql = sbFields.toString(); return sql; } }