Package org.pentaho.platform.engine.services.runtime

Source Code of org.pentaho.platform.engine.services.runtime.SelectionMapper

/*
* 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() );
  }

}
TOP

Related Classes of org.pentaho.platform.engine.services.runtime.SelectionMapper

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.