/*******************************************************************************
* Copyright (c) 2012 - 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.core.editors.main.composite.direct;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import com.hangum.tadpole.commons.libs.core.message.CommonMessages;
import com.hangum.tadpole.engine.sql.util.DataTypeValidate;
import com.hangum.tadpole.engine.sql.util.RDBTypeToJavaTypeUtils;
import com.hangum.tadpole.engine.sql.util.resultset.ResultSetUtilDTO;
import com.hangum.tadpole.rdb.core.Messages;
import com.hangum.tadpole.sql.format.SQLFormater;
/**
* SQL Result Editing support
*
* @author hangum
* @version 1.6.1
* @since 2015. 4. 6.
*
*/
public class SQLResultEditingSupport extends EditingSupport {
private static Logger logger = Logger.getLogger(SQLResultEditingSupport.class);
private TableViewer tvSQLResult;
private ResultSetUtilDTO rsDAO;
private int intColumnIndex;
private CellEditor cellEditor;
/**
* @param viewer
*/
public SQLResultEditingSupport(TableViewer viewer, final ResultSetUtilDTO rsDAO, final int intColumnIndex) {
super(viewer);
this.tvSQLResult = viewer;
this.rsDAO = rsDAO;
this.intColumnIndex = intColumnIndex;
this.cellEditor = new TextCellEditor(tvSQLResult.getTable());
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.EditingSupport#getCellEditor(java.lang.Object)
*/
@Override
protected CellEditor getCellEditor(Object element) {
return cellEditor;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.EditingSupport#canEdit(java.lang.Object)
*/
@Override
protected boolean canEdit(Object element) {
return true;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.EditingSupport#getValue(java.lang.Object)
*/
@Override
protected Object getValue(Object element) {
HashMap<Integer, String> data = (HashMap<Integer, String>)element;
return data.get(intColumnIndex)==null?"":data.get(intColumnIndex);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.EditingSupport#setValue(java.lang.Object, java.lang.Object)
*/
@Override
protected void setValue(Object element, Object value) {
HashMap<Integer, String> data = (HashMap<Integer, String>)element;
HashMap<Integer, String> oldDataMap = (HashMap<Integer, String>)data.clone();
String oldData = data.get(intColumnIndex)==null?"":data.get(intColumnIndex);
if(oldData.equals(value.toString())) return;
// 입력 값이 올바른지 검사합니다.
String colType = RDBTypeToJavaTypeUtils.getRDBType(rsDAO.getColumnType().get(intColumnIndex));
if(!DataTypeValidate.isValid(rsDAO.getUserDB(), colType, value.toString())) {
MessageDialog.openError(getViewer().getControl().getShell(), CommonMessages.get().Confirm, Messages.get().TextViewerEditingSupport_2 + " is " + colType + ".");
return;
}
String strColumnName = rsDAO.getColumnName().get(intColumnIndex);
String strColumnValue = "";
if(RDBTypeToJavaTypeUtils.isNumberType(rsDAO.getColumnType().get(intColumnIndex))) strColumnValue = value.toString();
else strColumnValue = "'" + StringEscapeUtils.escapeSql(value.toString()) + "'";
String tableName = rsDAO.getColumnTableName().get(intColumnIndex);
final String strUpdateStatement = String.format("UPDATE %s SET %s=%s WHERE %s",
tableName,
strColumnName,
strColumnValue,
makeWhereStaement(oldDataMap));
String strFormatStatement = "";
try {
strFormatStatement = SQLFormater.format(strUpdateStatement);
} catch(Exception e) {
strFormatStatement = strUpdateStatement;
}
if(logger.isDebugEnabled()) logger.debug("Update SQL Statement is " + strFormatStatement);
SQLUpdateDialog dialog = new SQLUpdateDialog(getViewer().getControl().getShell(), rsDAO.getUserDB(), strFormatStatement);
if(Dialog.OK == dialog.open()) {
// 수정된 데이터 표시
data.put(intColumnIndex, value.toString());
tvSQLResult.refresh();
tvSQLResult.getTable().setFocus();
}
}
/**
* make where statement
*
* @return
*/
private String makeWhereStaement(HashMap<Integer, String> data) {
StringBuffer sbWhere = new StringBuffer();
Map<Integer, String> mapTableNames = rsDAO.getColumnTableName();
Map<Integer, String> mapColumnNames = rsDAO.getColumnName();
Map<Integer, Integer> mapColumnType = rsDAO.getColumnType();
String selectTableName = mapTableNames.get(intColumnIndex);
for(int i=1;i<mapColumnNames.size(); i++) {
if(selectTableName.equals(mapTableNames.get(i))) {
sbWhere.append(mapColumnNames.get(i));
if(data.get(i) == null) {
sbWhere.append( " IS ");
} else {
sbWhere.append( " = ");
}
if(data.get(i) == null) {
sbWhere.append(" null ");
} else {
if(RDBTypeToJavaTypeUtils.isNumberType(mapColumnType.get(i))) sbWhere.append(data.get(i));
else sbWhere.append("'" + data.get(i) + "'");
}
sbWhere.append(" AND ");
}
}
String returnWhere = sbWhere.toString();
returnWhere = StringUtils.removeEnd(returnWhere, "AND ");
if(logger.isDebugEnabled()) logger.debug("make where statement is : " + returnWhere);
return returnWhere;
}
}