All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.pentaho.di.trans.steps.streamlookup.StreamLookupMeta Maven / Gradle / Ivy

The newest version!
/*! ******************************************************************************
 *
 * Pentaho Data Integration
 *
 * Copyright (C) 2002-2018 by Hitachi Vantara : http://www.pentaho.com
 *
 *******************************************************************************
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 ******************************************************************************/

package org.pentaho.di.trans.steps.streamlookup;

import org.pentaho.di.core.CheckResult;
import org.pentaho.di.core.CheckResultInterface;
import org.pentaho.di.core.Const;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.exception.KettleStepException;
import org.pentaho.di.core.exception.KettleXMLException;
import org.pentaho.di.core.injection.AfterInjection;
import org.pentaho.di.core.injection.Injection;
import org.pentaho.di.core.injection.InjectionSupported;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.core.row.ValueMetaInterface;
import org.pentaho.di.core.row.value.ValueMetaFactory;
import org.pentaho.di.core.variables.VariableSpace;
import org.pentaho.di.core.xml.XMLHandler;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.repository.ObjectId;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;
import org.pentaho.di.trans.step.BaseStepMeta;
import org.pentaho.di.trans.step.StepDataInterface;
import org.pentaho.di.trans.step.StepIOMeta;
import org.pentaho.di.trans.step.StepIOMetaInterface;
import org.pentaho.di.trans.step.StepInterface;
import org.pentaho.di.trans.step.StepMeta;
import org.pentaho.di.trans.step.StepMetaInterface;
import org.pentaho.di.trans.step.errorhandling.Stream;
import org.pentaho.di.trans.step.errorhandling.StreamIcon;
import org.pentaho.di.trans.step.errorhandling.StreamInterface;
import org.pentaho.di.trans.step.errorhandling.StreamInterface.StreamType;
import org.pentaho.metastore.api.IMetaStore;
import org.w3c.dom.Node;

import java.util.List;

@InjectionSupported( localizationPrefix = "StreamLookupMeta.Injection." )
public class StreamLookupMeta extends BaseStepMeta implements StepMetaInterface {
  private static Class PKG = StreamLookupMeta.class; // for i18n purposes, needed by Translator2!!

  /** fields in input streams with which we look up values */
  @Injection( name = "KEY_STREAM" )
  private String[] keystream;

  /** fields in lookup stream with which we look up values */
  @Injection( name = "KEY_LOOKUP" )
  private String[] keylookup;

  /** return these field values from lookup */
  @Injection( name = "RETRIEVE_VALUE" )
  private String[] value;

  /** rename to this after lookup */
  @Injection( name = "RETRIEVE_VALUE_NAME" )
  private String[] valueName;

  /** default value in case not found... */
  @Injection( name = "RETRIEVE_VALUE_DEFAULT" )
  private String[] valueDefault;

  /** type of default value */
  @Injection( name = "RETRIEVE_DEFAULT_TYPE" )
  private int[] valueDefaultType;

  /** Indicate that the input is considered sorted! */
  private boolean inputSorted;

  /** Indicate that we need to preserve memory by serializing objects */
  @Injection( name = "PRESERVE_MEMORY" )
  private boolean memoryPreservationActive;

  /** Indicate that we want to use a sorted list vs. a hashtable */
  @Injection( name = "SORTED_LIST" )
  private boolean usingSortedList;

  /** The content of the key and lookup is a single Integer (long) */
  @Injection( name = "INTEGER_PAIR" )
  private boolean usingIntegerPair;

  public StreamLookupMeta() {
    super(); // allocate BaseStepMeta
  }

  @Override
  public void loadXML( Node stepnode, List databases, IMetaStore metaStore ) throws KettleXMLException {
    readData( stepnode );
  }

  public void allocate( int nrkeys, int nrvalues ) {
    setKeystream( new String[nrkeys] );
    setKeylookup( new String[nrkeys] );

    setValue( new String[nrvalues] );
    setValueName( new String[nrvalues] );
    setValueDefault( new String[nrvalues] );
    setValueDefaultType( new int[nrvalues] );
  }

