/******************************************************************************* * 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.editors.main.parameter; 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.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnPixelData; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import com.hangum.tadpole.commons.google.analytics.AnalyticCaller; import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine; import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine.PARAMETER_TYPE; import com.hangum.tadpole.commons.libs.core.message.CommonMessages; import com.hangum.tadpole.engine.query.dao.system.UserDBDAO; import com.hangum.tadpole.engine.sql.util.ParameterUtils; import com.hangum.tadpole.engine.sql.util.RDBTypeToJavaTypeUtils; import com.hangum.tadpole.engine.utils.RequestQuery; import com.hangum.tadpole.mongodb.core.dialogs.msg.TadpoleSQLDialog; import com.hangum.tadpole.rdb.core.Messages; import com.hangum.tadpole.rdb.core.editors.main.composite.ResultSetComposite; /** * * @author nilriri */ public class ParameterDialog extends Dialog { private static final Logger logger = Logger.getLogger(ParameterDialog.class); /** 쿼리 실행 후 닫기 버튼 정의 */ private int EXECUTE_AND_CLOSE = IDialogConstants.CLIENT_ID + 1; private ResultSetComposite resultSetComposite; private PARAMETER_TYPE parameterType; private RequestQuery reqQuery; private String strSQL; private UserDBDAO userDB; private Map<Integer, String> mapIndex; private List<Map<Integer, Object>> parameters; /** * Create the dialog. * * @param parentShell * @param parameterType * @param reqQuery * @wbp.parser.constructor */ public ParameterDialog(Shell parentShell, ResultSetComposite resultSetComposite, PARAMETER_TYPE parameterType, final RequestQuery reqQuery, final UserDBDAO userDB, final String strSQL, int paramCount) { super(parentShell); setBlockOnOpen(false); setShellStyle(SWT.MAX | SWT.RESIZE | SWT.TITLE); this.resultSetComposite = resultSetComposite; this.parameterType = parameterType; this.reqQuery = reqQuery; this.userDB = userDB; this.strSQL = strSQL; this.makeParamCount(paramCount); } public ParameterDialog(Shell parentShell, ResultSetComposite resultSetComposite, PARAMETER_TYPE parameterType, final RequestQuery reqQuery, final UserDBDAO userDB, final String strSQL, final Map<Integer, String> mapIndex) { super(parentShell); setBlockOnOpen(false); setShellStyle(SWT.MAX | SWT.RESIZE | SWT.TITLE); this.resultSetComposite = resultSetComposite; this.parameterType = parameterType; this.reqQuery = reqQuery; this.userDB = userDB; this.strSQL = strSQL; this.mapIndex = mapIndex; this.makeParamCount(mapIndex); } @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText(Messages.get().ParameterDialog_0); } /** * Create contents of the dialog. * * @param parent */ @Override protected Control createDialogArea(Composite parent) { Composite container = (Composite) super.createDialogArea(parent); GridLayout gridLayout = (GridLayout) container.getLayout(); gridLayout.horizontalSpacing = 2; gridLayout.marginWidth = 5; gridLayout.verticalSpacing = 2; gridLayout.horizontalSpacing = 2; gridLayout.marginWidth = 5; gridLayout.marginHeight = 2; gridLayout.marginWidth = 2; container.setLayout(new GridLayout(1, false)); Composite compositeHead = new Composite(container, SWT.NONE); compositeHead.setLayout(new GridLayout(1, false)); ToolBar toolBar = new ToolBar(compositeHead, SWT.FLAT | SWT.RIGHT); ToolItem toolItem = new ToolItem(toolBar, SWT.NONE); toolItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { TadpoleSQLDialog dialog = new TadpoleSQLDialog(getShell(), Messages.get().ViewQuery, strSQL); dialog.open(); } }); toolItem.setText(Messages.get().ViewQuery); Composite compositeBody = new Composite(container, SWT.NONE); compositeBody.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); TableColumnLayout tcl_compositeBody = new TableColumnLayout(); compositeBody.setLayout(tcl_compositeBody); TableViewer tableViewer = new TableViewer(compositeBody, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); Table table = tableViewer.getTable(); table.setHeaderVisible(true); table.setLinesVisible(true); createTableColumn(tableViewer, tcl_compositeBody); tableViewer.setContentProvider(new ArrayContentProvider()); tableViewer.setLabelProvider(new ParamLabelProvider()); tableViewer.setInput(parameters); // google analytic AnalyticCaller.track(this.getClass().getName()); tableViewer.getTable().setFocus(); return container; } @Override protected void buttonPressed(int buttonId) { if(buttonId == EXECUTE_AND_CLOSE) { executeQuery(); return; } super.buttonPressed(buttonId); } @Override protected void okPressed() { executeQuery(); super.okPressed(); } /** * 쿼리 실행 */ private void executeQuery() { reqQuery.setSqlStatementType(PublicTadpoleDefine.SQL_STATEMENT_TYPE.PREPARED_STATEMENT); reqQuery.setSql(strSQL); ParameterObject paramObj = getParameterObject(); String repSQL = ParameterUtils.fillParameters(reqQuery.getSql(), paramObj.getParameter()); reqQuery.setSqlAddParameter(repSQL); if(PARAMETER_TYPE.JAVA_BASIC == parameterType) { reqQuery.setStatementParameter(getParameterObject().getParameter()); } else if(PARAMETER_TYPE.ORACLE == parameterType || PARAMETER_TYPE.MYBATIS_SHARP == parameterType || PARAMETER_TYPE.MYBATIS_DOLLAR == parameterType ) { reqQuery.setStatementParameter(getOracleParameterObject(mapIndex).getParameter()); } resultSetComposite._executeQuery(reqQuery); } /** * create table column * * @param tableViewer * @param tcl_composite */ private void createTableColumn(TableViewer tableViewer, TableColumnLayout tcl_composite) { // Not support Eclipse RAP. // This class table course. course is keyboard controls // final TableCursor cursor = new TableCursor(table, SWT.NONE); TableViewerColumn tvcSeq = new TableViewerColumn(tableViewer, SWT.NONE); TableColumn tcSeq = tvcSeq.getColumn(); tcl_composite.setColumnData(tcSeq, new ColumnPixelData(30, true, true)); tcSeq.setText(Messages.get().ParameterDialog_1); TableViewerColumn tvcName = new TableViewerColumn(tableViewer, SWT.NONE); TableColumn tcName = tvcName.getColumn(); tcl_composite.setColumnData(tcName, new ColumnPixelData(150, true, true)); tcName.setText(Messages.get().ParameterDialog_2); TableViewerColumn tvcType = new TableViewerColumn(tableViewer, SWT.NONE); TableColumn tcType = tvcType.getColumn(); tcl_composite.setColumnData(tcType, new ColumnPixelData(80, true, true)); tcType.setText(Messages.get().DataType); tvcType.setEditingSupport(new ParameterEditingSupport(tableViewer, 2, this.userDB, parameters)); TableViewerColumn tvcValue = new TableViewerColumn(tableViewer, SWT.NONE); TableColumn tcValue = tvcValue.getColumn(); tcl_composite.setColumnData(tcValue, new ColumnPixelData(150, true, true)); tcValue.setText(Messages.get().ParameterDialog_4); tvcValue.setEditingSupport(new ParameterEditingSupport(tableViewer, 3, this.userDB, parameters)); } /** * Create contents of the button bar. * * @param parent */ @Override protected void createButtonsForButtonBar(Composite parent) { createButton(parent, EXECUTE_AND_CLOSE, Messages.get().ExecuteQuery, true); createButton(parent, IDialogConstants.OK_ID, Messages.get().ExecuteQueryAndClose, false); createButton(parent, IDialogConstants.CANCEL_ID, CommonMessages.get().Close, false); } /** * Return the initial size of the dialog. */ @Override protected Point getInitialSize() { return new Point(420, 350); } /** * Return java style parameter * * @return */ private ParameterObject getParameterObject() { ParameterObject param = new ParameterObject(); for (Map<Integer, Object> paramE : parameters) { switch (RDBTypeToJavaTypeUtils.getJavaType((String) paramE.get(2))) { case java.sql.Types.INTEGER: param.setObject(Integer.valueOf(paramE.get(3).toString())); break; default: param.setObject(paramE.get(3)); break; } } return param; } /** * Returns oracle styled parameter object * * @param mapIndex * @return */ private ParameterObject getOracleParameterObject(Map<Integer, String> mapIndex) { ParameterObject param = new ParameterObject(); for(Integer intKey : mapIndex.keySet()) { String strParamName = mapIndex.get(intKey); for (Map<Integer, Object> mapParam : parameters) { String strTmpParamName = ""+mapParam.get(1); //$NON-NLS-1$ if(StringUtils.equals(strParamName, strTmpParamName)) { switch (RDBTypeToJavaTypeUtils.getJavaType((String) mapParam.get(2))) { case java.sql.Types.INTEGER: param.setObject(Integer.valueOf(mapParam.get(3).toString())); break; default: param.setObject(mapParam.get(3)); break; } // 파라미터 이름이 동일할 경우 하나만 설정되도록 수정. break; } } } return param; } /** * java type * * @param paramCount */ private void makeParamCount(int paramCount) { parameters = new ArrayList<Map<Integer, Object>>(); for (int i = 0; i < paramCount; i++) { Map<Integer, Object> map = new HashMap<Integer, Object>(); map.put(0, (i + 1)); map.put(1, "Param" + (i + 1)); //$NON-NLS-1$ map.put(2, RDBTypeToJavaTypeUtils.supportParameterTypes(userDB)[0]); map.put(3, ""); //$NON-NLS-1$ parameters.add(map); } } /** * oracel type * * @param mapIndex */ private void makeParamCount(Map<Integer, String> mapIndex) { parameters = new ArrayList<Map<Integer, Object>>(); // int i = 0; // for (String strKey : mapIndex.keySet()) { for(int i=0; i<mapIndex.size(); i++) { String strKey = mapIndex.get(i+1); Map<Integer, Object> map = new HashMap<Integer, Object>(); map.put(0, (i+ + 1)); map.put(1, strKey); map.put(2, RDBTypeToJavaTypeUtils.supportParameterTypes(userDB)[0]); map.put(3, ""); //$NON-NLS-1$ parameters.add(map); } } /** * table dao * * @return */ private List<Map<Integer, Object>> getParameters() { return parameters; } }