/*! * 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.builtin; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dom4j.Node; import org.pentaho.platform.api.engine.IActionParameter; import org.pentaho.platform.api.engine.IActionSequenceResource; import org.pentaho.platform.engine.services.solution.ComponentBase; import org.pentaho.platform.plugin.action.messages.Messages; import org.pentaho.platform.util.xml.dom4j.XmlDom4JHelper; 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; /** * @author James Dixon * * TODO To change the template for this generated type comment go to Window - Preferences - Java - Code Style - * Code Templates */ public class TestComponent extends ComponentBase { private static final long serialVersionUID = -5888733281367666385L; /* * (non-Javadoc) * * @see org.pentaho.component.ComponentBase#validate() */ @Override public Log getLogger() { return LogFactory.getLog( TestComponent.class ); } private void message( final String message ) { info( message ); System.out.println( message ); } @Override protected boolean validateSystemSettings() { // This component does not have any system settings to validate return true; } @Override protected boolean validateAction() { // describe the inputs, outputs and resources available to us Set inputNames = getInputNames(); Iterator inputNamesIterator = inputNames.iterator(); String inputName; IActionParameter actionParameter; while ( inputNamesIterator.hasNext() ) { inputName = (String) inputNamesIterator.next(); actionParameter = getInputParameter( inputName ); message( Messages.getInstance().getString( "TestComponent.DEBUG_INPUT_DESCRIPTION", inputName, actionParameter.getType() ) ); //$NON-NLS-1$ } Set outputNames = getOutputNames(); Iterator outputNamesIterator = outputNames.iterator(); String outputName; while ( outputNamesIterator.hasNext() ) { outputName = (String) outputNamesIterator.next(); actionParameter = getOutputItem( outputName ); message( Messages.getInstance().getString( "TestComponent.DEBUG_OUTPUT_DESCRIPTION", outputName, actionParameter.getType() ) ); //$NON-NLS-1$ } Set resourceNames = getResourceNames(); Iterator resourceNamesIterator = resourceNames.iterator(); String resourceName; IActionSequenceResource actionResource; while ( resourceNamesIterator.hasNext() ) { resourceName = (String) resourceNamesIterator.next(); actionResource = getResource( resourceName ); message( Messages .getInstance() .getString( "TestComponent.DEBUG_RESOURCE_DESCRIPTION", resourceName, actionResource.getMimeType(), actionResource.getAddress() ) ); //$NON-NLS-1$ try { String content = getResourceAsString( actionResource ); message( Messages.getInstance().getString( "TestComponent.DEBUG_RESOURCE_CONTENTS", ( ( content == null ) ? "null" : content.substring( 0, 100 ) ) ) ); //$NON-NLS-1$ //$NON-NLS-2$ } catch ( Exception e ) { message( Messages.getInstance().getString( "TestComponent.ERROR_0005_RESOURCE_NOT_LOADED", e.getMessage() ) ); //$NON-NLS-1$ } } return true; } /* * (non-Javadoc) * * @see org.pentaho.component.ComponentBase#done() */ @Override public void done() { // TODO Auto-generated method stub } /* * (non-Javadoc) * * @see org.pentaho.component.ComponentBase#execute() */ @Override protected boolean executeAction() { message( Messages.getInstance().getString( "TestComponent.DEBUG_EXECUTING_TEST" ) ); //$NON-NLS-1$ Node componentNode = getComponentDefinition(); Set inputNames = getInputNames(); Iterator inputNamesIterator = inputNames.iterator(); String inputName; IActionParameter actionParameter; while ( inputNamesIterator.hasNext() ) { inputName = (String) inputNamesIterator.next(); actionParameter = getInputParameter( inputName ); message( Messages .getInstance() .getString( "TestComponent.DEBUG_INPUT_DESCRIPTION", inputName, actionParameter.getValue().getClass().toString() + "=" + actionParameter.getValue().toString() ) ); //$NON-NLS-1$ //$NON-NLS-2$ } String test = XmlDom4JHelper.getNodeText( "test", componentNode ); //$NON-NLS-1$ if ( ( test == null ) || ( test.length() < 1 ) ) { message( componentNode.asXML() ); return ( true ); } String newName = XmlDom4JHelper.getNodeText( "newname", componentNode ); //$NON-NLS-1$ Object theResult = null; if ( "format".equals( test ) ) { //$NON-NLS-1$ MessageFormat mf = new MessageFormat( XmlDom4JHelper.getNodeText( "p1", componentNode, "" ) ); //$NON-NLS-1$ //$NON-NLS-2$ Object[] obj = { getParamFromComponentNode( "p2", componentNode ), getParamFromComponentNode( "p3", componentNode ) }; //$NON-NLS-1$ //$NON-NLS-2$ theResult = mf.format( obj ); } else { Object p1 = getParamFromComponentNode( "p1", componentNode ); //$NON-NLS-1$ if ( p1 == null ) { return ( false ); } else if ( "toupper".equals( test ) ) { //$NON-NLS-1$ theResult = p1.toString().toUpperCase(); } else if ( "rename".equals( test ) ) { //$NON-NLS-1$ theResult = p1; } else if ( "map2params".equals( test ) ) { //$NON-NLS-1$ if ( !( p1 instanceof Map ) ) { error( Messages.getInstance().getErrorString( "TestComponent.ERROR_0003_PARAMETER_NOT_MAP", "p1" ) ); //$NON-NLS-1$ //$NON-NLS-2$ return ( false ); } Map srcMap = (Map) p1; for ( Iterator it = srcMap.keySet().iterator(); it.hasNext(); ) { String key = it.next().toString(); setOutputValue( key, srcMap.get( key ) ); } } else if ( "print".equals( test ) ) { //$NON-NLS-1$ String delim = "\r\n***************************************************************\r\n"; //$NON-NLS-1$ theResult = delim + p1.toString() + delim; } else if ( "getkeys".equals( test ) ) { //$NON-NLS-1$ if ( !( p1 instanceof Map ) ) { error( Messages.getInstance().getErrorString( "TestComponent.ERROR_0003_PARAMETER_NOT_MAP", "p1" ) ); //$NON-NLS-1$ //$NON-NLS-2$ return ( false ); } theResult = new ArrayList( ( (Map) p1 ).keySet() ); } else { Object p2 = getParamFromComponentNode( "p2", componentNode ); //$NON-NLS-1$ if ( p2 == null ) { return ( false ); } if ( "concat".equals( test ) ) { //$NON-NLS-1$ theResult = p1.toString() + p2.toString(); } else if ( "print2".equals( test ) ) { //$NON-NLS-1$ String delim = Messages.getInstance().getString( "TestComponent.CODE_PRINT_DELIM" ); //$NON-NLS-1$ theResult = delim + p1.toString() + " - " + p2.toString() + delim; //$NON-NLS-1$ } else { Object p3 = getParamFromComponentNode( "p3", componentNode ); //$NON-NLS-1$ if ( p3 == null ) { return ( false ); } if ( "merge".equals( test ) ) { //$NON-NLS-1$ // merge cycles through each property map in list p2. // For each map, it cycles through the keys in map p1 // and compares the key name // from p1 with a value from p2. p3 specifies the key in // p2 to compare with. When a match is found, an entry // is added to an output // output list that is identical to the map from p2. The // value specified by the key in p1 will be added to the // output under the key "NewKey" if ( !( p1 instanceof Map ) || !( p2 instanceof List ) || !( p3 instanceof String ) ) { error( Messages.getInstance().getErrorString( "TestComponent.ERROR_0004_P1_P2_WRONG_TYPE" ) ); //$NON-NLS-1$ return ( false ); } theResult = merge( (Map) p1, (List) p2, (String) p3 ); } else { message( Messages.getInstance().getErrorString( "TestComponent.ERROR_0001_TEST_NODE_NOT_FOUND" ) ); //$NON-NLS-1$ return false; } } } } if ( newName != null ) { message( newName + " = " + theResult ); //$NON-NLS-1$ try { setOutputValue( newName, theResult ); } catch ( Exception e ) { //ignore } // setOutputValue logs an error mesage } else { message( "The result = " + theResult ); //$NON-NLS-1$ } return ( true ); } /* * (non-Javadoc) * * @see org.pentaho.component.ComponentBase#init() */ @Override public boolean init() { message( 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 ); } private List merge( final Map hm, final List list, final String keyName ) { ArrayList al = new ArrayList(); for ( Iterator it = list.iterator(); it.hasNext(); ) { Object item = it.next(); if ( item instanceof Map ) { Map resMap = merge( hm, (Map) item, keyName ); if ( resMap != null ) { al.add( resMap ); } } } return ( al ); } private Map merge( final Map srcMap, final Map destMap, final String keyName ) { Object keyValue = destMap.get( keyName ); Map rtnMap = null; for ( Iterator it = srcMap.keySet().iterator(); it.hasNext(); ) { String key = it.next().toString(); if ( ( keyValue != null ) && key.equalsIgnoreCase( keyValue.toString() ) ) { rtnMap = new HashMap( destMap ); rtnMap.put( "NewKey", srcMap.get( key ) ); //$NON-NLS-1$ return ( rtnMap ); } } return ( rtnMap ); } private Object getParamFromComponentNode( final String paramName, final Node componentNode ) { String param = XmlDom4JHelper.getNodeText( paramName, componentNode ); if ( ( param == null ) || ( param.length() < 1 ) ) { error( Messages.getInstance().getErrorString( "TestComponent.ERROR_0002_PARAMETER_MISSING", paramName ) ); //$NON-NLS-1$ return ( null ); } return ( getActionParameterValue( param ) ); } }