/*******************************************************************************
* Copyright (c) 2015 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.erd.core.actions;
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.draw2d.geometry.Rectangle;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.ui.actions.SelectionAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.IWorkbenchPart;
import com.hangum.tadpole.commons.libs.core.message.CommonMessages;
import com.hangum.tadpole.engine.define.DBGroupDefine;
import com.hangum.tadpole.engine.query.dao.mysql.TableColumnDAO;
import com.hangum.tadpole.engine.query.dao.mysql.TableDAO;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
import com.hangum.tadpole.rdb.erd.core.Messages;
import com.hangum.tadpole.rdb.erd.core.editor.TadpoleRDBEditor;
import com.hangum.tadpole.rdb.erd.core.relation.RelationUtil;
import com.hangum.tadpole.rdb.erd.core.utils.TDBDataHandler;
import com.hangum.tadpole.rdb.erd.core.utils.TadpoleModelUtils;
import com.hangum.tadpole.rdb.erd.stanalone.Activator;
import com.hangum.tadpole.rdb.model.Column;
import com.hangum.tadpole.rdb.model.DB;
import com.hangum.tadpole.rdb.model.RdbFactory;
import com.hangum.tadpole.rdb.model.Table;
import com.swtdesigner.ResourceManager;
/**
* ERD view refresh action
*
* @author hangum
*
*/
public class ERDRefreshAction extends SelectionAction {
public final static String ID = "com.hangum.tadpole.rdb.erd.actions.global.ERDViewRefreshAction"; //$NON-NLS-1$
private static final Logger logger = Logger.getLogger(ERDRefreshAction.class);
private GraphicalViewer viewer;
private TadpoleRDBEditor rdbEditor;
public ERDRefreshAction(IWorkbenchPart part, GraphicalViewer graphicalViewer) {
super(part);
setLazyEnablementCalculation(false);
rdbEditor = (TadpoleRDBEditor)part;
this.viewer = graphicalViewer;
setId(ID);
setText(Messages.get().ERDRefreshAction_0);
setToolTipText(Messages.get().ERDRefreshAction_0);
setImageDescriptor( ResourceManager.getPluginImageDescriptor(Activator.PLUGIN_ID, "resources/icons/refresh.png")); //$NON-NLS-1$
}
public GraphicalViewer getViewer() {
return viewer;
}
@Override
public void run() {
if(!MessageDialog.openConfirm(getWorkbenchPart().getSite().getShell(), CommonMessages.get().Confirm, Messages.get().ERDRefreshAction_4)) return;
DB dbModel = rdbEditor.getDb();
// 현재 보여지는 table 목록과 위치를 가져옵니다.
Map<String, Rectangle> mapOldTables = new HashMap<String, Rectangle>();
for(Table table : dbModel.getTables()) {
mapOldTables.put(table.getName(), table.getConstraints());
}
// remove tables
int intTableCnt = dbModel.getTables().size();
for(int i=0; i<intTableCnt; i++) {
Table table = dbModel.getTables().get(0);
table.setDb(null);
}
List<String> strTableNames = new ArrayList<String>(mapOldTables.keySet());
// refresh ui
try {
final RdbFactory factory = RdbFactory.eINSTANCE;
final UserDBDAO userDB = rdbEditor.getUserDB();
// 전체 참조 테이블 목록.
Map<String, Table> mapDBTables = new HashMap<String, Table>();
List<TableDAO> listTAbles = TadpoleModelUtils.INSTANCE.getTable(userDB, strTableNames);
for(TableDAO table : listTAbles) {
Table tableModel = factory.createTable();
tableModel.setDb(dbModel);
tableModel.setName(table.getName());
if(DBGroupDefine.SQLITE_GROUP == userDB.getDBGroup()) {
tableModel.setComment(""); //$NON-NLS-1$
} else {
String tableComment = table.getComment();
tableComment = StringUtils.substring(""+tableComment, 0, 10); //$NON-NLS-1$
tableModel.setComment(tableComment);
}
mapDBTables.put(tableModel.getName(), tableModel);
tableModel.setConstraints(mapOldTables.get(table.getName()));
// column add
List<TableColumnDAO> columnList = TDBDataHandler.getColumns(userDB, table);
for (TableColumnDAO columnDAO : columnList) {
Column column = factory.createColumn();
column.setDefault(columnDAO.getDefault());
column.setExtra(columnDAO.getExtra());
column.setField(columnDAO.getField());
column.setNull(columnDAO.getNull());
column.setKey(columnDAO.getKey());
column.setType(columnDAO.getType());
String strComment = columnDAO.getComment();
if(strComment == null) strComment = ""; //$NON-NLS-1$
strComment = StringUtils.substring(""+strComment, 0, 10); //$NON-NLS-1$
column.setComment(strComment);
column.setTable(tableModel);
tableModel.getColumns().add(column);
}
} // end table list
// 관계를 만듭니다.
RelationUtil.calRelation(userDB, mapDBTables, dbModel);
} catch (Exception e) {
logger.error("Get all table list", e); //$NON-NLS-1$
}
}
@Override
protected boolean calculateEnabled() {
return true;
}
}