/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program 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.
*
* Copyright (c) 2006 - 2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.reporting.ui.datasources.kettle.parameter;
import org.pentaho.openformula.ui.FieldDefinition;
import org.pentaho.reporting.engine.classic.core.designtime.DesignTimeContext;
import org.pentaho.reporting.engine.classic.extensions.datasources.kettle.FormulaArgument;
import org.pentaho.reporting.engine.classic.extensions.datasources.kettle.FormulaParameter;
import org.pentaho.reporting.libraries.base.util.ArgumentNullException;
import org.pentaho.reporting.libraries.base.util.StringUtils;
import org.pentaho.reporting.libraries.designtime.swing.CommonDialog;
import org.pentaho.reporting.ui.datasources.kettle.embedded.KettleParameterInfo;
import java.awt.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
public class FormulaParameterDialog extends CommonDialog {
public static class EditResult {
private FormulaArgument[] argumentNames;
private FormulaParameter[] parameterMappings;
public EditResult( final FormulaArgument[] argumentNames,
final FormulaParameter[] parameterMappings ) {
ArgumentNullException.validate( "argumentNames", argumentNames );
ArgumentNullException.validate( "parameterMappings", parameterMappings );
this.argumentNames = argumentNames;
this.parameterMappings = parameterMappings;
}
public FormulaArgument[] getArgumentNames() {
return argumentNames.clone();
}
public FormulaParameter[] getParameterMappings() {
return parameterMappings.clone();
}
}
private FormulaParameterEditor editor;
private DesignTimeContext context;
public FormulaParameterDialog( final Dialog owner,
final DesignTimeContext context ) throws HeadlessException {
super( owner );
this.context = context;
init();
}
protected String getDialogId() {
return getClass().getName();
}
protected void init() {
editor = new FormulaParameterEditor();
editor.setFormulaContext( this.context.getDataFactoryContext().getFormulaContext() );
super.init();
}
public EditResult performEdit( final FormulaArgument[] argumentNames,
final FormulaParameter[] parameterMappings,
final FieldDefinition[] reportFields,
final KettleParameterInfo[] transformationParameters ) {
editor.setFields( reportFields );
editor.setFormulaParameter( build( argumentNames, parameterMappings, transformationParameters ) );
if ( performEdit() == false ) {
return null;
}
return new EditResult( extractArguments(), extractParameter() );
}
private FormulaParameter[] extractParameter() {
FormulaParameterEntity[] formulaParameter = editor.getFormulaParameter();
List<FormulaParameter> l = new ArrayList<FormulaParameter>();
for ( final FormulaParameterEntity entity : formulaParameter ) {
if ( entity.getType() != FormulaParameterEntity.Type.PARAMETER ) {
continue;
}
String value = entity.getValue();
if ( StringUtils.isEmpty( value, true ) == false ) {
l.add( new FormulaParameter( entity.getName(), value ) );
}
}
return l.toArray( new FormulaParameter[ l.size() ] );
}
private FormulaArgument[] extractArguments() {
FormulaParameterEntity[] formulaParameter = editor.getFormulaParameter();
List<FormulaArgument> l = new ArrayList<FormulaArgument>();
for ( final FormulaParameterEntity entity : formulaParameter ) {
if ( entity.getType() != FormulaParameterEntity.Type.ARGUMENT ) {
continue;
}
String value = entity.getValue();
l.add( new FormulaArgument( value ) );
}
return l.toArray( new FormulaArgument[ l.size() ] );
}
private FormulaParameterEntity[] build( final FormulaArgument[] argumentNames,
final FormulaParameter[] parameterMappings,
final KettleParameterInfo[] transformationParameters ) {
ArrayList<FormulaParameterEntity> l = new ArrayList<FormulaParameterEntity>();
for ( final FormulaArgument argumentName : argumentNames ) {
FormulaParameterEntity e = new FormulaParameterEntity
( FormulaParameterEntity.Type.ARGUMENT, "Argument " + ( l.size() + 1 ), argumentName.getFormula() );
l.add( e );
}
HashSet<String> usedNames = new HashSet<String>();
for ( final FormulaParameter parameterMapping : parameterMappings ) {
l.add( new FormulaParameterEntity( FormulaParameterEntity.Type.PARAMETER,
parameterMapping.getName(), parameterMapping.getFormula() ) );
usedNames.add( parameterMapping.getName() );
}
for ( final KettleParameterInfo transformationParameter : transformationParameters ) {
if ( usedNames.contains( transformationParameter.getName() ) ) {
continue;
}
l.add( new FormulaParameterEntity( FormulaParameterEntity.Type.PARAMETER,
transformationParameter.getName(), null ) );
}
return l.toArray( new FormulaParameterEntity[ l.size() ] );
}
protected Component createContentPane() {
return editor;
}
}