/* * 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 2005 - 2009 Pentaho Corporation. All rights reserved. * * @created Jun 24, 2005 * @author Doug Moran */ package org.pentaho.platform.plugin.action.deprecated; 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; 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; /** * * 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 ("print".equalsIgnoreCase(commandName)) { //$NON-NLS-1$ // Do nothing. } else if ("copy".equalsIgnoreCase(commandName)) { //$NON-NLS-1$ // Do nothing. } 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) { } // 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)); } }