  @Override
  public Object clone() {
    StreamLookupMeta retval = (StreamLookupMeta) super.clone();
    StepIOMetaInterface thisStepIO = getStepIOMeta();
    StepIOMetaInterface thatStepIO = retval.getStepIOMeta();
    if ( thisStepIO != null
        && thisStepIO.getInfoStreams() != null
        && thatStepIO != null
        && thisStepIO.getInfoStreams() != null ) {
      List thisInfoStream = thisStepIO.getInfoStreams();
      List thatInfoStream = thatStepIO.getInfoStreams();
      thatInfoStream.get( 0 ).setStreamType( thisInfoStream.get( 0 ).getStreamType() );
      thatInfoStream.get( 0 ).setStepMeta( thisInfoStream.get( 0 ).getStepMeta() );
      thatInfoStream.get( 0 ).setDescription( thisInfoStream.get( 0 ).getDescription() );
      thatInfoStream.get( 0 ).setStreamIcon( thisInfoStream.get( 0 ).getStreamIcon() );
      thatInfoStream.get( 0 ).setSubject( thisInfoStream.get( 0 ).getSubject() );
    }

    int nrkeys = keystream.length;
    int nrvals = value.length;
    retval.allocate( nrkeys, nrvals );
    System.arraycopy( keystream, 0, retval.keystream, 0, nrkeys );
    System.arraycopy( keylookup, 0, retval.keylookup, 0, nrkeys );
    System.arraycopy( value, 0, retval.value, 0, nrvals );
    System.arraycopy( valueName, 0, retval.valueName, 0, nrvals );
    System.arraycopy( valueDefault, 0, retval.valueDefault, 0, nrvals );
    System.arraycopy( valueDefaultType, 0, retval.valueDefaultType, 0, nrvals );
    return retval;
  }

