package com.hangum.tadpole.monitoring.core.editors.monitoring.realtime; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.rap.rwt.service.ServerPushSession; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.layout.RowData; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.EditorPart; import com.hangum.tadpole.commons.exception.dialog.ExceptionDetailsErrorDialog; import com.hangum.tadpole.commons.libs.core.message.CommonMessages; import com.hangum.tadpole.engine.query.dao.system.UserDBDAO; import com.hangum.tadpole.engine.query.dao.system.monitoring.MonitoringDashboardDAO; import com.hangum.tadpole.engine.query.dao.system.monitoring.MonitoringResultDAO; import com.hangum.tadpole.engine.query.sql.TadpoleSystem_monitoring; import com.hangum.tadpole.monitoring.core.Activator; import com.hangum.tadpole.monitoring.core.dialogs.monitoring.MonitoringDetailStatusDialog; import com.hangum.tadpole.monitoring.core.dialogs.monitoring.ResultSetViewDialog; import com.hangum.tadpole.monitoring.core.editors.monitoring.manage.MonitoringManagerEditor; import com.hangum.tadpole.monitoring.core.editors.monitoring.manage.MonitoringManagerInput; import com.hangum.tadpole.monitoring.core.editors.monitoring.realtime.composite.DBStatusComposite; import com.hangum.tadpole.monitoring.core.manager.cache.MonitoringCacheRepository; import com.hangum.tadpole.monitoring.core.utils.MonitoringDefine; import com.hangum.tadpole.session.manager.SessionManager; import com.swtdesigner.SWTResourceManager; /** * Monitoring main Editor * * @author hangum * */ public class MonitoringMainEditor extends EditorPart { private static final Logger logger = Logger.getLogger(MonitoringMainEditor.class); public static final String ID = "com.hangum.tadpole.monitoring.core.editor.main"; private List<UserDBDAO> listUserMonitoringDB; String searchKey = ""; private Map<Integer, DBStatusComposite> mapDBComposite = new HashMap<>(); private boolean isThread = true; private final ServerPushSession pushSession = new ServerPushSession(); private TableViewer tvError; /* head title group */ private Group grpDatabaseList; private boolean boolTltmErrorIsPopup = false; public MonitoringMainEditor() { super(); } @Override public void doSave(IProgressMonitor monitor) { } @Override public void doSaveAs() { } @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { setSite(site); setInput(input); MonitoringMainInput mmInput = (MonitoringMainInput) input; setPartName(mmInput.getName()); } @Override public boolean isDirty() { return false; } @Override public boolean isSaveAsAllowed() { return false; } @Override public void createPartControl(final Composite parent) { parent.setLayout(new GridLayout(1, false)); Composite compositeStatus = new Composite(parent, SWT.NONE); compositeStatus.setLayout(new GridLayout(6, false)); compositeStatus.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Button btnManageMonitoring = new Button(compositeStatus, SWT.NONE); btnManageMonitoring.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); try { MonitoringManagerInput input = new MonitoringManagerInput(); page.openEditor(input, MonitoringManagerEditor.ID, false); } catch (PartInitException ee) { logger.error("Does not open monitoring manager", ee); Status errStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, ee.getMessage(), ee); //$NON-NLS-1$ ExceptionDetailsErrorDialog.openError(null,CommonMessages.get().Error, "Open monitoring manager", errStatus); //$NON-NLS-1$ } } }); btnManageMonitoring.setText("Manage"); final Button btnAutoPopupDialog = new Button(compositeStatus, SWT.CHECK); btnAutoPopupDialog.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if(btnAutoPopupDialog.getSelection()) boolTltmErrorIsPopup = true; else boolTltmErrorIsPopup = false; } }); btnAutoPopupDialog.setText("Auto popup Dialog"); Label lblNewLabel = new Label(compositeStatus, SWT.NONE); lblNewLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Button btnClean = new Button(compositeStatus, SWT.NONE); btnClean.setBounds(0, 0, 95, 28); btnClean.setText("Clean"); btnClean.setBackground(SWTResourceManager.getColor(MonitoringDefine.MONITORING_STATUS.CLEAN.getColor())); Button btnWarring = new Button(compositeStatus, SWT.NONE); btnWarring.setBounds(0, 0, 95, 28); btnWarring.setText("Warring"); btnWarring.setBackground(SWTResourceManager.getColor(MonitoringDefine.MONITORING_STATUS.WARRING.getColor())); Button btnCritical = new Button(compositeStatus, SWT.NONE); btnCritical.setBounds(0, 0, 95, 28); btnCritical.setText("Critical"); btnCritical.setBackground(SWTResourceManager.getColor(MonitoringDefine.MONITORING_STATUS.CRITICAL.getColor())); SashForm sashFormBody = new SashForm(parent, SWT.VERTICAL); sashFormBody.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); grpDatabaseList = new Group(sashFormBody, SWT.NONE); GridData gd_grpIndexDescription = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); grpDatabaseList.setLayoutData(gd_grpIndexDescription); grpDatabaseList.setText("Database List"); try { listUserMonitoringDB = TadpoleSystem_monitoring.getUserMonitoringDBList(); RowLayout rl_grpDatabaseList = new RowLayout(SWT.HORIZONTAL); grpDatabaseList.setLayout(rl_grpDatabaseList); for(int i=0; i<listUserMonitoringDB.size(); i++) { UserDBDAO userDBDAO = listUserMonitoringDB.get(i); DBStatusComposite dbComposite = new DBStatusComposite(grpDatabaseList, SWT.NONE, userDBDAO); dbComposite.setLayoutData(new RowData(80, 125)); mapDBComposite.put(userDBDAO.getSeq(), dbComposite); if(i != (listUserMonitoringDB.size()-1)) searchKey += userDBDAO.getSeq() + ","; else searchKey += userDBDAO.getSeq(); } } catch(Exception e) { logger.error("get monitoring db list", e); } // live error list Group compositeError = new Group(sashFormBody, SWT.NONE); compositeError.setLayout(new GridLayout(1, false)); compositeError.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); compositeError.setText("Error List"); tvError = new TableViewer(compositeError, SWT.BORDER | SWT.FULL_SELECTION); tvError.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { IStructuredSelection sel = (IStructuredSelection)event.getSelection(); if(!sel.isEmpty()) { MonitoringDashboardDAO dao = (MonitoringDashboardDAO)sel.getFirstElement(); MonitoringDetailStatusDialog dialog = new MonitoringDetailStatusDialog(parent.getShell(), dao); dialog.open(); } } }); Table tableError = tvError.getTable(); tableError.setHeaderVisible(true); tableError.setLinesVisible(true); tableError.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); createTableColumn(tvError); tvError.setContentProvider(new ArrayContentProvider()); tvError.setLabelProvider(new MonitoringErrorLabelprovider()); sashFormBody.setWeights(new int[] { 7, 3 }); callbackui(); } /** * crate result column */ public void createTableColumn(TableViewer tvError) { String[] arryTable = {"Start Date", "DB Name", "KPI", "Title", "Description", "Warring", "Critical"}; int[] arryWidth = {120, 150, 85, 120, 200, 60, 60}; crateTableColumn(tvError, arryTable, arryWidth); } /** * create table viewer column * * @param tv * @param arryTable * @param arryWidth */ private void crateTableColumn(TableViewer tv, String[] arryTable, int[] arryWidth) { for(int i=0; i<arryTable.length; i++) { TableViewerColumn tableViewerColumn = new TableViewerColumn(tv, SWT.NONE); TableColumn tblclmnDbName = tableViewerColumn.getColumn(); tblclmnDbName.setWidth(arryWidth[i]); tblclmnDbName.setText(arryTable[i]); } } private void callbackui() { pushSession.start(); Thread thread = new Thread(startUIThread()); thread.setDaemon(true); thread.start(); } private Runnable startUIThread() { final Display display = PlatformUI.getWorkbench().getDisplay();// tvError.getTable().getDisplay(); final MonitoringCacheRepository instance = MonitoringCacheRepository.getInstance(); final List<MonitoringDashboardDAO> listMonitoringResult = new ArrayList<MonitoringDashboardDAO>(); final String email = SessionManager.getEMAIL(); final List<MonitoringResultDAO> liveMonitoringResult = new ArrayList<MonitoringResultDAO>(); Runnable bgRunnable = new Runnable() { @Override public void run() { while(isThread) { try { listMonitoringResult.clear(); listMonitoringResult.addAll(TadpoleSystem_monitoring.getMonitoringErrorStatus(searchKey)); } catch (Exception e1) { logger.error("Get monitoring dashboard data", e1); } liveMonitoringResult.clear(); List<MonitoringResultDAO> listLive = instance.get(email); if(listLive != null) liveMonitoringResult.addAll(listLive); /** collect live error data */ final List<MonitoringResultDAO> listErrorMonitoringResult = new ArrayList<MonitoringResultDAO>(); for (MonitoringResultDAO resultDAO : liveMonitoringResult) { if(MonitoringDefine.MONITORING_STATUS.WARRING.toString().equals(resultDAO.getResult())) { listErrorMonitoringResult.add(resultDAO); } else if(MonitoringDefine.MONITORING_STATUS.CRITICAL.toString().equals(resultDAO.getResult())) { listErrorMonitoringResult.add(resultDAO); } } // collect old error data final Map<Integer, Integer> mapWarning = new HashMap<Integer, Integer>(); final Map<Integer, Integer> mapCritical = new HashMap<Integer, Integer>(); for (MonitoringDashboardDAO mrDAO : listMonitoringResult) { final int dbSeq = mrDAO.getDb_seq(); final int warnCnt = mrDAO.getWarring_cnt(); final int criCnt = mrDAO.getCritical_cnt(); if(mapWarning.containsKey(dbSeq)) mapWarning.put(dbSeq, mapWarning.get(dbSeq) + warnCnt); else mapWarning.put(dbSeq, warnCnt); if(mapCritical.containsKey(dbSeq)) mapCritical.put(dbSeq, mapCritical.get(dbSeq) + criCnt); else mapCritical.put(dbSeq, criCnt); } display.asyncExec(new Runnable() { @Override public void run() { if (!tvError.getTable().isDisposed()) { // live message if(boolTltmErrorIsPopup) { // 에러 수만큼 팝업을 보여줍니다. for (MonitoringResultDAO monitoringResultDAO : listErrorMonitoringResult) { ResultSetViewDialog dialog = new ResultSetViewDialog(null, monitoringResultDAO); dialog.open(); } } // All monitoring db state to clean for (Integer key : mapDBComposite.keySet()) { DBStatusComposite dbComposite = mapDBComposite.get(key); dbComposite.changeStatus(MonitoringDefine.MONITORING_STATUS.CLEAN.getColor(), ""); } // total message for (Integer key : mapWarning.keySet()) { DBStatusComposite dbComposite = mapDBComposite.get(key); dbComposite.changeStatus(MonitoringDefine.MONITORING_STATUS.WARRING.getColor(), "");//+mapWarning.get(key)); } for (Integer key : mapCritical.keySet()) { DBStatusComposite dbComposite = mapDBComposite.get(key); if(mapCritical.get(key) != 0) dbComposite.changeStatus(MonitoringDefine.MONITORING_STATUS.CRITICAL.getColor(), "");//+mapCritical.get(key)); } tvError.setInput(listMonitoringResult); tvError.refresh(); } // end tvError } }); // 10 seconds try{ Thread.sleep(1000 * 10); } catch(Exception e) {} } }; }; return bgRunnable; } @Override public void dispose() { super.dispose(); isThread = false; pushSession.stop(); } @Override public void setFocus() { } }