/*******************************************************************************
* 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.viewers.object;
import java.util.Arrays;
import java.util.HashMap;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import com.hangum.tadpole.commons.google.analytics.AnalyticCaller;
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.define.PublicTadpoleDefine.QUERY_DDL_TYPE;
import com.hangum.tadpole.commons.libs.core.message.CommonMessages;
import com.hangum.tadpole.commons.util.TadpoleWidgetUtils;
import com.hangum.tadpole.commons.viewsupport.SelectionProviderMediator;
import com.hangum.tadpole.engine.define.DBDefine;
import com.hangum.tadpole.engine.define.DBGroupDefine;
import com.hangum.tadpole.engine.manager.InitializeDB;
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.userdb.DBOtherDAO;
import com.hangum.tadpole.engine.query.dao.system.userdb.ResourcesDAO;
import com.hangum.tadpole.engine.query.sql.DBSystemSchema;
import com.hangum.tadpole.engine.security.TadpoleSecurityManager;
import com.hangum.tadpole.engine.utils.RequestQuery;
import com.hangum.tadpole.rdb.core.Messages;
import com.hangum.tadpole.rdb.core.viewers.connections.ManagerViewer;
import com.hangum.tadpole.rdb.core.viewers.object.sub.AbstractObjectComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.agens.TadpoleGraphPathComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.agens.edge.TadpoleEdgeComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.agens.vertex.TadpoleVertexComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.mongodb.collections.TadpoleMongoDBCollectionComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.mongodb.index.TadpoleMongoDBIndexesComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.mongodb.serversidescript.TadpoleMongoDBJavaScriptComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.dblink.TadpoleDBLinkComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.function.TadpoleFunctionComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.java.TadpoleJavaComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.jobs.TadpoleJobsComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.orapackage.TadpolePackageComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.procedure.TadpoleProcedureComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.sequence.TadpoleSequenceComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.sysnonym.TadpoleSynonymComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.table.TadpoleTableComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.table.trigger.TadpoleTriggerComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.view.TadpoleViewerComposite;
/**
* object explorer viewer
*
* @author hangum
*
*/
public class ExplorerViewer extends ViewPart {
private static Logger logger = Logger.getLogger(ExplorerViewer.class);
public static String ID = "com.hangum.tadpole.rdb.core.view.object.explorer"; //$NON-NLS-1$
/** schema list */
private Combo comboSchema;
/** tabfolder가 초기화 될때는 tab select 이벤트 먹지 않도록 조절하지 않도록 */
private boolean boolInitObjectHead = true;
/** multi structured viewer */
private StructuredViewer[] arrayStructuredViewer = null;
private UserDBDAO userDB;
private CTabFolder tabFolderObject;
private Text textSearch;
// rdb
private Composite compositeBody;
private TadpoleTableComposite tableComposite = null;
private TadpoleViewerComposite viewComposite = null;
private TadpoleTriggerComposite triggerComposite = null;
// oracle
private TadpoleSynonymComposite synonymComposite = null;
private TadpoleSequenceComposite sequenceComposite = null;
private TadpoleDBLinkComposite dblinkComposite = null;
private TadpoleJobsComposite jobsComposite = null;
private TadpoleJavaComposite javaComposite = null;
private TadpoleProcedureComposite procedureComposite = null;
private TadpolePackageComposite packageComposite = null;
private TadpoleFunctionComposite functionCompostite = null;
// mongodb
private TadpoleMongoDBCollectionComposite mongoCollectionComposite = null;
private TadpoleMongoDBIndexesComposite mongoIndexComposite = null;
private TadpoleMongoDBJavaScriptComposite mongoJavaScriptComposite = null;
// agens graph
private TadpoleGraphPathComposite agensGraphPathComposite = null;
private TadpoleVertexComposite agensVertexComposite = null;
private TadpoleEdgeComposite agensEdgeComposite = null;
public ExplorerViewer() {
super();
}
@Override
public void createPartControl(Composite parent) {
setPartName(Messages.get().ObjectExplorer);
GridLayout gl_parent = new GridLayout(1, false);
gl_parent.marginWidth = 1;
gl_parent.verticalSpacing = 0;
gl_parent.horizontalSpacing = 0;
gl_parent.marginHeight = 0;
parent.setLayout(gl_parent);
Composite compositeSchema = new Composite(parent, SWT.NONE);
compositeSchema.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
GridLayout gl_compositeSchema = new GridLayout(2, false);
gl_compositeSchema.horizontalSpacing = 2;
gl_compositeSchema.verticalSpacing = 2;
gl_compositeSchema.marginHeight = 2;
gl_compositeSchema.marginWidth = 2;
compositeSchema.setLayout(gl_compositeSchema);
Label labelSchema = new Label(compositeSchema, SWT.NONE);
labelSchema.setLayoutData(new GridData(SWT.NONE, SWT.NONE, false, false, 1, 1));
labelSchema.setText(Messages.get().Schemas);
comboSchema = new Combo(compositeSchema, SWT.NONE | SWT.READ_ONLY);
comboSchema.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
changeSchema(comboSchema.getText());
}
});
comboSchema.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Composite compositeSearch = new Composite(parent, SWT.NONE);
compositeSearch.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
GridLayout gl_compositeSearch = new GridLayout(2, false);
gl_compositeSearch.horizontalSpacing = 2;
gl_compositeSearch.verticalSpacing = 2;
gl_compositeSearch.marginHeight = 2;
gl_compositeSearch.marginWidth = 2;
compositeSearch.setLayout(gl_compositeSearch);
Label labelFilter = new Label(compositeSearch, SWT.NONE);
labelFilter.setLayoutData(new GridData(SWT.NONE, SWT.NONE, false, false, 1, 1));
labelFilter.setText(CommonMessages.get().Filter);
// filter를 설정합니다.
textSearch = new Text(compositeSearch, SWT.SEARCH | SWT.ICON_SEARCH | SWT.ICON_CANCEL);
textSearch.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
filterText();
}
});
textSearch.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
compositeBody = new Composite(parent, SWT.NONE);
compositeBody.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
GridLayout gl_compositeBody = new GridLayout(1, false);
gl_compositeBody.verticalSpacing = 2;
gl_compositeBody.horizontalSpacing = 2;
gl_compositeBody.marginHeight = 2;
gl_compositeBody.marginWidth = 2;
compositeBody.setLayout(gl_compositeBody);
tabFolderObject = new CTabFolder(compositeBody, SWT.NONE);
tabFolderObject.setBorderVisible(false);
tabFolderObject.setSelectionBackground(TadpoleWidgetUtils.getTabFolderBackgroundColor(), TadpoleWidgetUtils.getTabFolderPercents());
tabFolderObject.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent evt) {
if (userDB == null) return;
if(boolInitObjectHead) {
CTabItem ct = (CTabItem)evt.item;
refershSelectObject(""+ct.getData(AbstractObjectComposite.TAB_DATA_KEY));
}
}
});
tabFolderObject.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
// dumy table
createTable();
// Connection View에서 선택이벤트 받기.
getSite().getPage().addSelectionListener(ManagerViewer.ID, managementViewerListener);
// erd table에 선택되었을때..
PlatformUI.getPreferenceStore().addPropertyChangeListener(new IPropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty() == PublicTadpoleDefine.SELECT_ERD_TABLE) {
String tableName = event.getNewValue().toString();
if (tabFolderObject.getSelectionIndex() != 0) tabFolderObject.setSelection(0);
tableComposite.selectTable(tableName);
} // end if(event.getProperty()
} //
}); // end property change
}
/**
* filter text
*/
private void filterText() {
String strSelectTab = ""+tabFolderObject.getItem(tabFolderObject.getSelectionIndex()).getData(AbstractObjectComposite.TAB_DATA_KEY);
String strSearchText = textSearch.getText();
if (strSelectTab.equalsIgnoreCase(OBJECT_TYPE.COLLECTIONS.name())) {
mongoCollectionComposite.filter(strSearchText);
} else if (strSelectTab.equalsIgnoreCase(OBJECT_TYPE.TABLES.name())) {
tableComposite.filter(strSearchText);
} else if (strSelectTab.equalsIgnoreCase(OBJECT_TYPE.SYNONYM.name())) {
synonymComposite.filter(strSearchText);
} else if (strSelectTab.equalsIgnoreCase(OBJECT_TYPE.SEQUENCE.name())) {
sequenceComposite.filter(strSearchText);
} else if (strSelectTab.equalsIgnoreCase(OBJECT_TYPE.LINK.name())) {
dblinkComposite.filter(strSearchText);
} else if (strSelectTab.equalsIgnoreCase(OBJECT_TYPE.JOBS.name())) {
jobsComposite.filter(strSearchText);
} else if (strSelectTab.equalsIgnoreCase(OBJECT_TYPE.JAVA.name())) {
javaComposite.filter(strSearchText);
} else if (strSelectTab.equalsIgnoreCase(OBJECT_TYPE.VIEWS.name())) {
viewComposite.filter(strSearchText);
} else if (strSelectTab.equalsIgnoreCase(OBJECT_TYPE.INDEXES.name())) {
if(userDB != null && DBGroupDefine.MONGODB_GROUP == userDB.getDBGroup()) {
mongoIndexComposite.filter(strSearchText);
}
} else if (strSelectTab.equalsIgnoreCase(OBJECT_TYPE.PROCEDURES.name())) {
procedureComposite.filter(strSearchText);
} else if (strSelectTab.equalsIgnoreCase(OBJECT_TYPE.PACKAGES.name())) {
packageComposite.filter(strSearchText);
} else if (strSelectTab.equalsIgnoreCase(OBJECT_TYPE.FUNCTIONS.name())) {
functionCompostite.filter(strSearchText);
} else if (strSelectTab.equalsIgnoreCase(OBJECT_TYPE.TRIGGERS.name())) {
triggerComposite.filter(strSearchText);
} else if (strSelectTab.equalsIgnoreCase(OBJECT_TYPE.JAVASCRIPT.name())) {
mongoJavaScriptComposite.filter(strSearchText);
}
}
/**
* change schema name
*/
public void changeSchema(String strSchemaName) {
// if(strSchemaName.equals(comboSchema.getText())) return;
comboSchema.setText(strSchemaName);
userDB.setSchema(strSchemaName);
if(logger.isDebugEnabled()) logger.debug("*** Change schema name is " + strSchemaName);
// 기존 스키마에 대해 조회되어 있던 내용을 초기화 한다.
if(null != tableComposite) tableComposite.clearList();
if(null != viewComposite) viewComposite.clearList();
if(null != synonymComposite) synonymComposite.clearList();
if(null != sequenceComposite) sequenceComposite.clearList();
if(null != procedureComposite) procedureComposite.clearList();
if(null != packageComposite) packageComposite.clearList();
if(null != functionCompostite) functionCompostite.clearList();
if(null != triggerComposite) triggerComposite.clearList();
if(null != dblinkComposite) dblinkComposite.clearList();
if(null != jobsComposite) jobsComposite.clearList();
if(null != javaComposite) javaComposite.clearList();
if(null != this.agensGraphPathComposite) agensGraphPathComposite.clearList();
if(null != this.agensVertexComposite) agensVertexComposite.clearList();
if(null != this.agensEdgeComposite) agensEdgeComposite.clearList();
// 아젠스 그래프 디비인 경우는 첫번째 탭이 그래프 패스 이므로 그래프 패스가 선택 되도록 한다.
if(DBDefine.AGENSGRAPH_DEFAULT == userDB.getDBDefine()) {
//refershSelectObject(PublicTadpoleDefine.OBJECT_TYPE.GRAPHPATH.name());
this.agensGraphPathComposite.refreshGraphPath(userDB, true, "");
}else{
tableComposite.refreshTable(userDB, true, "");
}
}
/**
* management의 tree가 선택되었을때
*/
private ISelectionListener managementViewerListener = new ISelectionListener() {
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
if (selection instanceof IStructuredSelection) {
IStructuredSelection is = (IStructuredSelection) selection;
boolInitObjectHead = false;
initObjectHead(is.getFirstElement());
boolInitObjectHead = true;
} // end selection
} // end selectionchange
};
/**
* management의 head가 선택되었을때
*
* @param selectElement
*/
public void initObjectHead(Object selectElement) {
// 기존 사용자원을 반납합니다.
if(textSearch.isDisposed()) return;
textSearch.setText("");
if(null != tableComposite) tableComposite.dispose();
if(null != viewComposite) viewComposite.dispose();
if(null != synonymComposite) synonymComposite.dispose();
if(null != sequenceComposite) sequenceComposite.dispose();
if(null != procedureComposite) procedureComposite.dispose();
if(null != packageComposite) packageComposite.dispose();
if(null != functionCompostite) functionCompostite.dispose();
if(null != triggerComposite) triggerComposite.dispose();
if(null != dblinkComposite) dblinkComposite.dispose();
if(null != jobsComposite) jobsComposite.dispose();
if(null != javaComposite) javaComposite.dispose();
if(null != this.agensGraphPathComposite) agensGraphPathComposite.dispose();
if(null != this.agensVertexComposite) agensVertexComposite.dispose();
if(null != this.agensEdgeComposite) agensEdgeComposite.dispose();
if(null != mongoCollectionComposite) {
mongoCollectionComposite.dispose();
mongoIndexComposite.dispose();
mongoJavaScriptComposite.dispose();
}
// Initialize resources
if (selectElement instanceof UserDBDAO || selectElement instanceof UserDBResourceDAO) {
selectUserDB(selectElement);
} else if(selectElement instanceof ResourcesDAO) {
ResourcesDAO dao = (ResourcesDAO)selectElement;
selectUserDB(dao.getUserDBDAO());
} else if(selectElement instanceof DBOtherDAO) {
DBOtherDAO dao = (DBOtherDAO)selectElement;
try {
UserDBDAO schemaUserDB = (UserDBDAO)dao.getParent().getUserDBDAO().clone();
schemaUserDB.setSchema(dao.getName());
selectUserDB(schemaUserDB);
} catch(Exception e) {
logger.error("cloable not support exception", e);
}
} else {
userDB = null;
// 존재하는 tadfolder를 삭제한다.
for (CTabItem tabItem : tabFolderObject.getItems()) tabItem.dispose();
createTable();
}
}
/**
* initialize schema
*/
private void initSchema() throws Exception {
if(userDB == null) return;
// 디비 락이 있을 경우에 커넥션 시도를 하지 못하도록 합니다.
if(!TadpoleSecurityManager.getInstance().isLock(userDB)) return;
/** schema list*/
comboSchema.removeAll();
if(userDB.getDBGroup() == DBGroupDefine.POSTGRE_GROUP) {
try {
// public schema가 선택되도록 합니다.
// 스키마 리스트를 초기화 시킨다.
boolean isPublicExist = false;
for (Object object : DBSystemSchema.getSchemas(userDB)) {
HashMap mapData = (HashMap)object;
comboSchema.add(""+mapData.get("schema"));
if("public".equals(mapData.get("schema"))) isPublicExist = true;
}
if(isPublicExist) comboSchema.setText("public");
else comboSchema.select(0);
userDB.setSchema(comboSchema.getText());
} catch(Exception e) {
logger.error("get system schemas " + e.getMessage());
throw e;
}
}else if(userDB.getDBGroup() == DBGroupDefine.ORACLE_GROUP){
try {
for (Object object : DBSystemSchema.getSchemas(userDB)) {
HashMap<String, String> mapData = (HashMap)object;
comboSchema.add(mapData.get("SCHEMA"));
}
comboSchema.select(0);
//TODO: 최초 로그인시 userDB 설정시 기본 스키마 지정해 놓는 방법.
userDB.setSchema(comboSchema.getText());
} catch (Exception e) {
comboSchema.setItems( new String[]{userDB.getSchema()} );
throw e;
}
}else if(userDB.getDBGroup() == DBGroupDefine.MYSQL_GROUP){
try {
for (Object object : DBSystemSchema.getSchemas(userDB)) {
HashMap<String, String> mapData = (HashMap)object;
comboSchema.add(mapData.get("SCHEMA"));
if (StringUtils.equalsIgnoreCase(mapData.get("SCHEMA"), userDB.getDb())) {
userDB.setSchema(mapData.get("SCHEMA"));
comboSchema.select(comboSchema.getItemCount()-1);
}
}
this.refreshTable(false, "");
} catch (Exception e) {
comboSchema.setItems( new String[]{userDB.getSchema()} );
logger.error("get system schemas " + e.getMessage());
throw e;
}
}else if(userDB.getDBGroup() == DBGroupDefine.SQLITE_GROUP) {
comboSchema.add(userDB.getDb());
comboSchema.setText(userDB.getDb());
}else{
comboSchema.add(userDB.getDb());
comboSchema.setText(userDB.getDb());
}
comboSchema.setVisibleItemCount(comboSchema.getItemCount() > 15 ? 15 : comboSchema.getItemCount());
// 스키마 목록을 재상용하기 위해 기록합니다.
userDB.setSchemas(Arrays.asList(comboSchema.getItems()));
// initialize UserDB
InitializeDB.dbInfo(userDB);
// refresh manager viewer
refreshManagerViewUserDB();
}
/**
* refresh manager viewer
*/
private void refreshManagerViewUserDB() {
final ManagerViewer managerView = (ManagerViewer)PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(ManagerViewer.ID);
managerView.getManagerTV().refresh(userDB, true);
}
/**
* select user databse
* @param selectElement
*/
private void selectUserDB(Object selectElement) {
UserDBDAO selectUserDb = null;
if (selectElement instanceof UserDBDAO) selectUserDb = (UserDBDAO)selectElement;
else selectUserDb = ((UserDBResourceDAO)selectElement).getParent();
// 기존 디비가 중복 선택되었으면 리프레쉬 하지 않는다.
if (userDB != null) {
if (userDB.getSeq() == selectUserDb.getSeq()) {
filterText();
userDB = selectUserDb;
return;
}
}
// 디비 선택
userDB = selectUserDb;
// 존재하는 tadfolder를 삭제한다.
for (CTabItem tabItem : tabFolderObject.getItems()) tabItem.dispose();
// 디비 락이 있을 경우에 커넥션 시도를 하지 못하도록 합니다.
if(!TadpoleSecurityManager.getInstance().isLock(selectUserDb)) {
userDB = null;
createTable();
} else {
try {
initSchema();
initObjectDetail(userDB);
} catch(Exception e) {
logger.error("initialize database " + e.getMessage());
userDB = null;
createTable();
MessageDialog.openError(getSite().getShell(), CommonMessages.get().Error, Messages.get().doNotConnectionDB + e.getMessage().toString());
}
}
}
/**
* 다른 디비가 선택되어 지면 초기화 되어야 할 object 목록
*
* @param userDB Manager에서 선택된 object
*/
private void initObjectDetail(final UserDBDAO userDB) {
// sqlite
if (DBGroupDefine.SQLITE_GROUP == userDB.getDBGroup()) {
createTable();
createView();
arrayStructuredViewer = new StructuredViewer[] {
tableComposite.getTableListViewer(),
tableComposite.getTableColumnViewer(),
tableComposite.getIndexComposite().getTableViewer(),
tableComposite.getTriggerComposite().getTableViewer(),
viewComposite.getTableViewer()
};
getViewSite().setSelectionProvider(new SelectionProviderMediator(arrayStructuredViewer, tableComposite.getTableListViewer()));
// tajo, hive, hive2
} else if (DBGroupDefine.HIVE_GROUP == userDB.getDBGroup() || DBGroupDefine.TAJO_GROUP == userDB.getDBGroup()) {
createTable();
arrayStructuredViewer = new StructuredViewer[] {
tableComposite.getTableListViewer(),
tableComposite.getTableColumnViewer()
};
getViewSite().setSelectionProvider(new SelectionProviderMediator(arrayStructuredViewer, tableComposite.getTableListViewer()));
// mongodb
} else if (DBGroupDefine.MONGODB_GROUP == userDB.getDBGroup()) {
createMongoCollection();
createMongoIndex();
createMongoJavaScript();
arrayStructuredViewer = new StructuredViewer[] {
mongoCollectionComposite.getCollectionListViewer(),
mongoIndexComposite.getTableViewer(),
mongoJavaScriptComposite.getTableViewer()
};
getViewSite().setSelectionProvider(new SelectionProviderMediator(arrayStructuredViewer, mongoCollectionComposite.getCollectionListViewer()));
// oracle , tibero
} else if (DBGroupDefine.ORACLE_GROUP == userDB.getDBGroup()) {
createTable();
createView();
createSynonym();
createSequence();
createProcedure();
createPackage();
createFunction();
createTrigger();
createDBLink();
if (DBDefine.ORACLE_DEFAULT == userDB.getDBDefine()) {
createJobs();
createJava();
arrayStructuredViewer = new StructuredViewer[] {
tableComposite.getTableListViewer(),
tableComposite.getTableColumnViewer(),
tableComposite.getIndexComposite().getTableViewer(),
tableComposite.getConstraintsComposite().getTableViewer(),
tableComposite.getTriggerComposite().getTableViewer(),
viewComposite.getTableViewer(),
synonymComposite.getTableviewer(),
sequenceComposite.getTableviewer(),
procedureComposite.getTableViewer(),
packageComposite.getPackageTableViewer(),
packageComposite.getProcFuncTableViewer(),
functionCompostite.getTableviewer(),
triggerComposite.getTableViewer(),
dblinkComposite.getTableviewer(),
jobsComposite.getTableviewer(),
javaComposite.getTableviewer()
};
}else{
arrayStructuredViewer = new StructuredViewer[] {
tableComposite.getTableListViewer(),
tableComposite.getTableColumnViewer(),
tableComposite.getIndexComposite().getTableViewer(),
tableComposite.getConstraintsComposite().getTableViewer(),
tableComposite.getTriggerComposite().getTableViewer(),
viewComposite.getTableViewer(),
synonymComposite.getTableviewer(),
sequenceComposite.getTableviewer(),
procedureComposite.getTableViewer(),
packageComposite.getPackageTableViewer(),
packageComposite.getProcFuncTableViewer(),
functionCompostite.getTableviewer(),
triggerComposite.getTableViewer(),
dblinkComposite.getTableviewer()
};
}
getViewSite().setSelectionProvider(new SelectionProviderMediator(arrayStructuredViewer, tableComposite.getTableListViewer()));
// altibase, cubrid
} else if (DBGroupDefine.ALTIBASE_GROUP == userDB.getDBGroup() ||
DBGroupDefine.CUBRID_GROUP == userDB.getDBGroup() ||
DBGroupDefine.POSTGRE_GROUP == userDB.getDBGroup()
) {
if(DBDefine.AGENSGRAPH_DEFAULT == userDB.getDBDefine()) {
createGraphPath();
createVertex();
createEdge();
createTable();
createView();
createProcedure();
createFunction();
createTrigger();
arrayStructuredViewer = new StructuredViewer[] {
agensGraphPathComposite.getTableviewer(),
agensVertexComposite.getTableviewer(),
agensEdgeComposite.getTableviewer(),
tableComposite.getTableListViewer(),
tableComposite.getTableColumnViewer(),
tableComposite.getIndexComposite().getTableViewer(),
tableComposite.getTriggerComposite().getTableViewer(),
viewComposite.getTableViewer(),
procedureComposite.getTableViewer(),
functionCompostite.getTableviewer(),
triggerComposite.getTableViewer()
};
} else if(DBDefine.AMAZON_REDSHIFT_DEFAULT == userDB.getDBDefine()) {
createTable();
createView();
arrayStructuredViewer = new StructuredViewer[] {
tableComposite.getTableListViewer(),
tableComposite.getTableColumnViewer(),
tableComposite.getIndexComposite().getTableViewer(),
tableComposite.getTriggerComposite().getTableViewer(),
viewComposite.getTableViewer()
};
} else {
createTable();
createView();
createProcedure();
createFunction();
createTrigger();
arrayStructuredViewer = new StructuredViewer[] {
tableComposite.getTableListViewer(),
tableComposite.getTableColumnViewer(),
tableComposite.getIndexComposite().getTableViewer(),
tableComposite.getTriggerComposite().getTableViewer(),
viewComposite.getTableViewer(),
procedureComposite.getTableViewer(),
functionCompostite.getTableviewer(),
triggerComposite.getTableViewer()
};
}
getViewSite().setSelectionProvider(new SelectionProviderMediator(arrayStructuredViewer, tableComposite.getTableListViewer()));
// mysql, postgre, mssql
} else {
createTable();
createView();
createProcedure();
createFunction();
createTrigger();
arrayStructuredViewer = new StructuredViewer[] {
tableComposite.getTableListViewer(),
tableComposite.getTableColumnViewer(),
tableComposite.getIndexComposite().getTableViewer(),
tableComposite.getConstraintsComposite().getTableViewer(),
tableComposite.getTriggerComposite().getTableViewer(),
viewComposite.getTableViewer(),
procedureComposite.getTableViewer(),
functionCompostite.getTableviewer(),
triggerComposite.getTableViewer()
};
getViewSite().setSelectionProvider(new SelectionProviderMediator(arrayStructuredViewer, tableComposite.getTableListViewer()));
}
if(DBDefine.AGENSGRAPH_DEFAULT == userDB.getDBDefine()) {
refershSelectObject(PublicTadpoleDefine.OBJECT_TYPE.GRAPHPATH.name());
}else{
refershSelectObject(PublicTadpoleDefine.OBJECT_TYPE.TABLES.name());
}
}
/**
* Refresh the select tab.
*
* @param strSelectItemText
*/
private void refershSelectObject(String strSelectItemText) {
refershSelectObject(strSelectItemText, false, "");
}
/**
* 현재 선택된 tab을 리프레쉬합니다.
*
* @param strSelectItemText TabItem text
* @param isRefresh
* @param strObjectName
*/
private void refershSelectObject(String strSelectItemText, boolean isRefresh, String strObjectName) {
if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.TABLES.name())) {
refreshTable(isRefresh, strObjectName);
} else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.INDEXES.name())) {
refreshIndexes(isRefresh, strObjectName);
} else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.CONSTRAINTS.name())) {
refreshConstraints(isRefresh, strObjectName);
} else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.TRIGGERS.name())) {
refreshTrigger(isRefresh, strObjectName);
refreshAllTrigger(isRefresh, strObjectName);
} else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.VIEWS.name())) {
refreshView(isRefresh, strObjectName);
} else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.SYNONYM.name())) {
refreshSynonym(isRefresh, strObjectName);
} else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.SEQUENCE.name())) {
refreshSequence(isRefresh, strObjectName);
} else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.PROCEDURES.name())) {
refreshProcedure(isRefresh, strObjectName);
} else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.PACKAGES.name())) {
refreshPackage(isRefresh, strObjectName);
} else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.FUNCTIONS.name())) {
refreshFunction(isRefresh, strObjectName);
} else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.JAVASCRIPT.name())) {
refreshJS(isRefresh, strObjectName);
} else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.LINK.name())) {
refreshDBLink(isRefresh, strObjectName);
} else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.JOBS.name())) {
refreshJobs(isRefresh, strObjectName);
} else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.JAVA.name())) {
refreshJava(isRefresh, strObjectName);
} else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.VERTEX.name())) {
refreshVertex(isRefresh, strObjectName);
} else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.EDGE.name())) {
refreshEdge(isRefresh, strObjectName);
} else if (strSelectItemText.equalsIgnoreCase(OBJECT_TYPE.GRAPHPATH.name())) {
refreshGraph(isRefresh, strObjectName);
}
filterText();
// google analytic
AnalyticCaller.track(ExplorerViewer.ID, strSelectItemText);
}
/**
* selected tab refresh
*/
private void refreshSelectTab() {
refershSelectObject(tabFolderObject.getSelection().getText(), false, "");
}
/**
* mongo server side javascript define
*/
private void createMongoJavaScript() {
mongoJavaScriptComposite = new TadpoleMongoDBJavaScriptComposite(getSite(), tabFolderObject, userDB);
mongoJavaScriptComposite.initAction();
}
/**
* mongodb collection define
*/
private void createMongoCollection() {
mongoCollectionComposite = new TadpoleMongoDBCollectionComposite(getSite(), tabFolderObject, userDB);
mongoCollectionComposite.initAction();
tabFolderObject.setSelection(0);
}
/**
* mongodb index define
*/
private void createMongoIndex() {
mongoIndexComposite = new TadpoleMongoDBIndexesComposite(getSite(), tabFolderObject, userDB);
mongoIndexComposite.initAction();
}
/**
* Function 정의
*/
private void createFunction() {
functionCompostite = new TadpoleFunctionComposite(getSite(), tabFolderObject, userDB);
functionCompostite.initAction();
}
/**
* Trigger 정의
*/
private void createTrigger() {
triggerComposite = new TadpoleTriggerComposite(getSite(), tabFolderObject, userDB);
triggerComposite.initAction();
}
/**
* Procedure 정의
*/
private void createProcedure() {
procedureComposite = new TadpoleProcedureComposite(getSite(), tabFolderObject, userDB);
procedureComposite.initAction();
}
/**
* Package 정의
*/
private void createPackage() {
packageComposite = new TadpolePackageComposite(getSite(), tabFolderObject, userDB);
packageComposite.initAction();
}
/**
* view 정의
*/
private void createView() {
viewComposite = new TadpoleViewerComposite(getSite(), tabFolderObject, userDB);
viewComposite.initAction();
}
/**
* Table 정의
*/
private void createTable() {
tableComposite = new TadpoleTableComposite(getSite(), tabFolderObject, userDB);
tableComposite.initAction();
tabFolderObject.setSelection(0);
}
/**
* Synonym 정의
*/
private void createSynonym() {
synonymComposite = new TadpoleSynonymComposite(getSite(), tabFolderObject, userDB);
synonymComposite.initAction();
}
/**
* Synonym 정보를 최신으로 리프레쉬합니다.
*/
public void refreshSynonym(boolean boolRefresh, String strObjectName) {
if(boolRefresh) userDB.setDBObject(OBJECT_TYPE.SYNONYM, userDB.getDefaultSchemanName(), null);
synonymComposite.refreshSynonym(getUserDB(), boolRefresh, strObjectName);
}
/**
* Sequence 정의
*/
private void createSequence() {
sequenceComposite = new TadpoleSequenceComposite(getSite(), tabFolderObject, userDB);
sequenceComposite.initAction();
}
/**
* Database link 정의
*/
private void createDBLink() {
dblinkComposite = new TadpoleDBLinkComposite(getSite(), tabFolderObject, userDB);
dblinkComposite.initAction();
}
/**
* Database Link 정보를 최신으로 리프레쉬합니다.
*/
public void refreshDBLink(boolean boolRefresh, String strObjectName) {
if(boolRefresh) userDB.setDBObject(OBJECT_TYPE.LINK, userDB.getDefaultSchemanName(), null);
dblinkComposite.refreshDBLink(getUserDB(), boolRefresh, strObjectName);
}
/**
* Sequence 정보를 최신으로 리프레쉬합니다.
*/
public void refreshSequence(boolean boolRefresh, String strObjectName) {
if(boolRefresh) userDB.setDBObject(OBJECT_TYPE.SEQUENCE, userDB.getDefaultSchemanName(), null);
sequenceComposite.refreshSequence(getUserDB(), boolRefresh, strObjectName);
}
/**
* Job 정의
*/
private void createJobs() {
jobsComposite = new TadpoleJobsComposite(getSite(), tabFolderObject, userDB);
jobsComposite.initAction();
}
/**
* Job 정보를 최신으로 리프레쉬합니다.
*/
public void refreshJobs(boolean boolRefresh, String strObjectName) {
if(boolRefresh) userDB.setDBObject(OBJECT_TYPE.JOBS, userDB.getDefaultSchemanName(), null);
jobsComposite.refreshJobs(getUserDB(), boolRefresh, strObjectName);
}
/**
* Java 정의
*/
private void createJava() {
javaComposite = new TadpoleJavaComposite(getSite(), tabFolderObject, userDB);
javaComposite.initAction();
}
/**
* Graph Path
*/
private void createGraphPath() {
agensGraphPathComposite = new TadpoleGraphPathComposite(getSite(), tabFolderObject, userDB, this);
agensGraphPathComposite.initAction();
}
/**
* agens vertext정의
*/
private void createVertex() {
agensVertexComposite = new TadpoleVertexComposite(getSite(), tabFolderObject, userDB);
agensVertexComposite.initAction();
}
/**
* agens edge
*/
private void createEdge() {
agensEdgeComposite = new TadpoleEdgeComposite(getSite(), tabFolderObject, userDB);
agensEdgeComposite.initAction();
}
/**
* Job 정보를 최신으로 리프레쉬합니다.
*/
public void refreshJava(boolean boolRefresh, String strObjectName) {
if(boolRefresh) userDB.setDBObject(OBJECT_TYPE.JAVA, userDB.getDefaultSchemanName(), null);
javaComposite.refreshJava(getUserDB(), boolRefresh, strObjectName);
}
/**
* view 정보를 최신으로 리프레쉬합니다.
*/
public void refreshView(boolean boolRefresh, String strObjectName) {
if(boolRefresh) userDB.setDBObject(OBJECT_TYPE.VIEWS, userDB.getDefaultSchemanName(), null);
viewComposite.refreshView(getUserDB(), boolRefresh, strObjectName);
}
/**
* index 정보를 최신으로 갱신 합니다.
*/
public void refreshIndexes(boolean boolRefresh, String strObjectName) {
if(userDB != null && DBDefine.MONGODB_DEFAULT == userDB.getDBDefine()) {
mongoIndexComposite.refreshIndexes(userDB, boolRefresh);
} else {
tableComposite.getIndexComposite().refreshIndexes(getUserDB(), boolRefresh, strObjectName);
}
}
/**
* constraints 정보를 최신으로 갱신 합니다.
*/
public void refreshConstraints(boolean boolRefresh, String strObjectName) {
tableComposite.getConstraintsComposite().refreshConstraints(getUserDB(), boolRefresh, strObjectName);
}
/**
* procedure 정보를 최신으로 갱신 합니다.
*/
public void refreshProcedure(boolean boolRefresh, String strObjectName) {
if(boolRefresh) userDB.setDBObject(OBJECT_TYPE.PROCEDURES, userDB.getDefaultSchemanName(), null);
procedureComposite.refreshProcedure(userDB, boolRefresh, strObjectName);
}
/**
* package 정보를 최신으로 갱신 합니다.
*/
public void refreshPackage(boolean boolRefresh, String strObjectName) {
if(boolRefresh) userDB.setDBObject(OBJECT_TYPE.PACKAGES, userDB.getDefaultSchemanName(), null);
packageComposite.refreshPackage(userDB, boolRefresh, strObjectName);
}
/**
* trigger 정보를 최신으로 갱신 합니다.
*/
public void refreshTrigger(boolean boolRefresh, String strObjectName) {
tableComposite.getTriggerComposite().refreshTrigger(userDB, boolRefresh, strObjectName);
}
/**
* graph 정보를 최신으로 갱신 합니다.
* @param boolRefresh
* @param strObjectName
*/
public void refreshGraph(boolean boolRefresh, String strObjectName) {
if(boolRefresh) userDB.setDBObject(OBJECT_TYPE.GRAPHPATH, userDB.getDefaultSchemanName(), null);
agensGraphPathComposite.refreshGraphPath(getUserDB(), boolRefresh, strObjectName);
}
/**
* vertex 정보를 최신으로 갱신 합니다.
* @param boolRefresh
* @param strObjectName
*/
public void refreshVertex(boolean boolRefresh, String strObjectName) {
if(boolRefresh) userDB.setDBObject(OBJECT_TYPE.VERTEX, userDB.getDefaultSchemanName(), null);
agensVertexComposite.refreshSequence(getUserDB(), boolRefresh, strObjectName);
}
/**
* edge 정보를 최신으로 갱신 합니다.
* @param boolRefresh
* @param strObjectName
*/
public void refreshEdge(boolean boolRefresh, String strObjectName) {
if(boolRefresh) userDB.setDBObject(OBJECT_TYPE.EDGE, userDB.getDefaultSchemanName(), null);
agensEdgeComposite.refreshSequence(getUserDB(), boolRefresh, strObjectName);
}
/**
* 전체 trigger 정보를 최신으로 갱신 합니다.
*/
public void refreshAllTrigger(boolean boolRefresh, String strObjectName) {
if(boolRefresh) userDB.setDBObject(OBJECT_TYPE.TRIGGERS, userDB.getDefaultSchemanName(), null);
triggerComposite.refreshAllTrigger(userDB, boolRefresh, strObjectName);
}
/**
* function 정보를 최신으로 갱신 합니다.
*/
public void refreshFunction(boolean boolRefresh, String strObjectName) {
if(boolRefresh) userDB.setDBObject(OBJECT_TYPE.FUNCTIONS, userDB.getDefaultSchemanName(), null);
functionCompostite.refreshFunction(userDB, boolRefresh, strObjectName);
}
/**
* table 정보를 최신으로 리프레쉬합니다.
*/
public void refreshTable(boolean boolRefresh, String strObjectName) {
if(userDB != null && DBDefine.MONGODB_DEFAULT == userDB.getDBDefine()) {
mongoCollectionComposite.refreshTable(userDB, boolRefresh);
} else {
if(boolRefresh) userDB.setDBObject(OBJECT_TYPE.TABLES, userDB.getDefaultSchemanName(), null);
tableComposite.refreshTable(userDB, boolRefresh, strObjectName);
}
}
/**
* select table refresh
*/
public void refreshTableColumn() {
tableComposite.refreshTableColumn();
}
/**
* mongodb server side javascript define
*/
public void refreshJS(boolean boolRefresh, String strObjectName) {
mongoJavaScriptComposite.refreshJavaScript(userDB, boolRefresh);
}
public UserDBDAO getUserDB() {
return userDB;
}
/**
* refresh object
*
* @param chgUserDB
* @param reqQuery
*/
public void refreshCurrentTab(UserDBDAO chgUserDB, final RequestQuery reqQuery) {
if(reqQuery.getSqlDDLType() == null) return;
if(logger.isDebugEnabled()) {
logger.debug(String.format("update object : %s : %s : ", reqQuery.getSqlDDLType().name(), reqQuery.getSql()));
}
QUERY_DDL_TYPE queryDDLType = reqQuery.getSqlDDLType();
String strObjectName = reqQuery.getSqlObjectName();
refreshCurrentTab(queryDDLType, strObjectName, chgUserDB);
// refresh filter
filterText();
}
/**
*
* @param queryDDLType
* @param strObjectName
* @param chgUserDB
*/
public void refreshCurrentTab(QUERY_DDL_TYPE queryDDLType, String strObjectName, UserDBDAO chgUserDB) {
if (this.userDB.getSeq() != chgUserDB.getSeq()) return;
if(queryDDLType == QUERY_DDL_TYPE.TABLE) {
refershSelectObject(OBJECT_TYPE.TABLES.name(), true, strObjectName);
} else if(queryDDLType == QUERY_DDL_TYPE.INDEX) {
refershSelectObject(OBJECT_TYPE.INDEXES.name(), true, strObjectName);
} else if(queryDDLType == QUERY_DDL_TYPE.TRIGGER) {
refershSelectObject(OBJECT_TYPE.TRIGGERS.name(), true, strObjectName);
} else if(queryDDLType == QUERY_DDL_TYPE.VIEW) {
refershSelectObject(OBJECT_TYPE.VIEWS.name(), true, strObjectName);
} else if(queryDDLType == QUERY_DDL_TYPE.PROCEDURE) {
refershSelectObject(OBJECT_TYPE.PROCEDURES.name(), true, strObjectName);
} else if(queryDDLType == QUERY_DDL_TYPE.FUNCTION) {
refershSelectObject(OBJECT_TYPE.FUNCTIONS.name(), true, strObjectName);
} else if(queryDDLType == QUERY_DDL_TYPE.PACKAGE) {
refershSelectObject(OBJECT_TYPE.PACKAGES.name(), true, strObjectName);
} else if(queryDDLType == QUERY_DDL_TYPE.SYNONYM) {
refershSelectObject(OBJECT_TYPE.SYNONYM.name(), true, strObjectName);
} else if(queryDDLType == QUERY_DDL_TYPE.SEQUENCE) {
refershSelectObject(OBJECT_TYPE.SEQUENCE.name(), true, strObjectName);
} else if(queryDDLType == QUERY_DDL_TYPE.LINK ) {
refershSelectObject(OBJECT_TYPE.LINK.name(), true, strObjectName);
} else if(queryDDLType == QUERY_DDL_TYPE.JOBS ) {
refershSelectObject(OBJECT_TYPE.JOBS.name(), true, strObjectName);
} else if(queryDDLType == QUERY_DDL_TYPE.JAVA ) {
refershSelectObject(OBJECT_TYPE.JAVA.name(), true, strObjectName);
} else if(queryDDLType == QUERY_DDL_TYPE.TRIGGER) {
refershSelectObject(OBJECT_TYPE.TRIGGERS.name(), true, strObjectName);
} else {
refreshSelectTab();
}
}
/**
* mysql 일 경우 오브젝트 탐색기의 스키마를 변경한다.
*
* @param userDB
* @param strSchema
*/
public void changeSchema(UserDBDAO userDB, String strSchema) {
if(getUserDB() == null) return;
if(getUserDB().getSeq() == userDB.getSeq()) {
changeSchema(strSchema);
}
}
@Override
public void setFocus() {
}
}