package com.vci.server.framework.systemConfig.log; import java.net.UnknownHostException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.LinkedHashMap; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.criterion.Order; import org.hibernate.type.Type; import com.vci.common.resource.CommonProperties; import com.vci.corba.common.data.VCIInvocationInfo; import com.vci.server.base.persistence.dao.BaseService; import com.vci.server.base.persistence.dao.HibernateCallback; import com.vci.server.base.persistence.dao.HibernateCallbackExt; import com.vci.server.base.persistence.dao.HibernateSessionFactory; import com.vci.server.base.persistence.dao.HibernateTemplate; import com.vci.server.framework.systemConfig.SystemCfg; import com.vci.server.framework.systemConfig.SystemCfgDAOImpl; /** * 日志模块提供服务的Service * @author xiong fei * @time 2011-06-16 */ public class LogService extends BaseService { private final String LOG_DELETE_AUTO = "log.delete.auto";//配置日志是否进行自动删除 private final String LOG_SAVE_PERIODS = "log.save.periods";//配置的日志保存期限下拉框的值 private final String LOG_QUERY_PAGESIZE = "log.query.pagesize";//配置的日志页面显示条数 public LogService() { AlterTable(); } /* * 日志表增加日志内容字段 */ private void AlterTable() { String sql = "SELECT COUNT(1) as COLNUM FROM USER_TAB_COLUMNS WHERE TABLE_NAME='PLLOG' AND COLUMN_NAME='PLCONTENT'"; Connection connection = HibernateSessionFactory.getSessionConnection(); PreparedStatement pst = null; ResultSet rs = null; try { pst = connection.prepareStatement(sql); rs = pst.executeQuery(); int count = 0; while(rs.next()){ count = rs.getInt("COLNUM"); } rs.close(); rs = null; pst.close(); pst = null; if (count == 0) { sql = "ALTER TABLE PLLOG ADD PLCONTENT VARCHAR2(1000)"; pst = connection.prepareStatement(sql); pst.execute(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (rs != null) { rs.close(); } if(pst != null) { pst.close(); } } catch (Exception e2) { e2.printStackTrace(); } } } /** * 获取日志删除配置 * @return true表示自动删除,false表示手动删除 */ public boolean getIsAutoDelete() { boolean res = false; String isAuto = CommonProperties.getStringProperty(LOG_DELETE_AUTO); if(isAuto.equals("Y")){ res = true; } return res; } /** * 获取配置好的保存和备份期限的下拉框的值 * @return */ public LogPeriod[] getPeriods() { String periods = CommonProperties.getStringProperty(LOG_SAVE_PERIODS); String[] period = periods.split("::"); LogPeriod[] res = new LogPeriod[period.length]; for(int i = 0;iDescription:保存日志

* * @author xf * @time 2012-6-1 */ public void saveLog(final Log log){ new HibernateTemplate().run(new HibernateCallback() { @Override public Object execute() throws HibernateException { LogDAOImpl impl = new LogDAOImpl(); impl.save(log); return true; } }); } /** * 获取本次查询日志总数 * @param sql 前台条件查询的SQL * @return 日志总数 */ public long getSumLogRows(final String sql) { return (Long)new HibernateTemplate().run(new HibernateCallback() { public Object execute() throws HibernateException { LogDAOImpl impl = new LogDAOImpl(); return impl.getCountForLog(sql); } }); } /** * 使用SQL获取日志的列表 * @param sql sql语句 * @return 日志的对象 */ public List getLogListBySql(final String sql){ return (List)new HibernateTemplate().runExt(new HibernateCallbackExt() { public Object execute(Connection connection) throws HibernateException, SQLException { LogDAOImpl impl = new LogDAOImpl(); return impl.findEntites("from Log where " + sql + " order by date desc ",new String[0]); } }); } /** * 分页查询,获取本次查询的日志集合 * @param pageNO 当前页数 * @param PageSize 页面大小 * @return */ public List getLogList(final int pageNo,final int pageSize,final String sql){ return (List)new HibernateTemplate().runExt(new HibernateCallbackExt() { public Object execute(Connection connection) throws HibernateException, SQLException { LogDAOImpl impl = new LogDAOImpl(); Order order = Order.desc("date");//按时间排序 return impl.findList(pageNo, pageSize,sql,order); } }); } public List getLogListByContion(final int pageNo,final int pageSize,final String sql){ return (List)new HibernateTemplate().run(new HibernateCallback() { @Override public Object execute() throws HibernateException { int V_PAGE_ROWNUM_START = (pageNo - 1) * pageSize; int V_PAGE_ROWNUM_END = (pageNo ) * pageSize; LogDAOImpl impl = new LogDAOImpl(); StringBuffer sb = new StringBuffer(); sb.append(" SELECT * FROM ( "); sb.append(" SELECT ROW_.*,ROWNUM RN FROM ( "); sb.append(" select * from pllog P WHERE "); sb.append(sql); sb.append(" ORDER BY PLDATE DESC "); sb.append(" ) ROW_ "); sb.append(" )WHERE RN <= "); sb.append(V_PAGE_ROWNUM_END); sb.append(" AND RN > "); sb.append(V_PAGE_ROWNUM_START); return impl.findEntites(sb.toString(), new String[]{}, "P", Log.class); } }); } /** * 通过SQL语句执行日志删除,效率更高 * @param sql * @return */ public boolean deleteLogBySql(final String sql, final long curPeriod){ return (Boolean)new HibernateTemplate().run(new HibernateCallback() { public Object execute() throws HibernateException { LogDAOImpl impl = new LogDAOImpl(); impl.createSQLQuery(sql, new String[0]); String result = "删除 " + curPeriod + " 个月之前的日志 "; writeLogDeleteLog("logAutoDeleter", getServerIP(), result, impl); return true; } }); } private String getServerIP(){ String ip = "127.0.0.1"; try { ip = java.net.InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { e.printStackTrace(); } return ip; } /** * 保存日志保存/备份期限 * @param sysCfg 系统配置表的对象 * @return */ public boolean savePeriod(final SystemCfg sysCfg) { return (Boolean)new HibernateTemplate().run(new HibernateCallback() { public Object execute() throws HibernateException { SystemCfgDAOImpl impl = new SystemCfgDAOImpl(); String sql = "from SystemCfg s where s.name = '"+sysCfg.getName()+"'"; SystemCfg temp = impl.findEntity(sql); if(temp == null) {//如果不存在配置,插入 sysCfg.setUserEntity(userEntity); impl.save(sysCfg); } else {//如果存在配置,更新 temp.setName(sysCfg.getName()); temp.setValue(sysCfg.getValue()); temp.setUserEntity(userEntity); impl.update(temp); } return true; } }); } /** * 获取保存/备份期限值 * @param type * @return */ public int getCurPeriod(final String type) { return (Integer)new HibernateTemplate().run(new HibernateCallback() { public Object execute() throws HibernateException { SystemCfgDAOImpl impl = new SystemCfgDAOImpl(); SystemCfg sysCfg = new SystemCfg(); int curPeriod = 0; String sql = " from SystemCfg s where s.name ='"+type+"'"; sysCfg = impl.findEntity(sql); if(sysCfg != null){ curPeriod = Integer.parseInt(sysCfg.getValue()); } return curPeriod; } }); } /** * 手动删除日志 * @param deleteDate 所选日期,将删除该日期之前的日志 * @return */ public boolean deleteLog(final String deleteDate) { return (Boolean)new HibernateTemplate().run(new HibernateCallback() { public Object execute() throws HibernateException { LogDAOImpl impl = new LogDAOImpl(); String delDate = deleteDate; String sql = "delete from pllog where pltype<>'删除' and plmodule<>'日志管理' and pllogtype<>'一般操作' and pldate <= to_date('"+delDate+"','yyyy-MM-dd') "; if(deleteDate.contains("##")){ String[] vvs = deleteDate.split("##"); delDate = vvs[0]; sql = "delete from pllog where pltype<>'删除' and plmodule<>'日志管理' and pllogtype<>'一般操作' and pldate <= to_date('"+delDate+"','yyyy-MM-dd') and " + vvs[1]; } impl.createSQLQuery(sql); VCIInvocationInfo vcii = HibernateSessionFactory.getVciSessionInfo(); String result = "删除 " + delDate + " 之前的日志 "; writeLogDeleteLog(vcii.userName, vcii.clientIPInfo, result, impl); return true; } }); } /** * 记录日志删除的日志 */ public void writeLogDeleteLog(String userName, String ip, String result, LogDAOImpl impl){ if(impl == null){ impl = new LogDAOImpl(); } String sql = "insert into pllog(ploid, pluser, plip, plresult, pldate, pltype, plmodule, pllogtype) " + "values(" + "get_uuid()," + "'" + userName + "'," + "'" + ip + "'," + "'" + result + "'," + "sysdate," + "'" + "删除" + "'," + "'" + "日志管理" + "'," + "'" + "一般操作" + "'" + ")"; impl.createSQLQuery(sql); } // /** // * 删除日志 // * @param list // * @return // */ // public boolean deleteLog(final List list) { // return (Boolean)new HibernateTemplate().run(new HibernateCallback() { // public Object execute() throws HibernateException { // LogDAOImpl impl = new LogDAOImpl(); // for(Log entity:list){ // impl.delete(entity); // } // return true; // } // }); // } // /** * 根据模块的源路径返回模块的别名 * @param modulePath * @return */ public String getModuleAlias(final String modulePath){ return (String)new HibernateTemplate().run(new HibernateCallback() { @Override public Object execute() throws HibernateException { String res = ""; LogDAOImpl impl = new LogDAOImpl(); String sql = "SELECT T.PLALIASNAME FROM PLFUNCTION T WHERE T.PLRESOURCEC = ?"; Object[] values = { modulePath }; LinkedHashMap map = new LinkedHashMap(); map.put("PLALIASNAME", org.hibernate.type.StringType.INSTANCE); List list = impl.findEntitesBySQL(sql, values, map); if(list.size() != 0){ // Object[] data = list.get(0); // if(data != null && data.length > 0){ // res = (String) data[0]; // } res = list.get(0); if(res == null || "null".equals(res)) { res = ""; } } return res; } }); } /** * 根据模块的源路径返回角色名称 * */ /*public String getRoleName(final String modulePath,final String userName){ return (String)new HibernateTemplate().run(new HibernateCallback() { @Override public Object execute() throws HibernateException { String res = ""; LogDAOImpl impl = new LogDAOImpl(); StringBuilder logSql = new StringBuilder(); logSql.append(" select pr.plname from plrole pr where pr.pluid in ( "); logSql.append(" select r.plroleoid from Plroleright r where r.plfuncoid in ( "); logSql.append(" select pf.ploid from plfunction pf where pf.plresourcec = "); logSql.append(" ? "); logSql.append(" )"); logSql.append(" )"); logSql.append(" intersect "); logSql.append(" select pr.plname from plrole pr where pr.pluid in ( "); logSql.append(" select ur.plroleuid from pluserrole ur where ur.pluseruid in ( "); logSql.append(" select pu.pluid from pluser pu where pu.plusername= "); logSql.append(" ? "); logSql.append(" ) "); logSql.append(" ) "); Object[] values = { modulePath, userName}; LinkedHashMap map = new LinkedHashMap(); List list = impl.findEntitesBySQL(logSql.toString(), values, map); if(list.size() != 0){ res = list.get(0); if(res == null || "null".equals(res)) { res = ""; } } return res; } }); }*/ public String getRoleName(final String modulePath,final String userName){ return (String)new HibernateTemplate().runExt(new HibernateCallbackExt() { @Override public Object execute(Connection paramConnection) throws HibernateException, SQLException { String res = ""; LogDAOImpl impl = new LogDAOImpl(); StringBuilder logSql = new StringBuilder(); logSql.append(" select pr.plname from plrole pr where pr.pluid in ( "); logSql.append(" select r.plroleoid from Plroleright r where r.plfuncoid in ( "); logSql.append(" select pf.ploid from plfunction pf where pf.plresourcec = "); logSql.append(" ? "); logSql.append(" )"); logSql.append(" )"); logSql.append(" intersect "); logSql.append(" select pr.plname from plrole pr where pr.pluid in ( "); logSql.append(" select ur.plroleuid from pluserrole ur where ur.pluseruid in ( "); logSql.append(" select pu.pluid from pluser pu where pu.plusername= "); logSql.append(" ? "); logSql.append(" ) "); logSql.append(" ) "); Object[] values = { modulePath, userName}; LinkedHashMap map = new LinkedHashMap(); List list = impl.findEntitesBySQL(logSql.toString(), values, map); if(list.size() != 0){ res = list.get(0); }else{ res =getMessage(paramConnection,userName); } return res; } }); } public String getMessage(Connection paramConnection,String userName){ String res = ""; StringBuilder logSql = new StringBuilder(); logSql.append(" select pr.plname ,pr.pltype from plrole pr where pr.pluid in ( "); logSql.append(" select ur.plroleuid from pluserrole ur where ur.pluseruid in ( "); logSql.append(" select pu.pluid from pluser pu where pu.plusername= "); logSql.append(" '"+userName+"' "); logSql.append(" ) "); logSql.append(" ) "); PreparedStatement pstmt = null; ResultSet rs = null; try { pstmt = paramConnection.prepareStatement(logSql.toString()); rs = pstmt.executeQuery(); LinkedHashMap value = new LinkedHashMap(); while(rs.next()){ value.put(rs.getString(2),rs.getString(1)); } if(value.get("1")!=null){ res = value.get("1"); }else{ res = value.get("2"); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (rs != null) { rs.close(); } if(pstmt != null) { pstmt.close(); } } catch (Exception e2) { e2.printStackTrace(); } } return res; } }