  private void readData( Node stepnode ) throws KettleXMLException {
    try {
      String dtype;
      int nrkeys, nrvalues;

      String lookupFromStepname = XMLHandler.getTagValue( stepnode, "from" );
      StreamInterface infoStream = getStepIOMeta().getInfoStreams().get( 0 );
      infoStream.setSubject( lookupFromStepname );

      setInputSorted( "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "input_sorted" ) ) );
      setMemoryPreservationActive( "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "preserve_memory" ) ) );
      setUsingSortedList( "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "sorted_list" ) ) );
      setUsingIntegerPair( "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "integer_pair" ) ) );

      Node lookup = XMLHandler.getSubNode( stepnode, "lookup" );
      nrkeys = XMLHandler.countNodes( lookup, "key" );
      nrvalues = XMLHandler.countNodes( lookup, "value" );

      allocate( nrkeys, nrvalues );

      for ( int i = 0; i < nrkeys; i++ ) {
        Node knode = XMLHandler.getSubNodeByNr( lookup, "key", i );
        // CHECKSTYLE:Indentation:OFF
        getKeystream()[i] = XMLHandler.getTagValue( knode, "name" );
        getKeylookup()[i] = XMLHandler.getTagValue( knode, "field" );
        // CHECKSTYLE:Indentation:ON
      }

      for ( int i = 0; i < nrvalues; i++ ) {
        Node vnode = XMLHandler.getSubNodeByNr( lookup, "value", i );
        // CHECKSTYLE:Indentation:OFF
        getValue()[i] = XMLHandler.getTagValue( vnode, "name" );
        getValueName()[i] = XMLHandler.getTagValue( vnode, "rename" );
        if ( getValueName()[i] == null ) {
          getValueName()[i] = getValue()[i]; // default: same name to return!
        }

        getValueDefault()[i] = XMLHandler.getTagValue( vnode, "default" );
        dtype = XMLHandler.getTagValue( vnode, "type" );
        getValueDefaultType()[i] = ValueMetaFactory.getIdForValueMeta( dtype );
        // CHECKSTYLE:Indentation:ON
      }
    } catch ( Exception e ) {
      throw new KettleXMLException( BaseMessages.getString(
        PKG, "StreamLookupMeta.Exception.UnableToLoadStepInfoFromXML" ), e );
    }
  }

  @Override
  public void searchInfoAndTargetSteps( List steps ) {
    List infoStreams = getStepIOMeta().getInfoStreams();
    for ( StreamInterface stream : infoStreams ) {
      stream.setStepMeta( StepMeta.findStep( steps, (String) stream.getSubject() ) );
    }
  }

  @Override
  public void setDefault() {
    setMemoryPreservationActive( true );
    setUsingSortedList( false );
    setUsingIntegerPair( false );

    allocate( 0, 0 );
  }

  @Override
  public void getFields( RowMetaInterface row, String origin, RowMetaInterface[] info, StepMeta nextStep,
    VariableSpace space, Repository repository, IMetaStore metaStore ) throws KettleStepException {
    if ( info != null && info.length == 1 && info[0] != null ) {
      for ( int i = 0; i < getValueName().length; i++ ) {
        ValueMetaInterface v = info[0].searchValueMeta( getValue()[i] );
        if ( v != null ) {
          // Configuration error/missing resources...
          v.setName( getValueName()[i] );
          v.setOrigin( origin );
          row.addValueMeta( v );
        } else {
          throw new KettleStepException( BaseMessages.getString( PKG,
              "StreamLookupMeta.Exception.ReturnValueCanNotBeFound", getValue()[i] ) );
        }
      }
    } else {
      for ( int i = 0; i < getValueName().length; i++ ) {
        try {
          ValueMetaInterface v = ValueMetaFactory.createValueMeta( getValueName()[i], getValueDefaultType()[i] );
          v.setOrigin( origin );
          row.addValueMeta( v );
        } catch ( Exception e ) {
          throw new KettleStepException( e );
        }
      }
    }
  }

  @Override
  public String getXML() {
    StringBuilder retval = new StringBuilder();

    StreamInterface infoStream = getStepIOMeta().getInfoStreams().get( 0 );
    retval.append( "    " ).append( XMLHandler.addTagValue( "from", infoStream.getStepname() ) );
    retval.append( "    " ).append( XMLHandler.addTagValue( "input_sorted", isInputSorted() ) );
    retval.append( "    " ).append( XMLHandler.addTagValue( "preserve_memory", isMemoryPreservationActive() ) );
    retval.append( "    " ).append( XMLHandler.addTagValue( "sorted_list", isUsingSortedList() ) );
    retval.append( "    " ).append( XMLHandler.addTagValue( "integer_pair", isUsingIntegerPair() ) );

    retval.append( "    " ).append( Const.CR );
    for ( int i = 0; i < getKeystream().length; i++ ) {
      retval.append( "      " ).append( Const.CR );
      retval.append( "        " ).append( XMLHandler.addTagValue( "name", getKeystream()[i] ) );
      retval.append( "        " ).append( XMLHandler.addTagValue( "field", getKeylookup()[i] ) );
      retval.append( "      " ).append( Const.CR );
    }

    for ( int i = 0; i < getValue().length; i++ ) {
      retval.append( "      " ).append( Const.CR );
      retval.append( "        " ).append( XMLHandler.addTagValue( "name", getValue()[i] ) );
      retval.append( "        " ).append( XMLHandler.addTagValue( "rename", getValueName()[i] ) );
      retval.append( "        " ).append( XMLHandler.addTagValue( "default", getValueDefault()[i] ) );
      retval.append( "        " ).append(
          XMLHandler.addTagValue( "type", ValueMetaFactory.getValueMetaName( getValueDefaultType()[i] ) ) );
      retval.append( "      " ).append( Const.CR );
    }
    retval.append( "    " ).append( Const.CR );

    return retval.toString();
  }

  @Override
  public void readRep( Repository rep, IMetaStore metaStore, ObjectId id_step, List databases ) throws KettleException {
    try {
      String lookupFromStepname = rep.getStepAttributeString( id_step, "lookup_from_step" );
      StreamInterface infoStream = getStepIOMeta().getInfoStreams().get( 0 );
      infoStream.setSubject( lookupFromStepname );

      setInputSorted( rep.getStepAttributeBoolean( id_step, "input_sorted" ) );
      setMemoryPreservationActive( rep.getStepAttributeBoolean( id_step, "preserve_memory" ) );
      setUsingSortedList( rep.getStepAttributeBoolean( id_step, "sorted_list" ) );
      setUsingIntegerPair( rep.getStepAttributeBoolean( id_step, "integer_pair" ) );

      int nrkeys = rep.countNrStepAttributes( id_step, "lookup_key_name" );
      int nrvalues = rep.countNrStepAttributes( id_step, "return_value_name" );

      allocate( nrkeys, nrvalues );

      for ( int i = 0; i < nrkeys; i++ ) {
        // CHECKSTYLE:Indentation:OFF
        getKeystream()[i] = rep.getStepAttributeString( id_step, i, "lookup_key_name" );
        getKeylookup()[i] = rep.getStepAttributeString( id_step, i, "lookup_key_field" );
        // CHECKSTYLE:Indentation:ON
      }

      for ( int i = 0; i < nrvalues; i++ ) {
        // CHECKSTYLE:Indentation:OFF
        getValue()[i] = rep.getStepAttributeString( id_step, i, "return_value_name" );
        getValueName()[i] = rep.getStepAttributeString( id_step, i, "return_value_rename" );
        getValueDefault()[i] = rep.getStepAttributeString( id_step, i, "return_value_default" );
        getValueDefaultType()[i] =
          ValueMetaFactory.getIdForValueMeta( rep.getStepAttributeString( id_step, i, "return_value_type" ) );
        // CHECKSTYLE:Indentation:ON
      }
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "StreamLookupMeta.Exception.UnexpecteErrorReadingStepInfoFromRepository" ), e );
    }
  }

  @Override
  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
    try {
      StreamInterface infoStream = getStepIOMeta().getInfoStreams().get( 0 );
      rep.saveStepAttribute( id_transformation, id_step, "lookup_from_step", infoStream.getStepname() );
      rep.saveStepAttribute( id_transformation, id_step, "input_sorted", isInputSorted() );
      rep.saveStepAttribute( id_transformation, id_step, "preserve_memory", isMemoryPreservationActive() );
      rep.saveStepAttribute( id_transformation, id_step, "sorted_list", isUsingSortedList() );
      rep.saveStepAttribute( id_transformation, id_step, "integer_pair", isUsingIntegerPair() );

      for ( int i = 0; i < getKeystream().length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "lookup_key_name", getKeystream()[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "lookup_key_field", getKeylookup()[i] );
      }

      for ( int i = 0; i < getValue().length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "return_value_name", getValue()[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "return_value_rename", getValueName()[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "return_value_default", getValueDefault()[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "return_value_type",
          ValueMetaFactory.getValueMetaName( getValueDefaultType()[i] ) );
      }
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "StreamLookupMeta.Exception.UnableToSaveStepInfoToRepository" )
        + id_step, e );
    }
  }

  @Override
  public void check( List remarks, TransMeta transMeta, StepMeta stepMeta,
    RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info, VariableSpace space,
    Repository repository, IMetaStore metaStore ) {
    CheckResult cr;

    if ( prev != null && prev.size() > 0 ) {
      cr =
        new CheckResult( CheckResultInterface.TYPE_RESULT_OK, BaseMessages.getString(
          PKG, "StreamLookupMeta.CheckResult.StepReceivingFields", prev.size() + "" ), stepMeta );
      remarks.add( cr );

      String error_message = "";
      boolean error_found = false;

      // Starting from selected fields in ...
      // Check the fields from the previous stream!
      for ( String aKeystream : getKeystream() ) {
        int idx = prev.indexOfValue( aKeystream );
        if ( idx < 0 ) {
          error_message += "\t\t" + aKeystream + Const.CR;
          error_found = true;
        }
      }
      if ( error_found ) {
        error_message =
          BaseMessages.getString( PKG, "StreamLookupMeta.CheckResult.FieldsNotFound" )
            + Const.CR + Const.CR + error_message;

        cr = new CheckResult( CheckResultInterface.TYPE_RESULT_ERROR, error_message, stepMeta );
        remarks.add( cr );
      } else {
        cr =
          new CheckResult( CheckResultInterface.TYPE_RESULT_OK, BaseMessages.getString(
            PKG, "StreamLookupMeta.CheckResult.AllFieldsFound" ), stepMeta );
        remarks.add( cr );
      }
    } else {
      cr =
        new CheckResult( CheckResultInterface.TYPE_RESULT_ERROR, BaseMessages.getString(
          PKG, "StreamLookupMeta.CheckResult.CouldNotFindFieldsFromPreviousSteps" ), stepMeta );
      remarks.add( cr );
    }

    if ( info != null && info.size() > 0 ) {
      cr =
        new CheckResult( CheckResultInterface.TYPE_RESULT_OK, BaseMessages.getString(
          PKG, "StreamLookupMeta.CheckResult.StepReceivingLookupData", info.size() + "" ), stepMeta );
      remarks.add( cr );

      String error_message = "";
      boolean error_found = false;

      // Check the fields from the lookup stream!
      for ( String aKeylookup : getKeylookup() ) {
        int idx = info.indexOfValue( aKeylookup );
        if ( idx < 0 ) {
          error_message += "\t\t" + aKeylookup + Const.CR;
          error_found = true;
        }
      }
      if ( error_found ) {
        error_message =
          BaseMessages.getString( PKG, "StreamLookupMeta.CheckResult.FieldsNotFoundInLookupStream" )
            + Const.CR + Const.CR + error_message;

        cr = new CheckResult( CheckResultInterface.TYPE_RESULT_ERROR, error_message, stepMeta );
        remarks.add( cr );
      } else {
        cr =
          new CheckResult( CheckResultInterface.TYPE_RESULT_OK, BaseMessages.getString(
            PKG, "StreamLookupMeta.CheckResult.AllFieldsFoundInTheLookupStream" ), stepMeta );
        remarks.add( cr );
      }

      // Check the values to retrieve from the lookup stream!
      for ( String aValue : getValue() ) {
        int idx = info.indexOfValue( aValue );
        if ( idx < 0 ) {
          error_message += "\t\t" + aValue + Const.CR;
          error_found = true;
        }
      }
      if ( error_found ) {
        error_message =
          BaseMessages.getString( PKG, "StreamLookupMeta.CheckResult.FieldsNotFoundInLookupStream2" )
            + Const.CR + Const.CR + error_message;

        cr = new CheckResult( CheckResultInterface.TYPE_RESULT_ERROR, error_message, stepMeta );
        remarks.add( cr );
      } else {
        cr =
          new CheckResult( CheckResultInterface.TYPE_RESULT_OK, BaseMessages.getString(
            PKG, "StreamLookupMeta.CheckResult.AllFieldsFoundInTheLookupStream2" ), stepMeta );
        remarks.add( cr );
      }
    } else {
      cr =
        new CheckResult( CheckResultInterface.TYPE_RESULT_ERROR, BaseMessages.getString(
          PKG, "StreamLookupMeta.CheckResult.FieldsNotFoundFromInLookupSep" ), stepMeta );
      remarks.add( cr );
    }

    // See if the source step is filled in!
    StreamInterface infoStream = getStepIOMeta().getInfoStreams().get( 0 );
    if ( infoStream.getStepMeta() == null ) {
      cr =
        new CheckResult( CheckResultInterface.TYPE_RESULT_ERROR, BaseMessages.getString(
          PKG, "StreamLookupMeta.CheckResult.SourceStepNotSelected" ), stepMeta );
      remarks.add( cr );
    } else {
      cr =
        new CheckResult( CheckResultInterface.TYPE_RESULT_OK, BaseMessages.getString(
          PKG, "StreamLookupMeta.CheckResult.SourceStepIsSelected" ), stepMeta );
      remarks.add( cr );

      // See if the step exists!
      //
      if ( info != null ) {
        cr =
          new CheckResult( CheckResultInterface.TYPE_RESULT_OK, BaseMessages.getString(
            PKG, "StreamLookupMeta.CheckResult.SourceStepExist", infoStream.getStepname() ), stepMeta );
        remarks.add( cr );
      } else {
        cr =
          new CheckResult( CheckResultInterface.TYPE_RESULT_ERROR, BaseMessages.getString(
            PKG, "StreamLookupMeta.CheckResult.SourceStepDoesNotExist", infoStream.getStepname() ), stepMeta );
        remarks.add( cr );
      }
    }

    // See if we have input streams leading to this step!
    if ( input.length >= 2 ) {
      cr =
        new CheckResult( CheckResultInterface.TYPE_RESULT_OK, BaseMessages.getString(
          PKG, "StreamLookupMeta.CheckResult.StepReceivingInfoFromInputSteps", input.length + "" ), stepMeta );
      remarks.add( cr );
    } else {
      cr =
        new CheckResult( CheckResultInterface.TYPE_RESULT_ERROR, BaseMessages.getString(
          PKG, "StreamLookupMeta.CheckResult.NeedAtLeast2InputStreams", Const.CR, Const.CR ), stepMeta );
      remarks.add( cr );
    }
  }

  @Override
  public StepInterface getStep( StepMeta stepMeta, StepDataInterface stepDataInterface, int cnr,
    TransMeta transMeta, Trans trans ) {
    return new StreamLookup( stepMeta, stepDataInterface, cnr, transMeta, trans );
  }

  @Override
  public StepDataInterface getStepData() {
    return new StreamLookupData();
  }

  @Override
  public boolean excludeFromRowLayoutVerification() {
    return true;
  }

  /**
   * Returns the Input/Output metadata for this step. The generator step only produces output, does not accept input!
   */
  @Override
  public StepIOMetaInterface getStepIOMeta() {
    StepIOMetaInterface ioMeta = super.getStepIOMeta( false );
    if ( ioMeta == null ) {

      ioMeta = new StepIOMeta( true, true, false, false, false, false );

      StreamInterface stream =
        new Stream( StreamType.INFO, null, BaseMessages.getString(
          PKG, "StreamLookupMeta.InfoStream.Description" ), StreamIcon.INFO, null );
      ioMeta.addStream( stream );
      setStepIOMeta( ioMeta );
    }

    return ioMeta;
  }

  @Override
  public void resetStepIoMeta() {
    // Do nothing, don't reset as there is no need to do this.
  }

  /**
   * @return Returns the inputSorted.
   */
  public boolean isInputSorted() {
    return inputSorted;
  }

  /**
   * @param inputSorted
   *          The inputSorted to set.
   */
  public void setInputSorted( boolean inputSorted ) {
    this.inputSorted = inputSorted;
  }

  /**
   * @return Returns the keylookup.
   */
  public String[] getKeylookup() {
    return keylookup;
  }

  /**
   * @param keylookup
   *          The keylookup to set.
   */
  public void setKeylookup( String[] keylookup ) {
    this.keylookup = keylookup;
  }

  /**
   * @return Returns the keystream.
   */
  public String[] getKeystream() {
    return keystream;
  }

  /**
   * @param keystream
   *          The keystream to set.
   */
  public void setKeystream( String[] keystream ) {
    this.keystream = keystream;
  }

  /**
   * @return Returns the value.
   */
  public String[] getValue() {
    return value;
  }

  /**
   * @param value
   *          The value to set.
   */
  public void setValue( String[] value ) {
    this.value = value;
  }

  /**
   * @return Returns the valueDefault.
   */
  public String[] getValueDefault() {
    return valueDefault;
  }

  /**
   * @param valueDefault
   *          The valueDefault to set.
   */
  public void setValueDefault( String[] valueDefault ) {
    this.valueDefault = valueDefault;
  }

  /**
   * @return Returns the valueDefaultType.
   */
  public int[] getValueDefaultType() {
    return valueDefaultType;
  }

  /**
   * @param valueDefaultType
   *          The valueDefaultType to set.
   */
  public void setValueDefaultType( int[] valueDefaultType ) {
    this.valueDefaultType = valueDefaultType;
  }

  /**
   * @return Returns the valueName.
   */
  public String[] getValueName() {
    return valueName;
  }

  /**
   * @param valueName
   *          The valueName to set.
   */
  public void setValueName( String[] valueName ) {
    this.valueName = valueName;
  }

  public boolean isMemoryPreservationActive() {
    return memoryPreservationActive;
  }

  public void setMemoryPreservationActive( boolean memoryPreservationActive ) {
    this.memoryPreservationActive = memoryPreservationActive;
  }

  public boolean isUsingSortedList() {
    return usingSortedList;
  }

  public void setUsingSortedList( boolean usingSortedList ) {
    this.usingSortedList = usingSortedList;
  }

  /**
   * @return the usingIntegerPair
   */
  public boolean isUsingIntegerPair() {
    return usingIntegerPair;
  }

  /**
   * @param usingIntegerPair
   *          the usingIntegerPair to set
   */
  public void setUsingIntegerPair( boolean usingIntegerPair ) {
    this.usingIntegerPair = usingIntegerPair;
  }

  /**
   * If we use injection we can have different arrays lengths.
   * We need synchronize them for consistency behavior with UI
   */
  @AfterInjection
  public void afterInjectionSynchronization() {
    if ( value == null || value.length == 0 ) {
      return;
    }
    int nrFields = value.length;
    //PDI-16110
    if ( valueDefaultType.length < nrFields ) {
      int[] newValueDefaultType = new int[ nrFields ];
      System.arraycopy( valueDefaultType, 0, newValueDefaultType, 0, valueDefaultType.length );
      for ( int i = valueDefaultType.length; i < newValueDefaultType.length; i++ ) {
        newValueDefaultType[i] = -1; //set a undefined value (<0). It will be correct processed in a handleNullIf method
      }
      valueDefaultType = newValueDefaultType;
    }
    if ( valueName.length < nrFields ) {
      String[] newValueName = new String[ nrFields ];
      System.arraycopy( valueName, 0, newValueName, 0, valueName.length );
      valueName = newValueName;
    }

    if ( valueDefault.length < nrFields ) {
      String[] newValueDefault = new String[ nrFields ];
      System.arraycopy( valueDefault, 0, newValueDefault, 0, valueDefault.length );
      valueDefault = newValueDefault;
    }

  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy