/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License, version 2 as published by the Free Software * Foundation. * * You should have received a copy of the GNU General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.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 General Public License for more details. * * * Copyright 2006 - 2013 Pentaho Corporation. All rights reserved. */ package org.pentaho.platform.engine.services.runtime; import org.pentaho.commons.connection.IPentahoMetaData; import org.pentaho.commons.connection.IPentahoResultSet; import org.pentaho.platform.api.engine.IActionParameter; import org.pentaho.platform.api.engine.ISelectionMapper; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; public class SelectionMapper implements ISelectionMapper { /** * Creates a SelectionMapper based on an IPentahoResultSet. If the result set has 1 column, the values and * display names will come from that column. If it has more than 1 column, the first column will be used for the * values and the second will be used for the display names * * @param resultSet * The result set to get the data from * @param displayName * The name used to describe the choice for this selection. Usually used as a header * @return SelectionMapper if successful or null */ public static SelectionMapper create( final IPentahoResultSet resultSet, final String displayName, final String displayStyle ) { return ( SelectionMapper.create( resultSet, 1, -1, displayName, displayStyle ) ); } /** * Creates a SelectionMapper based on an IPentahoResultSet. The columns to use for the values and display names * are passed in as column names. * * @param resultSet * The result set to get the data from * @param valueColName * The name of the column to use for the values. If null, the first column will be used * @param dispColName * The name of the column to use for the display names. If null, the values column will be used * @param displayName * The name used to describe the choice for this selection. Usually used as a header * @return SelectionMapper if successful or null */ public static SelectionMapper create( final IPentahoResultSet resultSet, final String valueColName, final String dispColName, final String displayName, final String displayStyle ) { if ( resultSet == null ) { return ( null ); } IPentahoMetaData metaData = resultSet.getMetaData(); if ( ( metaData == null ) || ( metaData.getColumnCount() < 1 ) ) { // TODO surface an error return ( null ); } int valueColumnNo = ( valueColName == null ) ? 0 : metaData.getColumnIndex( valueColName ); if ( valueColumnNo < 0 ) { // TODO surface an error return ( null ); } int dispColumnNo = -1; if ( dispColName != null ) { dispColumnNo = metaData.getColumnIndex( dispColName ); if ( dispColumnNo < 0 ) { // TODO surface an error return ( null ); } } return ( SelectionMapper.create( resultSet, ++valueColumnNo, ++dispColumnNo, displayName, displayStyle ) ); } /** * Creates a SelectionMapper based on an IPentahoResultSet. The index of the column to use for the values and * display names are passed in. The index is 1 based so the first (left most) column is 1. * * @param resultSet * The result set to get the data from * @param valueColName * The index of the column to use for the values. * @param dispColName * The index of the column to use for the display names. If 0 then the valueColumn will be used. * @param displayName * The name used to describe the choice for this selection. Usually used as a header * @return SelectionMapper if successful or null */ public static SelectionMapper create( final IPentahoResultSet resultSet, int valueColIndex, int dispColIndex, final String displayName, final String displayStyle ) { --valueColIndex; --dispColIndex; if ( ( resultSet == null ) || ( valueColIndex < 0 ) ) { return ( null ); } IPentahoMetaData metaData = resultSet.getMetaData(); if ( ( metaData == null ) || ( metaData.getColumnCount() < valueColIndex ) || ( metaData.getColumnCount() < dispColIndex ) ) { return ( null ); } ArrayList<Object> values = new ArrayList<Object>(); HashMap<Object, Object> displayNames = ( dispColIndex < 0 ) ? null : new HashMap<Object, Object>(); Object[] row = resultSet.next(); Object value, name; while ( row != null ) { value = row[valueColIndex]; if ( value != null ) { value = value.toString(); values.add( value ); if ( displayNames != null ) { name = row[dispColIndex]; displayNames.put( value, ( name != null ) ? name.toString() : value ); } } row = resultSet.next(); } // close the result set so we can loop through it again later if we need to resultSet.close(); return ( new SelectionMapper( values, displayNames, displayName, displayStyle ) ); } /** * Creates a SelectionMapper based on an IActionParameter. The columns to use for the values and display names * are passed in as column names. * * @param actionParam * The ActionParameter to get the data from * @param valueColName * The name of the column to use for the values. If null, the first column will be used * @param dispColName * The name of the column to use for the display names. If null, the values column will be used * @param displayName * The name used to describe the choice for this selection. Usually used as a header * @return SelectionMapper if successful or null */ public static SelectionMapper create( final IActionParameter actionParam, final String valueColName, final String dispColName, final String displayName, final String displayStyle ) { if ( actionParam == null ) { return ( null ); } Object value = actionParam.getValue(); if ( value instanceof IPentahoResultSet ) { return ( SelectionMapper.create( (IPentahoResultSet) value, valueColName, dispColName, displayName, displayStyle ) ); } else if ( "property-map-list".equals( actionParam.getType() ) ) { //$NON-NLS-1$ return ( SelectionMapper.createFromPropMapList( (List) value, valueColName, dispColName, displayName, displayStyle ) ); } else if ( value instanceof List ) { return ( new SelectionMapper( (List) value, null, displayName, displayStyle ) ); } return ( null ); } /** * Creates a SelectionMapper based on a pentaho property map list. The index of the column to use for the values * and display names are passed in. The index is 1 based so the first (left most) column is 1. * * @param resultSet * The result set to get the data from * @param valueColName * The index of the column to use for the values. * @param dispColName * The index of the column to use for the display names. If 0 then the valueColumn will be used. * @param displayName * The name used to describe the choice for this selection. Usually used as a header * @return SelectionMapper if successful or null */ public static SelectionMapper createFromPropMapList( final List aList, final String valueColName, final String dispColName, final String displayName, final String displayStyle ) { if ( aList == null ) { return ( null ); } ArrayList<String> selValues = new ArrayList<String>(); HashMap<String, String> dispMap = new HashMap<String, String>(); String val, disp; for ( Iterator it = aList.iterator(); it.hasNext(); ) { try { Map hm = (Map) it.next(); val = hm.get( valueColName ).toString(); if ( val != null ) { selValues.add( val ); } disp = hm.get( dispColName ).toString(); if ( disp != null ) { dispMap.put( val, disp ); } } catch ( Exception ignore ) { //ignore } } return ( new SelectionMapper( selValues, dispMap, displayName, displayStyle ) ); } Map selNames; List selValues; String displayName, displayStyle; private SelectionMapper( final List selValues, final Map selNames, final String displayName, final String displayStyle ) { this.displayName = ( displayName != null ) ? displayName : ""; //$NON-NLS-1$ this.selNames = selNames; this.selValues = ( selValues != null ) ? selValues : new ArrayList(); this.displayStyle = displayStyle; } public String getDisplayStyle() { return displayStyle; } public String getSelectionDisplayName() { return ( displayName ); } public String getSelectionNameForValue( final String val ) { Object rtn = null; if ( selNames != null ) { rtn = selNames.get( val ); } return ( ( rtn == null ) ? val : rtn.toString() ); } public List getSelectionValues() { return ( selValues ); } public Map getSelectionNameMap() { return ( selNames ); } public boolean hasValue( final String value ) { return ( selValues.contains( value ) ); } public int selectionCount() { return ( selValues.size() ); } public String getValueAt( final int index ) { return ( selValues.get( index ).toString() ); } @Override public String toString() { StringBuffer sb = new StringBuffer( "Display Name: " ).append( getSelectionDisplayName() ).append( " [" ); //$NON-NLS-1$ //$NON-NLS-2$ for ( Iterator it = selValues.iterator(); it.hasNext(); ) { String value = it.next().toString(); sb.append( " [" ).append( value ).append( " : " ).append( getSelectionNameForValue( value ) ).append( "] " ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } sb.append( "]" ); //$NON-NLS-1$ return ( sb.toString() ); } }