/*******************************************************************************
* 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.main;
import java.sql.Connection;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
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.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.ProgressEvent;
import org.eclipse.swt.browser.ProgressListener;
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.Combo;
import org.eclipse.swt.widgets.Composite;
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 com.hangum.tadpole.ace.editor.core.dialogs.help.RDBShortcutHelpDialog;
import com.hangum.tadpole.ace.editor.core.texteditor.EditorExtension;
import com.hangum.tadpole.ace.editor.core.texteditor.function.EditorFunctionService;
import com.hangum.tadpole.ace.editor.core.texteditor.function.IEditorFunction;
import com.hangum.tadpole.commons.dialogs.fileupload.SingleFileuploadDialog;
import com.hangum.tadpole.commons.exception.dialog.ExceptionDetailsErrorDialog;
import com.hangum.tadpole.commons.google.analytics.AnalyticCaller;
import com.hangum.tadpole.commons.libs.core.define.DefineExternalPlguin;
import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine;
import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine.OBJECT_TYPE;
import com.hangum.tadpole.commons.libs.core.message.CommonMessages;
import com.hangum.tadpole.commons.util.ApplicationArgumentUtils;
import com.hangum.tadpole.commons.util.RequestInfoUtils;
import com.hangum.tadpole.commons.util.ShortcutPrefixUtils;
import com.hangum.tadpole.engine.define.DBGroupDefine;
import com.hangum.tadpole.engine.manager.AbstractTadpoleManager;
import com.hangum.tadpole.engine.manager.TadpoleSQLManager;
import com.hangum.tadpole.engine.manager.TadpoleSQLTransactionManager;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
import com.hangum.tadpole.engine.query.dao.system.UserDBResourceDAO;
import com.hangum.tadpole.engine.query.dao.system.bill.UserBillEditorInput;
import com.hangum.tadpole.engine.query.sql.DBSystemSchema;
import com.hangum.tadpole.engine.query.sql.TadpoleSystem_UserDBResource;
import com.hangum.tadpole.engine.sql.dialog.save.ResourceSaveDialog;
import com.hangum.tadpole.engine.sql.util.SQLUtil;
import com.hangum.tadpole.engine.utils.EditorDefine;
import com.hangum.tadpole.engine.utils.RequestQuery;
import com.hangum.tadpole.preference.define.GetAdminPreference;
import com.hangum.tadpole.preference.define.PreferenceDefine;
import com.hangum.tadpole.preference.get.GetPreferenceGeneral;
import com.hangum.tadpole.rdb.core.Activator;
import com.hangum.tadpole.rdb.core.Messages;
import com.hangum.tadpole.rdb.core.dialog.db.DBInformationDialog;
import com.hangum.tadpole.rdb.core.dialog.db.UserDBGroupDialog;
import com.hangum.tadpole.rdb.core.dialog.export.sqltoapplication.SQLToStringDialog;
import com.hangum.tadpole.rdb.core.dialog.restfulapi.MainSQLEditorAPIServiceDialog;
import com.hangum.tadpole.rdb.core.editors.main.composite.ResultMainComposite;
import com.hangum.tadpole.rdb.core.editors.main.function.MainEditorBrowserFunctionService;
import com.hangum.tadpole.rdb.core.editors.main.utils.ExtMakeContentAssistUtil;
import com.hangum.tadpole.rdb.core.extensionpoint.definition.IMainEditorExtension;
import com.hangum.tadpole.rdb.core.extensionpoint.handler.MainEditorContributionsHandler;
import com.hangum.tadpole.rdb.core.util.DialogUtil;
import com.hangum.tadpole.rdb.core.util.EditorUtils;
import com.hangum.tadpole.rdb.core.viewers.connections.DBIconsUtils;
import com.hangum.tadpole.rdb.core.viewers.object.ExplorerViewer;
import com.hangum.tadpole.rdb.core.viewers.object.sub.utils.TadpoleObjectQuery;
import com.hangum.tadpole.session.manager.SessionManager;
import com.hangum.tadpole.sql.format.SQLFormater;
import com.swtdesigner.ResourceManager;
/**
* 쿼리 수행 및 검색 창.
*
* @author hangum
*
*/
public class MainEditor extends EditorExtension {
/** Editor ID. */
public static final String ID = "com.hangum.tadpole.rdb.core.editor.main"; //$NON-NLS-1$
/** Logger for this class. */
private static final Logger logger = Logger.getLogger(MainEditor.class);
/**
* MySQL 그룹은 스키마를 콤보박스
*/
protected Combo comboSchema;
/** connection URL */
private ToolItem tltmConnectURL;
/** auto save를 위해 마지막 콘텐츠 를 남겨 놓는다. */
private String strLastContent = "";
/** toolbar auto commit */
private ToolItem tiAutoCommit = null, tiAutoCommitCommit = null, tiAutoCommitRollback = null;
/** result tab */
protected ResultMainComposite resultMainComposite;
/** edior가 초기화 될때 처음 로드 되어야 하는 String. */
protected String initDefaultEditorStr = ""; //$NON-NLS-1$
/** 현재 editor가 열린 상태. 즉 table, view, index 등의 상태. */
protected OBJECT_TYPE dbAction;
/** resource 정보. */
protected UserDBResourceDAO dBResource;
/** 자동 저장 auto save */
protected UserDBResourceDAO dBResourceAuto;
/** save mode */
protected boolean isDirty = false;
/** short cut prefix */
protected static final String STR_SHORT_CUT_PREFIX = ShortcutPrefixUtils.getCtrlShortcut();
protected SashForm sashFormExtension;
protected IMainEditorExtension[] compMainExtions;
public MainEditor() {
super();
}
@Override
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
MainEditorInput qei = (MainEditorInput)input;
try {
userDB = (UserDBDAO)qei.getUserDB().clone();
} catch(Exception e) {
logger.error("set define default userDB", e);
}
initDefaultEditorStr = qei.getDefaultStr();
strLastContent = qei.getDefaultStr();
dbAction = qei.getDbAction();
String strPartName = qei.getName();
dBResource = qei.getResourceDAO();
if(dBResource != null) {
strPartName = dBResource.getName();
} else {
// 기본 저장된 쿼리가 있는지 가져온다.
try {
dBResourceAuto = TadpoleSystem_UserDBResource.getDefaultDBResourceData(userDB);
if(dBResourceAuto != null) {
if(!StringUtils.isEmpty(dBResourceAuto.getDataString())) {
if(DBGroupDefine.MYSQL_GROUP == userDB.getDBGroup()) {
initDefaultEditorStr = dBResourceAuto.getDataString() + Messages.get().AutoRecoverMsg_mysql + initDefaultEditorStr;
} else {
initDefaultEditorStr = dBResourceAuto.getDataString() + Messages.get().AutoRecoverMsg + initDefaultEditorStr;
}
}
}
} catch(Exception e) {
logger.error("Get default resource", e);
}
}
strLastContent = initDefaultEditorStr;
strRoleType = userDB.getRole_id();
super.setUserType(strRoleType);
// schema 변경
setSite(site);
setInput(input);
setPartName(strPartName);
setTitleImage(DBIconsUtils.getEditorImage(getUserDB()));
}
@Override
public boolean isDirty() {
return isDirty;
}
@Override
public boolean isSaveAsAllowed() {
if(dBResource == null) return false;
else return true;
}
@Override
public void createPartControl(Composite parent) {
GridLayout gl_parent = new GridLayout(1, false);
gl_parent.verticalSpacing = 2;
gl_parent.horizontalSpacing = 2;
gl_parent.marginHeight = 2;
gl_parent.marginWidth = 2;
parent.setLayout(gl_parent);
// 에디터 확장을 위한 기본 베이스 위젲을 설정합니다.
sashFormExtension = new SashForm(parent, SWT.NONE);
sashFormExtension.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
SashForm sashForm = new SashForm(sashFormExtension, SWT.VERTICAL);
sashForm.setSashWidth(4);
sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
final Composite compositeEditor = new Composite(sashForm, SWT.NONE);
GridLayout gl_compositeEditor = new GridLayout(3, false);
gl_compositeEditor.verticalSpacing = 0;
gl_compositeEditor.horizontalSpacing = 0;
gl_compositeEditor.marginHeight = 0;
gl_compositeEditor.marginWidth = 0;
compositeEditor.setLayout(gl_compositeEditor);
ToolBar toolBar = new ToolBar(compositeEditor, SWT.NONE | SWT.FLAT | SWT.RIGHT);
tltmConnectURL = new ToolItem(toolBar, SWT.NONE);
tltmConnectURL.setToolTipText(Messages.get().DatabaseInformation);
tltmConnectURL.setImage(ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/editor/connect.png")); //$NON-NLS-1$
initConnectionInfo();
tltmConnectURL.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
DBInformationDialog dialog = new DBInformationDialog(getSite().getShell(), userDB);
dialog.open();
setFocus();
}
});
// 패스워드를 물어야 하면 화면에서 보이지 않도록 수정.
if(PublicTadpoleDefine.YES_NO.NO.name().equals(GetAdminPreference.getConnectionAskType())) {
final ToolItem tltmSelectDB = new ToolItem(toolBar, SWT.NONE);
tltmSelectDB.setToolTipText(Messages.get().SelectOthersDB);
tltmSelectDB.setImage(ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/editor/arrow_down.png")); //$NON-NLS-1$
tltmSelectDB.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if(!isAutoCommit()) {
MessageDialog.openWarning(getSite().getShell(), CommonMessages.get().Warning, Messages.get().PleaseEndedTransaction);
} else {
UserDBGroupDialog dialog = new UserDBGroupDialog(getSite().getShell(), userDB);
if(Dialog.OK == dialog.open()) {
UserDBDAO selectedUserDB = dialog.getUserDB();
if(selectedUserDB != null) {
userDB = selectedUserDB;
try {
TadpoleObjectQuery.getTableList(userDB);
} catch (Exception e1) {
logger.error("get table list", e1);
}
initConnectionInfo();
comboSchema.removeAll();
// if mysql db listup schema list
if(userDB.getDBGroup() == DBGroupDefine.MYSQL_GROUP){
try {
for (Object object : DBSystemSchema.getSchemas(userDB)) {
HashMap<String, String> mapData = (HashMap)object;
comboSchema.add(mapData.get("SCHEMA"));
}
userDB.setSchema(userDB.getDb());
comboSchema.setText(userDB.getDb());
} catch (Exception ee) {
comboSchema.setItems( new String[]{userDB.getSchema()} );
logger.error("get system schemas " + ee.getMessage());
}
} else {
comboSchema.add(userDB.getDb());
comboSchema.select(0);
}
} // end selected db
} // end dialog open
}
setFocus();
}
});
new ToolItem(toolBar, SWT.SEPARATOR);
}
// mysql group 이면 스키마 목록이 보이도록 합니다.
if(getUserDB().getDBGroup() == DBGroupDefine.MYSQL_GROUP | userDB.getDBGroup() == DBGroupDefine.ORACLE_GROUP | userDB.getDBGroup() == DBGroupDefine.POSTGRE_GROUP ) {
ToolItem sep = new ToolItem(toolBar, SWT.SEPARATOR);
comboSchema = new Combo(toolBar, SWT.READ_ONLY);
comboSchema.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
final String strSchema = comboSchema.getText();
userDB.setSchema(strSchema);
// 기존에 설정되어 있는 테이블 목록등을 삭제한다.
userDB.setTableListSeparator(null);
userDB.setViewListSeparator(null);
userDB.setFunctionLisstSeparator(null);
Connection conn = null;
try {
conn = TadpoleSQLManager.getConnection(userDB);
AbstractTadpoleManager.changeSchema(userDB, conn);
} catch(Exception e3) {
logger.error("** initialize connection", e3);
} finally {
try { if(conn != null) conn.close(); } catch(Exception ee) {}
}
//오브젝트 익스플로어가 같은 스키마 일경우 스키마가 변경되도록.
getSite().getShell().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
try {
ExplorerViewer ev = (ExplorerViewer)PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(ExplorerViewer.ID);
ev.changeSchema(userDB, strSchema);
} catch (PartInitException e) {
logger.error("ExplorerView show", e); //$NON-NLS-1$
}
}
});
}
});
//
// 스키마리스트가 없는 경우 스키마 리스트를 가지고 넣는다.
//
if(userDB.getSchemas().isEmpty()) {
try {
for (Object object : DBSystemSchema.getSchemas(userDB)) {
HashMap<String, String> mapData = (HashMap)object;
comboSchema.add(mapData.get("SCHEMA"));
userDB.addSchema(comboSchema.getText());
}
comboSchema.select(0);
userDB.setSchema(comboSchema.getText());
} catch(Exception e) {
logger.error("get schema list " + e.getMessage());
}
} else {
for (String schema : userDB.getSchemas()) {
comboSchema.add(schema);
}
if("".equals(userDB.getSchema())) {
comboSchema.select(0);
userDB.setSchema(comboSchema.getText());
}
}
comboSchema.setVisibleItemCount(userDB.getSchemas().size());
comboSchema.setText(userDB.getSchema());
comboSchema.pack();
new ToolItem(toolBar, SWT.SEPARATOR);
sep.setWidth(comboSchema.getSize().x);
sep.setControl(comboSchema);
toolBar.pack();
}
// fileupload
ToolItem tltmOpen = new ToolItem(toolBar, SWT.NONE);
tltmOpen.setToolTipText(Messages.get().MainEditor_35);
tltmOpen.setImage(ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/editor/file-open.png")); //$NON-NLS-1$
tltmOpen.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
SingleFileuploadDialog dialog = new SingleFileuploadDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell(), Messages.get().MainEditor_36);
if(Dialog.OK == dialog.open()) {
// if(logger.isDebugEnabled()) logger.debug("============> " + dialog.getStrTxtFile()); //$NON-NLS-1$
appendText(dialog.getStrTxtFile());
}
}
});
new ToolItem(toolBar, SWT.SEPARATOR);
ToolItem tltmExecute = new ToolItem(toolBar, SWT.NONE);
tltmExecute.setToolTipText(String.format(Messages.get().MainEditor_tltmExecute_toolTipText_1, STR_SHORT_CUT_PREFIX));
tltmExecute.setImage(ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/editor/play.png")); //$NON-NLS-1$
tltmExecute.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String strQuery = browserEvaluateToStr(EditorFunctionService.GET_SELECTED_TEXT, PublicTadpoleDefine.SQL_DELIMITER);
EditorDefine.EXECUTE_TYPE executeType = EditorDefine.EXECUTE_TYPE.NONE;
if( Boolean.parseBoolean( browserEvaluateToStr(EditorFunctionService.IS_BLOCK_TEXT) ) ) {
executeType = EditorDefine.EXECUTE_TYPE.BLOCK;
}
RequestQuery reqQuery = new RequestQuery(userDB, strQuery, dbAction, EditorDefine.QUERY_MODE.QUERY, executeType, isAutoCommit());
executeCommand(reqQuery);
}
});
new ToolItem(toolBar, SWT.SEPARATOR);
if(SQLUtil.isSELECTEditor(dbAction)) {
ToolItem tltmExecuteAll = new ToolItem(toolBar, SWT.NONE);
tltmExecuteAll.setToolTipText(Messages.get().MainEditor_tltmExecuteAll_text);
tltmExecuteAll.setImage(ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/editor/sql-query-all.png")); //$NON-NLS-1$
tltmExecuteAll.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String strQuery = browserEvaluateToStr(EditorFunctionService.ALL_TEXT);
RequestQuery reqQuery = new RequestQuery(userDB, strQuery, dbAction, EditorDefine.QUERY_MODE.QUERY, EditorDefine.EXECUTE_TYPE.ALL, isAutoCommit());
executeCommand(reqQuery);
}
});
new ToolItem(toolBar, SWT.SEPARATOR);
}
ToolItem tltmExplainPlanctrl = new ToolItem(toolBar, SWT.NONE);
tltmExplainPlanctrl.setImage(ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/editor/execute_plan.png")); //$NON-NLS-1$
tltmExplainPlanctrl.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String strQuery = browserEvaluateToStr(EditorFunctionService.GET_SELECTED_TEXT, PublicTadpoleDefine.SQL_DELIMITER); //$NON-NLS-1$
RequestQuery reqQuery = new RequestQuery(userDB, strQuery, dbAction, EditorDefine.QUERY_MODE.EXPLAIN_PLAN, EditorDefine.EXECUTE_TYPE.NONE, isAutoCommit());
executeCommand(reqQuery);
}
});
tltmExplainPlanctrl.setToolTipText(String.format(Messages.get().MainEditor_3, STR_SHORT_CUT_PREFIX));
new ToolItem(toolBar, SWT.SEPARATOR);
ToolItem tltmSort = new ToolItem(toolBar, SWT.NONE);
tltmSort.setImage(ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/editor/query_format.png")); //$NON-NLS-1$
tltmSort.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String strQuery = browserEvaluateToStr(EditorFunctionService.ALL_TEXT);
try {
browserEvaluate(EditorFunctionService.RE_NEW_TEXT, SQLFormater.format(strQuery));
} catch(Exception ee) {
logger.error("sql format", ee); //$NON-NLS-1$
}
}
});
tltmSort.setToolTipText(String.format(Messages.get().MainEditor_4, STR_SHORT_CUT_PREFIX));
new ToolItem(toolBar, SWT.SEPARATOR);
ToolItem tltmSQLToApplication = new ToolItem(toolBar, SWT.NONE);
tltmSQLToApplication.setImage(ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/editor/sql_to_applications.png")); //$NON-NLS-1$
tltmSQLToApplication.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String strQuery = browserEvaluateToStr(EditorFunctionService.ALL_TEXT);
SQLToStringDialog dialog = new SQLToStringDialog(null, getUserDB(), strQuery);
dialog.open();
setFocus();
}
});
tltmSQLToApplication.setToolTipText(Messages.get().MainEditor_40);
new ToolItem(toolBar, SWT.SEPARATOR);
// ToolItem tltmDownload = new ToolItem(toolBar, SWT.NONE);
// tltmDownload.setImage(ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/editor/download_query.png")); //$NON-NLS-1$
// tltmDownload.addSelectionListener(new SelectionAdapter() {
// @Override
// public void widgetSelected(SelectionEvent e) {
// if(!MessageDialog.openConfirm(null, Messages.get().MainEditor_38, Messages.get().MainEditor_39)) return;
//
// try {
// String strQuery = browserEvaluateToStr(EditorFunctionService.ALL_TEXT);
// compResult.downloadExtFile(getUserDB().getDisplay_name()+".sql", strQuery); //$NON-NLS-1$
// } catch(Exception ee) {
// logger.error("Download SQL", ee); //$NON-NLS-1$
// }
// }
// });
// tltmDownload.setToolTipText(Messages.get().MainEditor_42);
// new ToolItem(toolBar, SWT.SEPARATOR);
tiAutoCommit = new ToolItem(toolBar, SWT.CHECK);
tiAutoCommit.setSelection(false);
tiAutoCommit.setText(Messages.get().MainEditor_41);
tiAutoCommit.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
initAutoCommitAction(false, true);
}
});
tiAutoCommitCommit = new ToolItem(toolBar, SWT.NONE);
tiAutoCommitCommit.setSelection(false);
tiAutoCommitCommit.setText(Messages.get().Commit);
tiAutoCommitCommit.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if(logger.isDebugEnabled()) logger.debug("[set commit][user id]" + getUserEMail() + "[user id]" + userDB); //$NON-NLS-1$ //$NON-NLS-2$
TadpoleSQLTransactionManager.commit(getUserEMail(), userDB);
}
});
tiAutoCommitRollback = new ToolItem(toolBar, SWT.NONE);
tiAutoCommitRollback.setSelection(false);
tiAutoCommitRollback.setText(Messages.get().Rollback);
tiAutoCommitRollback.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if(logger.isDebugEnabled()) logger.debug("[set rollback][user id]" + getUserEMail() + "[user id]" + userDB); //$NON-NLS-1$ //$NON-NLS-2$
TadpoleSQLTransactionManager.rollback(getUserEMail(), userDB);
}
});
new ToolItem(toolBar, SWT.SEPARATOR);
// api
ToolItem tltmAPI = new ToolItem(toolBar, SWT.NONE);
tltmAPI.setImage(ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/editor/restful_api.png")); //$NON-NLS-1$
tltmAPI.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String strQuery = browserEvaluateToStr(EditorFunctionService.ALL_TEXT);
MainSQLEditorAPIServiceDialog dialog = new MainSQLEditorAPIServiceDialog(getSite().getShell(), userDB, strQuery);
dialog.open();
setFocus();
}
});
tltmAPI.setToolTipText(Messages.get().MainEditor_51);
new ToolItem(toolBar, SWT.SEPARATOR);
ToolItem tltmHelp = new ToolItem(toolBar, SWT.NONE);
tltmHelp.setImage(ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/editor/about.png")); //$NON-NLS-1$
tltmHelp.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
RDBShortcutHelpDialog dialog = new RDBShortcutHelpDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), SWT.NONE);
dialog.open();
setFocus();
}
});
tltmHelp.setToolTipText(String.format(Messages.get().MainEditor_27, STR_SHORT_CUT_PREFIX));
new ToolItem(toolBar, SWT.SEPARATOR);
////// tool bar end ///////////////////////////////////////////////////////////////////////////////////
////// orion editor start /////////////////////////////////////////////////////////////////////////////
browserQueryEditor = new Browser(compositeEditor, SWT.BORDER);
browserQueryEditor.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1));
addBrowserService();
resultMainComposite = new ResultMainComposite(sashForm, SWT.BORDER);
GridLayout gl_compositeResult = new GridLayout(1, false);
gl_compositeResult.verticalSpacing = 0;
gl_compositeResult.horizontalSpacing = 0;
gl_compositeResult.marginHeight = 0;
gl_compositeResult.marginWidth = 0;
resultMainComposite.setLayout(gl_compositeResult);
resultMainComposite.setMainEditor(this);
sashForm.setWeights(new int[] {63, 37});
initEditor();
// 올챙이 확장에 관한 코드를 넣습니다. ===================================================================
MainEditorContributionsHandler editorExtension = new MainEditorContributionsHandler();
compMainExtions = editorExtension.evaluateCreateWidgetContribs(userDB);
int intSashCnt = 1;
for (IMainEditorExtension aMainEditorExtension : compMainExtions) {
if(aMainEditorExtension.isEnableExtension()) {
intSashCnt++;
Composite compExt = new Composite(sashFormExtension, SWT.BORDER);
GridLayout gl_compositeExt = new GridLayout(1, false);
gl_compositeExt.verticalSpacing = 0;
gl_compositeExt.horizontalSpacing = 0;
gl_compositeExt.marginHeight = 0;
gl_compositeExt.marginWidth = 0;
compExt.setLayout(gl_compositeExt);
aMainEditorExtension.createPartControl(compExt, this);
}
}
if(intSashCnt >= 2) {
sashFormExtension.setWeights(new int[] {100, 0});
}
// 올챙이 확장에 관한 코드를 넣습니다. ===================================================================
// autocommit true 혹은 false값이 바뀌었을때..
PlatformUI.getPreferenceStore().addPropertyChangeListener(new IPropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty() == PublicTadpoleDefine.AUTOCOMMIT_USE) {
String strAutoCommit_seq = event.getNewValue().toString();
// UserDB.seq || auto commit ture or false
String[] arryVal = StringUtils.split(strAutoCommit_seq, "||"); //$NON-NLS-1$
int seq = Integer.parseInt(arryVal[0]);
boolean boolUseAutocommit = Boolean.parseBoolean(arryVal[1]);
if(!tiAutoCommit.isDisposed()) {
if(seq == userDB.getSeq()) {
tiAutoCommit.setSelection(boolUseAutocommit);
if(!boolUseAutocommit) {
tiAutoCommitCommit.setEnabled(false);
tiAutoCommitRollback.setEnabled(false);
} else {
tiAutoCommitCommit.setEnabled(true);
tiAutoCommitRollback.setEnabled(true);
}
} // end tltmAutoCommit
} // end seq
} else if(event.getProperty() == PreferenceDefine.EDITOR_CHANGE_EVENT) {
final String varTheme = PublicTadpoleDefine.getMapTheme().get(GetPreferenceGeneral.getEditorTheme());
final String varFontSize = GetPreferenceGeneral.getEditorFontSize();
final String varIsWrap = ""+GetPreferenceGeneral.getEditorIsWarp();
final String varWarpLimit = GetPreferenceGeneral.getEditorWarpLimitValue();
final String varIsShowGutter = ""+GetPreferenceGeneral.getEditorShowGutter();
browserEvaluate(IEditorFunction.CHANGE_EDITOR_STYLE,
varTheme, varFontSize, varIsWrap, varWarpLimit, varIsShowGutter
);
}
} //
}); // end property change
}
/**
* refresh connection title
*/
private void initConnectionInfo() {
tltmConnectURL.setText(String.format("%s", userDB.getDisplay_name()));
// if selected DB is mysql, reset schema list
}
public Browser getBrowserQueryEditor() {
return browserQueryEditor;
}
/**
* browser handler
*/
protected void addBrowserService() {
browserQueryEditor.setUrl(REAL_DB_URL);
// final String strConstList = findDefaultKeyword();
// 기존 리소스를 가져왔으면 auto save mode 는 false
final String varAutoSave = dBResource != null?"fasle":""+GetPreferenceGeneral.getEditorAutoSave();
final String varTheme = PublicTadpoleDefine.getMapTheme().get(GetPreferenceGeneral.getEditorTheme());
final String varFontSize = GetPreferenceGeneral.getEditorFontSize();
final String varIsWrap = ""+GetPreferenceGeneral.getEditorIsWarp();
final String varWarpLimit = GetPreferenceGeneral.getEditorWarpLimitValue();
final String varIsShowGutter = ""+GetPreferenceGeneral.getEditorShowGutter();
registerBrowserFunctions();
browserQueryEditor.addProgressListener(new ProgressListener() {
@Override
public void completed( ProgressEvent event ) {
try {
browserEvaluate(IEditorFunction.RDB_INITIALIZE,
findEditorExt(), dbAction.toString(), getInitDefaultEditorStr(),
varAutoSave, varTheme, varFontSize, varIsWrap, varWarpLimit, varIsShowGutter
); //$NON-NLS-1$
} catch(Exception ee) {
logger.error("rdb editor initialize ", ee); //$NON-NLS-1$
}
}
public void changed( ProgressEvent event ) {}
});
}
/**
* getContentAssist
*
* @param strQuery
* @param intPosition
* @return
*/
public String getContentAssist(String strQuery, int intPosition) {
if("".equals(StringUtils.trimToEmpty(strQuery))) return "";
if(logger.isDebugEnabled()) {
logger.debug("-[start block] -------------------------------------------------------------");
logger.debug("\t[strQuery]" + strQuery );
logger.debug("\t[intPosition]" + intPosition );
}
String newContentAssist = "";
try {
ExtMakeContentAssistUtil constAssistUtil = new ExtMakeContentAssistUtil();
newContentAssist = constAssistUtil.makeContentAssist(getUserDB(), strQuery, intPosition);
} catch(Exception e) {
logger.error("Content assist", e);
}
if(logger.isDebugEnabled()) logger.debug("-[end block] -------------------------------------------------------------");
return newContentAssist==null?"":newContentAssist;
}
/**
* initialize editor
*/
private void initEditor() {
if (DBGroupDefine.HIVE_GROUP == userDB.getDBGroup() || DBGroupDefine.TAJO_GROUP == userDB.getDBGroup()) {
tiAutoCommit.setEnabled(false);
}
if("YES".equals(userDB.getIs_autocommit())) { //$NON-NLS-1$
tiAutoCommit.setSelection(false);
} else {
tiAutoCommit.setSelection(true);
}
// 기존 에디터에서 auto commit button 이 어떻게 설정 되어 있는지 가져옵니다.
initAutoCommitAction(true, false);
// 과거에 실행했던 쿼리 정보 가져오기.
// resultMainComposite.initMainComposite();
// 초기 연결 커넥션을 초기화 합니다.
if (DBGroupDefine.MYSQL_GROUP == userDB.getDBGroup()) {
Connection conn = null;
try {
conn = TadpoleSQLManager.getConnection(userDB);
AbstractTadpoleManager.changeSchema(userDB, conn);
} catch(Exception e3) {
logger.error("** initialize connection", e3);
} finally {
try { if(conn != null) conn.close(); } catch(Exception ee) {}
}
}
// google analytic
AnalyticCaller.track(MainEditor.ID, userDB.getDbms_type());
}
/**
* start sql transaction;
*/
public void beginTransaction() {
getSite().getShell().getDisplay().asyncExec(new Runnable() {
public void run() {
if(tiAutoCommit.isEnabled()) {
tiAutoCommit.setEnabled(true);
tiAutoCommit.setSelection(true);
tiAutoCommitCommit.setEnabled(true);
tiAutoCommitRollback.setEnabled(true);
}
}
});
}
/**
* init auto commit button
*
* @param isFirst
* @param isRiseEvent
*/
private void initAutoCommitAction(boolean isFirst, boolean isRiseEvent) {
if(isAutoCommit()) {
tiAutoCommitCommit.setEnabled(false);
tiAutoCommitRollback.setEnabled(false);
if(!isFirst) {
if(TadpoleSQLTransactionManager.isInstance(getUserEMail(), userDB)) {
if(MessageDialog.openConfirm(null, CommonMessages.get().Confirm, Messages.get().MainEditor_47)) {
TadpoleSQLTransactionManager.commit(getUserEMail(), userDB);
} else {
TadpoleSQLTransactionManager.rollback(getUserEMail(), userDB);
}
}
}
} else {
tiAutoCommitCommit.setEnabled(true);
tiAutoCommitRollback.setEnabled(true);
}
if(isRiseEvent) {
// auto commit의 실행버튼을 동일한 db를 열고 있는 에디터에서 공유합니다.
PlatformUI.getPreferenceStore().setValue(PublicTadpoleDefine.AUTOCOMMIT_USE, userDB.getSeq() + "||" + tiAutoCommit.getSelection() + "||" + System.currentTimeMillis()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
}
/**
* execute query
*
* @param reqQuery
*/
public void executeCommand(final RequestQuery reqQuery) {
// 요청쿼리가 없다면 무시합니다.
if(StringUtils.isEmpty(reqQuery.getSql())) return;
//
// schema test code start
//
final UserDBDAO userDB = getUserDB();
// if(logger.isDebugEnabled()) {
// logger.debug("======= schema name : " + userDB.getSchema());
// }
// do not execute query
if(System.currentTimeMillis() > SessionManager.getServiceEnd().getTime()) {
if(ApplicationArgumentUtils.isOnlineServer()) {
if(MessageDialog.openConfirm(null, CommonMessages.get().Information, Messages.get().MainEditorServiceEndGoPay)) {
UserBillEditorInput mei = new UserBillEditorInput();
try {
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor(mei, DefineExternalPlguin.BILL_PLUGIN);
} catch (PartInitException e) {
logger.error("open editor", e); //$NON-NLS-1$
Status errStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); //$NON-NLS-1$
ExceptionDetailsErrorDialog.openError(null,CommonMessages.get().Error, "Bill page open", errStatus); //$NON-NLS-1$
}
}
} else {
MessageDialog.openInformation(null, CommonMessages.get().Information, Messages.get().MainEditorServiceEnd);
}
return;
}
String strCheckSQL = SQLUtil.removeCommentAndOthers(userDB, reqQuery.getSql());
if(StringUtils.startsWithIgnoreCase(strCheckSQL, "desc ")) {
String strObject = StringUtils.removeStartIgnoreCase(strCheckSQL, "desc ");
Map<String,String> paramMap = new HashMap<String, String>();
if(StringUtils.contains(strObject, ".")) {
paramMap.put("OBJECT_OWNER", StringUtils.substringBefore(strObject, "."));
paramMap.put("OBJECT_NAME", StringUtils.substringAfter(strObject, "."));
}else{
paramMap.put("OBJECT_OWNER", userDB.getSchema());
paramMap.put("OBJECT_NAME", strObject);
}
DialogUtil.popupObjectInformationDialog(getUserDB(), paramMap);
} else if(StringUtils.startsWithIgnoreCase(strCheckSQL, "use ") && getUserDB().getDBGroup() == DBGroupDefine.MYSQL_GROUP) {
try {
testChangeSchema(strCheckSQL);
String strSchema = StringUtils.remove(strCheckSQL, "use ");
userDB.setSchema(strSchema);
comboSchema.setText(strSchema);
} catch(Exception e) {
MessageDialog.openError(null, CommonMessages.get().Error, e.getMessage());
setFocus();
}
} else {
resultMainComposite.executeCommand(reqQuery);
}
// google analytic
AnalyticCaller.track(MainEditor.ID, "executeCommand"); //$NON-NLS-1$
}
/**
* schema 변경시 올바른지 검증한다.
* @param strCheckSQL
* @throws Exception
*/
private void testChangeSchema(String strCheckSQL) throws Exception {
Connection javaConn = TadpoleSQLManager.getConnection(userDB);
Statement statement = null;
try {
if(userDB.getDBGroup() == DBGroupDefine.MYSQL_GROUP) {
if(logger.isDebugEnabled()) logger.debug(String.format("=set define schema %s ", userDB.getSchema()));
statement = javaConn.createStatement();
statement.executeUpdate(strCheckSQL);
}
} catch(Exception e) {
logger.error("change scheman ", e);
throw e;
} finally {
if(statement != null) statement.close();
}
}
/**
* auto commit
* @return
*/
public boolean isAutoCommit() {
if(tiAutoCommit == null) return true;
return !tiAutoCommit.getSelection();
}
@Override
public void setFocus() {
setOrionTextFocus();
EditorUtils.selectConnectionManager(getUserDB());
}
/**
* new resource name
*
* @return
*/
private UserDBResourceDAO getResouceName(UserDBResourceDAO initDBResource, String strContentData) {
ResourceSaveDialog rsDialog = new ResourceSaveDialog(null, initDBResource, userDB, PublicTadpoleDefine.RESOURCE_TYPE.SQL, strContentData);
if(rsDialog.open() == Window.OK) {
return rsDialog.getRetResourceDao();
} else {
return null;
}
}
/**
* 데이터를 저장합니다.
*
* @param strContentData
* @return
*/
public boolean calledDoSave(String strContentData) {
boolean isSaved = false;
try {
// 신규 저장일때는 리소스타입, 이름, 코멘를 입력받습니다.
if(dBResource == null) {
UserDBResourceDAO newDBResource = getResouceName(null, strContentData);
if(newDBResource == null) return false;
isSaved = saveResourceData(newDBResource, strContentData);
// 업데이트 일때.
} else {
isSaved = updateResourceDate(strContentData);
}
this.strLastContent = strContentData;
// auto save 항목을 지운다.
if(dBResourceAuto != null) {
TadpoleSystem_UserDBResource.updateResourceAuto(dBResourceAuto, "");
}
} catch(Exception e) {
logger.error(RequestInfoUtils.requestInfo("doSave exception", getUserEMail()), e); //$NON-NLS-1$
} finally {
if(isSaved) {
setDirty(false);
browserEvaluate(IEditorFunction.SAVE_DATA);
}
browserEvaluate(IEditorFunction.SET_FOCUS);
}
return isSaved;
}
/**
* call auto save
*
* @param strContentData
* @return
*/
public boolean calledDoAutoSave(String strContentData) {
if(logger.isDebugEnabled()) logger.debug("====== called auto save ==========" + strContentData);
// 내용이 공백이거나 이전 내용과 같으면 저장하지 않는다.
if("".equals(StringUtils.trimToEmpty(strContentData))) return true;
if(StringUtils.trimToEmpty(strLastContent).equals(StringUtils.trimToEmpty(strContentData))) return true;
boolean isSaved = false;
try {
isSaved = updateAutoResourceDate(strContentData);
strLastContent = strContentData;
} catch(SWTException e) {
logger.error(RequestInfoUtils.requestInfo("doAutoSave exception", getUserEMail()), e); //$NON-NLS-1$
} finally {
// browserEvaluate(IEditorFunction.SET_FOCUS);
}
return isSaved;
}
@Override
public void doSave(IProgressMonitor monitor) {
String strEditorAllText = browserEvaluateToStr(EditorFunctionService.ALL_TEXT);
calledDoSave(strEditorAllText);
}
@Override
public void doSaveAs() {
boolean isSaved = false;
// 저장을 호출합니다.
try {
String strEditorAllText = browserEvaluateToStr(EditorFunctionService.ALL_TEXT);
// 신규 저장일때는 리소스타입, 이름, 코멘를 입력받습니다.
UserDBResourceDAO newDBResource = getResouceName(dBResource, strEditorAllText);
if(newDBResource == null) return;
isSaved = saveResourceData(newDBResource, strEditorAllText);
} catch(SWTException e) {
logger.error(RequestInfoUtils.requestInfo("doSave exception", getUserEMail()), e); //$NON-NLS-1$
} finally {
if(isSaved) {
setDirty(false);
browserEvaluate(IEditorFunction.SAVE_DATA);
}
browserEvaluate(IEditorFunction.SET_FOCUS);
}
}
/**
* 데이터를 수정합니다.
*
* @param newContents
* @return
*/
private boolean updateResourceDate(String newContents) {
try {
TadpoleSystem_UserDBResource.updateResource(dBResource, newContents);
return true;
} catch (Exception e) {
logger.error("update file", 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$
return false;
}
}
/**
* auto update save
* @param newContents
* @return
*/
private boolean updateAutoResourceDate(String newContents) {
if(dBResource != null) return true;
// table, view만 auto save 된다.
if(dbAction == PublicTadpoleDefine.OBJECT_TYPE.TABLES |
dbAction == PublicTadpoleDefine.OBJECT_TYPE.VIEWS) {
if(logger.isDebugEnabled()) logger.debug("====> called updateAutoResourceDate ");
try {
dBResourceAuto = TadpoleSystem_UserDBResource.updateAutoResourceDate(getUserDB(), dBResourceAuto, dBResource, newContents);
if(dBResource != null) {
setDirty(false);
}
return true;
} catch (Exception e) {
logger.error("Autosave exception", e);
// igoner error message
return false;
}
}
return true;
}
/**
* save data
*
* @param newDBResource 저장 하려는 리소스
* @param newContents
* @return
*/
private boolean saveResourceData(UserDBResourceDAO newDBResource, String newContents) {
try {
// db 저장
dBResource = TadpoleSystem_UserDBResource.saveResource(userDB, newDBResource, newContents);
dBResource.setParent(userDB);
// title 수정
setPartName(dBResource.getName());
// tree 갱신
PlatformUI.getPreferenceStore().setValue(PublicTadpoleDefine.SAVE_FILE, String.format("%s:%s", dBResource.getDb_seq(), System.currentTimeMillis())); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
} catch (Exception e) {
logger.error("save data", 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$
return false;
}
return true;
}
/** save property dirty */
public void setDirty(Boolean newValue) {
if(isDirty != newValue) {
isDirty = newValue;
firePropertyChange(PROP_DIRTY);
}
}
@Override
public void dispose() {
super.dispose();
}
/**
* 에디터의 성격을 정의 합니다.
*
* @return
*/
public OBJECT_TYPE getDbAction() {
return dbAction;
}
/**
* get Resource
*
* @return
*/
public UserDBResourceDAO getdBResource() {
return dBResource;
}
@Override
protected void registerBrowserFunctions() {
editorService = new MainEditorBrowserFunctionService(userDB, browserQueryEditor, EditorFunctionService.EDITOR_SERVICE_HANDLER, this);
}
/**
* 에디터 로드할때 사용할 초기 쿼리 입니다.
* @return
*/
public String getInitDefaultEditorStr() {
return initDefaultEditorStr;
}
public IMainEditorExtension[] getMainEditorExtions() {
return compMainExtions;
}
public SashForm getSashFormExtension() {
return sashFormExtension;
}
}