/******************************************************************************* * 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.orapackage; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; 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.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.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.permission.PermissionChecker; import com.hangum.tadpole.engine.query.dao.mysql.ProcedureFunctionDAO; import com.hangum.tadpole.engine.query.dao.system.UserDBDAO; import com.hangum.tadpole.engine.sql.util.SQLUtil; import com.hangum.tadpole.engine.sql.util.executer.ProcedureExecuterManager; 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.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.actions.object.rdb.object.OracleObjectCompileAction; import com.hangum.tadpole.rdb.core.dialog.procedure.ExecuteProcedureDialog; import com.hangum.tadpole.rdb.core.viewers.object.comparator.DefaultComparator; import com.hangum.tadpole.rdb.core.viewers.object.comparator.ObjectComparator; import com.hangum.tadpole.rdb.core.viewers.object.comparator.ProcedureFunctionComparator; import com.hangum.tadpole.rdb.core.viewers.object.sub.AbstractObjectComposite; import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.procedure.ProcedureFunctionLabelProvicer; import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.procedure.ProcedureFunctionViewFilter; import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.procedure.TadpoleProcedureComposite; import com.ibatis.sqlmap.client.SqlMapClient; /** * RDB procedure composite * * @author hangum * */ public class TadpolePackageComposite extends AbstractObjectComposite { /** * Logger for this class */ private static final Logger logger = Logger.getLogger(TadpoleProcedureComposite.class); private CTabItem tbtmPackage; /** select table name */ private String selectPackageName = ""; //$NON-NLS-1$ private TableViewer packageTableViewer; private ProcedureFunctionComparator packageComparator; private List<ProcedureFunctionDAO> showPackage = new ArrayList<>(); private ProcedureFunctionViewFilter packageFilter; private ObjectCreatAction creatAction_Package; private ObjectDropAction dropAction_Package; private ObjectRefreshAction refreshAction_Package; private GenerateViewDDLAction viewDDLAction; private ObjectExecuteProcedureAction executeAction_Package; private OracleObjectCompileAction objectCompileAction; // column info private TableViewer packageProcFuncViewer; private ObjectComparator packageProcFuncComparator; private List<ProcedureFunctionDAO> showPackageProcFuncColumns; /** * procedure * * @param site * @param tabFolderObject * @param userDB */ public TadpolePackageComposite(IWorkbenchPartSite site, CTabFolder tabFolderObject, UserDBDAO userDB) { super(site, tabFolderObject, userDB); createWidget(tabFolderObject); } private void createWidget(final CTabFolder tabFolderObject) { tbtmPackage = new CTabItem(tabFolderObject, SWT.NONE); tbtmPackage.setText(Messages.get().Package); tbtmPackage.setData(TAB_DATA_KEY, PublicTadpoleDefine.OBJECT_TYPE.PACKAGES.name()); Composite compositePackages = new Composite(tabFolderObject, SWT.NONE); tbtmPackage.setControl(compositePackages); GridLayout gl_compositePackages = new GridLayout(1, false); gl_compositePackages.verticalSpacing = 2; gl_compositePackages.horizontalSpacing = 2; gl_compositePackages.marginHeight = 2; gl_compositePackages.marginWidth = 2; compositePackages.setLayout(gl_compositePackages); SashForm sashForm = new SashForm(compositePackages, SWT.NONE); sashForm.setOrientation(SWT.VERTICAL); sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); // SWT.VIRTUAL 일 경우 FILTER를 적용하면 데이터가 보이지 않는 오류수정. packageTableViewer = new TableViewer(sashForm, /* SWT.VIRTUAL | */ SWT.BORDER | SWT.FULL_SELECTION); Table tableTableList = packageTableViewer.getTable(); tableTableList.setLinesVisible(true); tableTableList.setHeaderVisible(true); packageTableViewer.addPostSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { // 인덱스 디테일한 정보를 확인할동안은 블럭으로 만들어 놓습니다. if(DBGroupDefine.SQLITE_GROUP == userDB.getDBGroup() //|| DBGroupDefine.ORACLE_GROUP == userDB.getDBGroup() ) return; if(PublicTadpoleDefine.YES_NO.NO.name().equals(userDB.getIs_showtables())) return; // 테이블의 컬럼 목록을 출력합니다. try { IStructuredSelection is = (IStructuredSelection) event.getSelection(); Object packageDAO = is.getFirstElement(); if (packageDAO != null) { ProcedureFunctionDAO oraclePackage = (ProcedureFunctionDAO) packageDAO; if (selectPackageName.equals(oraclePackage.getName())) return; selectPackageName = oraclePackage.getName(); SqlMapClient sqlClient = TadpoleSQLManager.getInstance(userDB); HashMap<String, String>paramMap = new HashMap<String, String>(); paramMap.put("schema_name", userDB.getSchema()); paramMap.put("package_name", selectPackageName); showPackageProcFuncColumns = sqlClient.queryForList("packageBodyList", paramMap); //$NON-NLS-1$ for(ProcedureFunctionDAO dao : showPackageProcFuncColumns) { dao.setSysName(SQLUtil.makeIdentifierName(userDB, dao.getName())); } } else showPackageProcFuncColumns = null; packageProcFuncViewer.setInput(showPackageProcFuncColumns); packageProcFuncViewer.refresh(); TableUtil.packTable(packageProcFuncViewer.getTable()); } 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$ } } }); packageComparator = new ProcedureFunctionComparator(); packageTableViewer.setSorter(packageComparator); packageComparator.setColumn(0); createProcedureFunctionColumn(packageTableViewer, packageComparator); packageTableViewer.setLabelProvider(new ProcedureFunctionLabelProvicer()); packageTableViewer.setContentProvider(new ArrayContentProvider()); packageFilter = new ProcedureFunctionViewFilter(); packageTableViewer.addFilter(packageFilter); // columns packageProcFuncViewer = new TableViewer(sashForm, /* SWT.VIRTUAL | */ SWT.BORDER | SWT.FULL_SELECTION); Table tableTableColumn = packageProcFuncViewer.getTable(); tableTableColumn.setHeaderVisible(true); tableTableColumn.setLinesVisible(true); packageProcFuncComparator = new DefaultComparator(); packageProcFuncViewer.setSorter(packageProcFuncComparator); createProcedureFunctionListColumne(packageProcFuncViewer); packageProcFuncViewer.setContentProvider(new ArrayContentProvider()); packageProcFuncViewer.setLabelProvider(new PackageProcFuncLabelprovider()); sashForm.setWeights(new int[] { 1, 1 }); // creat action createMenu(); } private void createMenu() { if(getUserDB() == null) return; creatAction_Package = new ObjectCreatAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.PACKAGES, Messages.get().TadpolePackageComposite_3); dropAction_Package = new ObjectDropAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.PACKAGES, Messages.get().TadpolePackageComposite_4); refreshAction_Package = new ObjectRefreshAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.PACKAGES, CommonMessages.get().Refresh); viewDDLAction = new GenerateViewDDLAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.PACKAGES, Messages.get().ViewDDL); executeAction_Package = new ObjectExecuteProcedureAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.PACKAGES , Messages.get().TadpolePackageComposite_7); objectCompileAction = new OracleObjectCompileAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.PACKAGES, Messages.get().TadpolePackageComposite_8); // object copy to query editor objectSelectionToEditorAction = new ObjectExplorerSelectionToEditorAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES); // menu final MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ if (PermissionChecker.isShow(getUserRoleType(), getUserDB())) { if(!isDDLLock()) { menuMgr.add(creatAction_Package); menuMgr.add(dropAction_Package); menuMgr.add(new Separator()); } menuMgr.add(refreshAction_Package); menuMgr.add(new Separator()); menuMgr.add(viewDDLAction); } if (DBGroupDefine.ORACLE_GROUP == userDB.getDBGroup()){ menuMgr.add(new Separator()); menuMgr.add(objectCompileAction); } menuMgr.add(new Separator()); menuMgr.add(objectSelectionToEditorAction); packageTableViewer.getTable().setMenu(menuMgr.createContextMenu(packageTableViewer.getTable())); getSite().registerContextMenu(menuMgr, packageTableViewer); // package procedure/function list sub menu final MenuManager subMenuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ subMenuMgr.add(executeAction_Package); packageProcFuncViewer.getTable().setMenu(subMenuMgr.createContextMenu(packageProcFuncViewer.getTable())); getSite().registerContextMenu(subMenuMgr, packageProcFuncViewer); } /** * selection adapter * * @param packageProcFuncColumn * @param i * @return */ private SelectionAdapter getSelectionAdapter(final TableViewerColumn packageProcFuncColumn, final int index) { SelectionAdapter selectionAdapter = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { packageProcFuncComparator.setColumn(index); packageProcFuncViewer.getTable().setSortDirection(packageProcFuncComparator.getDirection()); packageProcFuncViewer.getTable().setSortColumn(packageProcFuncColumn.getColumn()); packageProcFuncViewer.refresh(); } }; return selectionAdapter; } /** * package procedure function list */ protected void createProcedureFunctionListColumne(final TableViewer tv) { String[] name = {Messages.get().Type, CommonMessages.get().Name, Messages.get().Overload}; int[] size = {120, 300, 120}; for (int i=0; i<name.length; i++) { TableViewerColumn packageProcFuncColumn = new TableViewerColumn(tv, SWT.LEFT); packageProcFuncColumn.getColumn().setText(name[i]); packageProcFuncColumn.getColumn().setWidth(size[i]); packageProcFuncColumn.getColumn().addSelectionListener(getSelectionAdapter(packageProcFuncColumn, i)); } packageProcFuncViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { IStructuredSelection iss = (IStructuredSelection) event.getSelection(); if(!iss.isEmpty()) { ProcedureFunctionDAO procedureDAO = (ProcedureFunctionDAO)iss.getFirstElement(); ProcedureExecuterManager pm = new ProcedureExecuterManager(getUserDB(), procedureDAO); if(pm.isExecuted(procedureDAO, getUserDB())) { ExecuteProcedureDialog epd = new ExecuteProcedureDialog(getShell(), getUserDB(), procedureDAO); epd.open(); } } // end iss.isempty } }); } /** * viewer filter * * @param textSearch */ public void filter(String textSearch) { packageFilter.setSearchText(textSearch); packageTableViewer.refresh(); } /** * initialize action */ public void initAction() { if (showPackage != null) showPackage.clear(); packageTableViewer.setInput(showPackage); packageTableViewer.refresh(); if(getUserDB() == null) return; creatAction_Package.setUserDB(getUserDB()); dropAction_Package.setUserDB(getUserDB()); refreshAction_Package.setUserDB(getUserDB()); executeAction_Package.setUserDB(getUserDB()); viewDDLAction.setUserDB(getUserDB()); objectCompileAction.setUserDB(getUserDB()); objectSelectionToEditorAction.setUserDB(getUserDB()); } /** * procedure 정보를 최신으로 갱신 합니다. * @param strObjectName */ public void refreshPackage(final UserDBDAO userDB, boolean boolRefresh, String strObjectName) { if (!boolRefresh) if (!showPackage.isEmpty()) return; this.userDB = userDB; showPackage = (List<ProcedureFunctionDAO>)userDB.getDBObject(OBJECT_TYPE.PACKAGES, userDB.getDefaultSchemanName()); if(showPackage == null || showPackage.isEmpty()) { try { SqlMapClient sqlClient = TadpoleSQLManager.getInstance(userDB); showPackage = sqlClient.queryForList("packageList", userDB.getSchema()); //$NON-NLS-1$ for(ProcedureFunctionDAO dao : showPackage) { dao.setSysName(SQLUtil.makeIdentifierName(userDB, dao.getName())); } // set push of cache userDB.setDBObject(OBJECT_TYPE.PACKAGES, userDB.getDefaultSchemanName(), showPackage); } catch (Exception e) { logger.error("showPackage refresh", 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().ExplorerViewer_71, errStatus); //$NON-NLS-1$ } } packageTableViewer.setInput(showPackage); packageTableViewer.refresh(); TableUtil.packTable(packageTableViewer.getTable()); // select tabitem getTabFolderObject().setSelection(tbtmPackage); selectDataOfTable(strObjectName); } /** * get tableviewer * * @return */ public TableViewer getPackageTableViewer() { return packageTableViewer; } public TableViewer getProcFuncTableViewer() { return this.packageProcFuncViewer; } @Override public void setSearchText(String searchText) { packageFilter.setSearchText(searchText); } @Override public void dispose() { super.dispose(); if(creatAction_Package != null) creatAction_Package.dispose(); if(dropAction_Package != null) dropAction_Package.dispose(); if(refreshAction_Package != null) refreshAction_Package.dispose(); if(viewDDLAction != null) viewDDLAction.dispose(); if(executeAction_Package != null) executeAction_Package.dispose(); if(objectCompileAction != null) objectCompileAction.dispose(); } @Override public void selectDataOfTable(String strObjectName) { if("".equals(strObjectName) || strObjectName == null) return; getPackageTableViewer().getTable().setFocus(); //TODO: 패키지 바디를 컴파일 할때는 strObjectName 에 BODY라고 넘어온다. ㅡㅡ; 아마도 package 라는 키워드 다음문자를 오브젝트 명칭으로 처리한듯.... // find select object and viewer select for(int i=0; i<showPackage.size(); i++) { ProcedureFunctionDAO tableDao = (ProcedureFunctionDAO)getPackageTableViewer().getElementAt(i); if (tableDao !=null && StringUtils.equalsIgnoreCase(strObjectName, tableDao.getName())) { getPackageTableViewer().setSelection(new StructuredSelection(getPackageTableViewer().getElementAt(i)), true); break; } } } public void clearList() { // TODO Auto-generated method stub if(showPackage != null) this.showPackage.clear(); if(showPackageProcFuncColumns != null) this.showPackageProcFuncColumns.clear(); } }