/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2016 by Pentaho : 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.accessinput; import java.util.ArrayList; import java.util.List; import org.pentaho.di.core.Const; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.row.ValueMetaInterface; import org.pentaho.di.core.row.value.ValueMetaBase; import org.pentaho.di.core.row.value.ValueMetaFactory; import org.pentaho.di.trans.step.StepInjectionMetaEntry; import org.pentaho.di.trans.step.StepMetaInjectionInterface; /** * To keep it simple, this metadata injection interface only supports the fields in the spreadsheet for the time being. * * @author Matt */ public class AccessInputMetaInjection implements StepMetaInjectionInterface { private AccessInputMeta meta; public AccessInputMetaInjection( AccessInputMeta meta ) { this.meta = meta; } @Override public List<StepInjectionMetaEntry> getStepInjectionMetadataEntries() throws KettleException { List<StepInjectionMetaEntry> all = new ArrayList<StepInjectionMetaEntry>(); for ( Entry entry : Entry.values() ) { if ( entry.getParent() == null && entry.getValueType() != ValueMetaInterface.TYPE_NONE ) { all.add( new StepInjectionMetaEntry( entry.name(), entry.getValueType(), entry.getDescription() ) ); } } // The file name lines // StepInjectionMetaEntry filesEntry = new StepInjectionMetaEntry( Entry.FILENAME_LINES.name(), ValueMetaInterface.TYPE_NONE, Entry.FILENAME_LINES.description ); all.add( filesEntry ); StepInjectionMetaEntry fileEntry = new StepInjectionMetaEntry( Entry.FILENAME_LINE.name(), ValueMetaInterface.TYPE_NONE, Entry.FILENAME_LINE.description ); filesEntry.getDetails().add( fileEntry ); for ( Entry entry : Entry.values() ) { if ( entry.getParent() == Entry.FILENAME_LINE ) { StepInjectionMetaEntry metaEntry = new StepInjectionMetaEntry( entry.name(), entry.getValueType(), entry.getDescription() ); fileEntry.getDetails().add( metaEntry ); } } // Add the fields... // StepInjectionMetaEntry fieldsEntry = new StepInjectionMetaEntry( Entry.FIELDS.name(), Entry.FIELDS.getValueType(), Entry.FIELDS .getDescription() ); all.add( fieldsEntry ); StepInjectionMetaEntry fieldEntry = new StepInjectionMetaEntry( Entry.FIELD.name(), Entry.FIELD.getValueType(), Entry.FIELD.getDescription() ); fieldsEntry.getDetails().add( fieldEntry ); for ( Entry entry : Entry.values() ) { if ( entry.getParent() == Entry.FIELD ) { StepInjectionMetaEntry metaEntry = new StepInjectionMetaEntry( entry.name(), entry.getValueType(), entry.getDescription() ); fieldEntry.getDetails().add( metaEntry ); } } return all; } private class FileLine { String filename; String includeMask; String excludeMask; String required; String includeSubfolders; } @Override public void injectStepMetadataEntries( List<StepInjectionMetaEntry> all ) throws KettleException { List<AccessInputField> fields = new ArrayList<AccessInputField>(); List<FileLine> fileLines = new ArrayList<FileLine>(); // Parse the filenames, fields,... & inject into the meta class.. // for ( StepInjectionMetaEntry lookFields : all ) { Entry fieldsEntry = Entry.findEntry( lookFields.getKey() ); if ( fieldsEntry == null ) { continue; } String lookValue = (String) lookFields.getValue(); switch ( fieldsEntry ) { case FILENAME_LINES: for ( StepInjectionMetaEntry lookField : lookFields.getDetails() ) { Entry fieldEntry = Entry.findEntry( lookField.getKey() ); if ( fieldEntry == Entry.FILENAME_LINE ) { FileLine fileLine = new FileLine(); List<StepInjectionMetaEntry> entries = lookField.getDetails(); for ( StepInjectionMetaEntry entry : entries ) { Entry metaEntry = Entry.findEntry( entry.getKey() ); if ( metaEntry != null ) { String value = (String) entry.getValue(); switch ( metaEntry ) { case FILENAME: fileLine.filename = value; break; case FILEMASK: fileLine.includeMask = value; break; case EXCLUDE_FILEMASK: fileLine.excludeMask = value; break; case FILE_REQUIRED: fileLine.required = value; break; case INCLUDE_SUBFOLDERS: fileLine.includeSubfolders = value; break; default: break; } } } fileLines.add( fileLine ); } } break; case FIELDS: for ( StepInjectionMetaEntry lookField : lookFields.getDetails() ) { Entry fieldEntry = Entry.findEntry( lookField.getKey() ); if ( fieldEntry == Entry.FIELD ) { AccessInputField field = new AccessInputField(); List<StepInjectionMetaEntry> entries = lookField.getDetails(); for ( StepInjectionMetaEntry entry : entries ) { Entry metaEntry = Entry.findEntry( entry.getKey() ); if ( metaEntry != null ) { String value = (String) entry.getValue(); switch ( metaEntry ) { case FIELD_NAME: field.setName( value ); break; case FIELD_COLUMN: field.setColumn( value ); break; case FIELD_LENGTH: field.setLength( Const.toInt( value, -1 ) ); break; case FIELD_TYPE: field.setType( ValueMetaFactory.getIdForValueMeta( value ) ); break; case FIELD_FORMAT: field.setFormat( value ); break; case FIELD_TRIM_TYPE: field.setTrimType( ValueMetaBase.getTrimTypeByCode( value ) ); break; case FIELD_PRECISION: field.setPrecision( Const.toInt( value, -1 ) ); break; case FIELD_DECIMAL: field.setDecimalSymbol( value ); break; case FIELD_GROUP: field.setGroupSymbol( value ); break; case FIELD_CURRENCY: field.setCurrencySymbol( value ); break; case FIELD_REPEAT: field.setRepeated( "Y".equalsIgnoreCase( value ) ); break; default: break; } } } fields.add( field ); } } break; case INCLUDE_FILENAME: meta.setIncludeFilename( "Y".equalsIgnoreCase( lookValue ) ); break; case FILENAME_FIELD: meta.setFilenameField( lookValue ); break; case INCLUDE_ROW_NUMBER: meta.setIncludeRowNumber( "Y".equalsIgnoreCase( lookValue ) ); break; case ROW_NUMBER_BY_FILE: meta.setResetRowNumber( "Y".equalsIgnoreCase( lookValue ) ); break; case ROW_NUMBER_FIELD: meta.setRowNumberField( lookValue ); break; case ROW_LIMIT: meta.setRowLimit( Const.toInt( lookValue, -1 ) ); break; case ACCEPT_FILE_NAMES: meta.setFileField( "Y".equalsIgnoreCase( lookValue ) ); break; case ACCEPT_FILE_FIELD: meta.setDynamicFilenameField( lookValue ); break; case ADD_FILES_TO_RESULT: meta.setAddResultFile( "Y".equalsIgnoreCase( lookValue ) ); break; case FILE_SHORT_FILE_FIELDNAME: meta.setShortFileNameField( lookValue ); break; case FILE_PATH_FIELDNAME: meta.setPathField( lookValue ); break; case FILE_HIDDEN_FIELDNAME: meta.setIsHiddenField( lookValue ); break; case FILE_LAST_MODIFICATION_FIELDNAME: meta.setLastModificationDateField( lookValue ); break; case FILE_URI_FIELDNAME: meta.setUriField( lookValue ); break; case FILE_EXTENSION_FIELDNAME: meta.setExtensionField( lookValue ); break; case FILE_SIZE_FIELDNAME: meta.setSizeField( lookValue ); break; case TABLENAME: meta.setTableName( lookValue ); break; case INCLUDE_TABLENAME: meta.setIncludeTablename( "Y".equalsIgnoreCase( lookValue ) ); break; case TABLENAME_FIELD: meta.setTableName( lookValue ); break; default: break; } } // Pass the grid to the step metadata // Only change a list when you need to, don't clear/reset existing content if you don't send new content. // if ( fields.size() > 0 ) { meta.setInputFields( fields.toArray( new AccessInputField[fields.size()] ) ); } if ( fileLines.size() > 0 ) { meta.allocateFiles( fileLines.size() ); for ( int i = 0; i < fileLines.size(); i++ ) { FileLine fileLine = fileLines.get( i ); ( meta.getFileName() )[i] = fileLine.filename; ( meta.getFileMask() )[i] = fileLine.includeMask; ( meta.getExludeFileMask() )[i] = fileLine.excludeMask; ( meta.getExludeFileMask() )[i] = fileLine.excludeMask; ( meta.getFileRequired() )[i] = fileLine.required; ( meta.getIncludeSubFolders() )[i] = fileLine.includeSubfolders; } } } @Override public List<StepInjectionMetaEntry> extractStepMetadataEntries() throws KettleException { return null; } public AccessInputMeta getMeta() { return meta; } private enum Entry { FILENAME_LINES( ValueMetaInterface.TYPE_NONE, "The list of file definitions" ), FILENAME_LINE( ValueMetaInterface.TYPE_NONE, "One file definition line" ), FILENAME( FILENAME_LINE, ValueMetaInterface.TYPE_STRING, "The filename or directory" ), FILEMASK( FILENAME_LINE, ValueMetaInterface.TYPE_STRING, "The file mask (regex)" ), EXCLUDE_FILEMASK( FILENAME_LINE, ValueMetaInterface.TYPE_STRING, "The mask for the files to exclude (regex)" ), FILE_REQUIRED( FILENAME_LINE, ValueMetaInterface.TYPE_STRING, "Is this a required file (Y/N)" ), INCLUDE_SUBFOLDERS( FILENAME_LINE, ValueMetaInterface.TYPE_STRING, "Include sub-folders when searching files? (Y/N)" ), INCLUDE_FILENAME( ValueMetaInterface.TYPE_STRING, "Include filename in the output? (Y/N)" ), FILENAME_FIELD( ValueMetaInterface.TYPE_STRING, "The name of the filename field in the output" ), INCLUDE_TABLENAME( ValueMetaInterface.TYPE_STRING, "Include the table name in the output? (Y/N)" ), TABLENAME_FIELD( ValueMetaInterface.TYPE_STRING, "The name of the table name field in the output" ), INCLUDE_ROW_NUMBER( ValueMetaInterface.TYPE_STRING, "Include a row number in the output? (Y/N)" ), ROW_NUMBER_BY_FILE( ValueMetaInterface.TYPE_STRING, "Reset the row number for each file? (Y/N)" ), ROW_NUMBER_FIELD( ValueMetaInterface.TYPE_STRING, "The name of the row number field in the output" ), TABLENAME( ValueMetaInterface.TYPE_STRING, "The name of the table to retrieve data from" ), ROW_LIMIT( ValueMetaInterface.TYPE_STRING, "The maximum number of lines to read." ), FIELDS( ValueMetaInterface.TYPE_NONE, "All the fields on the spreadsheets" ), FIELD( ValueMetaInterface.TYPE_NONE, "One field" ), FIELD_NAME( FIELD, ValueMetaInterface.TYPE_STRING, "Field name" ), FIELD_COLUMN( FIELD, ValueMetaInterface.TYPE_STRING, "Field source column name" ), FIELD_TYPE( FIELD, ValueMetaInterface.TYPE_STRING, "Field data type" ), FIELD_LENGTH( FIELD, ValueMetaInterface.TYPE_STRING, "Field length" ), FIELD_PRECISION( FIELD, ValueMetaInterface.TYPE_STRING, "Field precision" ), FIELD_TRIM_TYPE( FIELD, ValueMetaInterface.TYPE_STRING, "Field trim type (none, left, right, both)" ), FIELD_FORMAT( FIELD, ValueMetaInterface.TYPE_STRING, "Field conversion format" ), FIELD_CURRENCY( FIELD, ValueMetaInterface.TYPE_STRING, "Field currency symbol" ), FIELD_DECIMAL( FIELD, ValueMetaInterface.TYPE_STRING, "Field decimal symbol" ), FIELD_GROUP( FIELD, ValueMetaInterface.TYPE_STRING, "Field group symbol" ), FIELD_REPEAT( FIELD, ValueMetaInterface.TYPE_STRING, "Field repeat (Y/N)" ), ACCEPT_FILE_NAMES( ValueMetaInterface.TYPE_STRING, "Accept file names? (Y/N)" ), ACCEPT_FILE_FIELD( ValueMetaInterface.TYPE_STRING, "The input field for the file names" ), ADD_FILES_TO_RESULT( ValueMetaInterface.TYPE_STRING, "Add file names to the result files? (Y/N)" ), FILE_SHORT_FILE_FIELDNAME( ValueMetaInterface.TYPE_STRING, "The short file output fieldname" ), FILE_PATH_FIELDNAME( ValueMetaInterface.TYPE_STRING, "The path output fieldname" ), FILE_HIDDEN_FIELDNAME( ValueMetaInterface.TYPE_STRING, "The hidden output fieldname" ), FILE_LAST_MODIFICATION_FIELDNAME( ValueMetaInterface.TYPE_STRING, "The last modification time output fieldname" ), FILE_URI_FIELDNAME( ValueMetaInterface.TYPE_STRING, "The URI output fieldname" ), FILE_EXTENSION_FIELDNAME( ValueMetaInterface.TYPE_STRING, "The extension output fieldname" ), FILE_SIZE_FIELDNAME( ValueMetaInterface.TYPE_STRING, "The file size output fieldname" ); private int valueType; private String description; private Entry parent; private Entry( int valueType, String description ) { this.valueType = valueType; this.description = description; } private Entry( Entry parent, int valueType, String description ) { this.parent = parent; this.valueType = valueType; this.description = description; } /** * @return the valueType */ public int getValueType() { return valueType; } /** * @return the description */ public String getDescription() { return description; } public static Entry findEntry( String key ) { return Entry.valueOf( key ); } public Entry getParent() { return parent; } } public class ExcelInputSheet { public String sheetName; public int startCol; public int startRow; /** * @param sheetName * @param startCol * @param startRow */ private ExcelInputSheet( String sheetName, int startCol, int startRow ) { this.sheetName = sheetName; this.startCol = startCol; this.startRow = startRow; } } }