/* ***************************************************************************** * JFire - it's hot - Free ERP System - http://jfire.org * * Copyright (C) 2004-2005 NightLabs - http://NightLabs.org * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin St, Fifth Floor, * * Boston, MA 02110-1301 USA * * * * Or get it online : * * http://www.gnu.org/copyleft/lesser.html * * * * * ******************************************************************************/ package org.nightlabs.jfire.reporting.admin.ui.oda.jfs.client.ui; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.eclipse.birt.report.designer.ui.dialogs.ExpressionBuilder; import org.eclipse.datatools.connectivity.oda.IParameterMetaData; import org.eclipse.datatools.connectivity.oda.OdaException; import org.eclipse.datatools.connectivity.oda.design.DataElementAttributes; import org.eclipse.datatools.connectivity.oda.design.DataSetDesign; import org.eclipse.datatools.connectivity.oda.design.DataSetParameters; import org.eclipse.datatools.connectivity.oda.design.DesignFactory; import org.eclipse.datatools.connectivity.oda.design.ElementNullability; import org.eclipse.datatools.connectivity.oda.design.InputElementAttributes; import org.eclipse.datatools.connectivity.oda.design.InputParameterAttributes; import org.eclipse.datatools.connectivity.oda.design.ParameterDefinition; import org.eclipse.datatools.connectivity.oda.design.ui.designsession.DesignSessionUtil; import org.eclipse.datatools.connectivity.oda.design.ui.wizards.DataSetWizardPage; import org.eclipse.datatools.connectivity.oda.jfire.JFireOdaException; import org.eclipse.emf.common.util.EList; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.DialogCellEditor; import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.nightlabs.base.ui.composite.XComposite; import org.nightlabs.base.ui.table.AbstractTableComposite; import org.nightlabs.base.ui.table.TableContentProvider; import org.nightlabs.base.ui.table.TableLabelProvider; import org.nightlabs.jfire.reporting.admin.ui.resource.Messages; import org.nightlabs.jfire.reporting.oda.JFireReportingOdaException; import org.nightlabs.jfire.reporting.oda.ParameterMetaData; import org.nightlabs.jfire.reporting.oda.ParameterMetaData.ParameterDescriptor; import org.nightlabs.jfire.reporting.oda.jfs.JFSQueryPropertySet; import org.nightlabs.jfire.reporting.oda.jfs.JFSQueryUtil; import org.nightlabs.jfire.reporting.oda.wrapper.ParameterMetaDataWrapper; import org.nightlabs.jfire.scripting.ScriptParameterSet; import org.nightlabs.jfire.scripting.dao.ScriptParameterSetForScriptRegistryItemIDDAO; import org.nightlabs.jfire.scripting.id.ScriptRegistryItemID; import org.nightlabs.progress.NullProgressMonitor; /** * @author Alexander Bieber <alex [AT] nightlabs [DOT] de> */ public class JFSParameterWizardPage extends DataSetWizardPage implements ICellModifier { private static final Logger logger = Logger.getLogger(JFSParameterWizardPage.class); private static final String PROPERTY_NAME = "Name"; //$NON-NLS-1$ private static final String PROPERTY_TYPE = "Type"; //$NON-NLS-1$ private static final String PROPERTY_DEFAULT_VALUE = "Type"; //$NON-NLS-1$ private class Table extends AbstractTableComposite<ParameterDescriptor> { public Table(Composite parent, int style) { super(parent, style); } @Override protected void createTableColumns(TableViewer tableViewer, org.eclipse.swt.widgets.Table table) { TableColumn tc; tc = new TableColumn(table, SWT.LEFT); tc.setText(Messages.getString("org.nightlabs.jfire.reporting.admin.ui.oda.jfs.client.ui.JFSParameterWizardPage.nameColumn.text")); //$NON-NLS-1$ tc = new TableColumn(table, SWT.LEFT); tc.setText(Messages.getString("org.nightlabs.jfire.reporting.admin.ui.oda.jfs.client.ui.JFSParameterWizardPage.typeColumn.text")); //$NON-NLS-1$ tc = new TableColumn(table, SWT.LEFT); tc.setText(Messages.getString("org.nightlabs.jfire.reporting.admin.ui.oda.jfs.client.ui.JFSParameterWizardPage.defaultValueColumn.text")); //$NON-NLS-1$ // table.setLayout(new WeightedTableLayout(new int[] {10, 10, 10, 10, 10, 10})); TableLayout l = new TableLayout(); l.addColumnData(new ColumnWeightData(1, 50)); l.addColumnData(new ColumnWeightData(1, 50)); l.addColumnData(new ColumnWeightData(1, 50)); table.setLayout(l); tableViewer.setColumnProperties(new String[] { PROPERTY_NAME, PROPERTY_TYPE, PROPERTY_DEFAULT_VALUE }); tableViewer.setCellEditors(new CellEditor[] { null, null, new DefaultValueCellEditor(table) }); tableViewer.setCellModifier(JFSParameterWizardPage.this); } @Override protected void setTableProvider(TableViewer tableViewer) { tableViewer.setContentProvider(new ContentProvider()); tableViewer.setLabelProvider(new LabelProvider()); } } private class ContentProvider extends TableContentProvider { @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof ParameterMetaData) { ParameterMetaData metaData = (ParameterMetaData) inputElement; try { List<ParameterDescriptor> result = new ArrayList<ParameterDescriptor>(metaData.getParameterCount()); for (int i = 1; i <= metaData.getParameterCount(); i++) { result.add(metaData.getDescriptor(i)); } return result.toArray(); } catch (JFireOdaException e) { throw new RuntimeException(e); } } return super.getElements(inputElement); } } private class LabelProvider extends TableLabelProvider { public String getColumnText(Object element, int columnIdx) { ParameterDescriptor descriptor = (ParameterDescriptor) element; String defValue = (parameterDefaultValues != null) ? parameterDefaultValues.get(descriptor.getParameterName()) : null; switch (columnIdx) { case 0: return ((ParameterDescriptor)element).getParameterName(); case 1: return ((ParameterDescriptor)element).getDataTypeName() + "("+((ParameterDescriptor)element).getRealDataTypeName()+")"; //$NON-NLS-1$ //$NON-NLS-2$ case 2: return defValue != null ? defValue : ""; //$NON-NLS-1$ } return ""; //$NON-NLS-1$ } } private class DefaultValueCellEditor extends DialogCellEditor { public DefaultValueCellEditor(org.eclipse.swt.widgets.Table table) { super(table); } @Override protected Object openDialogBox(Control parent) { ParameterDescriptor descriptor = table.getFirstSelectedElement(); String initExpression = parameterDefaultValues.get(descriptor.getParameterName()); ExpressionBuilder expressionBuilder = new ExpressionBuilder(initExpression != null ? initExpression : ""); //$NON-NLS-1$ // ScalarParameterHandle handle = (ScalarParameterHandle) ElementProcessorFactory.createProcessor( "ScalarParameter" ).createElement( null ); // expressionBuilder.setExpressionProvier(new ParameterExpressionProvider( // handle, dataSetDesign.getName()) // ); if (expressionBuilder.open( ) == Window.OK){ return expressionBuilder.getResult().trim(); } return null; } } private ParameterMetaData parameterMetaData; private Map<String, String> parameterDefaultValues; private DataSetDesign dataSetDesign; private XComposite wrapper; private Table table; /** * @param arg0 */ public JFSParameterWizardPage(String name) { super(name); } /** * @param arg0 * @param arg1 * @param arg2 */ public JFSParameterWizardPage(String name, String title, ImageDescriptor icon) { super(name, title, icon); } /* (non-Javadoc) * @see org.eclipse.datatools.connectivity.oda.design.ui.wizards.DataSetWizardPage#createPageCustomControl(org.eclipse.swt.widgets.Composite) */ @Override public void createPageCustomControl(Composite parent) { wrapper = new XComposite(parent, SWT.NONE); table = new Table(wrapper, SWT.NONE); setControl(wrapper); } @Override protected void refresh(DataSetDesign design) { super.refresh(design); this.dataSetDesign = design; getParameterMetaData(dataSetDesign); getParameterDefaultValues(dataSetDesign); table.setInput(parameterMetaData); logDesignParameters("refresh: ", design); //$NON-NLS-1$ } private void logDesignParameters(String prefix, DataSetDesign design) { EList paramDefns = design.getParameters().getParameterDefinitions(); for (Iterator iter = paramDefns.iterator(); iter.hasNext();) { ParameterDefinition definition = (ParameterDefinition) iter.next(); logger.info(prefix + "Found parameter with InOutMode: " + definition.getInOutMode().toString()); //$NON-NLS-1$ DataElementAttributes dataElementAttributes = definition.getAttributes(); InputParameterAttributes attrs = definition.getInputAttributes(); InputElementAttributes elementAttributes = attrs.getElementAttributes(); logger.info(prefix + "Parameter name: " + dataElementAttributes.getName()); //$NON-NLS-1$ logger.info(prefix + "Parameter allowsNull: " + dataElementAttributes.allowsNull()); //$NON-NLS-1$ logger.info(prefix + "Parameter defaultValue: " + elementAttributes.getDefaultScalarValue()); //$NON-NLS-1$ } } protected ParameterMetaData getParameterMetaData(DataSetDesign design) { if (parameterMetaData != null) return parameterMetaData; JFSQueryPropertySet queryPropertySet = JFSQueryUtil.createPropertySetFromQueryString(design.getQuery().getQueryText()); ScriptRegistryItemID scriptID = queryPropertySet.getScriptRegistryItemID(); ScriptParameterSet parameterSet = ScriptParameterSetForScriptRegistryItemIDDAO.sharedInstance().getScriptParameterSet( scriptID, ScriptParameterSetForScriptRegistryItemIDDAO.DEFAULT_FETCH_GROUPS, new NullProgressMonitor() ); parameterMetaData = null; try { parameterMetaData = ParameterMetaData.createMetaDataFromParameterSet(parameterSet); } catch (JFireReportingOdaException e) { throw new RuntimeException(e); } return parameterMetaData; } protected void getParameterDefaultValues(DataSetDesign design) { if (design.getParameters() == null) return; EList paramDefns = design.getParameters().getParameterDefinitions(); for (Iterator iter = paramDefns.iterator(); iter.hasNext();) { ParameterDefinition definition = (ParameterDefinition) iter.next(); if (parameterDefaultValues == null) parameterDefaultValues = new HashMap<String, String>(); DataElementAttributes dataElementAttributes = definition.getAttributes(); InputParameterAttributes attrs = definition.getInputAttributes(); InputElementAttributes elementAttributes = attrs.getElementAttributes(); parameterDefaultValues.put(dataElementAttributes.getName(), elementAttributes.getDefaultScalarValue()); } } protected void setParameterDefaultValues(DataSetDesign design) { for (Iterator iter = design.getParameters().getParameterDefinitions().iterator(); iter.hasNext();) { ParameterDefinition definition = (ParameterDefinition) iter.next(); if (parameterDefaultValues == null) parameterDefaultValues = new HashMap<String, String>(); DataElementAttributes dataElementAttributes = definition.getAttributes(); InputParameterAttributes attrs = definition.getInputAttributes(); InputElementAttributes elementAttributes = null; if (attrs == null) { attrs = DesignFactory.eINSTANCE.createInputParameterAttributes(); definition.setInputAttributes(attrs); attrs.setElementAttributes(DesignFactory.eINSTANCE.createInputElementAttributes()); } elementAttributes = attrs.getElementAttributes(); String defaultValue = parameterDefaultValues.get(dataElementAttributes.getName()); if (defaultValue == null || "".equals(defaultValue)) //$NON-NLS-1$ continue; elementAttributes.setDefaultScalarValue(defaultValue); } } @Override protected DataSetDesign collectDataSetDesign(DataSetDesign design) { DataSetDesign superResult = super.collectDataSetDesign(design); IParameterMetaData metaData = new ParameterMetaDataWrapper(getParameterMetaData(superResult)); DataSetParameters params = null; try { params = createDataSetParameters(metaData); } catch (OdaException e) { throw new RuntimeException(e); } superResult.setParameters(params); setParameterDefaultValues(superResult); logDesignParameters("collectDataSetDesign: ", design); //$NON-NLS-1$ return superResult; } public static DataSetParameters createDataSetParameters( IParameterMetaData pmd) throws OdaException { DataSetParameters params = DesignSessionUtil.toDataSetParametersDesign(pmd); EList pDefinitions = params.getParameterDefinitions(); for (Iterator iter = pDefinitions.iterator(); iter.hasNext();) { ParameterDefinition definition = (ParameterDefinition) iter.next(); definition.getAttributes().setName(pmd.getParameterName(definition.getAttributes().getPosition())); definition.getAttributes().setNullability(ElementNullability.NULLABLE_LITERAL); } return params; } public boolean canModify(Object element, String property) { return PROPERTY_DEFAULT_VALUE.equals(property); } public Object getValue(Object element, String property) { ParameterDescriptor descriptor = (ParameterDescriptor) element; if (parameterDefaultValues == null) return null; return parameterDefaultValues.get(descriptor.getParameterName()); } public void modify(Object element, String property, Object value) { TableItem tableItem = (TableItem)element; ParameterDescriptor descriptor = (ParameterDescriptor) tableItem.getData(); if (parameterDefaultValues == null) parameterDefaultValues = new HashMap<String, String>(); parameterDefaultValues.put(descriptor.getParameterName(), (String) value); table.refresh(); } }