package com.vci.server.omd.biztype.service; import java.io.File; import java.io.IOException; import java.math.BigDecimal; import java.sql.Clob; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.hibernate.HibernateException; import org.hibernate.SQLQuery; import org.hibernate.Session; import com.vci.common.log.ServerWithLog4j; import com.vci.common.resource.CommonProperties; import com.vci.common.utility.ObjectUtility; import com.vci.corba.omd.atm.AttribItem; import com.vci.corba.omd.btm.BtmAndApName; import com.vci.corba.omd.btm.BtmItem; import com.vci.corba.omd.data.SystemModelData; import com.vci.omd.constants.OmdConstants; import com.vci.server.base.persistence.dao.HibernateSessionFactory; import com.vci.server.base.utility.OmdHelper; import com.vci.server.cache.OMCacheProvider; import com.vci.server.omd.common.OmdViewTool; import com.vci.server.omd.ddlTool.DDLHelper; import com.vci.server.omd.delegate.SystemConfDelegate; import com.vci.corba.common.VCIError; @SuppressWarnings("deprecation") public class BTMService { private static BTMService instance; /** * 业务类型的系统属性 */ // private static String otherFieldBt = "\n\tOID VARCHAR2(36) not null," + // "\n\tREVISIONOID VARCHAR2(36),\n\tNAMEOID VARCHAR2(36),\n\tBtmName VARCHAR2(36)," + // "\n\tISLastR CHAR(1),\n\tISFirstR CHAR(1),\n\tISLastV CHAR(1),\n\tISFirstV CHAR(1)," + // "\n\tCreator VARCHAR2(36)," + // "\n\tCreateTime TIMESTAMP,\n\tLastModifier VARCHAR2(36),\n\tLastModifyTime TIMESTAMP," + // "\n\tRevisionRule VARCHAR2(36),\n\tVersionRule VARCHAR2(36),\n\tRevisionSeq NUMBER," + // "\n\tRevisionValue VARCHAR2(10),\n\tVersionSeq NUMBER,\n\tVersionValue VARCHAR2(10)," + // "\n\tLCTID VARCHAR2(36),\n\tLCStatus VARCHAR2(36),\n\tTS TIMESTAMP," + // "\n\tID VARCHAR2(36),\n\tNAME VARCHAR2(128),\n\tDESCRIPTION VARCHAR2(255)," + // "\n\tOWNER VARCHAR2(36),\n\tCHECKINBY VARCHAR2(36),\n\tCHECKINTIME TIMESTAMP," + // "\n\tCHECKOUTBY VARCHAR2(36),\n\tCHECKOUTTIME TIMESTAMP,\n\tCOPYFROMVERSION VARCHAR2(36),\n\t"; private BTMService() { } public static BTMService getInstance() { if (instance == null) { instance = new BTMService(); } return instance; } /** * 获取名字以filter开始的业务类型(for 查询) 获取全部业务类型:filter为"" * * @throws Exception */ public BtmItem[] getAllBtmItem(String filter) throws Exception { // String sql = "select oid, name, label, description, ts, creator, createtime, // modifier, modifytime, t.content.getclobval() content from plbtmtype t"; String sql = ""; switch (HibernateSessionFactory.getDbType()) { case DM8: sql = "select oid, name, label, description, ts, creator, createtime, modifier, modifytime, content from plbtmtype t"; break; case ORACL: default: sql = "select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plbtmtype t"; break; } if (!filter.equals("")) { sql = sql + " where t.name like '" + filter + "%'"; } sql = sql + " order by name "; Connection connection = HibernateSessionFactory.getSessionConnection(); PreparedStatement pst = connection.prepareStatement(sql); ResultSet rs = pst.executeQuery(); ServerWithLog4j.logger.debug(sql); List bts = new ArrayList(); while (rs.next()) { BtmItem bt = getBT(rs); bts.add(bt); } rs.close(); pst.close(); return bts.toArray(new BtmItem[0]); } /** * 获取当前业务类型下所有子业务类型的定义 * * @param btmName * @return * @throws Exception */ public BtmItem[] getChildrenBtms(String btmName) throws Exception { // String sql = "select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plbtmtype t" // + " where extractvalue(content, '/btm/fName') = ?"; String sql = ""; switch (HibernateSessionFactory.getDbType()) { case DM8: sql = "select oid, name, label, description, ts, creator, createtime, modifier, modifytime, content from plbtmtype t" + " where extractvalue(content, '/btm/fName') = ?"; break; case ORACL: default: sql = "select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plbtmtype t" + " where extractvalue(content, '/btm/fName') = ?"; break; } Connection connection = HibernateSessionFactory.getSessionConnection(); PreparedStatement pst = connection.prepareStatement(sql); pst.setString(1, btmName); ResultSet rs = pst.executeQuery(); ServerWithLog4j.logger.debug(sql); List bts = new ArrayList(); while (rs.next()) { BtmItem bt = getBT(rs); bts.add(bt); } rs.close(); pst.close(); return bts.toArray(new BtmItem[0]); } /** * 获取属性名以及对应的业务类型名 * * @throws Throwable */ public BtmAndApName[] getBtmAndApNameArray(String btmName) throws Throwable { ArrayList btmAndeApNameList = new ArrayList(); while (!btmName.equals("")) { BtmItem bt = getBtmItemByName(btmName); BtmAndApName btmAndApName = new BtmAndApName(); btmAndApName.btmName = btmName; btmAndApName.apName = bt.apNameArray; btmAndeApNameList.add(btmAndApName); btmName = bt.fName; } return btmAndeApNameList.toArray(new BtmAndApName[0]); } /** * 删除业务类型 * * @throws Exception */ public boolean deleteBtmItem(BtmItem bt) throws Exception { boolean flag = false; Connection connection = HibernateSessionFactory.getSessionConnection(); String tableName = OmdHelper.getBTTableName(bt.name); // 删除表 DDLHelper.dropTable(tableName); // 删除对象类型记录 String sql = "delete from plbtmtype where oid = ? and ts = ?"; PreparedStatement pst = connection.prepareStatement(sql); pst.setString(1, bt.oid); pst.setTimestamp(2, new Timestamp(bt.ts)); pst.executeUpdate(); ServerWithLog4j.logger.debug(sql); pst.close(); flag = true; return flag; } public boolean deleteBtmItemNoCache(BtmItem bt) throws Exception { boolean flag = false; String sql = "delete from plbtmtype where oid = ? and ts = ?"; Connection connection = HibernateSessionFactory.getSessionConnection(); PreparedStatement pst = connection.prepareStatement(sql); pst.setString(1, bt.oid); pst.setTimestamp(2, new Timestamp(bt.ts)); pst.executeUpdate(); ServerWithLog4j.logger.debug(sql); pst.close(); flag = true; return flag; } /** * 删除业务类型 * * @throws Exception */ public boolean deleteBtmItems(BtmItem[] bts) throws Exception { boolean flag = false; for (BtmItem bt : bts) { deleteBtmItem(bt); } flag = true; return flag; } /** * 检查要插入的记录是否存在 * * @throws Exception */ public boolean checkRowIsExists(String name) throws Exception { String sql = "select count(name) count from plbtmtype t where t.name = ?"; Connection connection = HibernateSessionFactory.getSessionConnection(); PreparedStatement pst = connection.prepareStatement(sql); pst.setString(1, name); ResultSet rs = pst.executeQuery(); ServerWithLog4j.logger.debug(sql); while (rs.next()) { int count = rs.getInt("count"); if (count > 0) { return true; } else { return false; } } rs.close(); pst.close(); return false; } /** * 增加业务类型 * * @throws Exception */ public boolean addBtmItem(BtmItem bt) throws Exception { String insertSql = "insert into plbtmtype (OID, NAME, LABEL, DESCRIPTION, TS, CREATOR, CREATETIME, MODIFIER, MODIFYTIME, CONTENT) values(?,?,?,?,?,?,?,?,?,xmltype(?))"; long time = Calendar.getInstance().getTimeInMillis(); Timestamp ts = new Timestamp(time); Connection connection = HibernateSessionFactory.getSessionConnection(); PreparedStatement pst = connection.prepareStatement(insertSql); bt.oid = ObjectUtility.getNewObjectID36(); int index = 1; pst.setString(index++, bt.oid); pst.setString(index++, bt.name); pst.setString(index++, bt.label); pst.setString(index++, bt.description); pst.setTimestamp(index++, ts); pst.setString(index++, bt.creator); pst.setTimestamp(index++, ts); pst.setString(index++, bt.modifier); pst.setTimestamp(index++, ts); String xmlText = getXmlText(bt); // CLOB content = BTMServiceImplHelper.getInstance().getXmlTypeContent(xmlText, // connection); // pst.setObject(10, content); pst.setString(index++, xmlText); int size = pst.executeUpdate(); ServerWithLog4j.logger.debug(insertSql); pst.close(); if (size > 0) { bt.createTime = time; bt.modifyTime = time; bt.ts = time; } return size > 0; } /** * 更改业务类型 * * @throws Exception */ public boolean updateBtmItem(BtmItem bt) throws Exception { String sql = "update plbtmtype t set t.name=?, t.label=?, t.description=?, t.ts=?, t.modifier=?, t.modifytime=?, t.content=xmltype(?) where t.oid=? and t.ts = ?"; Connection conn = HibernateSessionFactory.getSessionConnection(); PreparedStatement pst = conn.prepareStatement(sql); long time = Calendar.getInstance().getTimeInMillis(); Timestamp ts = new Timestamp(time); int index = 1; pst.setString(index++, bt.name); pst.setString(index++, bt.label); pst.setString(index++, bt.description); pst.setTimestamp(index++, ts); pst.setString(index++, bt.modifier); pst.setTimestamp(index++, ts); String xmlText = getXmlText(bt); // CLOB content = BTMServiceImplHelper.getInstance().getXmlTypeContent(xmlText, // conn); // pst.setObject(9, content); pst.setString(index++, xmlText); pst.setString(index++, bt.oid); pst.setTimestamp(index++, new Timestamp(bt.ts)); int size = pst.executeUpdate(); ServerWithLog4j.logger.debug(sql); pst.close(); if (size > 0) { bt.modifyTime = time; bt.ts = time; } return size > 0; } /** * 获取业务类型的属性名数组 * * @throws Exception */ public String[] getBtmApNameArray(String btmName) throws Exception { List list = new ArrayList(); // String sql = "select oid, name, label, description, ts, creator, createtime, // modifier, modifytime, t.content.getclobval() content from plbtmtype t start // with name = ? connect by prior extractvalue(content, '/btm/fName') = name"; String sql = ""; switch (HibernateSessionFactory.getDbType()) { case DM8: sql = "select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plbtmtype t " + "start with name = ? connect by prior extractvalue(content, '/btm/fName') = name"; break; case ORACL: default: sql = "select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plbtmtype t " + "start with name = ? connect by prior extractvalue(content, '/btm/fName') = name"; break; } Connection connection = HibernateSessionFactory.getSessionConnection(); PreparedStatement pst = connection.prepareStatement(sql); pst.setString(1, btmName); ResultSet rs = pst.executeQuery(); ServerWithLog4j.logger.debug(sql); while (rs.next()) { BtmItem bt = getBT(rs); // _list为固定大小的列表, 不支持add/remove List _list = Arrays.asList(bt.apNameArray); list.addAll(_list); } rs.close(); pst.close(); return list.toArray(new String[0]); } /** * 根据属性名获取使用该属性名的全部业务类型名 * * @throws Exception */ public String[] getBTMNamesByAPName(String apName) throws Exception { String sql = "select t.name from plbtmtype t start with extractvalue(content, '/btm/apNameArray') like ? or extractvalue(content, '/btm/apNameArray') like ?" + "or extractvalue(content, '/btm/apNameArray') like ? or extractvalue(content, '/btm/apNameArray') = ? connect by prior t.name = extractvalue(content, '/btm/fName')"; Connection conn = HibernateSessionFactory.getSessionConnection(); PreparedStatement pst = conn.prepareStatement(sql); pst.setString(1, apName + ",%"); pst.setString(2, "%," + apName); pst.setString(3, "%," + apName + ",%"); pst.setString(4, apName); ResultSet rs = pst.executeQuery(); ServerWithLog4j.logger.debug(sql); Set set = new HashSet(); while (rs.next()) { set.add(rs.getString("name")); } rs.close(); pst.close(); return set.toArray(new String[0]); } /** * (对外)提供业务类型的数据文件数据 */ public String getBTMData() throws VCIError { return ""; } /** * 根据版本规则名获取使用该版本规则的全部业务类型名 * * @throws Exception */ public String[] getBTMNamesByVerName(String verName) throws Exception { String sql = "select t.name from plbtmtype t where extractvalue(content, '/btm/revRuleName') = ?"; Connection conn = HibernateSessionFactory.getSessionConnection(); PreparedStatement pst = conn.prepareStatement(sql); pst.setString(1, verName); ResultSet rs = pst.executeQuery(); ServerWithLog4j.logger.debug(sql); List list = new ArrayList(); while (rs.next()) { list.add(rs.getString("name")); } rs.close(); pst.close(); return list.toArray(new String[0]); } /** * 根据生命周期名获取使用该生命周期的全部业务类型名 * * @throws Exception */ public String[] getBTMNamesByLCyName(String lCyName) throws Exception { String sql = "select t.name from plbtmtype t where extractvalue(content, '/btm/lifeCycle') = ?"; Connection conn = HibernateSessionFactory.getSessionConnection(); PreparedStatement pst = conn.prepareStatement(sql); pst.setString(1, lCyName); ResultSet rs = pst.executeQuery(); ServerWithLog4j.logger.debug(sql); List list = new ArrayList(); while (rs.next()) { list.add(rs.getString("name")); } rs.close(); pst.close(); return list.toArray(new String[0]); } /** * 获取业务类型的子类型名 * * @throws Exception */ public String[] getChildrenNames(String btmName) throws Exception { String sql = "select t.name from plbtmtype t start with t.name = ? connect by prior t.name = extractvalue(content, '/btm/fName')"; Connection conn = HibernateSessionFactory.getSessionConnection(); PreparedStatement pst = conn.prepareStatement(sql); pst.setString(1, btmName); ResultSet rs = pst.executeQuery(); ServerWithLog4j.logger.debug(sql); Set set = new HashSet(); while (rs.next()) { set.add(rs.getString("name")); } set.remove(btmName); rs.close(); pst.close(); return set.toArray(new String[0]); } /** * 将服务端image是路径下的文件 , 以images/fileName的形式返回 * * @throws VCIError */ public String[] getImagePaths() throws VCIError { String imagePath = CommonProperties.getStringProperty("imagePath"); File imageFolder = new File(imagePath); File[] files = imageFolder.listFiles(); ArrayList pathList = new ArrayList(); for (File file : files) { String name = file.getName(); pathList.add("images/" + name); } return pathList.toArray(new String[0]); } /** * 根据传入的业务对象名称,获取对象建模的所有数据(参数为空时,获取所有建模数据) * * @throws Throwable */ public SystemModelData getAllConfigurationData(String[] boTypes) throws Throwable { return SystemConfDelegate.getInstance().getAllConfigurationData(boTypes); } /** * 业务类型与数据库一致性检查 * * @throws Exception */ public String[] btmConsistencyCheck() throws Exception { List infoList = new ArrayList(); // AttribItem[] attrs = AttrPoolService.getInstance().getAttribItems(null, 0, 0); // Map mapAttr = new HashMap(); // for (AttribItem attr : attrs) { // mapAttr.put(attr.name.toLowerCase(), attr); // } BtmItem[] btms = getAllBtmItem(""); List tableNameList = getAllBtmTables(); // modify by weidy@2021-10-27 // 可能这个东西是视图 List viewNameList = getAllBtmViews(); Map> map = getTableAndCols(); // List lstLackAttr = new ArrayList(); StringBuilder info = new StringBuilder(); for (int i = 0; i < btms.length; i++) { info.setLength(0); BtmItem btm = btms[i]; String tableName = OmdHelper.getBTTableName(btm.name).toLowerCase(); // 视图的话,就不管sql了 if (viewNameList.contains(tableName)) { continue; } if (!tableNameList.contains(tableName)) { info.append(btm.name).append("/DML_CREATE"); infoList.add(info.toString()); continue; } //String[] abNames = BtmHelper.getAbNames(btm.name); String[] abNames = OMCacheProvider.getBTAttributes(btm.name); List colList = map.get(tableName); List addList = new ArrayList(); List dropList = new ArrayList(); for (int k = 0; k < abNames.length; k++) { String abName = abNames[k].toLowerCase(); // if (!mapAttr.containsKey(abName)) { // lstLackAttr.add(abName); // } if (colList == null || !colList.contains(abName)) { addList.add(abName); } else { colList.remove(abName); } } if (colList != null) { dropList = colList; } if (addList.size() > 0) { info.append(btm.name).append("/DML_ADD("); for (int k = 0; k < addList.size(); k++) { String abName = addList.get(k); info.append(abName).append(","); } info.setCharAt(info.lastIndexOf(","), ')'); } if (dropList.size() > 0) { if (info.length() == 0) { info.append(btm.name).append("/DML_DROP("); } else { info.append(";_DROP("); } for (int k = 0; k < dropList.size(); k++) { String abName = dropList.get(k); info.append(abName).append(","); } info.setCharAt(info.lastIndexOf(","), ')'); } if (info.length() > 0) { infoList.add(info.toString()); } } // info.setLength(0); // if (lstLackAttr.size() > 0) { // for (String attr : lstLackAttr) { // if (info.length() == 0) // info.append("attribute/DML_LACK(").append(attr); // else // info.append(",").append(attr); // } // info.append(")"); // infoList.add(info.toString()); // } return infoList.toArray(new String[0]); } /** * 执行修复的sql, 并返回修复结果 修复完全成功的, 返回类型名 修复部分成功的, 返回类型名+成功的部分信息 * * @throws Throwable */ public String[] executeRepair(String[] sqlArray) throws Throwable { List list = new ArrayList(); for (int i = 0; i < sqlArray.length; i++) { String[] sqlInfo = sqlArray[i].split("/DML"); String type = sqlInfo[0]; String sql = sqlInfo[1]; if (sql.contains(";")) { String[] sqls = sql.split(";"); String addSql = parseToSql(type, sqls[0]); String dropSql = parseToSql(type, sqls[1]); boolean addFlag = DDLHelper.executeSql(addSql); boolean dropFlag = DDLHelper.executeSql(dropSql); if (addFlag && dropFlag) { list.add(type); } else if (addFlag) { list.add(type + "_ADD"); } else if (dropFlag) { list.add(type + "_DROP"); } } else { String sql_ = parseToSql(type, sql); boolean flag = DDLHelper.executeSql(sql_); if (sql_.toLowerCase().contains("create table " + OmdHelper.getBTTableName(type).toLowerCase())) { String consSql = getAddPKSql(type); boolean flag_ = DDLHelper.executeSql(consSql); if (flag && flag_) { list.add(type); } } else if (flag) { list.add(type); } } } return list.toArray(new String[0]); } /** * 如果一个业务类型包含子类型, 创建业务类型视图 * * @throws Throwable */ public boolean createTable(String btName) throws Throwable { BtmItem btItem = getBtmItemByName(btName); String sqlCreate = getCreateBTMTableSql(btItem); String sqlAlter = getAddPKSql(btItem.name); Session session = HibernateSessionFactory.getSession(); SQLQuery query; if (!sqlCreate.equals("")) { query = session.createSQLQuery(sqlCreate); int re = query.executeUpdate(); if (re < 0) { return false; } } if (!sqlAlter.equals("")) { query = session.createSQLQuery(sqlAlter); int re = query.executeUpdate(); if (re < 0) { return false; } } return true; } /** * 如果一个业务类型包含子类型, 创建业务类型视图 * * @throws Exception */ public boolean createView() throws Exception { Session session = HibernateSessionFactory.getSession(); SQLQuery createSQLQuery; BtmItem[] allBtmItem = getAllBtmItem(""); for (BtmItem bt : allBtmItem) { String[] childrenNames = getChildrenNames(bt.name); if (childrenNames.length > 0) { List asList = Arrays.asList(childrenNames); asList.add(bt.name); String vName = OmdViewTool.getBtViewName(bt.name); String vSql = OmdViewTool.getBTSViewSql(asList.toArray(new String[0]), vName); if (!vSql.equals("")) { createSQLQuery = session.createSQLQuery(vSql); int re = createSQLQuery.executeUpdate(); if (re < 0) { return false; } } } } return true; } /** * 清空业务表, 业务类型 * * @throws Exception */ public boolean deleteBtsAndTables(BtmItem[] bts) throws Exception { deleteBtmItems(bts); Session session = HibernateSessionFactory.getSession(); for (BtmItem bt : bts) { String tableName = OmdHelper.getBTTableName(bt.name); String sql = "drop table " + tableName; try { session.createSQLQuery(sql).executeUpdate(); // 处理HibernateException, 保证一条sql不成功时, 继续执行下一条. } catch (HibernateException e) { e.printStackTrace(); } } return true; } /** * 获取表中fields中不能 删除的字段 * * @throws Throwable */ public String[] getUnRemovableFields(String tableName, String[] fields) throws Throwable { try{ List list = new ArrayList(); Session session = HibernateSessionFactory.getSession(); for(String field : fields){ String sql = "select count(oid) from " + tableName + " where " + field + " is not null"; int count = ((BigDecimal)session.createSQLQuery(sql).list().get(0)).intValue(); if(count > 0){ list.add(field); } } return list.toArray(new String[0]); }catch(Throwable e){ throw e; } } public boolean xml2DB(String userName) throws VCIError { // List news = Xml2DBDelegate.getInstance().getNews(userName); // if (news == null) { // return true; // } // for (BtmItem o : news) { // try { // addBtmItemNoCache(o); // } catch (Throwable e) { // e.printStackTrace(); // ServerWithLog4j.logger.info(o.name + "迁移失败, 业务类型的迁移中止!"); // return false; // } // } return true; } // public boolean addBtmItemNoCache(BtmItem btmItem) throws Exception { // boolean flag = false; // String insertSql = "insert into plbtmtype values(?,?,?,?,?,?,?,?,?,xmltype(?))"; // Connection connection = HibernateSessionFactory.getSessionConnection(); // PreparedStatement pst = connection.prepareStatement(insertSql); // pst.setString(1, ObjectUtility.getNewObjectID36()); // pst.setString(2, btmItem.name); // pst.setString(3, btmItem.label); // pst.setString(4, btmItem.description); // long time = Calendar.getInstance().getTimeInMillis(); // Timestamp ts = new Timestamp(time); // pst.setTimestamp(5, ts); // pst.setString(6, btmItem.creator); // pst.setTimestamp(7, ts); // pst.setString(8, btmItem.modifier); // pst.setTimestamp(9, ts); // String xmlText = BTMServiceHelper.getInstance().getXmlText(btmItem); // // CLOB content = BTMServiceImplHelper.getInstance().getXmlTypeContent(xmlText, // // connection); // // pst.setObject(10, content); // pst.setString(10, xmlText); // pst.executeUpdate(); // ServerWithLog4j.logger.debug(insertSql); // pst.close(); // flag = true; // return flag; // } /** * 若表tableName不存在,则用createSql创建表 */ public boolean checkTable(String tableName, String createSql) throws VCIError { try { String sql = "select count(table_name) count from user_tables where table_name = ?"; Connection connection = HibernateSessionFactory.getSessionConnection(); PreparedStatement pst = connection.prepareStatement(sql); pst.setString(1, tableName.toUpperCase()); ResultSet rs = pst.executeQuery(); ServerWithLog4j.logger.debug(sql); int count = 0; while (rs.next()) { count = rs.getInt("count"); } rs.close(); pst.close(); if (count < 1) { pst = connection.prepareStatement(createSql); pst.executeUpdate(); ServerWithLog4j.logger.debug(createSql); pst.close(); } } catch (SQLException e) { e.printStackTrace(); } return false; } // 根据id查询状态 public BtmItem getBTMByOid(String oid) throws Exception { // String sql = "select oid, name, label, description, ts, creator, createtime, // modifier, modifytime, t.content.getclobval() content from plbtmtype t where // t.oid =?"; String sql = ""; switch (HibernateSessionFactory.getDbType()) { case DM8: sql = "select oid, name, label, description, ts, creator, createtime, modifier, modifytime, content from plbtmtype t where t.oid =?"; break; case ORACL: default: sql = "select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plbtmtype t where t.oid =?"; break; } Connection connection = HibernateSessionFactory.getSessionConnection(); PreparedStatement pst = connection.prepareStatement(sql); pst.setString(1, oid); ResultSet rs = pst.executeQuery(); ServerWithLog4j.logger.debug(sql); BtmItem bt = null; while (rs.next()) { bt = getBT(rs); } rs.close(); pst.close(); return bt; } /** * 生成创建业务类型的DDL * @param btm * @return */ private String getCreateBTMTableSql(BtmItem btm){ String btmName = btm.name; String btmTableName = OmdHelper.getBTTableName(btmName); String sql = "create Table " + btmTableName + "(" + DDLHelper.getBTSysFields(); String[] apNames = btm.apNameArray; if(apNames != null && apNames.length != 0){ for(int k = 0; k < apNames.length; k++){ String abName = apNames[k]; AttribItem abItem = null; abItem = OMCacheProvider.getAttribute(abName); String abSql = DDLHelper.getAbSql(abItem); sql += abSql; } } sql = sql.substring(0, sql.lastIndexOf(",")); sql += "\n)"; return sql; } /** * 获取增加主键sql * @param typeName * @return */ private String getAddPKSql(String typeName){ return "alter table " + OmdHelper.getBTTableName(typeName) + " add constraint PKBTM_" + typeName + " primary key (OID)\n"; } /** * 获取业务类型属性总集合 * * @param btNames * @return */ // private Set getUserAttrNameSet(List btNames) { // Set set = new LinkedHashSet(); // try { // for (String btName : btNames) { // String[] abNames = getBtmApNameArray(btName); // for (String abName : abNames) { // set.add(abName); // } // } // } catch (Throwable e) { // e.printStackTrace(); // } // return set; // } /** * 获取各个业务类型查询属性总集合的sql 当业务业务类型中不包含某个属性attrA时, '' as attrA * * @param allAttrName * @param btNames * @return * @throws Exception */ // private Map getBTSqlMap(Set allAttrName, List btNames) throws Exception { // // 记录业务类型和与其对应的属性列表 // Map> btAttrMap = new HashMap>(); // // 记录业务类型和与其对应的查询sql // Map btSqlMap = new HashMap(); // String[] sysAbItems = OmdTools.getBtSysANames(); // String querySysAttrSql = "select " + StringUtils.join(sysAbItems, ","); // for (String btName : btNames) { // String[] abNames = getBtmApNameArray(btName); // btAttrMap.put(btName, Arrays.asList(abNames)); // btSqlMap.put(btName, new StringBuilder(querySysAttrSql)); // } // // for (String attrName : allAttrName) { // for (String btName : btNames) { // btSqlMap.get(btName).append(","); // if (btAttrMap.get(btName).contains(attrName)) { // btSqlMap.get(btName).append(attrName); // } else { // btSqlMap.get(btName).append("null as " + attrName); // } // } // } // // for (String btName : btNames) { // btSqlMap.get(btName).append(" from " + OmdTools.getBTMTableName(btName)); // } // return btSqlMap; // } public boolean hasData(String btName) { boolean flag = false; Session session = HibernateSessionFactory.getSession(); String table = OmdHelper.getBTTableName(btName); // 判断表是否存在, 表不存在则该表无数据 String sql_ = "select count(1) from user_tables where TABLE_NAME = '" + table + "'"; List list_ = session.createSQLQuery(sql_).list(); // 当list.get(i)中Object数量为1时, list.get(i)为Object // 当list.get(i)中Object数量 > 1时, list.get(i)为Object Object obj_ = list_.get(0); int count_ = ((BigDecimal) obj_).intValue(); if (count_ < 1) { return false; } String sql = "select count(*) from " + table; List list = session.createSQLQuery(sql).list(); // 当list.get(i)中Object数量为1时, list.get(i)为Object // 当list.get(i)中Object数量 > 1时, list.get(i)为Object Object obj = list.get(0); int count = ((BigDecimal) obj).intValue(); if (count > 0) { flag = true; } return flag; } //========================================================================= /** * 获取指定的业务类型 * @throws Throwable */ public BtmItem getBtmItemByName(String btmName) throws Throwable{ //String sql = "select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plbtmtype t where t.name =?"; String sql = ""; switch (HibernateSessionFactory.getDbType()) { case DM8: sql = "select oid, name, label, description, ts, creator, createtime, modifier, modifytime, content from plbtmtype t where t.name =?"; break; case ORACL: default: sql = "select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plbtmtype t where t.name =?"; break; } Connection connection = HibernateSessionFactory.getSessionConnection(); PreparedStatement pst = connection.prepareStatement(sql); pst.setString(1, btmName); ResultSet rs = pst.executeQuery(); BtmItem bt = null; while(rs.next()){ bt = getBT(rs); } rs.close(); pst.close(); if(bt == null){ bt = new BtmItem(); bt.apNameArray = new String[0]; bt.lifeCycles = new String[0]; } return bt; } public BtmItem[] getBtmItems(String[] btNames) throws SQLException, IOException, DocumentException { //StringBuilder sql = new StringBuilder("select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plbtmtype t where "); StringBuilder sql = null; switch (HibernateSessionFactory.getDbType()) { case DM8: sql = new StringBuilder("select oid, name, label, description, ts, creator, createtime, modifier, modifytime, content from plbtmtype t where "); break; case ORACL: default: sql = new StringBuilder("select oid, name, label, description, ts, creator, createtime, modifier, modifytime, t.content.getclobval() content from plbtmtype t where "); break; } List bts = new ArrayList(); if(btNames != null && btNames.length > 0){ for(String btName : btNames){ sql.append("t.name='" + btName + "'"); sql.append(" or "); } } else { sql.append(" 1 = 1 or "); } String sql_ = sql.substring(0, sql.lastIndexOf(" or ")); Connection connection = HibernateSessionFactory.getSessionConnection(); PreparedStatement pst = connection.prepareStatement(sql_); ResultSet rs = pst.executeQuery(); ServerWithLog4j.logger.info(sql); //System.out.println(sql); while(rs.next()){ BtmItem bt = getBT(rs); bts.add(bt); } rs.close(); pst.close(); return bts.toArray(new BtmItem[0]); } /** * tableName and columns Map * @return */ public Map> getTableAndCols(){ Map> map = new HashMap>(); int sysAbLength = OmdHelper.getBTSysANames().length; String sql = "select t.TABLE_NAME, t.COLUMN_NAME from user_tab_columns t where t.TABLE_NAME like 'PLATFORMBTM_%' and t.COLUMN_ID > " + sysAbLength + " order by t.TABLE_NAME"; Session session = HibernateSessionFactory.getSession(); List list = session.createSQLQuery(sql).list(); for(int i = 0; i < list.size(); i++){ Object[] o = (Object[]) list.get(i); String tableName = ((String) o[0]).toLowerCase(); String colName = ((String) o[1]).toLowerCase(); List colList = map.get(tableName); if(colList == null){ colList = new ArrayList(); colList.add(colName); map.put(tableName, colList); }else{ colList.add(colName); } } return map; } /** * 获取所有业务类型表 * @return */ public List getAllBtmTables(){ List tableNameList = new ArrayList(); String sql = "select t.TABLE_NAME from user_tables t where t.TABLE_NAME like 'PLATFORMBTM_%'"; Session session = HibernateSessionFactory.getSession(); List list = session.createSQLQuery(sql).list(); for(int i = 0; i < list.size(); i++){ String tableName = (String) list.get(i); tableNameList.add(tableName.toLowerCase()); } return tableNameList; } /** * 获取所有的视图(平台创建的) * @return 视图的名字 */ public List getAllBtmViews(){ List viewNameList = new ArrayList(); String sql = "select t.view_name from user_views t where t.view_name like 'PLATFORMBTM_%'"; Session session = HibernateSessionFactory.getSession(); List list = session.createSQLQuery(sql).list(); for(int i = 0; i < list.size(); i++){ String tableName = (String) list.get(i); viewNameList.add(tableName.toLowerCase()); } return viewNameList; } /** * * @param type * @param sql:_ADD(cols)/_DROP(cols) * @return * @throws Throwable */ public String parseToSql(String type, String sql) throws Throwable{ String operator = null; if(sql.contains("_ADD")){ operator = "add"; }else if(sql.contains("_DROP")){ operator = "drop"; }else if(sql.contains("_CREATE")){ operator = "create"; }else{ return null; } if(operator.equals("create")){ return getCreateBTMTableSql(getBtmItemByName(type)); }else{ StringBuilder stb = new StringBuilder("alter table "); stb.append(OmdHelper.getBTTableName(type)); stb.append(" "); stb.append(operator); stb.append("("); sql = sql.substring(sql.indexOf("(") + 1, sql.indexOf(")")); String[] abNames = sql.split(","); if(operator.equals("add")){ for(int i = 0; i < abNames.length; i++){ String abName = abNames[i]; AttribItem abItem = OMCacheProvider.getAttribute(abName); String abSql_ = DDLHelper.getAbSql(abItem); stb.append(abSql_); } }else if(operator.equals("drop")){ for(int i = 0; i < abNames.length; i++){ String abName = abNames[i]; stb.append(abName); if(i != abNames.length-1){ stb.append(","); } } } //modify by weidy@2020-12-16 //增加逗号的判断 String temp = stb.toString(); if(temp.endsWith(",")){ temp = temp.substring(0,temp.length()-1); } if(temp.endsWith(",\n\t")){ temp = temp.substring(0,temp.length()-",\n\t".length()); } return temp + ")"; } } /** * 将bt转化成xmltext * @param bt * @return */ private String getXmlText(BtmItem bt){ String apNameArray = arrayTOString(bt.apNameArray); String lifeCycles = arrayTOString(bt.lifeCycles); StringBuilder stb = new StringBuilder(""); stb.append("" + bt.name + ""); stb.append(""); stb.append("" + bt.description + ""); stb.append("" + bt.isAbstract + ""); stb.append("" + bt.shape + ""); stb.append("" + bt.implClass + ""); stb.append("" + bt.fName + ""); stb.append("" + bt.lifeCycle + ""); stb.append("" + bt.imageName + ""); stb.append("" + bt.revLevel + ""); stb.append("" + bt.revRuleName + ""); stb.append("" + bt.revInput + ""); stb.append("" + bt.delimiter + ""); stb.append("" + bt.verRuleName + ""); stb.append("" + apNameArray + ""); stb.append("" + lifeCycles + ""); stb.append(""); return stb.toString(); } /** * Array-->String * @param array * @return */ private String arrayTOString(String[] array){ String str = ""; if(array != null && array.length > 0){ for(int i = 0; i < array.length; i++){ str += array[i]; str += ","; } str = str.substring(0, str.lastIndexOf(",")); } return str; } /** * 将查询的clob对象转换成xml的element, 便于解析 * @param clob * @return * @throws SQLException * @throws IOException * @throws DocumentException */ private Element getBtDetails(Clob clob) throws DocumentException, SQLException{ SAXReader saxReader = new SAXReader(); //Document document = saxReader.read(clob.characterStreamValue()); Document document = saxReader.read(clob.getCharacterStream()); Element root = document.getRootElement(); return root; } /** * 将一条数据库中的记录转化成btmitem * @param rs * @return * @throws SQLException */ private BtmItem getBT(ResultSet rs) throws SQLException, IOException, DocumentException{ BtmItem bt = new BtmItem(); String value = rs.getString("oid"); bt.oid = (value == null ? "" : value); value = rs.getString("name"); bt.name = (value == null ? "" : value); value = rs.getString("label"); bt.label = (value == null ? "" : value); value = rs.getString("description"); bt.description = (value == null ? "" : value); bt.ts = rs.getTimestamp("ts").getTime(); value = rs.getString("creator"); bt.creator = (value == null ? "" : value); bt.createTime = rs.getTimestamp("createTime").getTime(); value = rs.getString("modifier"); bt.modifier = (value == null ? "" : value); bt.modifyTime = rs.getTimestamp("modifyTime").getTime(); //CLOB clob = (CLOB) rs.getClob("content"); Clob clob = rs.getClob("content"); Element btDetails = getBtDetails(clob); setBTValueFormDoc(bt, btDetails); return bt; } /** * 设置EnumItem存在 * @param att * @param element */ private void setBTValueFormDoc(BtmItem bt, Element element){ String value = element.elementText("isAbstract"); bt.isAbstract = (value == null ? false : Boolean.valueOf(value)); value = element.elementText("fName"); bt.fName = (value == null ? "" : value); value = element.elementText("implClass"); bt.implClass = (value == null ? "" : value); value = element.elementText("shape"); bt.shape = (value == null ? "" : value); value = element.elementText("lifeCycle"); bt.lifeCycle = (value == null ? "" : value); value = element.elementText("lifeCycles"); if(value != null && !value.equals("")){ bt.lifeCycles = value.trim().split(","); }else{ bt.lifeCycles = new String[0]; } value = element.elementText("imageName"); bt.imageName = (value == null ? "" : value); value = element.elementText("revLevel"); bt.revLevel = (value == null ? 0 : Short.valueOf(value)); value = element.elementText("revRuleName"); bt.revRuleName = (value == null ? "" : value); value = element.elementText("revInput"); bt.revInput = (value == null ? false : Boolean.valueOf(value)); value = element.elementText("delimiter"); bt.delimiter = (value == null ? "" : value); value = element.elementText("verRuleName"); bt.verRuleName = (value == null ? 0 : Short.valueOf(value)); value = element.elementText("apNameArray"); if(value != null && !value.equals("")){ bt.apNameArray = value.trim().split(","); }else{ bt.apNameArray = new String[0]; } } }