/*******************************************************************************
* 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.connections;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
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.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
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.TreeViewer;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import com.hangum.tadpole.commons.exception.dialog.ExceptionDetailsErrorDialog;
import com.hangum.tadpole.commons.google.analytics.AnalyticCaller;
import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine;
import com.hangum.tadpole.commons.libs.core.message.CommonMessages;
import com.hangum.tadpole.commons.util.download.DownloadServiceHandler;
import com.hangum.tadpole.commons.util.download.DownloadUtils;
import com.hangum.tadpole.engine.define.DBDefine;
import com.hangum.tadpole.engine.define.DBGroupDefine;
import com.hangum.tadpole.engine.query.dao.ManagerListDTO;
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.dao.system.userdb.ResourcesDAO.DB_RESOURCE_TYPE;
import com.hangum.tadpole.engine.query.sql.TadpoleSystem_UserDBQuery;
import com.hangum.tadpole.engine.query.sql.TadpoleSystem_UserDBResource;
import com.hangum.tadpole.engine.security.TadpoleSecurityManager;
import com.hangum.tadpole.preference.define.GetAdminPreference;
import com.hangum.tadpole.rdb.core.Activator;
import com.hangum.tadpole.rdb.core.Messages;
import com.hangum.tadpole.rdb.core.actions.connections.QueryEditorAction;
import com.hangum.tadpole.rdb.core.actions.erd.mongodb.MongoDBERDViewAction;
import com.hangum.tadpole.rdb.core.actions.erd.rdb.RDBERDViewAction;
import com.hangum.tadpole.rdb.core.actions.global.ConnectDatabaseAction;
import com.hangum.tadpole.rdb.core.dialog.commons.MapViewerDialog;
import com.hangum.tadpole.rdb.core.editors.main.MainEditor;
import com.hangum.tadpole.rdb.core.editors.main.MainEditorInput;
import com.hangum.tadpole.rdb.core.util.EditorUtils;
import com.hangum.tadpole.session.manager.SessionManager;
/**
* connection manager 정보를
*
* @author hangum
*
*/
public class ManagerViewer extends ViewPart {
private static final Logger logger = Logger.getLogger(ManagerViewer.class);
public static String ID = "com.hangum.tadpole.rdb.core.view.connection.manager"; //$NON-NLS-1$
private Composite compositeMainComposite;
private List<ManagerListDTO> treeDataList = new ArrayList<ManagerListDTO>();
private TreeViewer managerTV;
/** download servcie handler. */
private DownloadServiceHandler downloadServiceHandler;
public ManagerViewer() {
super();
}
@Override
public void createPartControl(Composite parent) {
setPartName(Messages.get().ManagerViewer_0);
compositeMainComposite = new Composite(parent, SWT.NONE);
GridLayout gl_composite = new GridLayout(1, false);
gl_composite.verticalSpacing = 0;
gl_composite.horizontalSpacing = 0;
gl_composite.marginHeight = 0;
gl_composite.marginWidth = 0;
compositeMainComposite.setLayout(gl_composite);
managerTV = new TreeViewer(compositeMainComposite, SWT.NONE);
managerTV.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection is = (IStructuredSelection)event.getSelection();
Object objSelect = is.getFirstElement();
if(objSelect instanceof UserDBDAO) {
final UserDBDAO userDB = (UserDBDAO)objSelect;
if(!TadpoleSecurityManager.getInstance().ifLockOpenDialog(userDB)) return;
// 리소스 가져온다.
addManagerResouceData(userDB, false);
// 싱글 클릭일때 에디터에 오픈된 화면이 없으면 에디터 화면이 열리도록 수정.
// IEditorPart editor = EditorUtils.findSQLEditor(userDB);
// if(editor == null) {
// QueryEditorAction qea = new QueryEditorAction();
// qea.run(userDB);
// }
// Rice lock icode change event
managerTV.refresh(userDB, true);
AnalyticCaller.track(ManagerViewer.ID, userDB.getDbms_type());
managerTV.getControl().setFocus();
} else if(objSelect instanceof ManagerListDTO) {
ManagerListDTO managerDTO = (ManagerListDTO)objSelect;
if(managerDTO.getManagerList().isEmpty()) {
try {
List<UserDBDAO> userDBS = TadpoleSystem_UserDBQuery.getUserGroupDB(managerDTO.getName());
for (UserDBDAO userDBDAO : userDBS) {
managerDTO.addLogin(userDBDAO);
}
managerTV.refresh(managerDTO, false);
managerTV.expandToLevel(managerDTO, 2);
} catch(Exception e) {
logger.error("get manager list", e);
}
}
} else if(objSelect instanceof DBOtherDAO) {
DBOtherDAO dao = (DBOtherDAO)objSelect;
}
} // select change event
});
managerTV.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
IStructuredSelection is = (IStructuredSelection)event.getSelection();
Object selElement = is.getFirstElement();
// db object를 클릭하면 쿼리 창이 뜨도록하고.
if(selElement instanceof UserDBDAO) {
final UserDBDAO userDB= (UserDBDAO)selElement;
if(!TadpoleSecurityManager.getInstance().ifLockOpenDialog(userDB)) return;
QueryEditorAction qea = new QueryEditorAction();
qea.run(userDB);
// erd를 클릭하면 erd가 오픈되도록 수정.
} else if(selElement instanceof UserDBResourceDAO) {
final UserDBResourceDAO dao = (UserDBResourceDAO)selElement;
if( PublicTadpoleDefine.RESOURCE_TYPE.ERD.toString().equals(dao.getResource_types())) {
UserDBDAO userDB = dao.getParent();
if(userDB != null && DBGroupDefine.MONGODB_GROUP == userDB.getDBGroup()) {
MongoDBERDViewAction ea = new MongoDBERDViewAction();
ea.run(dao);
} else {
RDBERDViewAction ea = new RDBERDViewAction();
ea.run(dao);
}
} else {
QueryEditorAction qea = new QueryEditorAction();
qea.run(dao);
}
// manager
} else if (selElement instanceof ManagerListDTO) {
if("YES".equals(SessionManager.getIsRegistDB())) {
ConnectDatabaseAction cda = new ConnectDatabaseAction(getSite().getWorkbenchWindow());
cda.runConnectionDialog(is);
}
} else if (selElement instanceof DBOtherDAO) {
final DBOtherDAO dao = (DBOtherDAO)selElement;
MapViewerDialog dialog = new MapViewerDialog(getSite().getWorkbenchWindow().getShell(), dao.getParent().getName(), dao);
dialog.open();
}
}
});
Tree tree = managerTV.getTree();
tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
// tree.setData( RWT.MARKUP_ENABLED, Boolean.TRUE );
managerTV.setContentProvider(new ManagerContentProvider());
ColumnViewerToolTipSupport.enableFor(managerTV);
managerTV.setLabelProvider(new ManagerLabelProvider());
managerTV.setInput(treeDataList);
getSite().setSelectionProvider(managerTV);
createPopupMenu();
registerServiceHandler();
setManagerDBList();
// db에 erd가 추가되었을 경우
PlatformUI.getPreferenceStore().addPropertyChangeListener(new IPropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty() == PublicTadpoleDefine.SAVE_FILE) {
addResource(Integer.parseInt( event.getNewValue().toString().split(":")[0] )); //$NON-NLS-1$
}
}
});
}
/**
* initialize manager db list
*/
private void setManagerDBList() {
treeDataList.clear();
List<ManagerListDTO> _tmpListManager = SessionManager.getManagerDBList();
if(_tmpListManager.isEmpty()) {
// product type filter
final String []strProductTypeFilters = GetAdminPreference.getViewProductTypeFilter();
// product type filter
if(logger.isDebugEnabled()) logger.debug("===== Manager Viewer add user session................");
try {
for (String strGroupName : TadpoleSystem_UserDBQuery.getUserGroupName()) {
ManagerListDTO managerDTO = new ManagerListDTO(strGroupName);
for (UserDBDAO userDBDAO : TadpoleSystem_UserDBQuery.getUserGroupDB(managerDTO.getName())) {
boolean isFilter = false;
for (String strProductType : strProductTypeFilters) {
if(strProductType.equals(userDBDAO.getOperation_type())) isFilter = true;
}
if(!isFilter) managerDTO.addLogin(userDBDAO);
else {
if(logger.isDebugEnabled()) logger.debug(String.format("Filter db is %s", userDBDAO.getOperation_type()));
}
}
if(!managerDTO.getManagerList().isEmpty()) treeDataList.add(managerDTO);
} // end last end
// session 에 사용자 디비 리스트를 저장하다.
SessionManager.setManagerDBList(treeDataList);
} catch (Exception e) {
logger.error("initialize Managerview", 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().ManagerViewer_4, errStatus); //$NON-NLS-1$
}
} else {
if(logger.isDebugEnabled()) {
logger.debug("===== Manager Viewer reuse user session................" + _tmpListManager.size());
// for (ManagerListDTO managerListDTO : _tmpListManager) {
// for (UserDBDAO dbDao : managerListDTO.getManagerList()) {
// logger.debug("\t======>> " + dbDao.getDisplay_name());
// }
// }
}
treeDataList = _tmpListManager;
}
managerTV.setInput(treeDataList);
managerTV.expandToLevel(2);
AnalyticCaller.track(ManagerViewer.ID);
}
/**
* 트리 데이터 초기화
*/
public void init() {
if(logger.isDebugEnabled()) logger.debug("===== Manager Viewer init..............");
SessionManager.initManagerDBList();
setManagerDBList();
}
/**
* popup 화면을 오픈합니다.
*/
private void createPopupMenu() {
MenuManager menuMgr = new MenuManager();
menuMgr.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
Menu popupMenu = menuMgr.createContextMenu(managerTV.getTree());
managerTV.getTree().setMenu(popupMenu);
getSite().registerContextMenu(menuMgr, managerTV);
}
@Override
public void setFocus() {
}
/**
* 모든 트리 목록을 리턴
*
* @return
*/
public List<ManagerListDTO> getAllTreeList() {
return treeDataList;
}
/**
* tree에 새로운 항목 추가
*
* @param userDB
* @param defaultOpen default editor open
*/
public void addUserDB(UserDBDAO userDB, boolean defaultOpen) {
for(ManagerListDTO dto: treeDataList) {
if(dto.getName().equals(userDB.getGroup_name())) {
dto.addLogin(userDB);
selectAndOpenView(dto, userDB, defaultOpen);
return;
} // end if(dto.getname()....
} // end for
// 신규 그룹이면...
ManagerListDTO managerDto = new ManagerListDTO(userDB.getGroup_name());
managerDto.addLogin(userDB);
treeDataList.add(managerDto);
selectAndOpenView(managerDto, userDB, defaultOpen);
}
/**
* tree에 user resource 항목을 추가합니다.
*
* @param userDB
*/
public void addManagerResouceData(UserDBDAO userDB, boolean isReload) {
if(userDB.getListResource().isEmpty() || isReload) {
// user_resource_data 목록을 추가해 줍니다.
try {
List<UserDBResourceDAO> listUserDBResources = TadpoleSystem_UserDBResource.userDbResourceTree(userDB);
if(!listUserDBResources.isEmpty()) {
ResourcesDAO resourcesDAO = new ResourcesDAO(userDB);
resourcesDAO.setType(DB_RESOURCE_TYPE.USER_RESOURCE);
resourcesDAO.setName(Messages.get().ManagerViewer_Resources);
resourcesDAO.setListResource(listUserDBResources);
userDB.getListResource().add(resourcesDAO);
}
// pg_extension 이 없는 경우가 있습니다.
try {
// pgsql은 익스텐스 을 보여준다.
if(DBGroupDefine.POSTGRE_GROUP == userDB.getDBGroup()) {
if(userDB.getDBDefine() != DBDefine.AMAZON_REDSHIFT_DEFAULT) PostgresqlConnectionEXT.connectionext(userDB);
}
} catch(Exception e) {
logger.error("pg_extension", e);
}
managerTV.refresh(userDB, true);
managerTV.expandToLevel(userDB, 1);
} catch (Exception e) {
logger.error("user_db_erd list", 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().ManagerViewer_4, errStatus); //$NON-NLS-1$
}
}
}
/**
* 사용자 리소스가 추가되었을때
*
* @param userDBErd
*/
public void addResource(int dbSeq) {
for(ManagerListDTO dto: treeDataList) {
for(UserDBDAO userDB : dto.getManagerList()) {
if(userDB.getSeq() == dbSeq) {
userDB.getListResource().clear();
addManagerResouceData(userDB, true);
return;
} // if(userDB.getSeq() == dbSeq) {
} // for(UserDBDAO
}
}
/**
* change resource
*
* @param originalResourceDB
*/
public void refreshResource(UserDBResourceDAO originalResourceDB) {
managerTV.refresh(originalResourceDB);
}
public void deleteResource(UserDBResourceDAO userDBResource) {
UserDBDAO userDB = userDBResource.getParent();
IEditorReference iEditorReference = null;
// 열린화면 검색
if(userDBResource.getResource_types().equals(PublicTadpoleDefine.RESOURCE_TYPE.SQL.toString())) {
iEditorReference = EditorUtils.findSQLEditor(userDBResource);
} else if(userDBResource.getResource_types().equals(PublicTadpoleDefine.RESOURCE_TYPE.ERD.toString())) {
iEditorReference = EditorUtils.findERDEditor(userDBResource);
}
// 열린 화면 닫기
if(iEditorReference != null) {
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().closeEditor(iEditorReference.getEditor(false), true);
}
// 삭제
userDBResource.getParent().findResource(DB_RESOURCE_TYPE.USER_RESOURCE).getListResource().remove(userDBResource);
managerTV.refresh(userDB);
}
/**
* 트리를 갱신하고 쿼리 창을 엽니다.
* @param managerDto
* @param userDB
* @param defaultOpen
*/
public void selectAndOpenView(ManagerListDTO managerDto, UserDBDAO userDB, boolean defaultOpen) {
managerTV.refresh();
managerTV.expandToLevel(managerDto, 2);
managerTV.setSelection(new StructuredSelection(userDB), true);
if(!defaultOpen) return;
// mongodb 일경우 열지 않는다.
if(DBGroupDefine.MONGODB_GROUP != userDB.getDBGroup()) {
MainEditorInput mei = new MainEditorInput(userDB);
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
try {
page.openEditor(mei, MainEditor.ID);
} catch (PartInitException e) {
logger.error("main editor open", 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().ManagerViewer_10, errStatus); //$NON-NLS-1$
}
}
}
/** registery service handler */
private void registerServiceHandler() {
downloadServiceHandler = new DownloadServiceHandler();
RWT.getServiceManager().registerServiceHandler(downloadServiceHandler.getId(), downloadServiceHandler);
}
/**
* SQLite file download
*/
public void download(final UserDBDAO userDB) {
try {
String strFileLoc = StringUtils.difference(StringUtils.remove(userDB.getDBDefine().getDB_URL_INFO(), "%s"), userDB.getUrl());
File dbFile = new File(strFileLoc);
byte[] arrayData = FileUtils.readFileToByteArray(dbFile);
downloadServiceHandler.setContentType("");
downloadServiceHandler.setName(dbFile.getName()); //$NON-NLS-1$
downloadServiceHandler.setByteContent(arrayData);
DownloadUtils.provideDownload(compositeMainComposite, downloadServiceHandler.getId());
} catch(Exception e) {
logger.error("SQLite file Download exception", e); //$NON-NLS-1$
Status errStatus = new Status(IStatus.ERROR, Activator.PLUGIN_ID, e.getMessage(), e); //$NON-NLS-1$
ExceptionDetailsErrorDialog.openError(null,CommonMessages.get().Error, "DB Download Exception", errStatus); //$NON-NLS-1$ //$NON-NLS-2$
}
}
/**
* @return the managerTV
*/
public TreeViewer getManagerTV() {
return managerTV;
}
}