package com.hangum.tadpole.monitoring.core.editors.monitoring.manage;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
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.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
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.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DateTime;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.EditorPart;
import com.hangum.tadpole.commons.exception.dialog.ExceptionDetailsErrorDialog;
import com.hangum.tadpole.commons.google.analytics.AnalyticCaller;
import com.hangum.tadpole.commons.libs.core.message.CommonMessages;
import com.hangum.tadpole.engine.define.DBDefine;
import com.hangum.tadpole.engine.query.dao.ManagerListDTO;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
import com.hangum.tadpole.engine.query.dao.system.monitoring.MonitoringIndexDAO;
import com.hangum.tadpole.engine.query.dao.system.monitoring.MonitoringResultDAO;
import com.hangum.tadpole.engine.query.sql.TadpoleSystem_UserDBQuery;
import com.hangum.tadpole.engine.query.sql.TadpoleSystem_monitoring;
import com.hangum.tadpole.monitoring.core.Activator;
import com.hangum.tadpole.monitoring.core.Messages;
import com.hangum.tadpole.monitoring.core.dialogs.monitoring.AddMonitoringDialog;
import com.hangum.tadpole.monitoring.core.dialogs.monitoring.TemplateMonitoringManageDialog;
import com.hangum.tadpole.monitoring.core.dialogs.monitoring.UpdateMonitoringDialog;
import com.hangum.tadpole.monitoring.core.utils.MonitoringDefine;
/**
* Monitoring manage editor
*
* @author hangum
*
*/
public class MonitoringManagerEditor extends EditorPart {
private static final Logger logger = Logger.getLogger(MonitoringManagerEditor.class);
public static final String ID = "com.hangum.tadpole.monitoring.core.editor.manage";
private List<ManagerListDTO> treeList = new ArrayList<ManagerListDTO>();
private TreeViewer treeVUserDB;
// index
private UserDBDAO userDB;
private TableViewer tableVMonitoringList;
private ToolItem tltmRefresh;
private ToolItem tltmAdd;
private ToolItem tltmModify;
private ToolItem tltmRemove;
// private ToolItem tltmAddTemplate;
// result search
private Combo comboResult;
private DateTime dateTimeStart;
private DateTime dateTimeEnd;
private TableViewer tvResult;
// private Combo comboStatics;
// private Text text;
// private Text text_1;
public MonitoringManagerEditor() {
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);
MonitoringManagerInput mmInput = (MonitoringManagerInput) input;
setPartName(mmInput.getName());
}
@Override
public boolean isDirty() {
return false;
}
@Override
public boolean isSaveAsAllowed() {
return false;
}
@Override
public void createPartControl(final Composite parent) {
GridLayout gl_parent = new GridLayout(1, false);
gl_parent.verticalSpacing = 1;
gl_parent.horizontalSpacing = 1;
gl_parent.marginHeight = 1;
gl_parent.marginWidth = 1;
parent.setLayout(gl_parent);
Composite compositeTop = new Composite(parent, SWT.NONE);
compositeTop.setLayout(new GridLayout(1, false));
ToolBar toolBarTop = new ToolBar(compositeTop, SWT.FLAT | SWT.RIGHT);
toolBarTop.setBounds(0, 0, 88, 20);
ToolItem tltmManageTemplate = new ToolItem(toolBarTop, SWT.NONE);
tltmManageTemplate.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
TemplateMonitoringManageDialog dialog = new TemplateMonitoringManageDialog(parent.getShell());
dialog.open();
reLoadDBList();
}
});
tltmManageTemplate.setText("Manage Template");
SashForm sashFormMain = new SashForm(parent, SWT.BORDER | SWT.VERTICAL);
sashFormMain.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
SashForm sashFormTerm = new SashForm(sashFormMain, SWT.BORDER);
Composite compositeLeft = new Composite(sashFormTerm, SWT.NONE);
compositeLeft.setLayout(new GridLayout(1, false));
ToolBar toolBarDB = new ToolBar(compositeLeft, SWT.FLAT | SWT.RIGHT);
ToolItem tltmDBRefresh = new ToolItem(toolBarDB, SWT.NONE);
tltmDBRefresh.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
reLoadDBList();
}
});
tltmDBRefresh.setText("Refresh");
treeVUserDB = new TreeViewer(compositeLeft, SWT.BORDER);
Tree treeDatabase = treeVUserDB.getTree();
treeDatabase.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
treeDatabase.setData(RWT.MARKUP_ENABLED, Boolean.TRUE);
treeVUserDB.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection is = (IStructuredSelection) event.getSelection();
if (is.getFirstElement() instanceof UserDBDAO) {
userDB = (UserDBDAO) is.getFirstElement();
if(userDB.getDBDefine() != DBDefine.MONGODB_DEFAULT) {
refreshMonitoringIndex();
initIndexBtn(true);
initSearchResult();
}
}
}
});
Composite compositeRight = new Composite(sashFormTerm, SWT.NONE);
compositeRight.setLayout(new GridLayout(1, false));
ToolBar toolBar = new ToolBar(compositeRight, SWT.FLAT | SWT.RIGHT);
tltmRefresh = new ToolItem(toolBar, SWT.NONE);
tltmRefresh.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
refreshMonitoringIndex();
}
});
tltmRefresh.setText("Refresh");
tltmAdd = new ToolItem(toolBar, SWT.NONE);
tltmAdd.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
AddMonitoringDialog dialog = new AddMonitoringDialog(null, userDB);
dialog.open();
refreshMonitoringIndex();
}
});
tltmAdd.setText("Add");
tltmModify = new ToolItem(toolBar, SWT.NONE);
tltmModify.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IStructuredSelection iss = (IStructuredSelection)tableVMonitoringList.getSelection();
if(!iss.isEmpty()) {
MonitoringIndexDAO monitoringIndexDao = (MonitoringIndexDAO)iss.getFirstElement();
UpdateMonitoringDialog dialog = new UpdateMonitoringDialog(parent.getShell(), monitoringIndexDao);
if(Dialog.OK == dialog.open()) {
refreshMonitoringIndex();
}
}
}
});
tltmModify.setText("Modify");
tltmModify.setEnabled(false);
tltmRemove = new ToolItem(toolBar, SWT.NONE);
tltmRemove.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
IStructuredSelection iss = (IStructuredSelection)tableVMonitoringList.getSelection();
if(!iss.isEmpty()) {
if(!MessageDialog.openConfirm(null, CommonMessages.get().Confirm, "Do you want delete?")) return;
MonitoringIndexDAO monitoringIndexDao = (MonitoringIndexDAO)iss.getFirstElement();
try {
TadpoleSystem_monitoring.deleteMonitoringIndex(monitoringIndexDao);
refreshMonitoringIndex();
} catch (Exception e1) {
logger.error("delete monitoring index", e1);
}
}
}
});
tltmRemove.setText("Remove");
tltmRemove.setEnabled(false);
// tltmAddTemplate = new ToolItem(toolBar, SWT.NONE);
// tltmAddTemplate.addSelectionListener(new SelectionAdapter() {
// @Override
// public void widgetSelected(SelectionEvent e) {
// }
// });
// tltmAddTemplate.setText("Add Template");
tableVMonitoringList = new TableViewer(compositeRight, SWT.BORDER | SWT.FULL_SELECTION);
tableVMonitoringList.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
if(!event.getSelection().isEmpty()) {
tltmModify.setEnabled(true);
tltmRemove.setEnabled(true);
}
}
});
Table tableIndex = tableVMonitoringList.getTable();
tableIndex.setHeaderVisible(true);
tableIndex.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
createMonitoringColumn();
tableVMonitoringList.setLabelProvider(new MonitoringIndexLabelProvider());
tableVMonitoringList.setContentProvider(new ArrayContentProvider());
sashFormTerm.setWeights(new int[] {3, 7});
Composite compositeResult = new Composite(sashFormMain, SWT.NONE);
compositeResult.setLayout(new GridLayout(1, false));
Composite compositeResultSearch = new Composite(compositeResult, SWT.NONE);
compositeResultSearch.setLayout(new GridLayout(9, false));
compositeResultSearch.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
// Label lblStatics = new Label(compositeResultSearch, SWT.NONE);
// lblStatics.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
// lblStatics.setText("Statics");
//
// comboStatics = new Combo(compositeResultSearch, SWT.READ_ONLY);
// comboStatics.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
// comboStatics.setVisibleItemCount(5);
// comboStatics.add("All");
// comboStatics.add("5 Minute");
// comboStatics.add("1 Hour");
// comboStatics.add("1 Day");
// comboStatics.add("1 Week");
// comboStatics.add("1 Month");
// comboStatics.select(0);
Label lblNewLabel = new Label(compositeResultSearch, SWT.NONE);
lblNewLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
lblNewLabel.setText("Result");
comboResult = new Combo(compositeResultSearch, SWT.READ_ONLY);
for (MonitoringDefine.MONITORING_STATUS type : MonitoringDefine.MONITORING_STATUS.values()) {
comboResult.add(type.getName());
}
comboResult.setVisibleItemCount(MonitoringDefine.MONITORING_STATUS.values().length);
comboResult.select(1);
Label lblStart = new Label(compositeResultSearch, SWT.NONE);
lblStart.setText("start");
dateTimeStart = new DateTime(compositeResultSearch, SWT.BORDER | SWT.DROP_DOWN);
Label label = new Label(compositeResultSearch, SWT.NONE);
label.setText("~");
dateTimeEnd = new DateTime(compositeResultSearch, SWT.BORDER | SWT.DROP_DOWN);
Button btnSearch = new Button(compositeResultSearch, SWT.NONE);
btnSearch.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
searchResultData();
}
});
btnSearch.setText("Search");
CTabFolder tabFolderResult = new CTabFolder(compositeResult, SWT.NONE);
tabFolderResult.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
CTabItem tbtmTable = new CTabItem(tabFolderResult, SWT.NONE);
tbtmTable.setText("Table");
Composite compositeTable = new Composite(tabFolderResult, SWT.NONE);
tbtmTable.setControl(compositeTable);
compositeTable.setLayout(new GridLayout(1, false));
tvResult = new TableViewer(compositeTable, SWT.BORDER | SWT.FULL_SELECTION);
tvResult.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
IStructuredSelection sel = (IStructuredSelection)event.getSelection();
if(!sel.isEmpty()) {
// MonitoringResultDAO dao = (MonitoringResultDAO)sel.getFirstElement();
// ResultSetViewDialog dialog = new ResultSetViewDialog(null, dao);
// dialog.open();
}
}
});
Table tableResult = tvResult.getTable();
tableResult.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
tableResult.setLinesVisible(true);
tableResult.setHeaderVisible(true);
createTableColumn(tvResult);
tvResult.setContentProvider(new ArrayContentProvider());
tvResult.setLabelProvider(new MonitoringResultLabelprovider());
sashFormMain.setWeights(new int[] {3, 7});
tabFolderResult.setSelection(0);
// Composite compositeSummary = new Composite(compositeResult, SWT.NONE);
// compositeSummary.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
// compositeSummary.setLayout(new GridLayout(4, false));
//
// Label lblTotal = new Label(compositeSummary, SWT.NONE);
// lblTotal.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
// lblTotal.setText("Total");
//
// text_1 = new Text(compositeSummary, SWT.BORDER);
// text_1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
//
// Label lblAverage = new Label(compositeSummary, SWT.NONE);
// lblAverage.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
// lblAverage.setText("Average");
//
// text = new Text(compositeSummary, SWT.BORDER);
// text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
initUI();
}
/**
* crate result column
*/
public void createTableColumn(TableViewer tvError) {
String[] arryTable = {"Title", "Status", "Value", "User Descripton", "System Description", "Result", "Date"};
int[] arryWidth = {120, 65, 80, 200, 200, 160, 100};
for(int i=0; i<arryTable.length; i++) {
TableViewerColumn tableViewerColumn = new TableViewerColumn(tvError, SWT.NONE);
TableColumn tblclmnDbName = tableViewerColumn.getColumn();
tblclmnDbName.setWidth(arryWidth[i]);
tblclmnDbName.setText(arryTable[i]);
}
}
/**
*
*/
private void searchResultData() {
IStructuredSelection iss = (IStructuredSelection)tableVMonitoringList.getSelection();
if(!iss.isEmpty()) {
MonitoringIndexDAO monitoringIndexDao = (MonitoringIndexDAO)iss.getFirstElement();
Calendar cal = Calendar.getInstance();
cal.set(dateTimeStart.getYear(), dateTimeStart.getMonth(), dateTimeStart.getDay(), 0, 0, 0);
long startTime = cal.getTimeInMillis();
cal.set(dateTimeEnd.getYear(), dateTimeEnd.getMonth(), dateTimeEnd.getDay(), 23, 59, 59);
long endTime = cal.getTimeInMillis();
try {
List<MonitoringResultDAO> listResult = TadpoleSystem_monitoring.getMonitoringResultHistory(monitoringIndexDao, comboResult.getText(), "", startTime, endTime);
for (MonitoringResultDAO monitoringResultDAO : listResult) {
monitoringResultDAO.setMonitoringIndexDAO(monitoringIndexDao);
}
tvResult.setInput(listResult);
tvResult.refresh();
} catch(Exception e) {
logger.error("find monitoring result", e);
}
}
}
/**
* initialize ui
*/
private void initUI() {
treeVUserDB.setContentProvider(new UserDBContentProvider());
treeVUserDB.setLabelProvider(new UserDBLabelProvider());
treeVUserDB.setInput(treeList);
reLoadDBList();
// end
Calendar cal = Calendar.getInstance();
// cal.add(Calendar.DAY_OF_YEAR, -1);
dateTimeStart.setDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH));
initIndexBtn(false);
// google analytic
AnalyticCaller.track(MonitoringManagerEditor.ID);
}
/**
* initialize index button
*
* @param isEnable
*/
private void initIndexBtn(boolean isEnable) {
tltmRefresh.setEnabled(isEnable);
tltmAdd.setEnabled(isEnable);
// tltmAddTemplate.setEnabled(isEnable);
}
/**
* initialize resultData
*/
private void initSearchResult() {
List<MonitoringResultDAO> listResult = new ArrayList<>();
tvResult.setInput(listResult);
}
/**
* refresh db list
*/
public void reLoadDBList() {
try {
treeList.clear();
List<UserDBDAO> userDBS = TadpoleSystem_UserDBQuery.getSessionUserDB();
// 그룹 이름을 생성합니다.
List<String> groupNames = new ArrayList<String>();
for (UserDBDAO userDBDAO : userDBS) {
if(!groupNames.contains(userDBDAO.getGroup_name())) {
groupNames.add(userDBDAO.getGroup_name());
}
}
for (UserDBDAO userDBDAO : userDBS) {
addUserDB(userDBDAO, false);
}
} catch (Exception e) {
logger.error("initialize Managerview", e);
Status errStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); //$NON-NLS-1$
ExceptionDetailsErrorDialog.openError(getSite().getShell(),CommonMessages.get().Error, "Can't load database.", errStatus); //$NON-NLS-1$
}
treeVUserDB.refresh();
treeVUserDB.expandToLevel(2);
}
/**
* monitoring index 초기화
*/
private void refreshMonitoringIndex() {
try {
List<MonitoringIndexDAO> listMonitoringIndex = TadpoleSystem_monitoring.getUserMonitoringIndex(userDB);
tableVMonitoringList.setInput(listMonitoringIndex);
tableVMonitoringList.refresh();
tltmModify.setEnabled(false);
tltmRemove.setEnabled(false);
} catch (Exception e) {
logger.error("get UserMonitoring index", e);
}
}
/**
* create monitoring column
*/
private void createMonitoringColumn() {
String[] arryTitle = {"Title", "KPI", "Method", "Type", "Index Name", "Condition", "Condition Value", "After"};
int[] arryWidth = {120, 70, 50, 130, 130, 70, 70, 150};
for (int i=0; i<arryTitle.length; i++) {
TableViewerColumn tableViewerColumn = new TableViewerColumn(tableVMonitoringList, SWT.NONE);
TableColumn tblclmnTitle = tableViewerColumn.getColumn();
tblclmnTitle.setWidth(arryWidth[i]);
tblclmnTitle.setText(arryTitle[i]);
}
}
/**
* tree에 새로운 항목 추가
*
* @param userDB
* @param defaultOpen
* default editor open
*/
private void addUserDB(UserDBDAO userDB, boolean defaultOpen) {
for (ManagerListDTO dto : treeList) {
if (dto.getName().equals(userDB.getGroup_name())) {
dto.addLogin(userDB);
if (defaultOpen) {
selectAndOpenView(userDB);
treeVUserDB.expandToLevel(userDB, 2);
}
return;
} // end if(dto.getname()....
} // end for
// 신규 그룹이면...
ManagerListDTO managerDto = new ManagerListDTO(userDB.getGroup_name());
managerDto.addLogin(userDB);
treeList.add(managerDto);
if (defaultOpen) {
selectAndOpenView(userDB);
treeVUserDB.expandToLevel(userDB, 2);
}
}
/**
* 트리를 갱신하고 쿼리 창을 엽니다.
*
* @param userDB
*/
private void selectAndOpenView(UserDBDAO userDB) {
treeVUserDB.refresh();
treeVUserDB.setSelection(new StructuredSelection(userDB), true);
// mongodb 일경우 열지 않는다.
if (userDB.getDBDefine() != DBDefine.MONGODB_DEFAULT) {
// MainEditorInput mei = new MainEditorInput(dto);
// IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
// try {
// page.openEditor(mei, MainEditor.ID);
// } catch (PartInitException e) {
// logger.error("main editor open", e); //$NON-NLS-1$
//
// Status errStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); //$NON-NLS-1$
// ExceptionDetailsErrorDialog.openError(getSite().getShell(),CommonMessages.get().Error, "Can't open resource. ", errStatus); //$NON-NLS-1$
// }
}
}
@Override
public void setFocus() {
}
}