/*******************************************************************************
* Copyright (c) 2013 hangum.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v2.1
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* hangum - initial API and implementation
******************************************************************************/
package com.hangum.tadpole.rdb.core.editors.sessionlist;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
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.MessageDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
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.rap.rwt.service.ServerPushSession;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
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.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.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
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.commons.util.GlobalImageUtils;
import com.hangum.tadpole.engine.define.DBDefine;
import com.hangum.tadpole.engine.define.DBGroupDefine;
import com.hangum.tadpole.engine.manager.TadpoleSQLManager;
import com.hangum.tadpole.engine.permission.PermissionChecker;
import com.hangum.tadpole.engine.query.dao.mysql.SessionListDAO;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
import com.hangum.tadpole.rdb.core.Activator;
import com.hangum.tadpole.rdb.core.Messages;
import com.hangum.tadpole.rdb.core.editors.dbinfos.composites.ColumnHeaderCreator;
import com.hangum.tadpole.rdb.core.editors.dbinfos.composites.TableViewColumnDefine;
import com.hangum.tadpole.rdb.core.editors.sessionlist.composite.mysql.MySQLSessionListLabelProvider;
import com.hangum.tadpole.rdb.core.editors.sessionlist.composite.mysql.MySQLSessionListTableCompare;
import com.hangum.tadpole.rdb.core.viewers.object.comparator.ObjectComparator;
import com.hangum.tadpole.session.manager.SessionManager;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.swtdesigner.SWTResourceManager;
/**
* DDB Session list editor
*
* mysql : http://dev.mysql.com/doc/refman/5.1/en/show-processlist.html
*
* @since 2013.04.01
* @author hangum
*
*/
public class SessionListEditor extends EditorPart {
private static final Logger logger = Logger.getLogger(SessionListEditor.class);
public static final String ID = "com.hangum.tadpole.rdb.core.editor.sessionlist"; //$NON-NLS-1$
private SashForm mainSashForm;
protected final int user_seq = SessionManager.getUserSeq();
private boolean isThread = true;
private final ServerPushSession pushSession = new ServerPushSession();
// set initialize button
private ToolItem tltmStart;
private ToolItem tltmStop;
private ToolItem tltmKillProcess;
private boolean isNotRefreshUi = false;
private UserDBDAO userDB;
private TableViewer tableViewerSessionList;
private ObjectComparator comparator;
private Text textQuery;
private TableViewer tableViewerLocks;
private TableViewer tableViewerBlock;
private Table tableLocks;
private List<HashMap> showLocksList;
private List<HashMap> showLockBlockList;
private Table table;
private Text textSQL;
private Text textRefreshMil;
private Button btnSessionLocks;
private Button btnAllLocks;
/** SESSION INTERVAL */
private int SESSION_INTERVAL = 10;
public SessionListEditor() {
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);
SessionListEditorInput qei = (SessionListEditorInput)input;
this.userDB = qei.getUserDB();
setPartName(qei.getName());
}
@Override
public boolean isDirty() {
return false;
}
@Override
public boolean isSaveAsAllowed() {
return false;
}
@Override
public void createPartControl(Composite parent) {
GridLayout gl_parent = new GridLayout(1, false);
gl_parent.verticalSpacing = 0;
gl_parent.horizontalSpacing = 0;
gl_parent.marginHeight = 0;
gl_parent.marginWidth = 0;
parent.setLayout(gl_parent);
mainSashForm = new SashForm(parent, SWT.NONE);
mainSashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
createSessionUI();
if(userDB.getDBDefine() == DBDefine.ORACLE_DEFAULT||
//userDB.getDBDefine() == DBDefine.TIBERO_DEFAULT||
userDB.getDBGroup() == DBGroupDefine.MYSQL_GROUP) {
createOracleExtensionUI();
mainSashForm.setWeights(new int[] {1, 1});
}
}
/**
* crate extension oracle
*/
private void createOracleExtensionUI() {
Composite compositeExtension = new Composite(mainSashForm, SWT.NONE);
compositeExtension.setLayout(new GridLayout(1, false));
SashForm sashFormExtension = new SashForm(compositeExtension, SWT.VERTICAL);
sashFormExtension.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
Composite compositeExtHead = new Composite(sashFormExtension, SWT.NONE);
compositeExtHead.setLayout(new GridLayout(1, false));
Composite composite = new Composite(compositeExtHead, SWT.NONE);
composite.setLayout(new GridLayout(2, false));
btnAllLocks = new Button(composite, SWT.RADIO);
btnAllLocks.setText("All Locks");
btnAllLocks.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
refreshLocksList("");
}
});
btnSessionLocks = new Button(composite, SWT.RADIO);
btnSessionLocks.setSelection(true);
btnSessionLocks.setText("Session Locks");
tableViewerLocks = new TableViewer(compositeExtHead, SWT.BORDER | SWT.FULL_SELECTION);
tableLocks = tableViewerLocks.getTable();
tableLocks.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if(tableViewerLocks.getSelection().isEmpty()) return;
StructuredSelection ss = (StructuredSelection)tableViewerLocks.getSelection();
HashMap map = (HashMap)ss.getFirstElement();
if(null != map) {
if(DBGroupDefine.MYSQL_GROUP == userDB.getDBGroup()){
refreshLocksBlockList((String)map.get("lock_trx_id"), "");
}else{
refreshLocksBlockList((String)map.get("LOCK_ID1"), (String)map.get("LOCK_ID2"));
}
}
}
});
tableLocks.setHeaderVisible(true);
tableLocks.setLinesVisible(true);
tableLocks.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
createLocksTableColumn();
Composite compositeExtBody = new Composite(sashFormExtension, SWT.NONE);
compositeExtBody.setLayout(new GridLayout(1, false));
Label lblBlockedBlocking = new Label(compositeExtBody, SWT.NONE);
lblBlockedBlocking.setText("Blocked && Blocking");
tableViewerBlock = new TableViewer(compositeExtBody, SWT.BORDER | SWT.FULL_SELECTION);
table = tableViewerBlock.getTable();
table.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if(tableViewerBlock.getSelection().isEmpty()) return;
StructuredSelection ss = (StructuredSelection)tableViewerBlock.getSelection();
HashMap map = (HashMap)ss.getFirstElement();
if(null != map) {
textSQL.setText(StringUtils.trimToEmpty((String)map.get("SQL_TEXT")));
}else{
textSQL.setText(StringUtils.EMPTY);
}
}
});
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
table.setHeaderVisible(true);
table.setLinesVisible(true);
textSQL = new Text(compositeExtBody, SWT.BORDER | SWT.READ_ONLY | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI);
textSQL.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
GridData gd_textSQL = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
gd_textSQL.heightHint = 80;
textSQL.setLayoutData(gd_textSQL);
sashFormExtension.setWeights(new int[] {1, 1});
createLocksBlockTableColumn();
}
private void createLocksTableColumn() {
TableViewColumnDefine[] tableColumnDef = null;
if(DBGroupDefine.ORACLE_GROUP == userDB.getDBGroup()){
this.btnAllLocks.setEnabled(true);
this.btnSessionLocks.setEnabled(true);
tableColumnDef = new TableViewColumnDefine[] { new TableViewColumnDefine("SID", "Session ID", 80, SWT.RIGHT) //$NON-NLS-1$
, new TableViewColumnDefine("USERNAME", "User Name", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("LOCK_TYPE", "Lock Type", 80, SWT.CENTER) //$NON-NLS-1$
, new TableViewColumnDefine("MODE_HELD", "Mode Held", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("MODE_REQUESTED", "Mode Requested", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("OWNER", "Owner", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("OBJECT_TYPE", "Object Type", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("OBJECT_NAME", "Object Name", 100, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("BLOCK", "Blocking", 60, SWT.CENTER) //$NON-NLS-1$
, new TableViewColumnDefine("LOCKWAIT", "Blocked", 60, SWT.CENTER) //$NON-NLS-1$
, new TableViewColumnDefine("OSUSER", "OS User", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("MACHINE", "Machine", 100, SWT.LEFT) //$NON-NLS-1$
};
}else if(DBGroupDefine.MYSQL_GROUP == userDB.getDBGroup()){
this.btnAllLocks.setEnabled(false);
this.btnSessionLocks.setEnabled(false);
tableColumnDef = new TableViewColumnDefine[] { new TableViewColumnDefine("lock_id", "Lock ID", 80, SWT.RIGHT) //$NON-NLS-1$
, new TableViewColumnDefine("lock_trx_id", "Transaction ID", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("lock_mode", "Lock mode", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("lock_type", "Lock type", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("lock_table", "Lock table", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("lock_index", "Lock index", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("lock_space", "Lock space", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("lock_page", "Lock page", 100, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("lock_rec", "Lock rec", 60, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("lock_data", "Lock data", 60, SWT.LEFT) //$NON-NLS-1$
};
}
ColumnHeaderCreator.createColumnHeader(tableViewerLocks, tableColumnDef);
tableViewerLocks.setContentProvider(new ArrayContentProvider());
tableViewerLocks.setLabelProvider(new SessionLocksLabelProvider(tableViewerLocks));
}
private void createLocksBlockTableColumn() {
TableViewColumnDefine[] tableColumnDef = null;
if(DBGroupDefine.ORACLE_GROUP == userDB.getDBGroup()){
tableColumnDef = new TableViewColumnDefine[] { new TableViewColumnDefine("SID", "Session ID", 80, SWT.RIGHT) //$NON-NLS-1$
, new TableViewColumnDefine("USERNAME", "User Name", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("BLOCK_TYPE", "Block Type", 80, SWT.CENTER) //$NON-NLS-1$
, new TableViewColumnDefine("STATUS", "Status", 80, SWT.CENTER) //$NON-NLS-1$
, new TableViewColumnDefine("SQL_TEXT", "SQL", 300, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("LOCK_TYPE", "Lock Type", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("MODE_HELD", "Mode Held", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("MODE_REQUESTED", "Mode Requested", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("OSUSER", "OS User", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("MACHINE", "Machine", 100, SWT.LEFT) //$NON-NLS-1$
};
}else if(DBGroupDefine.MYSQL_GROUP == userDB.getDBGroup()){
tableColumnDef = new TableViewColumnDefine[] { new TableViewColumnDefine("trx_id", "Transaction ID", 80, SWT.RIGHT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_state", "State", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_started", "Started", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_requested_lock_id", "Requested lock", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_wait_started", "Wait started", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_weight", "Weight", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_mysql_thread_id", "Thread ID", 80, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("SQL_TEXT", "SQL", 100, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_operation_state", "Operation state", 60, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_tables_in_use", "In use", 60, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_tables_locked", "Locked", 60, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_lock_structs", "Structs", 60, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_lock_memory_bytes", "Memory bytes", 60, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_rows_locked", "Rows locked", 60, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_rows_modified", "Rows modified", 60, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_concurrency_tickets", "Concur..Tickets", 60, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_isolation_level", "Isolation Level", 60, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_unique_checks", "Unique check", 60, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_foreign_key_checks", "ForeignKey check", 60, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_last_foreign_key_error", "ForeignKey error", 60, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_adaptive_hash_latched", "Hash latched", 60, SWT.LEFT) //$NON-NLS-1$
, new TableViewColumnDefine("trx_adaptive_hash_timeout", "Hash timeout", 60, SWT.LEFT) //$NON-NLS-1$
};
}
ColumnHeaderCreator.createColumnHeader(tableViewerBlock, tableColumnDef);
tableViewerBlock.setContentProvider(new ArrayContentProvider());
tableViewerBlock.setLabelProvider(new SessionLocksLabelProvider(tableViewerBlock));
}
public void refreshLocksList(String sid) {
try {
SqlMapClient sqlClient = TadpoleSQLManager.getInstance(userDB);
Map<String, String> param = new HashMap<String, String>();
param.put("sid", StringUtils.replace(sid, ",", ""));
showLocksList = (List<HashMap>) sqlClient.queryForList("getLockList", param); //$NON-NLS-1$
if (showLocksList!=null && showLocksList.size() > 0){
tableViewerLocks.setInput(showLocksList);
tableViewerLocks.refresh();
}
//tableViewerBlock.setInput(new ArrayList<HashMap<String, Object>>());
//tableViewerBlock.refresh();
} catch (Exception e) {
logger.error("refresh list", 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, e.getMessage(), errStatus); //$NON-NLS-1$
}
}
public void refreshLocksBlockList(String lock_id1, String lock_id2) {
try {
SqlMapClient sqlClient = TadpoleSQLManager.getInstance(userDB);
Map<String, String> param = new HashMap<String, String>();
param.put("lock_id1", StringUtils.replace(lock_id1, ",", ""));
param.put("lock_id2", StringUtils.replace(lock_id2, ",", ""));
showLockBlockList = (List<HashMap>) sqlClient.queryForList("getLockBlockList", param); //$NON-NLS-1$
tableViewerBlock.setInput(showLockBlockList);
tableViewerBlock.refresh();
} catch (Exception e) {
logger.error("refresh list", 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, e.getMessage(), errStatus); //$NON-NLS-1$
}
}
/**
* 기본 세션 모니터링 화면을 조회 합니다.
*/
private void createSessionUI() {
Composite compositSessionUI = new Composite(mainSashForm, SWT.NONE);
compositSessionUI.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
GridLayout gl_compositeHead = new GridLayout(1, false);
gl_compositeHead.marginHeight = 0;
gl_compositeHead.horizontalSpacing = 0;
gl_compositeHead.marginWidth = 0;
compositSessionUI.setLayout(gl_compositeHead);
Composite compositeSessionHead = new Composite(compositSessionUI, SWT.NONE);
compositeSessionHead.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
compositeSessionHead.setLayout(new GridLayout(2, false));
Composite compositeSessionBody = new Composite(compositSessionUI, SWT.NONE);
compositeSessionBody.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
textRefreshMil = new Text(compositeSessionHead, SWT.BORDER);
textRefreshMil.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent event) {
validateInterval();
}
});
textRefreshMil.setText("10");
GridData gd_textRefreshMil = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
gd_textRefreshMil.widthHint = 30;
gd_textRefreshMil.minimumWidth = 30;
textRefreshMil.setLayoutData(gd_textRefreshMil);
ToolBar toolBar = new ToolBar(compositeSessionHead, SWT.FLAT | SWT.RIGHT);
toolBar.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
ToolItem tltmSecondsRefresh = new ToolItem(toolBar, SWT.NONE);
tltmSecondsRefresh.setText(Messages.get().SessionListEditor_4);
tltmStart = new ToolItem(toolBar, SWT.NONE);
tltmStart.setToolTipText(CommonMessages.get().Start);
tltmStart.setImage(GlobalImageUtils.getStart()); //$NON-NLS-1$
tltmStart.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if(!validateInterval()) return;
isNotRefreshUi = true;
tltmStart.setEnabled(false);
tltmStop.setEnabled(true);
initSessionListData();
}
});
tltmStart.setEnabled(true);
tltmStop = new ToolItem(toolBar, SWT.NONE);
tltmStop.setToolTipText(CommonMessages.get().Stop);
tltmStop.setImage(GlobalImageUtils.getStop());
tltmStop.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
isNotRefreshUi = false;
tltmStart.setEnabled(true);
tltmStop.setEnabled(false);
}
});
tltmStop.setEnabled(false);
new ToolItem(toolBar, SWT.SEPARATOR);
ToolItem tltmRefresh = new ToolItem(toolBar, SWT.NONE);
tltmRefresh.setToolTipText(CommonMessages.get().Refresh);
tltmRefresh.setImage(GlobalImageUtils.getRefresh());
tltmRefresh.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
initSessionListData();
}
});
new ToolItem(toolBar, SWT.SEPARATOR);
tltmKillProcess = new ToolItem(toolBar, SWT.NONE);
tltmKillProcess.setToolTipText(Messages.get().SessionListEditor_3);
tltmKillProcess.setImage(GlobalImageUtils.getKilling());
tltmKillProcess.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean isPossible = false;
if(PermissionChecker.isDBAdminRole(userDB)) isPossible = true;
else {
if(!PermissionChecker.isProductBackup(userDB)) isPossible = true;
}
if(isPossible) {
killProcess();
} else {
MessageDialog.openWarning(PlatformUI.getWorkbench().getDisplay().getActiveShell(), CommonMessages.get().Warning, Messages.get().MainEditor_21);
}
}
});
tltmKillProcess.setEnabled(false);
compositeSessionBody.setLayout(new GridLayout(1, false));
SashForm sashForm = new SashForm(compositeSessionBody, SWT.VERTICAL);
sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
Composite compositeBody = new Composite(sashForm, SWT.NONE);
compositeBody.setLayout(new GridLayout(1, false));
tableViewerSessionList = new TableViewer(compositeBody, SWT.BORDER | SWT.FULL_SELECTION);
tableViewerSessionList.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
if(tableViewerSessionList.getSelection().isEmpty()) return;
tltmKillProcess.setEnabled(true);
StructuredSelection ss = (StructuredSelection)tableViewerSessionList.getSelection();
SessionListDAO sl = (SessionListDAO)ss.getFirstElement();
if(null != sl.getInfo()) {
refreshLocksList( sl.getSID());
textQuery.setText(sl.getInfo());
textQuery.setFocus();
} else {
textQuery.setText(""); //$NON-NLS-1$
}
}
});
Table tableSessionList = tableViewerSessionList.getTable();
tableSessionList.setHeaderVisible(true);
tableSessionList.setLinesVisible(true);
tableSessionList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
Group compositeQuery = new Group(sashForm, SWT.NONE);
compositeQuery.setLayout(new GridLayout(1, false));
compositeQuery.setText(Messages.get().Query);
textQuery = new Text(compositeQuery, SWT.BORDER | SWT.READ_ONLY | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI);
textQuery.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
comparator = new MySQLSessionListTableCompare();
tableViewerSessionList.setSorter(comparator);
createColumn();
tableViewerSessionList.setContentProvider(new ArrayContentProvider());
tableViewerSessionList.setLabelProvider(new MySQLSessionListLabelProvider());
sashForm.setWeights(new int[] {7, 3});
pushSession.start();
Thread thread = new Thread(startUIThread());
thread.setDaemon(true);
thread.start();
initSessionListData();
}
/**
* check validate interval
* @return
*/
private boolean validateInterval() {
String strRefreshTerm = textRefreshMil.getText();
if(!NumberUtils.isNumber(strRefreshTerm)) {
MessageDialog.openInformation(null, CommonMessages.get().Information, Messages.get().SessionListEditor_GreatThan10Sec);
return false;
} else if(Integer.parseInt(strRefreshTerm) < 10) {
MessageDialog.openInformation(null, CommonMessages.get().Information, Messages.get().SessionListEditor_GreatThan10Sec);
return false;
}
SESSION_INTERVAL = Integer.parseInt(strRefreshTerm);
return true;
}
/**
* start ui thread
*
* @return
*/
private Runnable startUIThread() {
final Display display = tltmStart.getDisplay();
Runnable bgRunnable = new Runnable() {
@Override
public void run() {
while(isThread) {
display.syncExec(new Runnable() {
@Override
public void run() {
if(isNotRefreshUi) initSessionListData();
}
});
// 20 seconds
try{ Thread.sleep(1000 * SESSION_INTERVAL); } catch(Exception e) {}
} // end while
};
};
return bgRunnable;
}
/**
* kill process
*/
private void killProcess() {
StructuredSelection ss = (StructuredSelection)tableViewerSessionList.getSelection();
SessionListDAO sl = (SessionListDAO)ss.getFirstElement();
if(!MessageDialog.openConfirm(null, CommonMessages.get().Confirm, Messages.get().SessionListEditor_8)) return;
try {
SqlMapClient client = TadpoleSQLManager.getInstance(userDB);
if (DBGroupDefine.POSTGRE_GROUP == userDB.getDBGroup()) {
client.queryForObject("killProcess", Integer.parseInt(sl.getId())); //$NON-NLS-1$
} else if (DBGroupDefine.ALTIBASE_GROUP == userDB.getDBGroup()){
Map<String, String> parameters = new HashMap<String, String>(2);
parameters.put("dbname", sl.getDb());
parameters.put("session_id", sl.getId());
client.queryForObject("killProcess", parameters);
} else {
client.queryForObject("killProcess", sl.getId()); //$NON-NLS-1$
}
initSessionListData();
} catch(Exception e) {
logger.error("killprocess exception", 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, Messages.get().MainEditor_19, errStatus); //$NON-NLS-1$
}
}
/**
* editor init data
*/
private void initSessionListData() {
// 버튼을 초기화 합니다.
tltmKillProcess.setEnabled(false);
try {
SqlMapClient sqlClient = TadpoleSQLManager.getInstance(userDB);
List<?> listSessionList = null;
if (DBDefine.ORACLE_DEFAULT == userDB.getDBDefine()) {
int getSessionGrant = (Integer) sqlClient.queryForObject("getSessionGrant"); //$NON-NLS-1$
if (0 >= getSessionGrant){
Status errStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, "In order to display a list of the session , you want to manage, and requires a authority.", null); //$NON-NLS-1$
ExceptionDetailsErrorDialog.openError(getSite().getShell(),CommonMessages.get().Error, Messages.get().SessionListEditor_13, errStatus); //$NON-NLS-1$
return;
}
try {
int getSessionView = (Integer) sqlClient.queryForObject("getSessionView"); //$NON-NLS-1$
}catch (Exception e) {
Status errStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); //$NON-NLS-1$
ExceptionDetailsErrorDialog.openError(getSite().getShell(),CommonMessages.get().Error, Messages.get().SessionListEditor_15, errStatus); //$NON-NLS-1$
return;
}
int version = (Integer) sqlClient.queryForObject("getVersion"); //$NON-NLS-1$
if (version <= 9){
listSessionList = sqlClient.queryForList("sessionList_9"); //$NON-NLS-1$
}else{
listSessionList = sqlClient.queryForList("sessionList"); //$NON-NLS-1$
}
} else if(DBDefine.TIBERO_DEFAULT == userDB.getDBDefine()) {
int getSessionGrant = (Integer) sqlClient.queryForObject("getSessionGrant"); //$NON-NLS-1$
if (0 >= getSessionGrant){
Status errStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, "In order to display a list of the session , you want to manage, and requires a authority.", null); //$NON-NLS-1$
ExceptionDetailsErrorDialog.openError(getSite().getShell(),CommonMessages.get().Error, Messages.get().SessionListEditor_13, errStatus); //$NON-NLS-1$
return;
}
try {
int getSessionView = (Integer) sqlClient.queryForObject("getSessionView"); //$NON-NLS-1$
}catch (Exception e) {
Status errStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); //$NON-NLS-1$
ExceptionDetailsErrorDialog.openError(getSite().getShell(),CommonMessages.get().Error, Messages.get().SessionListEditor_15, errStatus); //$NON-NLS-1$
return;
}
listSessionList = sqlClient.queryForList("sessionList"); //$NON-NLS-1$
}else{
listSessionList = sqlClient.queryForList("sessionList"); //$NON-NLS-1$
}
tableViewerSessionList.setInput(listSessionList);
tableViewerSessionList.refresh();
} catch (Exception e) {
logger.error("initialize session list", e); //$NON-NLS-1$
exitSession();
Status errStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); //$NON-NLS-1$
ExceptionDetailsErrorDialog.openError(getSite().getShell(),CommonMessages.get().Error, Messages.get().MainEditor_19, errStatus); //$NON-NLS-1$
}
}
private void exitSession() {
isThread = true;
isNotRefreshUi = false;
tltmStart.setEnabled(false);
tltmStop.setEnabled(false);
pushSession.stop();
}
/**
* create column
*/
private void createColumn() {
String[] name = {Messages.get().PID, Messages.get().User, Messages.get().Host, Messages.get().Database, Messages.get().Command, Messages.get().Time, Messages.get().State, CommonMessages.get().Information};
int[] size = {70, 70, 150, 70, 70, 100, 50, 200};
for (int i=0; i<name.length; i++) {
TableViewerColumn tableColumn = new TableViewerColumn(tableViewerSessionList, SWT.LEFT);
tableColumn.getColumn().setText(name[i]);
tableColumn.getColumn().setWidth(size[i]);
tableColumn.getColumn().addSelectionListener(getSelectionAdapter(tableViewerSessionList, comparator, tableColumn.getColumn(), i));
}
}
/**
* table sorter
*
* @param comparator
* @param viewer
* @param column
* @param index
* @return
*/
private SelectionAdapter getSelectionAdapter(final TableViewer viewer, final ObjectComparator comparator, final TableColumn column, final int index) {
SelectionAdapter adapter = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
comparator.setColumn(index);
viewer.getTable().setSortDirection(comparator.getDirection());
viewer.getTable().setSortColumn(column);
viewer.refresh();
}
};
return adapter;
}
@Override
public void setFocus() {
tableViewerSessionList.getTable().setFocus();
}
@Override
public void dispose() {
super.dispose();
isThread = false;
pushSession.stop();
}
}