/*******************************************************************************
* 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.mongodb.collections;
import java.util.List;
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.ColumnLabelProvider;
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.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
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.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.graphics.Image;
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.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PartInitException;
import com.hangum.tadpole.commons.exception.dialog.ExceptionDetailsErrorDialog;
import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine;
import com.hangum.tadpole.commons.libs.core.message.CommonMessages;
import com.hangum.tadpole.commons.util.NumberFormatUtils;
import com.hangum.tadpole.engine.permission.PermissionChecker;
import com.hangum.tadpole.engine.query.dao.mongodb.CollectionFieldDAO;
import com.hangum.tadpole.engine.query.dao.mysql.TableDAO;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
import com.hangum.tadpole.engine.sql.util.tables.TableUtil;
import com.hangum.tadpole.engine.sql.util.tables.TreeUtil;
import com.hangum.tadpole.mongodb.core.editors.main.MongoDBEditorInput;
import com.hangum.tadpole.mongodb.core.editors.main.MongoDBTableEditor;
import com.hangum.tadpole.mongodb.core.query.MongoDBQuery;
import com.hangum.tadpole.rdb.core.Activator;
import com.hangum.tadpole.rdb.core.Messages;
import com.hangum.tadpole.rdb.core.actions.object.mongodb.ObjectMongodbCollCompactAction;
import com.hangum.tadpole.rdb.core.actions.object.mongodb.ObjectMongodbCollFindAndModifyAction;
import com.hangum.tadpole.rdb.core.actions.object.mongodb.ObjectMongodbCollStatesAction;
import com.hangum.tadpole.rdb.core.actions.object.mongodb.ObjectMongodbCollValidateAction;
import com.hangum.tadpole.rdb.core.actions.object.mongodb.ObjectMongodbGroupAction;
import com.hangum.tadpole.rdb.core.actions.object.mongodb.ObjectMongodbMapReduceAction;
import com.hangum.tadpole.rdb.core.actions.object.mongodb.ObjectMongodbReIndexAction;
import com.hangum.tadpole.rdb.core.actions.object.mongodb.ObjectMongodbRenameAction;
import com.hangum.tadpole.rdb.core.actions.object.rdb.generate.GenerateSQLInsertAction;
import com.hangum.tadpole.rdb.core.actions.object.rdb.generate.GenerateSQLSelectAction;
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.ObjectRefreshAction;
import com.hangum.tadpole.rdb.core.viewers.object.comparator.MongoDBCollectionComparator;
import com.hangum.tadpole.rdb.core.viewers.object.comparator.ObjectComparator;
import com.hangum.tadpole.rdb.core.viewers.object.sub.AbstractObjectComposite;
import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.table.TableDragListener;
import com.hangum.tadpole.rdb.core.viewers.object.sub.rdb.table.TableFilter;
import com.swtdesigner.ResourceManager;
/**
* Mongodb Collection composite
*
* @author hangum
*
*/
public class TadpoleMongoDBCollectionComposite extends AbstractObjectComposite {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(TadpoleMongoDBCollectionComposite.class);
/** select table name */
private String selectTableName = ""; //$NON-NLS-1$
// table info
private TableViewer tableListViewer;
private List<TableDAO> showTables;
private ObjectComparator tableComparator;
private TableFilter tableFilter;
// column info
private TreeViewer treeColumnViewer;
private List<CollectionFieldDAO> showTableColumns;
private ObjectCreatAction creatAction_Table;
private ObjectDropAction deleteAction_Table;
private ObjectMongodbCollFindAndModifyAction collFindAndModifyAction;
private ObjectRefreshAction refreshAction_Table;
private GenerateSQLSelectAction insertStmtAction;
private ObjectMongodbRenameAction renameColAction;
private ObjectMongodbReIndexAction reIndexColAction;
private ObjectMongodbMapReduceAction mapReduceAction;
private ObjectMongodbGroupAction groupAction;
private ObjectMongodbCollStatesAction collStatsAction;
private ObjectMongodbCollCompactAction collCompactAction;
private ObjectMongodbCollValidateAction collValidateAction;
public TadpoleMongoDBCollectionComposite(IWorkbenchPartSite partSite, final CTabFolder tabFolderObject, UserDBDAO userDB) {
super(partSite, tabFolderObject, userDB);
createWidget(tabFolderObject);
}
private void createWidget(final CTabFolder tabFolderObject) {
CTabItem tbtmTable = new CTabItem(tabFolderObject, SWT.NONE);
tbtmTable.setText(Messages.get().Collections);
tbtmTable.setData(TAB_DATA_KEY, PublicTadpoleDefine.OBJECT_TYPE.COLLECTIONS.name());
Composite compositeTables = new Composite(tabFolderObject, SWT.NONE);
tbtmTable.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를 적용하면 데이터가 보이지 않는 오류수정.
tableListViewer = new TableViewer(sashForm, /* SWT.VIRTUAL | */ SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
tableListViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
if(PublicTadpoleDefine.YES_NO.NO.name().equals(userDB.getIs_showtables())) return;
IStructuredSelection is = (IStructuredSelection) event.getSelection();
if (null != is) {
TableDAO tableDAO = (TableDAO) is.getFirstElement();
MongoDBEditorInput input = new MongoDBEditorInput(tableDAO.getName(), userDB, showTableColumns);
IWorkbenchPage page = getSite().getWorkbenchWindow().getActivePage();
try {
page.openEditor(input, MongoDBTableEditor.ID);
} catch (PartInitException e) {
logger.error("Load the table data", 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, Messages.get().ExplorerViewer_39, errStatus); //$NON-NLS-1$
}
}
}
});
tableListViewer.addPostSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
if(PublicTadpoleDefine.YES_NO.NO.name().equals(userDB.getIs_showtables())) return;
// 테이블의 컬럼 목록을 출력합니다.
try {
IStructuredSelection is = (IStructuredSelection) event.getSelection();
Object tableDAO = is.getFirstElement();
if (tableDAO != null) {
TableDAO table = (TableDAO) tableDAO;
if (selectTableName.equals(table.getName())) return;
selectTableName = table.getName();
showTableColumns = MongoDBQuery.collectionColumn(userDB, selectTableName);
} else
showTableColumns = null;
treeColumnViewer.setInput(showTableColumns);
treeColumnViewer.refresh();
TreeUtil.packTree(treeColumnViewer.getTree());
} 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 = tableListViewer.getTable();
tableTableList.setLinesVisible(true);
tableTableList.setHeaderVisible(true);
// sorter
tableComparator = new MongoDBCollectionComparator();
tableListViewer.setSorter(tableComparator);
tableComparator.setColumn(0);
TableViewerColumn tvColName = new TableViewerColumn(tableListViewer, SWT.NONE);
TableColumn tbName = tvColName.getColumn();
tbName.setWidth(150);
tbName.setText("Name"); //$NON-NLS-1$
tbName.addSelectionListener(getSelectionAdapter(tableListViewer, tableComparator, tbName, 0));
tvColName.setLabelProvider(new ColumnLabelProvider() {
@Override
public Image getImage(Object element) {
return ResourceManager.getPluginImage(Activator.PLUGIN_ID, "resources/icons/objectExplorer/tables.png"); //$NON-NLS-1$
}
@Override
public String getText(Object element) {
TableDAO table = (TableDAO) element;
return table.getName();
}
});
// tvColName.setEditingSupport(new TableCommentEditorSupport(tableListViewer, userDB, 0));
TableViewerColumn tvColRows = new TableViewerColumn(tableListViewer, SWT.RIGHT);
TableColumn tbComment = tvColRows.getColumn();
tbComment.setWidth(200);
tbComment.setText("Rows"); //$NON-NLS-1$
tbComment.addSelectionListener(getSelectionAdapter(tableListViewer, tableComparator, tbComment, 1));
tvColRows.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
TableDAO table = (TableDAO) element;
return NumberFormatUtils.commaFormat(table.getRows());
}
});
// tvColRows.setEditingSupport(new TableCommentEditorSupport(tableListViewer, userDB, 1));
TableViewerColumn tvColSize = new TableViewerColumn(tableListViewer, SWT.RIGHT);
TableColumn tbSize = tvColSize.getColumn();
tbSize.setWidth(200);
tbSize.setText("Size"); //$NON-NLS-1$
tbSize.addSelectionListener(getSelectionAdapter(tableListViewer, tableComparator, tbComment, 1));
tvColSize.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
TableDAO table = (TableDAO) element;
return NumberFormatUtils.kbMbFormat(table.getSize());
}
});
tableListViewer.setContentProvider(new ArrayContentProvider());
tableListViewer.setInput(showTables);
createMenu();
// dnd 기능 추가
Transfer[] transferTypes = new Transfer[]{TextTransfer.getInstance()};
tableListViewer.addDragSupport(DND_OPERATIONS, transferTypes , new TableDragListener(userDB, tableListViewer));
// filter
tableFilter = new TableFilter(userDB);
tableListViewer.addFilter(tableFilter);
// columns
treeColumnViewer = new TreeViewer(sashForm, /* SWT.VIRTUAL | */ SWT.BORDER | SWT.FULL_SELECTION);
Tree tableTableColumn = treeColumnViewer.getTree();
tableTableColumn.setHeaderVisible(true);
tableTableColumn.setLinesVisible(true);
createTableMongoColumne();
treeColumnViewer.setContentProvider(new MongoDBCollectionFieldsContentProvider());
treeColumnViewer.setLabelProvider(new MongoDBCollectionFieldsLabelProvider());
sashForm.setWeights(new int[] { 1, 1 });
}
/**
* mongodb collection column
* @param treeColumnViewer2
*/
private void createTableMongoColumne() {
String[] columnName = {Messages.get().Field, Messages.get().TadpoleMongoDBCollectionComposite_2, Messages.get().TadpoleMongoDBCollectionComposite_3};
int[] columnSize = {110, 100, 100};
try {
// reset column
for(int i=0; i<columnName.length; i++) {
final TreeViewerColumn tableColumn = new TreeViewerColumn(treeColumnViewer, SWT.LEFT);
tableColumn.getColumn().setText( columnName[i] );
tableColumn.getColumn().setWidth( columnSize[i] );
tableColumn.getColumn().setResizable(true);
tableColumn.getColumn().setMoveable(false);
} // end for
} catch(Exception e) {
logger.error("MongoDB Table Editor", e); //$NON-NLS-1$
}
}
/**
* create menu
*/
private void createMenu() {
if(getUserDB() == null) return;
creatAction_Table = new ObjectCreatAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().TadpoleMongoDBCollectionComposite_5);
deleteAction_Table = new ObjectDropAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().TadpoleMongoDBCollectionComposite_6);
collFindAndModifyAction = new ObjectMongodbCollFindAndModifyAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().TadpoleMongoDBCollectionComposite_7);
refreshAction_Table = new ObjectRefreshAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, CommonMessages.get().Refresh);
insertStmtAction = new GenerateSQLInsertAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().TadpoleMongoDBCollectionComposite_9);
renameColAction = new ObjectMongodbRenameAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().TadpoleMongoDBCollectionComposite_10);
reIndexColAction = new ObjectMongodbReIndexAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().TadpoleMongoDBCollectionComposite_11);
mapReduceAction = new ObjectMongodbMapReduceAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().TadpoleMongoDBCollectionComposite_12);
groupAction = new ObjectMongodbGroupAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().TadpoleMongoDBCollectionComposite_13);
collStatsAction = new ObjectMongodbCollStatesAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().TadpoleMongoDBCollectionComposite_14);
collCompactAction = new ObjectMongodbCollCompactAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().TadpoleMongoDBCollectionComposite_15);
collValidateAction = new ObjectMongodbCollValidateAction(getSite().getWorkbenchWindow(), PublicTadpoleDefine.OBJECT_TYPE.TABLES, Messages.get().TadpoleMongoDBCollectionComposite_16);
// menu
final MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
menuMgr.add(creatAction_Table);
if(PermissionChecker.isShow(getUserRoleType(), getUserDB())) {
menuMgr.add(deleteAction_Table);
menuMgr.add(collFindAndModifyAction);
menuMgr.add(collValidateAction);
}
menuMgr.add(new Separator());
menuMgr.add(refreshAction_Table);
menuMgr.add(new Separator());
menuMgr.add(insertStmtAction);
menuMgr.add(collStatsAction);
if(PermissionChecker.isShow(getUserRoleType(), getUserDB())) {
menuMgr.add(new Separator());
menuMgr.add(collCompactAction);
menuMgr.add(renameColAction);
menuMgr.add(reIndexColAction);
}
menuMgr.add(new Separator());
menuMgr.add(mapReduceAction);
menuMgr.add(groupAction);
tableListViewer.getTable().setMenu(menuMgr.createContextMenu(tableListViewer.getTable()));
getSite().registerContextMenu(menuMgr, tableListViewer);
}
@Override
public void setSearchText(String searchText) {
tableFilter.setSearchText(searchText);
}
public void initAction() {
if(getUserDB() == null) return;
creatAction_Table.setUserDB(getUserDB());
deleteAction_Table.setUserDB(getUserDB());
collFindAndModifyAction.setUserDB(getUserDB());
collValidateAction.setUserDB(getUserDB());
refreshAction_Table.setUserDB(getUserDB());
insertStmtAction.setUserDB(getUserDB());
collStatsAction.setUserDB(getUserDB());
collCompactAction.setUserDB(getUserDB());
renameColAction.setUserDB(getUserDB());
reIndexColAction.setUserDB(getUserDB());
mapReduceAction.setUserDB(getUserDB());
groupAction.setUserDB(getUserDB());
}
public TableViewer getCollectionListViewer() {
return tableListViewer;
}
/**
* refresh mongodb collection
*
* @param selectUserDb
* @param boolRefresh
*/
public void refreshTable(final UserDBDAO selectUserDb, boolean boolRefresh) {
if(!boolRefresh) if(selectUserDb == null) return;
this.userDB = selectUserDb;
// 테이블 등록시 테이블 목록 보이지 않는 옵션을 선택했는지.
if(PublicTadpoleDefine.YES_NO.NO.name().equals(this.userDB.getIs_showtables())) {
showTables.add(new TableDAO(Messages.get().TadpoleMongoDBCollectionComposite_4, "")); //$NON-NLS-1$
tableListViewer.setInput(showTables);
tableListViewer.refresh();
TableUtil.packTable(tableListViewer.getTable());
return;
}
Job job = new Job(Messages.get().MainEditor_45) {
@Override
public IStatus run(IProgressMonitor monitor) {
monitor.beginTask(MSG_DataIsBeginAcquired, IProgressMonitor.UNKNOWN);
try {
showTables= MongoDBQuery.listCollection(userDB);
} catch(Exception e) {
logger.error("Table Referesh", e); //$NON-NLS-1$
return new Status(Status.WARNING, Activator.PLUGIN_ID, e.getMessage());
} finally {
monitor.done();
}
/////////////////////////////////////////////////////////////////////////////////////////
return Status.OK_STATUS;
}
};
// job의 event를 처리해 줍니다.
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()) {
tableListViewer.setInput(showTables);
tableListViewer.refresh();
TableUtil.packTable(tableListViewer.getTable());
} else {
if (showTables != null) showTables.clear();
tableListViewer.setInput(showTables);
tableListViewer.refresh();
TableUtil.packTable(tableListViewer.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();
}
public TableViewer getTableListViewer() {
return tableListViewer;
}
public void filter(String textSearch) {
tableFilter.setSearchText(textSearch);
tableListViewer.refresh();
}
@Override
public void dispose() {
super.dispose();
if(creatAction_Table != null) creatAction_Table.dispose();
if(deleteAction_Table != null) deleteAction_Table.dispose();
if(collFindAndModifyAction != null) collFindAndModifyAction.dispose();
if(collValidateAction != null) collValidateAction.dispose();
if(refreshAction_Table != null) refreshAction_Table.dispose();
if(insertStmtAction != null) insertStmtAction.dispose();
if(collStatsAction != null) collStatsAction.dispose();
if(collCompactAction != null) collCompactAction.dispose();
if(renameColAction != null) renameColAction.dispose();
if(reIndexColAction != null) reIndexColAction.dispose();
if(mapReduceAction != null) mapReduceAction.dispose();
if(groupAction != null) groupAction.dispose();
}
@Override
public void selectDataOfTable(String strObjectName) {
// TODO Auto-generated method stub
}
}