/******************************************************************************* * 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.sub.rdb.sysnonym; 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.log4j.Logger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.ui.IWorkbenchPartSite; import com.hangum.tadpole.commons.exception.dialog.ExceptionDetailsErrorDialog; 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.engine.define.DBGroupDefine; import com.hangum.tadpole.engine.manager.TadpoleSQLManager; import com.hangum.tadpole.engine.query.dao.rdb.OracleSynonymColumnDAO; import com.hangum.tadpole.engine.query.dao.rdb.OracleSynonymDAO; import com.hangum.tadpole.engine.query.dao.system.UserDBDAO; import com.hangum.tadpole.engine.sql.util.SQLUtil; import com.hangum.tadpole.engine.sql.util.tables.TableUtil; import com.hangum.tadpole.rdb.core.Activator; import com.hangum.tadpole.rdb.core.Messages; import com.hangum.tadpole.rdb.core.actions.object.AbstractObjectAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.generate.GenerateViewDDLAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.object.ObjectCreatAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.object.ObjectDropAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.object.ObjectExecuteProcedureAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.object.ObjectExplorerSelectionToEditorAction; import com.hangum.tadpole.rdb.core.actions.object.rdb.object.ObjectRefreshAction; import com.hangum.tadpole.rdb.core.editors.dbinfos.composites.ColumnHeaderCreator; import com.hangum.tadpole.rdb.core.editors.dbinfos.composites.DefaultLabelProvider; import com.hangum.tadpole.rdb.core.editors.dbinfos.composites.DefaultTableColumnFilter; import com.hangum.tadpole.rdb.core.editors.dbinfos.composites.TableViewColumnDefine; import com.hangum.tadpole.rdb.core.util.FindEditorAndWriteQueryUtil; import com.hangum.tadpole.rdb.core.viewers.object.comparator.SynonymColumnComparator; import com.hangum.tadpole.rdb.core.viewers.object.sub.AbstractObjectComposite; import com.ibatis.sqlmap.client.SqlMapClient; /** * RDB synonym composite * * @author hangum * */ public class TadpoleSynonymComposite extends AbstractObjectComposite { /** * Logger for this class */ private static final Logger logger = Logger.getLogger(TadpoleSynonymComposite.class); private CTabItem tbtmSynonym; /** select synonym name */ private String selectSynonymName = ""; //$NON-NLS-1$ // table info private TableViewer synonymListViewer; private List<OracleSynonymDAO> showSynonyms = new ArrayList<OracleSynonymDAO>(); private DefaultTableColumnFilter synonymFilter; // column info private TableViewer synonymColumnViewer; private List<OracleSynonymColumnDAO> showSynonymColumns; private SynonymColumnComparator synonymColumnComparator; private ObjectCreatAction creatAction_Synonym; private AbstractObjectAction dropAction_Synonym; private AbstractObjectAction refreshAction_Synonym; private GenerateViewDDLAction viewDDLAction; private ObjectExecuteProcedureAction executeAction; /** * Create the composite. * * @param partSite * @param parent * @param userDB */ public TadpoleSynonymComposite(IWorkbenchPartSite partSite, final CTabFolder tabFolderObject, UserDBDAO userDB) { super(partSite, tabFolderObject, userDB); createWidget(tabFolderObject); } private void createWidget(final CTabFolder tabFolderObject) { tbtmSynonym = new CTabItem(tabFolderObject, SWT.NONE); tbtmSynonym.setText(Messages.get().Synonym); tbtmSynonym.setData(TAB_DATA_KEY, PublicTadpoleDefine.OBJECT_TYPE.SYNONYM.name()); Composite compositeTables = new Composite(tabFolderObject, SWT.NONE); tbtmSynonym.setControl(compositeTables); GridLayout gl_compositeTables = new GridLayout(1, false); gl_compositeTables.verticalSpacing = 2; gl_compositeTables.horizontalSpacing = 2; gl_compositeTables.marginHeight = 2; gl_compositeTables.marginWidth = 2; compositeTables.setLayout(gl_compositeTables); compositeTables.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); SashForm sashForm = new SashForm(compositeTables, SWT.NONE); sashForm.setOrientation(SWT.VERTICAL); sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); // SWT.VIRTUAL 일 경우 FILTER를 적용하면 데이터가 보이지 않는 오류수정. synonymListViewer = new TableViewer(sashForm, /* SWT.VIRTUAL | */ SWT.BORDER | SWT.FULL_SELECTION); synonymListViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { try { IStructuredSelection is = (IStructuredSelection) event.getSelection(); if (null != is) { OracleSynonymDAO synonymDAO = (OracleSynonymDAO) is.getFirstElement(); FindEditorAndWriteQueryUtil.run(userDB, "SELECT * FROM " + synonymDAO.getFullName() + PublicTadpoleDefine.SQL_DELIMITER, PublicTadpoleDefine.OBJECT_TYPE.SYNONYM); } } catch (Exception e) { logger.error("create synoonym", e); } } }); synonymListViewer.addPostSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { try { IStructuredSelection is = (IStructuredSelection) event.getSelection(); Object synonymDAO = is.getFirstElement(); if (synonymDAO != null) { OracleSynonymDAO synonym = (OracleSynonymDAO) synonymDAO; selectSynonymName = synonym.getSynonym_name(); SqlMapClient sqlClient = TadpoleSQLManager.getInstance(userDB); Map<String, String> mapParam = new HashMap<String, String>(); mapParam.put("db", userDB.getDb()); //$NON-NLS-1$ mapParam.put("owner", synonym.getTable_owner()); //$NON-NLS-1$ mapParam.put("table", synonym.getTable_name()); //$NON-NLS-1$ showSynonymColumns = sqlClient.queryForList("synonymColumnList", mapParam); //$NON-NLS-1$ for(OracleSynonymColumnDAO dao : showSynonymColumns) { dao.setSysName(SQLUtil.makeIdentifierName(userDB, dao.getColumn_name() )); } } else { showSynonymColumns = null; } synonymColumnViewer.setInput(showSynonymColumns); synonymColumnViewer.refresh(); } catch (Exception e) { logger.error("get table column", e); //$NON-NLS-1$ Status errStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); //$NON-NLS-1$ ExceptionDetailsErrorDialog.openError(tabFolderObject.getShell(),CommonMessages.get().Error, e.getMessage(), errStatus); //$NON-NLS-1$ } } }); Table tableTableList = synonymListViewer.getTable(); tableTableList.setLinesVisible(true); tableTableList.setHeaderVisible(true); createSynonymMenu(); createSysnonymListColumne(); synonymListViewer.setInput(showSynonyms); synonymListViewer.refresh(); synonymFilter = new DefaultTableColumnFilter(); synonymListViewer.addFilter(synonymFilter); // columns synonymColumnViewer = new TableViewer(sashForm, /* SWT.VIRTUAL | */ SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI); synonymColumnViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { IStructuredSelection is = (IStructuredSelection) event.getSelection(); if (null != is) { OracleSynonymColumnDAO synonymDAO = (OracleSynonymColumnDAO) is.getFirstElement(); FindEditorAndWriteQueryUtil.runAtPosition(synonymDAO.getColumn_name()); } } }); Table tableTableColumn = synonymColumnViewer.getTable(); tableTableColumn.setHeaderVisible(true); tableTableColumn.setLinesVisible(true); createSynonymDetailColumne(); synonymColumnComparator = new SynonymColumnComparator(); synonymColumnViewer.setSorter(synonymColumnComparator); synonymColumnComparator.setColumn(0); sashForm.setWeights(new int[] { 1, 1 }); } private void createSysnonymListColumne() { TableViewColumnDefine[] tableColumnDef = new TableViewColumnDefine[] { // new TableViewColumnDefine("SYNONYM_NAME", Messages.get().TadpoleSynonymComposite_5, 100, SWT.LEFT) // //$NON-NLS-1$ , new TableViewColumnDefine("TABLE_OWNER", Messages.get().TadpoleSynonymComposite_7, 60, SWT.LEFT) // //$NON-NLS-1$ , new TableViewColumnDefine("OBJECT_TYPE", Messages.get().Type, 70, SWT.CENTER) // //$NON-NLS-1$ , new TableViewColumnDefine("TABLE_NAME", Messages.get().TadpoleSynonymComposite_11, 100, SWT.LEFT) // //$NON-NLS-1$ , new TableViewColumnDefine("COMMENTS", Messages.get().Comment, 100, SWT.LEFT) // //$NON-NLS-1$ }; ColumnHeaderCreator.createColumnHeader(synonymListViewer, tableColumnDef); synonymListViewer.setContentProvider(new ArrayContentProvider()); synonymListViewer.setLabelProvider(new DefaultLabelProvider(synonymListViewer)); } private void createSynonymDetailColumne() { TableViewColumnDefine[] tableColumnDef = new TableViewColumnDefine[] { // new TableViewColumnDefine("COLUMN_ID", Messages.get().SEQ, 50, SWT.RIGHT) // //$NON-NLS-1$ , new TableViewColumnDefine("COLUMN_NAME", CommonMessages.get().Name, 100, SWT.LEFT) // //$NON-NLS-1$ , new TableViewColumnDefine("DATA_TYPE", Messages.get().DataType, 80, SWT.CENTER) // //$NON-NLS-1$ , new TableViewColumnDefine("NULLABLE", Messages.get().TadpoleSynonymComposite_21, 60, SWT.CENTER) // //$NON-NLS-1$ , new TableViewColumnDefine("KEY", Messages.get().TadpoleSynonymComposite_23, 50, SWT.CENTER) // //$NON-NLS-1$ , new TableViewColumnDefine("COMMENTS", Messages.get().TadpoleSynonymComposite_25, 100, SWT.LEFT) // //$NON-NLS-1$ }; ColumnHeaderCreator.createColumnHeader(synonymColumnViewer, synonymColumnComparator, tableColumnDef); synonymColumnViewer.setContentProvider(new ArrayContentProvider()); synonymColumnViewer.setLabelProvider(new DefaultLabelProvider(synonymColumnViewer)); } /** * create Table menu */ private void createSynonymMenu() { if(getUserDB() == null) return; creatAction_Synonym = new ObjectCreatAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.SYNONYM, Messages.get().Synonym + " " + Messages.get().Created); dropAction_Synonym = new ObjectDropAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.SYNONYM, Messages.get().DropSynonym); //$NON-NLS-1$ refreshAction_Synonym = new ObjectRefreshAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.SYNONYM, CommonMessages.get().Refresh); //$NON-NLS-1$ executeAction = new ObjectExecuteProcedureAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.SYNONYM, Messages.get().Execute); //$NON-NLS-1$ viewDDLAction = new GenerateViewDDLAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.SYNONYM, Messages.get().ViewDDL); //$NON-NLS-1$ // object copy to query editor objectSelectionToEditorAction = new ObjectExplorerSelectionToEditorAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES); // menu final MenuManager menuMgr = new MenuManager("#PopupMenu", "Synonym"); //$NON-NLS-1$ //$NON-NLS-2$ if(!isDDLLock()) { menuMgr.add(creatAction_Synonym); menuMgr.add(dropAction_Synonym); menuMgr.add(new Separator()); } menuMgr.add(refreshAction_Synonym); IStructuredSelection is = (IStructuredSelection) synonymListViewer.getSelection(); if (!is.isEmpty()) { menuMgr.add(new Separator()); OracleSynonymDAO synonymDAO = (OracleSynonymDAO) is.getFirstElement(); if (synonymDAO.getObject_type().startsWith("PROCEDURE") || synonymDAO.getObject_type().startsWith("FUNCTION")) { //$NON-NLS-1$ //$NON-NLS-2$ viewDDLAction.setEnabled(true); executeAction.setEnabled(true); menuMgr.add(viewDDLAction); menuMgr.add(executeAction); } else if (synonymDAO.getObject_type().startsWith("PACKAGE") || synonymDAO.getObject_type().startsWith("VIEW") //$NON-NLS-1$ //$NON-NLS-2$ || synonymDAO.getObject_type().startsWith("TABLE")) { //$NON-NLS-1$ viewDDLAction.setEnabled(true); menuMgr.add(viewDDLAction); } } menuMgr.add(new Separator()); menuMgr.add(objectSelectionToEditorAction); synonymListViewer.getTable().setMenu(menuMgr.createContextMenu(synonymListViewer.getTable())); getSite().registerContextMenu(menuMgr, synonymListViewer); } /** * 정보를 최신으로 리프레쉬합니다. * @param strObjectName */ public void refreshSynonym(final UserDBDAO selectUserDb, final boolean boolRefresh, final String strObjectName) { if (!boolRefresh) if (!showSynonyms.isEmpty()) return; this.userDB = selectUserDb; showSynonyms = (List<OracleSynonymDAO>)selectUserDb.getDBObject(OBJECT_TYPE.SYNONYM, selectUserDb.getDefaultSchemanName()); if(!(showSynonyms == null || showSynonyms.isEmpty())) { synonymListViewer.setInput(showSynonyms); synonymListViewer.refresh(); TableUtil.packTable(synonymListViewer.getTable()); // select tabitem getTabFolderObject().setSelection(tbtmSynonym); selectDataOfTable(strObjectName); } else { Job job = new Job(Messages.get().MainEditor_45) { @Override public IStatus run(IProgressMonitor monitor) { monitor.beginTask(MSG_DataIsBeginAcquired, IProgressMonitor.UNKNOWN); //$NON-NLS-1$ try { showSynonyms = getSynonymList(userDB); for(OracleSynonymDAO dao : showSynonyms) { dao.setSysName(SQLUtil.makeIdentifierName(userDB, dao.getSynonym_name() )); } // set push of cache userDB.setDBObject(OBJECT_TYPE.SYNONYM, userDB.getDefaultSchemanName(), showSynonyms); } catch (Exception e) { logger.error("Synonym Referesh", e); //$NON-NLS-1$ return new Status(Status.WARNING, Activator.PLUGIN_ID, e.getMessage()); } finally { monitor.done(); } return Status.OK_STATUS; } }; job.addJobChangeListener(new JobChangeAdapter() { public void done(IJobChangeEvent event) { final IJobChangeEvent jobEvent = event; getSite().getShell().getDisplay().asyncExec(new Runnable() { public void run() { if (jobEvent.getResult().isOK()) { synonymListViewer.setInput(showSynonyms); synonymListViewer.refresh(); TableUtil.packTable(synonymListViewer.getTable()); // select tabitem getTabFolderObject().setSelection(tbtmSynonym); selectDataOfTable(strObjectName); } else { if (showSynonyms != null) showSynonyms.clear(); synonymListViewer.setInput(showSynonyms); synonymListViewer.refresh(); TableUtil.packTable(synonymListViewer.getTable()); Status errStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, jobEvent.getResult().getMessage(), jobEvent.getResult().getException()); //$NON-NLS-1$ ExceptionDetailsErrorDialog.openError(null,CommonMessages.get().Error, Messages.get().ExplorerViewer_86, errStatus); //$NON-NLS-1$ } } }); // end display.asyncExec } // end done }); // end job job.setName(userDB.getDisplay_name()); job.setUser(true); job.schedule(); } } /** * 보여 주어야할 목록을 정의합니다. * * @param userDB * @return * @throws Exception */ public static List<OracleSynonymDAO> getSynonymList(final UserDBDAO userDB) throws Exception { SqlMapClient sqlClient = TadpoleSQLManager.getInstance(userDB); if(DBGroupDefine.ORACLE_GROUP == userDB.getDBGroup()){ return sqlClient.queryForList("synonymList", userDB.getSchema()); //$NON-NLS-1$ }else{ return sqlClient.queryForList("synonymList", userDB.getDb()); //$NON-NLS-1$ } } /** * initialize action */ public void initAction() { if(getUserDB() == null) return; creatAction_Synonym.setUserDB(getUserDB()); dropAction_Synonym.setUserDB(getUserDB()); refreshAction_Synonym.setUserDB(getUserDB()); executeAction.setUserDB(getUserDB()); viewDDLAction.setUserDB(getUserDB()); objectSelectionToEditorAction.setUserDB(getUserDB()); } /** * get synonymViewer * * @return */ public TableViewer getTableviewer() { return synonymListViewer; } /** * get synonym column viewer * * @return */ public TableViewer getSynonymColumnViewer() { return synonymColumnViewer; } /** * initialize filter text * * @param textSearch */ public void filter(String textSearch) { synonymFilter.setSearchString(textSearch); synonymListViewer.refresh(); } @Override public void dispose() { super.dispose(); if(creatAction_Synonym != null) creatAction_Synonym.dispose(); if(dropAction_Synonym != null) dropAction_Synonym.dispose(); if(refreshAction_Synonym != null) refreshAction_Synonym.dispose(); if(viewDDLAction != null) viewDDLAction.dispose(); if(executeAction != null) executeAction.dispose(); } @Override public void setSearchText(String searchText) { synonymFilter.setSearchString(searchText); } @Override public void selectDataOfTable(String strObjectName) { if("".equals(strObjectName) || strObjectName == null) return; getTableviewer().getTable().setFocus(); // find select object and viewer select for(int i=0; i<showSynonymColumns.size(); i++) { OracleSynonymDAO tableDao = (OracleSynonymDAO)getTableviewer().getElementAt(i); if(StringUtils.equalsIgnoreCase(strObjectName, tableDao.getSynonym_name())) { getTableviewer().setSelection(new StructuredSelection(getTableviewer().getElementAt(i)), true); break; } } } public void clearList() { if(showSynonymColumns != null) this.showSynonymColumns.clear(); if(showSynonyms != null) this.showSynonyms.clear(); } }