package com.vci.client.framework.systemConfig.log; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.TitledBorder; import org.apache.commons.lang3.StringUtils; import com.vci.corba.common.VCIError; import com.vci.mw.ClientContextVariable; import com.vci.client.LogonApplication; import com.vci.client.common.VCIBasePanel; import com.vci.client.common.objects.LogObject; import com.vci.client.common.objects.RoleObject; import com.vci.client.common.objects.UserObject; import com.vci.client.framework.delegate.LogManagementClientDelegate; import com.vci.client.framework.delegate.RightManagementClientDelegate; import com.vci.client.framework.util.JAutoCompleteComboBox; import com.vci.client.oq.QTClient; import com.vci.client.ui.date.PopupCalendarMethod; import com.vci.client.ui.exception.VCIException; import com.vci.client.ui.locale.LocaleDisplay; import com.vci.client.ui.swing.VCIOptionPane; import com.vci.client.ui.swing.VCISwingUtil; import com.vci.client.ui.swing.components.VCIJButton; import com.vci.client.ui.swing.components.VCIJComboBox; import com.vci.client.ui.swing.components.VCIJPanel; import com.vci.client.ui.swing.components.table.AbstractVCIJTableDataProvider; import com.vci.client.ui.swing.components.table.VCIJTableNode; import com.vci.client.ui.swing.components.table.VCIJTablePanel; import com.vci.common.log.LogType; /** * * @author xiongfei * 日志管理 * 创建时间:2011-06-13 */ public class LogManagementPanel extends VCIJPanel { /** * */ private static final long serialVersionUID = -5588255327255334689L; //获取异常信息及国际化信息的文件名 private String FILENAME = "RMIPFramework"; //查询日期:由 private String DATE_START = LocaleDisplay.getI18nString("rmip.framework.log.startDate", "RMIPFramework", getLocale()); //到 private String TO = LocaleDisplay.getI18nString("rmip.framework.log.to", "RMIPFramework", getLocale()); //创建 private String CREATE = LocaleDisplay.getI18nString("rmip.framework.log.create", "RMIPFramework", getLocale()); //修改 private String UPDATE = LocaleDisplay.getI18nString("rmip.framework.log.update", "RMIPFramework", getLocale()); //删除 private String DELETE = LocaleDisplay.getI18nString("rmip.framework.log.delete", "RMIPFramework", getLocale()); //操作用户: private String OPERATEUSER = LocaleDisplay.getI18nString("rmip.framework.log.operateUser", "RMIPFramework", getLocale()); //查询 private String QUERY = LocaleDisplay.getI18nString("rmip.framework.log.query", "RMIPFramework", getLocale()); //导出 private String EXPORT = LocaleDisplay.getI18nString("rmip.framework.log.export", "RMIPFramework", getLocale()); //日志管理 private String LOGMANAGE = LocaleDisplay.getI18nString("rmip.framework.logManagementModel", "RMIPFramework", getLocale()); /** * 操作类型 */ private String OPERATE_TYPE = LocaleDisplay.getI18nString("rmip.framework.log.operateType", "RMIPFramework", getLocale()); private JLabel dateLabelStart = new JLabel(DATE_START); private JLabel dateLabelTo = new JLabel(TO); protected VCIJComboBox startDateBox = new VCIJComboBox(); protected VCIJComboBox endDateBox = new VCIJComboBox(); private JButton startDateButton = new PopupCalendarMethod().createDateDialogButton("date.gif",startDateBox); private JButton endDateButton = new PopupCalendarMethod().createDateDialogButton("date.gif",endDateBox); private JCheckBox create = new JCheckBox(CREATE); private JCheckBox modify = new JCheckBox(UPDATE); private JCheckBox delete = new JCheckBox(DELETE); private JLabel userLabel = new JLabel(OPERATEUSER); protected JAutoCompleteComboBox userCombox = new JAutoCompleteComboBox(); //added by xf 增加按用户IP查询日志 ,支持模糊查询 private JLabel ipLabel = new JLabel("用户IP:"); protected JTextField ipText = new JTextField(); private JLabel operateTypeLabel = new JLabel(OPERATE_TYPE); protected JTextField typeText = new JTextField(); private LogManagementPanelActionListener logActionListener = new LogManagementPanelActionListener(this); private VCIJButton queryBtn = VCISwingUtil.createVCIJButton("query",QUERY,QUERY,"search.png",logActionListener); private VCIJButton exportBtn = VCISwingUtil.createVCIJButton("export",EXPORT,EXPORT,"export.gif",logActionListener); VCIJButton queryDetail = new VCIJButton("查看详细信息", VCISwingUtil.createImageIcon("search.png")); private String querySql = ""; LogManagementClientDelegate logDel = new LogManagementClientDelegate(LogonApplication.getUserEntityObject()); protected final String LOG_SAVE_PERIOD = "logSavePeriod";//日志保存期限 // 控件的坐标位置变量 private int x = 10; private int y = 20; private int width = 50; private int height = 25; /** * 两控件间垂直间隔 */ private int vspan = 5; /** * 两控件间水平间隔 */ private int hspan = 5; private VCIBasePanel vciBasePanel = null; private LinkedList selfCustomButtons = new LinkedList(); { selfCustomButtons.add(exportBtn); selfCustomButtons.add(queryDetail); } private LogType logType = null; private boolean isManagerQuery = false; public LogType getLogType() { return logType; } public void setLogType(LogType logType) { this.logType = logType; } public boolean isManagerQuery() { return isManagerQuery; } public void setManagerQuery(boolean isManagerQuery) { this.isManagerQuery = isManagerQuery; } public LogManagementPanel(VCIBasePanel vciBasePanel, LogType logType, boolean isManagerQuery){ this.vciBasePanel = vciBasePanel; this.logType = logType; this.isManagerQuery = isManagerQuery; init(); } class MyDataProvider extends AbstractVCIJTableDataProvider{ @Override public LogObject[] getDatas(int pageCount, int pageSize) { LogObject[] logInfos = new LogObject[0]; try { querySql = getSQL(); logInfos = logDel.getLogListByContion(pageCount,pageSize,querySql); } catch (VCIException e) { VCIOptionPane.showError(LogonApplication.frame, "RMIPFramework", e); return null; } return logInfos; } @Override public VCIJTableNode getNewRowNode(LogObject dataObj) { VCIJTableNode node = new VCIJTableNode(dataObj); node.setPropertyValue(getSpecialColumns()[0], dataObj.getUsername()); node.setPropertyValue(getSpecialColumns()[1], dataObj.getTruename()); node.setPropertyValue(getSpecialColumns()[2], dataObj.getUserIp()); node.setPropertyValue(getSpecialColumns()[3], dataObj.getModule()); node.setPropertyValue(getSpecialColumns()[4], dataObj.getType()); node.setPropertyValue(getSpecialColumns()[5], dataObj.getDate()); String result = "操作成功"; String memo = dataObj.getResult(); if(StringUtils.isNotBlank(memo)){ boolean hasResult =false; if(memo.startsWith("操作") && memo.length()>4){ result = memo.substring(0,4); hasResult = true; } if((memo.startsWith("登入") || memo.startsWith("登出"))&& memo.length()>4){ result = memo.substring(0,4); hasResult = true; } if(memo.length()>5 && hasResult){ memo = memo.substring(5); }else{ //memo = ""; } } node.setPropertyValue(getSpecialColumns()[6], result); node.setPropertyValue(getSpecialColumns()[7], memo); return node; } @Override public String[] getSpecialColumns() { return "用户名,姓名, 用户ip,模块,操作,时间,操作结果, 描述".split(","); } @Override public int getTotal() { querySql = getSQL(); try { total = (int) logDel.getSumLogRows(querySql); } catch (VCIException e) { e.printStackTrace(); VCIOptionPane.showError(LogonApplication.frame, "RMIPFramework", e); } return this.total; } } protected MyDataProvider dataProvider = new MyDataProvider(); protected VCIJTablePanel tablePanel = new VCIJTablePanel(dataProvider); private VCIJPanel tablePanel(){ LinkedHashMap widthMaps = new LinkedHashMap(); widthMaps.put(2, 150); widthMaps.put(3, 150); widthMaps.put(4, 150); widthMaps.put(5, 150); widthMaps.put(6, 150); widthMaps.put(7, 150); widthMaps.put(8, 150); widthMaps.put(9, 350); tablePanel.setColumnWidthMaps(widthMaps); tablePanel.setCustomButtons(selfCustomButtons); tablePanel.setShowPaging(true); tablePanel.setCustomButtonFlowAlign(FlowLayout.CENTER); tablePanel.setPageButtonFlowAlign(FlowLayout.CENTER); tablePanel.setShowExport(false); tablePanel.buildTablePanel(); tablePanel.refreshTableData(); return tablePanel; } /** * 初始化页面 */ private void init(){ JPanel palMain = new JPanel(); palMain.setLayout(new BorderLayout()); palMain.setBorder(new TitledBorder(LOGMANAGE)); JPanel palTop = new JPanel();//上部 //初始化 initTop(palTop);//上部 initComboBox();//下拉框 initAction(); palMain.add(palTop, BorderLayout.NORTH); palMain.add(tablePanel(), BorderLayout.CENTER); this.setLayout(new BorderLayout()); this.add(palMain,BorderLayout.CENTER); } private void initAction(){ queryDetail.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent paramActionEvent) { queryDetai_Method(); } }); } private void queryDetai_Method(){ int select = tablePanel.getSelectedRowIndexs().length; if(select ==0){ VCIOptionPane.showMessage(this, "请选择要查看的数据!"); return; }else if(select>1){ VCIOptionPane.showMessage(this, "请选择单条数据进行查看!"); return; }else{ LinkedList list = tablePanel.getSelectedRowObjects(); LogObject dataObj = list.getFirst(); new DetailDialog(dataObj.getResult()); } } /** * 初始化上部 * @param palTop */ private void initTop(JPanel palTop){ JPanel palLeft = new JPanel();//上部左边的部分 palLeft.setLayout(null); palLeft.setPreferredSize(new Dimension(700,200)); initTopLeft(palLeft); palTop.setLayout(new GridLayout()); palTop.setPreferredSize(new Dimension(900,50)); palTop.add(palLeft,new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0 ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 30, 10, 0), 0, 0)); } /** * 初始化上部左边 * @param palLeft */ private void initTopLeft(JPanel palLeft){ /*-----------------------------第一行---------------------------------*/ x = 20; y = 10; width = 80; height = 25; dateLabelStart.setBounds(x, y, width, height);//查询日期:由 x += dateLabelStart.getBounds().width+hspan; y = 10; width=120;height=25; startDateBox.setBounds(x, y, width, height);//起始日期 x += startDateBox.getBounds().width+hspan; y = 10;width=25;height=25; startDateButton.setBounds(x, y, width, height);//日期控件 x+= startDateButton.getBounds().width+hspan;y = 10;width=25;height=25; dateLabelTo.setBounds(x, y, width, height);//到 x+= dateLabelTo.getBounds().width+hspan;y = 10;width=120;height=25; endDateBox.setBounds(x, y, width, height);//结束日期 x+= endDateBox.getBounds().width+hspan;y = 10;width=25;height=25; endDateButton.setBounds(x, y, width, height);//日期控件 /*-----------------------------第三行---------------------------------*/ x = 460;y = 10;width = 60;height = 25; userLabel.setBounds(x, y, width, height); x+=userLabel.getBounds().width+hspan+20; width=180; userCombox.setBounds(x, y, width, height); userCombox.setEditable(true); x+=userCombox.getBounds().width+hspan+15; width=60; ipLabel.setBounds(x, y, width, height); x+=ipLabel.getBounds().width+hspan; width = 105; ipText.setBounds(x, y, width, height); x+= ipText.getBounds().width + hspan + 20; width = 80; operateTypeLabel.setBounds(x,y,width,height); x+= operateTypeLabel.getBounds().width + hspan ; width = 100; typeText.setBounds(x,y,width,height); x+= typeText.getBounds().width + hspan; width = 80; queryBtn.setBounds(x, y, width, height); //第一行 palLeft.add(dateLabelStart); palLeft.add(startDateBox); palLeft.add(startDateButton); palLeft.add(dateLabelTo); palLeft.add(endDateBox); palLeft.add(endDateButton); //第三行 palLeft.add(userLabel); palLeft.add(userCombox); palLeft.add(ipLabel); palLeft.add(ipText); palLeft.add(operateTypeLabel); palLeft.add(typeText); palLeft.add(queryBtn); } /** * 初始化下拉框,用户,期限 */ protected void initComboBox(){ initUser(); } /*** * 初始化用户 */ protected void initUser() { UserObject[] users = getUserObjects(); setUserObjectToComboBox(users); } private static final String SYSTEM_ADMIN_ROLE = "系统管理员"; private static final String SEC_ADMIN_ROLE = "安全管理员"; private static final String AUDIT_ADMIN_ROLE = "审计管理员"; protected UserObject[] getUserObjects(){ // UserObject[] users = new UserObject[0]; // try { // RightManagementClientDelegate del = new RightManagementClientDelegate(LogonApplication.getUserEntityObject()); // int userType = 0; // // List lstUser = new ArrayList(); // if(isManagerQuery()){ // RoleObject role = del.fetchRoleByName(SYSTEM_ADMIN_ROLE); // users = del.fetchUsersByRoleId(role.getId()); // for (UserObject user : users) // lstUser.add(user); // // role = del.fetchRoleByName(SEC_ADMIN_ROLE); // users = del.fetchUsersByRoleId(role.getId()); // for (UserObject user : users) // lstUser.add(user); // //// role = del.fetchRoleByName(AUDIT_ADMIN_ROLE); //// users = del.fetchUsersByRoleId(role.getId()); //// for (UserObject user : users) //// lstUser.add(user); // // users = lstUser.toArray(new UserObject[0]); // userType = 0; // } else { // userType = 1; // users = del.fetchUserInfoByType(userType); // //看是不是审计管理员,审计管理员可以看系统管理和安全管理 // // if(isAdminByRoleName(AUDIT_ADMIN_ROLE)){ // return wrapperAdminUser(users, Arrays.asList(new String[]{SYSTEM_ADMIN_ROLE,SEC_ADMIN_ROLE})); // } // if(isAdminByRoleName(SEC_ADMIN_ROLE)){ // return wrapperAdminUser(users, Arrays.asList(new String[]{AUDIT_ADMIN_ROLE})); // } // } // //users = del.fetchUserInfoByType(userType); // } catch (VCIException re) { // VCIOptionPane.showError(LogonApplication.frame, FILENAME, re); // } // return users; List users = new ArrayList(); if("secAdmin".equals(ClientContextVariable.getInvocationInfo().userName)){ try { users.addAll(getUsersByUserNames(Arrays.asList("auditAdmin"))); users.addAll(getUsersByUserNames(getUserNameByUserType(2))); } catch (VCIException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (VCIError e) { // TODO Auto-generated catch block e.printStackTrace(); } } else if("auditAdmin".equals(ClientContextVariable.getInvocationInfo().userName)){ try { users.addAll(getUsersByUserNames(Arrays.asList("secAdmin", "sysAdmin"))); } catch (VCIException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else if("sysAdmin".equals((ClientContextVariable.getInvocationInfo().userName))){ } return users.toArray(new UserObject[users.size()]); } private List getUsersByUserNames(List userNames) throws VCIException{ List userList = new ArrayList(); RightManagementClientDelegate rmcd = new RightManagementClientDelegate(LogonApplication.getUserEntityObject()); for(String userName : userNames){ userList.add(rmcd.fetchUserInfoByName(userName)); } Collections.sort(userList, new Comparator(){ @Override public int compare(UserObject o1, UserObject o2) { return o1.getUserName().compareTo(o2.getUserName()); } }); return userList; } private List getUserNameByUserType(int userType) throws VCIError{ List userNames = new ArrayList(); String sql = "select plusername,pltruename from pluser u where u.plusertype = " + String.valueOf(userType); String[][] valss = QTClient.getService().queryBySqlWithoutKey(sql); for(String[] vals : valss){ userNames.add(vals[0]); } return userNames; } private UserObject[] wrapperAdminUser(UserObject[] users,List adminRoleList){ List userObjList = new ArrayList(); Collections.addAll(userObjList, users); RightManagementClientDelegate del = new RightManagementClientDelegate(LogonApplication.getUserEntityObject()); try{ for(String roleName:adminRoleList){ RoleObject role = del.fetchRoleByName(roleName); UserObject[] tempUsers = del.fetchUsersByRoleId(role.getId()); for (UserObject user : tempUsers){ userObjList.add(user); } } }catch(Throwable e){ } return userObjList.toArray(new UserObject[0]); } private boolean isAdminByRoleName(String roleName){ boolean isAuditUser = false; try{ RightManagementClientDelegate del = new RightManagementClientDelegate(LogonApplication.getUserEntityObject()); RoleObject role = del.fetchRoleByName(roleName); UserObject[] auditUsers = del.fetchUsersByRoleId(role.getId()); for (UserObject user : auditUsers){ if(user.getUserName().equals(LogonApplication.getUserObject().getUserName())){ isAuditUser = true; break; } } }catch(Throwable a){ } return isAuditUser; } protected void setUserObjectToComboBox(UserObject[] users){ for(UserObject obj : users){ userCombox.addItem(obj); } userCombox.setSelectedIndex(-1); } /** * 获取查询条件并拼成SQL,只拼where子句后面的SQL * @return */ public String getSQL(){ String startDate = String.valueOf(this.startDateBox.getSelectedItem());//获取起始时间 String endDate = String.valueOf(this.endDateBox.getSelectedItem());//获取结束时间 StringBuffer sql = new StringBuffer(""); int period = this.getPeriod(LOG_SAVE_PERIOD);//获取保存期限,以月为单位 //下面是拼出SQL if(period != 0){ sql.append(" to_date(PLDATE) >= add_months(to_date(sysdate),"+(-period)+")"); } if(!startDate.trim().equals("")&&!startDate.equals("null")&&startDate!=null){//起始日期 if(!sql.toString().equals("")){ sql.append(" and "); } sql.append(" to_date(PLDATE) >= to_date('"+startDate.trim()+"','yyyy-MM-dd') "); } if(!endDate.trim().equals("")&&!endDate.equals("null")&&endDate!=null){//结束日期 if(!sql.toString().equals("")){ sql.append(" and "); } sql.append(" trunc(PLDATE) <= to_date('"+endDate.trim()+"','yyyy-MM-dd')"); } if(getLogType() == LogType.Login) {//登入登出日志 if(!sql.toString().equals("")){ sql.append(" and "); } sql.append("PLLOGTYPE in ('" + getLogTypeString(LogType.Login) +"','" + getLogTypeString(LogType.Logout)+ "')"); } else if(getLogType() == LogType.GrantPrivileges) {//授权日志 if(!sql.toString().equals("")){ sql.append(" and "); } sql.append("PLLOGTYPE in('" + getLogTypeString(LogType.GrantPrivileges) + "')"); } else if(getLogType() == LogType.GeneralOperation) {//一般操作日志 if(!sql.toString().equals("")){ sql.append(" and "); } sql.append("PLLOGTYPE in('" + getLogTypeString(LogType.GeneralOperation) + "')"); } // String roleNameSql = getSqlByRole(); // if(!"".equals(roleNameSql)) { // sql.append(" and "+ roleNameSql); // } // if(userCombox.getSelectedItem() != null&&!userCombox.getSelectedItem().equals("")){//操作用户 String userName = ""; Object obj = userCombox.getSelectedItem(); if(obj instanceof UserObject){ UserObject user = (UserObject)obj; userName = user.getUserName(); }else{ userName = (String)obj; } if(!userName.trim().equals("")){//如果用户名为空格则不加用户条件 if(!sql.toString().equals("")){ sql.append(" and "); } if(userName.contains("*")){ userName = userName.trim().replaceAll("\\*", "%"); sql.append(" PLUSER like '").append(userName.trim()).append("'"); }else{ sql.append(" PLUSER = '").append(userName.trim()).append("'"); } } } //按IP查询 if(!ipText.getText().trim().equals("")){ String ip = ipText.getText().trim(); if(!sql.toString().equals("")){ sql.append(" and "); } if(ip.trim().contains("*")){//模糊查询 ip = ip.trim().replaceAll("\\*", "%"); sql.append(" PLIP like '").append(ip.trim()).append("'"); }else{ sql.append(" PLIP = '").append(ip.trim()).append("'"); } } if(StringUtils.isNotBlank(typeText.getText())){ String typeValue = typeText.getText(); sql.append(" and pltype like '%").append(typeValue).append("%'"); } //过滤掉admin和developer用户的日志记录 sql.append(" and PLUSER !='admin' and PLUSER !='developer' "); sql.append(" and pluser != '" + ClientContextVariable.getInvocationInfo().userName + "' "); // 安全保密员不看系统管理员的日志 if("secAdmin".equals(ClientContextVariable.getInvocationInfo().userName)){ sql.append(" and pluser != 'sysAdmin' "); } // 审计管理员只看系统管理员和安全保密员的日志 else if("auditAdmin".equals(ClientContextVariable.getInvocationInfo().userName)){ sql.append(" and pluser in ('secAdmin', 'sysAdmin')"); } return sql.toString(); } protected String getSqlByRole(){ RightManagementClientDelegate del = new RightManagementClientDelegate(LogonApplication.getUserEntityObject()); StringBuilder roleNameString = new StringBuilder(); try { RoleObject[] roleObj = del.fetchRoleInfoByRoleType(1);//取出管理员角色 StringBuilder userString = new StringBuilder(); for(int k = 0;k < roleObj.length;k++) { RoleObject obj = roleObj[k]; userString.append(" '"); userString.append(obj.getName()); userString.append("' "); if(k < roleObj.length - 1) { userString.append(" ,"); } } if("".equals(userString.toString())) { return ""; } //管理员日志记录 if(isManagerQuery()){ roleNameString.append("PLROLENAME in ( "); }else{ roleNameString.append("PLROLENAME not in ( "); } roleNameString.append(userString.toString()); roleNameString.append(" ) "); } catch (VCIException e) { e.printStackTrace(); VCIOptionPane.showError(LogonApplication.frame,"RMIPFramework", e); } return roleNameString.toString(); } protected String getLogTypeString(LogType logType){ String res = ""; if(logType == LogType.Login) { res = "登录"; } else if(logType == LogType.Logout) { res = "登出"; } else if(logType == LogType.GrantPrivileges) { res = "授权"; } else if(logType == LogType.GeneralOperation) { res = "一般操作"; } else if(logType == LogType.Integration) { res = "集成应用"; } return res; } /** * 获取日志保存期限 * @param type 类型,判断是保存还是备份期限 * @return */ protected int getPeriod(String type){ int curPeriod = 0; try { curPeriod = this.logDel.getCurPeriod(type); } catch (VCIException e) { VCIOptionPane.showError(LogonApplication.frame, FILENAME, e); curPeriod = 0; } return curPeriod; } }