/*! * 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) 2002-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.platform.plugin.action.deprecated; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dom4j.Element; import org.dom4j.Node; import org.pentaho.actionsequence.dom.ActionInput; import org.pentaho.actionsequence.dom.ActionInputConstant; import org.pentaho.actionsequence.dom.IActionDefinition; import org.pentaho.actionsequence.dom.IActionInput; import org.pentaho.actionsequence.dom.IActionOutput; import org.pentaho.actionsequence.dom.actions.CopyParamAction; import org.pentaho.actionsequence.dom.actions.FormatMsgAction; import org.pentaho.actionsequence.dom.actions.PrintMapValsAction; import org.pentaho.actionsequence.dom.actions.PrintParamAction; import org.pentaho.platform.engine.services.solution.ComponentBase; import org.pentaho.platform.plugin.action.messages.Messages; import java.text.MessageFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; /** * * Provides utilities to help manipulate parameters used in action sequences. * <p> * <ul> * <li><i>format</i> - Java style message formatting</li> * <li><i>getvalues</i> - Make the key value pairs from a property map available as action-outputs</li> * <li><i>copy</i> - Set the action-output with the value of the action input</li> * <li><i>tostring</i> - Sets the action-output to the string value of the action-input</li> * <li><i></i> -</li> */ @SuppressWarnings( "deprecation" ) public class UtilityComponent extends ComponentBase { /** * */ private static final long serialVersionUID = -3257037449482351540L; HashMap tmpOutputs = new HashMap(); /* * (non-Javadoc) * * @see org.pentaho.component.ComponentBase#validate() */ @Override public Log getLogger() { return LogFactory.getLog( UtilityComponent.class ); } @Override protected boolean validateSystemSettings() { // This component does not have any system settings to validate return true; } /** * @deprecated */ @Deprecated private boolean validateAction( final IActionDefinition actionDefinition ) { boolean result = true; Element[] elements = actionDefinition.getComponentDefElements( "*" ); //$NON-NLS-1$ for ( Element element : elements ) { String commandName = element.getName(); if ( "format".equalsIgnoreCase( commandName ) ) { //$NON-NLS-1$ if ( element.selectSingleNode( "format-string" ) == null ) { //$NON-NLS-1$ error( Messages.getInstance().getErrorString( "TestComponent.ERROR_0002_PARAMETER_MISSING", "format-string" ) ); //$NON-NLS-1$ //$NON-NLS-2$ result = false; } } else if ( "getmapvalues".equalsIgnoreCase( commandName ) ) { //$NON-NLS-1$ if ( element.selectSingleNode( "property-map" ) == null ) { //$NON-NLS-1$ error( Messages.getInstance().getErrorString( "TestComponent.ERROR_0002_PARAMETER_MISSING", "format-string" ) ); //$NON-NLS-1$ //$NON-NLS-2$ result = false; } List paramList = element.selectNodes( "arg" ); //$NON-NLS-1$ if ( paramList.size() < 1 ) { error( Messages .getInstance() .getErrorString( "TestComponent.ERROR_0003_PARAMETER_MISSING", "arg", String.valueOf( 1 ), String.valueOf( paramList.size() ) ) ); //$NON-NLS-1$ //$NON-NLS-2$ result = false; } } } return result; } private boolean validateCopyAction( final CopyParamAction copyParamAction ) { return true; } private boolean validateFormatAction( final FormatMsgAction formatMsgAction ) { boolean result = true; if ( formatMsgAction.getFormatString() == null ) { error( Messages.getInstance().getErrorString( "TestComponent.ERROR_0002_PARAMETER_MISSING", "format-string" ) ); //$NON-NLS-1$ //$NON-NLS-2$ result = false; } return result; } private boolean validatePrintParamAction( final PrintParamAction printParamAction ) { return true; } private boolean validateGetMapValuesAction( final PrintMapValsAction getMapValsAction ) { boolean result = true; if ( getMapValsAction.getPropertyMap() == ActionInputConstant.NULL_INPUT ) { error( Messages.getInstance().getErrorString( "TestComponent.ERROR_0002_PARAMETER_MISSING", "format-string" ) ); //$NON-NLS-1$ //$NON-NLS-2$ result = false; } if ( getMapValsAction.getKeys().length < 1 ) { error( Messages.getInstance().getErrorString( "TestComponent.ERROR_0003_PARAMETER_MISSING", "arg", String.valueOf( 1 ), "0" ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ result = false; } return result; } /** * @deprecated */ @Deprecated private boolean executeAction( final IActionDefinition actionDefinition ) { boolean result = true; Element[] elements = actionDefinition.getComponentDefElements( "*" ); //$NON-NLS-1$ for ( Element element : elements ) { String commandName = element.getName(); if ( "format".equalsIgnoreCase( commandName ) ) { //$NON-NLS-1$ result = executeFormatAction( element ); } else if ( "print".equalsIgnoreCase( commandName ) ) { //$NON-NLS-1$ result = executePrintParamAction( element ); } else if ( "copy".equalsIgnoreCase( commandName ) ) { //$NON-NLS-1$ result = executeCopyAction( element ); } else if ( "getmapvalues".equalsIgnoreCase( commandName ) ) { //$NON-NLS-1$ result = executeGetMapValuesAction( element ); } } if ( result ) { Set outNames = getOutputNames(); for ( Iterator it = outNames.iterator(); it.hasNext(); ) { String name = (String) it.next(); Object value = tmpOutputs.get( name ); if ( value != null ) { setOutputValue( name, value ); } } } return result; } /** * @deprecated */ @Deprecated private boolean executeCopyAction( final Element componentDefinition ) { boolean result = true; String inputName = null; Element element = componentDefinition.element( "from" ); //$NON-NLS-1$ if ( element != null ) { inputName = element.getText(); } String outputName = null; element = componentDefinition.element( "return" ); //$NON-NLS-1$ if ( element != null ) { outputName = element.getText(); } if ( ( inputName != null ) && ( outputName != null ) ) { try { tmpOutputs.put( outputName, getValueOf( inputName ) ); } catch ( Exception e ) { error( Messages.getInstance().getString( "UtilityComponent.ERROR_0003_ERROR_COPYING_PARAMETER" ) ); //$NON-NLS-1$ result = false; } } return result; } /** * @deprecated */ @Deprecated private boolean executeFormatAction( final Element componentDefinition ) { String formatString = componentDefinition.element( "format-string" ).getText(); //$NON-NLS-1$ String outputName = null; Element element = componentDefinition.element( "return" ); //$NON-NLS-1$ if ( element != null ) { outputName = element.getText(); } ArrayList formatArgs = new ArrayList(); List paramList = componentDefinition.selectNodes( "arg" ); //$NON-NLS-1$ for ( Iterator it = paramList.iterator(); it.hasNext(); ) { formatArgs.add( ( (Node) it.next() ).getText() ); } boolean result = true; try { MessageFormat mf = new MessageFormat( formatString ); String theResult = mf.format( formatArgs.toArray() ); tmpOutputs.put( outputName, theResult ); } catch ( Exception e ) { error( Messages.getInstance().getString( "UtilityComponent.ERROR_0001_FORMAT_ERROR" ) ); //$NON-NLS-1$ result = false; } return result; } /** * @deprecated */ @Deprecated private boolean executePrintParamAction( final Element componentDefinition ) { String delimiter = ""; //$NON-NLS-1$ Element element = componentDefinition.element( "delimiter" ); //$NON-NLS-1$ if ( element != null ) { delimiter = element.getText(); } ArrayList paramNames = new ArrayList(); List paramList = componentDefinition.selectNodes( "arg" ); //$NON-NLS-1$ for ( Iterator it = paramList.iterator(); it.hasNext(); ) { paramNames.add( ( (Node) it.next() ).getText() ); } boolean result = true; try { StringBuffer sb = new StringBuffer( "\n***************************************************************\n" ); //$NON-NLS-1$ for ( Iterator it = paramNames.iterator(); it.hasNext(); ) { sb.append( getValueOf( it.next().toString() ) ).append( delimiter ); } sb.append( "\n***************************************************************\n" ); //$NON-NLS-1$ info( sb.toString() ); } catch ( Exception e ) { error( Messages.getInstance().getString( "UtilityComponent.ERROR_0002_MESSAGE_LOG_ERROR" ) ); //$NON-NLS-1$ result = false; } return result; } /** * @deprecated */ @Deprecated private boolean executeGetMapValuesAction( final Element componentDefinition ) { String propertyMapName = null; Element element = componentDefinition.element( "property-map" ); //$NON-NLS-1$ if ( element != null ) { propertyMapName = element.getText(); } ArrayList keyNames = new ArrayList(); List paramList = componentDefinition.selectNodes( "arg" ); //$NON-NLS-1$ for ( Iterator it = paramList.iterator(); it.hasNext(); ) { keyNames.add( ( (Node) it.next() ).getText() ); } boolean result = true; try { Object mapObj = getValueOf( propertyMapName ); if ( !( mapObj instanceof Map ) ) { error( Messages.getInstance().getErrorString( "UtilityComponent.ERROR_0004_PARAMETER_NOT_MAP", "property-map" ) ); //$NON-NLS-1$ //$NON-NLS-2$ result = false; } else { Map srcMap = (Map) mapObj; for ( Iterator it = keyNames.iterator(); it.hasNext(); ) { String key = it.next().toString(); tmpOutputs.put( key, srcMap.get( key ) ); } } } catch ( Exception e ) { error( Messages.getInstance().getString( "UtilityComponent.ERROR_0005_GET_MAP_VALUES_ERROR" ) ); //$NON-NLS-1$ result = false; } return result; } private boolean executeCopyAction( final CopyParamAction copyParamAction ) { boolean result = true; IActionInput actionInput = copyParamAction.getCopyFrom(); IActionOutput actionOutput = copyParamAction.getOutputCopy(); if ( ( actionInput instanceof ActionInput ) && ( actionOutput != null ) ) { try { actionOutput.setValue( actionInput.getValue() ); } catch ( Exception ex ) { result = false; } } return result; } private boolean executeFormatAction( final FormatMsgAction formatMsgAction ) { boolean result = true; String formatString = formatMsgAction.getFormatString().getStringValue(); IActionOutput actionOutput = formatMsgAction.getOutputString(); IActionInput[] msgInputs = formatMsgAction.getMsgInputs(); ArrayList formatArgs = new ArrayList(); for ( IActionInput element : msgInputs ) { formatArgs.add( element.getStringValue() ); } try { MessageFormat mf = new MessageFormat( formatString ); String theResult = mf.format( formatArgs.toArray() ); if ( actionOutput != null ) { actionOutput.setValue( theResult ); } } catch ( Exception ex ) { result = false; } return result; } private boolean executePrintParamAction( final PrintParamAction printParamAction ) { String delimiter = printParamAction.getDelimiter().getStringValue( "" ); //$NON-NLS-1$ IActionInput[] inputsToPrint = printParamAction.getInputsToPrint(); boolean result = true; try { StringBuffer sb = new StringBuffer( "\n***************************************************************\n" ); //$NON-NLS-1$ for ( IActionInput element : inputsToPrint ) { sb.append( element.getStringValue( "" ) ).append( delimiter ); //$NON-NLS-1$ } sb.append( "\n***************************************************************\n" ); //$NON-NLS-1$ info( sb.toString() ); } catch ( Exception e ) { error( Messages.getInstance().getString( "UtilityComponent.ERROR_0002_MESSAGE_LOG_ERROR" ) ); //$NON-NLS-1$ result = false; } return result; } private boolean executeGetMapValuesAction( final PrintMapValsAction getMapValsAction ) { IActionInput propertyMap = getMapValsAction.getPropertyMap(); IActionInput[] keys = getMapValsAction.getKeys(); boolean result = true; try { if ( !( propertyMap.getValue() instanceof Map ) ) { error( Messages.getInstance().getErrorString( "UtilityComponent.ERROR_0004_PARAMETER_NOT_MAP", "property-map" ) ); //$NON-NLS-1$ //$NON-NLS-2$ result = false; } else { Map srcMap = (Map) propertyMap.getValue(); for ( IActionInput element : keys ) { String key = element.getStringValue(); getMapValsAction.getOutput( key ).setValue( srcMap.get( key ) ); } } } catch ( Exception e ) { error( Messages.getInstance().getString( "UtilityComponent.ERROR_0005_GET_MAP_VALUES_ERROR" ) ); //$NON-NLS-1$ result = false; } return result; } @Override protected boolean validateAction() { boolean result = true; IActionDefinition actionDefinition = getActionDefinition(); if ( actionDefinition instanceof CopyParamAction ) { result = validateCopyAction( (CopyParamAction) actionDefinition ); } else if ( actionDefinition instanceof FormatMsgAction ) { result = validateFormatAction( (FormatMsgAction) actionDefinition ); } else if ( actionDefinition instanceof PrintMapValsAction ) { result = validateGetMapValuesAction( (PrintMapValsAction) actionDefinition ); } else if ( actionDefinition instanceof PrintParamAction ) { result = validatePrintParamAction( (PrintParamAction) actionDefinition ); } else { // This component allows multiple actions to be defined in a single action definition. // While this is no longer supported by the design studio, it needs to be supported here // for backwards compatibility with older action sequence documents. result = validateAction( actionDefinition ); } return result; } /* * (non-Javadoc) * * @see org.pentaho.component.ComponentBase#done() */ @Override public void done() { } /* * (non-Javadoc) * * @see org.pentaho.component.ComponentBase#execute() */ @Override protected boolean executeAction() { IActionDefinition actionDefinition = getActionDefinition(); tmpOutputs = new HashMap(); // Make sure we start with an empty list in boolean result = true; if ( actionDefinition instanceof CopyParamAction ) { executeCopyAction( (CopyParamAction) actionDefinition ); } else if ( actionDefinition instanceof FormatMsgAction ) { executeFormatAction( (FormatMsgAction) actionDefinition ); } else if ( actionDefinition instanceof PrintMapValsAction ) { executeGetMapValuesAction( (PrintMapValsAction) actionDefinition ); } else if ( actionDefinition instanceof PrintParamAction ) { executePrintParamAction( (PrintParamAction) actionDefinition ); } else { // This component allows multiple actions to be defined in a single action definition. // While this is no longer supported by the design studio, it needs to be supported here // for backwards compatibility with older action sequence documents. result = executeAction( actionDefinition ); } return result; // this iteration } /* * (non-Javadoc) * * @see org.pentaho.component.ComponentBase#init() */ @Override public boolean init() { if ( ComponentBase.debug ) { debug( Messages.getInstance().getString( "TestComponent.DEBUG_INITIALIZING_TEST" ) ); //$NON-NLS-1$ } return true; } protected Object getActionParameterValue( final String name ) { try { return ( getInputValue( name ) ); } catch ( Exception e ) { //ignore } // Return null if it doesn't exist return ( null ); } Object getValueOf( final String paramName ) { if ( paramName == null ) { return ( null ); } if ( paramName.startsWith( "\"" ) && paramName.endsWith( "\"" ) ) { //$NON-NLS-1$ //$NON-NLS-2$ if ( paramName.length() < 3 ) { return ( "" ); //$NON-NLS-1$ } return ( paramName.substring( 1, paramName.length() - 1 ) ); } Object obj = tmpOutputs.get( paramName ); if ( obj != null ) { return ( obj ); } return ( getInputValue( paramName ) ); } }