/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2017 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.excelinput; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import java.util.UUID; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.SystemUtils; import org.apache.commons.lang.builder.EqualsBuilder; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.pentaho.di.core.KettleEnvironment; import org.pentaho.di.core.exception.KettleException; import org.pentaho.di.core.plugins.PluginRegistry; import org.pentaho.di.trans.steps.loadsave.LoadSaveTester; import org.pentaho.di.trans.steps.loadsave.validator.ArrayLoadSaveValidator; import org.pentaho.di.trans.steps.loadsave.validator.FieldLoadSaveValidator; import org.pentaho.di.trans.steps.loadsave.validator.IntLoadSaveValidator; import org.pentaho.di.trans.steps.loadsave.validator.PrimitiveIntArrayLoadSaveValidator; import org.pentaho.di.trans.steps.loadsave.validator.StringLoadSaveValidator; public class ExcelInputMetaTest { LoadSaveTester loadSaveTester; ExcelInputMeta meta; @Before public void setUp() throws Exception { KettleEnvironment.init(); PluginRegistry.init( true ); meta = new ExcelInputMeta(); meta.setFileName( new String[] { "1", "2", "3" } ); meta.setSheetName( new String[] { "1", "2", "3", "4" } ); meta.setField( new ExcelInputField[] { new ExcelInputField( "1", 1, 1 ), new ExcelInputField( "2", 2, 2 ) } ); meta.normilizeAllocation(); } @Test public void testSerialization() throws KettleException { List<String> attributes = Arrays.asList( "fileName", "fileMask", "excludeFileMask", "fileRequired", "includeSubFolders", "field", "sheetName", "startRow", "startColumn", "spreadSheetType", "fileField", "sheetField", "sheetRowNumberField", "rowNumberField", "shortFileFieldName", "extensionFieldName", "pathFieldName", "sizeFieldName", "hiddenFieldName", "lastModificationTimeFieldName", "uriNameFieldName", "rootUriNameFieldName" ); Map<String, String> getterMap = new HashMap<String, String>() { { put( "excludeFileMask", "getExludeFileMask" ); put( "shortFileFieldName", "getShortFileNameField" ); put( "extensionFieldName", "getExtensionField" ); put( "pathFieldName", "getPathField" ); put( "sizeFieldName", "getSizeField" ); put( "hiddenFieldName", "isHiddenField" ); put( "lastModificationTimeFieldName", "getLastModificationDateField" ); put( "uriNameFieldName", "getUriField" ); put( "rootUriNameFieldName", "getRootUriField" ); } }; Map<String, String> setterMap = new HashMap<String, String>() { { put( "shortFileFieldName", "setShortFileNameField" ); put( "extensionFieldName", "setExtensionField" ); put( "pathFieldName", "setPathField" ); put( "sizeFieldName", "setSizeField" ); put( "hiddenFieldName", "setIsHiddenField" ); put( "lastModificationTimeFieldName", "setLastModificationDateField" ); put( "uriNameFieldName", "setUriField" ); put( "rootUriNameFieldName", "setRootUriField" ); } }; FieldLoadSaveValidator<String[]> stringArrayLoadSaveValidator = new ArrayLoadSaveValidator<String>( new StringLoadSaveValidator(), 5 ); Map<String, FieldLoadSaveValidator<?>> attrValidatorMap = new HashMap<String, FieldLoadSaveValidator<?>>(); attrValidatorMap.put( "fileName", stringArrayLoadSaveValidator ); attrValidatorMap.put( "sheetName", stringArrayLoadSaveValidator ); attrValidatorMap.put( "fileMask", stringArrayLoadSaveValidator ); attrValidatorMap.put( "excludeFileMask", stringArrayLoadSaveValidator ); attrValidatorMap.put( "fileRequired", stringArrayLoadSaveValidator ); attrValidatorMap.put( "includeSubFolders", stringArrayLoadSaveValidator ); attrValidatorMap.put( "field", new ArrayLoadSaveValidator<ExcelInputField>( new ExcelInputFieldLoadSaveValidator(), 5 ) ); attrValidatorMap.put( "spreadSheetType", new SpreadSheetTypeFieldLoadSaveValidator() ); Map<String, FieldLoadSaveValidator<?>> typeValidatorMap = new HashMap<String, FieldLoadSaveValidator<?>>(); typeValidatorMap.put( int[].class.getCanonicalName(), new PrimitiveIntArrayLoadSaveValidator( new IntLoadSaveValidator(), 5 ) ); loadSaveTester = new LoadSaveTester( ExcelInputMeta.class, attributes, getterMap, setterMap, attrValidatorMap, typeValidatorMap ); loadSaveTester.testSerialization(); } public class ExcelInputFieldLoadSaveValidator implements FieldLoadSaveValidator<ExcelInputField> { final Random rand = new Random(); @Override public ExcelInputField getTestObject() { ExcelInputField rtn = new ExcelInputField(); rtn.setCurrencySymbol( UUID.randomUUID().toString() ); rtn.setDecimalSymbol( UUID.randomUUID().toString() ); rtn.setFormat( UUID.randomUUID().toString() ); rtn.setGroupSymbol( UUID.randomUUID().toString() ); rtn.setName( UUID.randomUUID().toString() ); rtn.setTrimType( rand.nextInt( 4 ) ); rtn.setPrecision( rand.nextInt( 9 ) ); rtn.setRepeated( rand.nextBoolean() ); rtn.setLength( rand.nextInt( 50 ) ); rtn.setType( rand.nextInt( 5 ) + 1 ); return rtn; } @Override public boolean validateTestObject( ExcelInputField testObject, Object actual ) { if ( !( actual instanceof ExcelInputField ) ) { return false; } ExcelInputField another = (ExcelInputField) actual; return new EqualsBuilder() .append( testObject.getName(), another.getName() ) .append( testObject.getType(), another.getType() ) .append( testObject.getLength(), another.getLength() ) .append( testObject.getFormat(), another.getFormat() ) .append( testObject.getTrimType(), another.getTrimType() ) .append( testObject.getPrecision(), another.getPrecision() ) .append( testObject.getCurrencySymbol(), another.getCurrencySymbol() ) .append( testObject.getDecimalSymbol(), another.getDecimalSymbol() ) .append( testObject.getGroupSymbol(), another.getGroupSymbol() ) .append( testObject.isRepeated(), another.isRepeated() ) .isEquals(); } } public class SpreadSheetTypeFieldLoadSaveValidator implements FieldLoadSaveValidator<SpreadSheetType> { @Override public SpreadSheetType getTestObject() { return SpreadSheetType.POI; } @Override public boolean validateTestObject( SpreadSheetType testObject, Object actual ) { return true; } } @Test public void testRepoRoundTripWithNullAttr() throws KettleException { List<String> attributes = Arrays.asList( "fileName", "fileMask", "excludeFileMask", "fileRequired", "includeSubFolders", "field", "sheetName", "startRow", "startColumn", "spreadSheetType", "fileField", "sheetField", "sheetRowNumberField", "rowNumberField", "shortFileFieldName", "extensionFieldName", "pathFieldName", "sizeFieldName", "hiddenFieldName", "lastModificationTimeFieldName", "uriNameFieldName", "rootUriNameFieldName" ); Map<String, String> getterMap = new HashMap<String, String>() { { put( "excludeFileMask", "getExludeFileMask" ); put( "shortFileFieldName", "getShortFileNameField" ); put( "extensionFieldName", "getExtensionField" ); put( "pathFieldName", "getPathField" ); put( "sizeFieldName", "getSizeField" ); put( "hiddenFieldName", "isHiddenField" ); put( "lastModificationTimeFieldName", "getLastModificationDateField" ); put( "uriNameFieldName", "getUriField" ); put( "rootUriNameFieldName", "getRootUriField" ); } }; Map<String, String> setterMap = new HashMap<String, String>() { { put( "shortFileFieldName", "setShortFileNameField" ); put( "extensionFieldName", "setExtensionField" ); put( "pathFieldName", "setPathField" ); put( "sizeFieldName", "setSizeField" ); put( "hiddenFieldName", "setIsHiddenField" ); put( "lastModificationTimeFieldName", "setLastModificationDateField" ); put( "uriNameFieldName", "setUriField" ); put( "rootUriNameFieldName", "setRootUriField" ); } }; FieldLoadSaveValidator<String[]> nullStringArrayLoadSaveValidator = new NullStringArrayLoadSaveValidator(); FieldLoadSaveValidator<String[]> stringArrayLoadSaveValidator = new ArrayLoadSaveValidator<String>( new StringLoadSaveValidator(), 1 ); NullNameExcelInputArrayFieldLoadSaveValidator nullNameExcelInputArrayFieldLoadSaveValidator = new NullNameExcelInputArrayFieldLoadSaveValidator(); Map<String, FieldLoadSaveValidator<?>> attrValidatorMap = new HashMap<String, FieldLoadSaveValidator<?>>(); attrValidatorMap.put( "fileName", nullStringArrayLoadSaveValidator ); attrValidatorMap.put( "fileMask", stringArrayLoadSaveValidator ); attrValidatorMap.put( "excludeFileMask", stringArrayLoadSaveValidator ); attrValidatorMap.put( "fileRequired", stringArrayLoadSaveValidator ); attrValidatorMap.put( "includeSubFolders", stringArrayLoadSaveValidator ); attrValidatorMap.put( "sheetName", nullStringArrayLoadSaveValidator ); attrValidatorMap.put( "field", nullNameExcelInputArrayFieldLoadSaveValidator ); attrValidatorMap.put( "spreadSheetType", new SpreadSheetTypeFieldLoadSaveValidator() ); Map<String, FieldLoadSaveValidator<?>> typeValidatorMap = new HashMap<String, FieldLoadSaveValidator<?>>(); typeValidatorMap.put( int[].class.getCanonicalName(), new PrimitiveIntArrayLoadSaveValidator( new IntLoadSaveValidator(), 1 ) ); loadSaveTester = new LoadSaveTester( ExcelInputMeta.class, attributes, getterMap, setterMap, attrValidatorMap, typeValidatorMap ); loadSaveTester.testRepoRoundTrip(); } public class NullStringArrayLoadSaveValidator implements FieldLoadSaveValidator<String[]> { @Override public String[] getTestObject() { return new String[] { null }; } @Override public boolean validateTestObject( String[] original, Object actualObject ) { String[] actual = actualObject instanceof String[] ? ( (String[]) actualObject ) : null; if ( actual == null || actual.length != 1 || original.length != 1 || original[ 0 ] != null ) { return false; } return StringUtils.EMPTY.equals( actual[ 0 ] ); } } public class NullNameExcelInputArrayFieldLoadSaveValidator implements FieldLoadSaveValidator<ExcelInputField[]> { @Override public ExcelInputField[] getTestObject() { ExcelInputField rtn = new ExcelInputField(); rtn.setName( null ); return new ExcelInputField[] { rtn }; } @Override public boolean validateTestObject( ExcelInputField[] original, Object actualObject ) { ExcelInputField[] actual = actualObject instanceof ExcelInputField[] ? ( (ExcelInputField[]) actualObject ) : null; if ( actual == null || actual.length != 1 || original.length != 1 || original[ 0 ].getName() != null ) { return false; } return StringUtils.EMPTY.equals( actual[ 0 ].getName() ); } } @Test public void testNormilizeAllocation() throws KettleException { Assert.assertEquals( 3, meta.getFileName().length ); Assert.assertEquals( 3, meta.getFileMask().length ); Assert.assertEquals( 3, meta.getExcludeFileMask().length ); Assert.assertEquals( 3, meta.getFileRequired().length ); Assert.assertEquals( 3, meta.getIncludeSubFolders().length ); Assert.assertEquals( 4, meta.getSheetName().length ); Assert.assertEquals( 4, meta.getStartRow().length ); Assert.assertEquals( 4, meta.getStartColumn().length ); Assert.assertArrayEquals( new String[] { "1", "2", "3" }, meta.getFileName() ); Assert.assertArrayEquals( new String[] { "1", "2", "3", "4" }, meta.getSheetName() ); for ( String str : meta.getFileMask() ) { Assert.assertEquals( null, str ); } for ( String str : meta.getExcludeFileMask() ) { Assert.assertEquals( null, str ); } for ( String str : meta.getFileRequired() ) { Assert.assertEquals( null, str ); } for ( String str : meta.getIncludeSubFolders() ) { Assert.assertEquals( null, str ); } for ( int itr : meta.getStartRow() ) { Assert.assertEquals( 0, itr ); } for ( int itr : meta.getStartColumn() ) { Assert.assertEquals( 0, itr ); } } @Test public void testGetXML() throws KettleException { Assert.assertEquals( " <header>N</header>" + SystemUtils.LINE_SEPARATOR + " <noempty>N</noempty>" + SystemUtils.LINE_SEPARATOR + " <stoponempty>N</stoponempty>" + SystemUtils.LINE_SEPARATOR + " <filefield/>" + SystemUtils.LINE_SEPARATOR + " <sheetfield/>" + SystemUtils.LINE_SEPARATOR + " <sheetrownumfield/>" + SystemUtils.LINE_SEPARATOR + " <rownumfield/>" + SystemUtils.LINE_SEPARATOR + " <sheetfield/>" + SystemUtils.LINE_SEPARATOR + " <filefield/>" + SystemUtils.LINE_SEPARATOR + " <limit>0</limit>" + SystemUtils.LINE_SEPARATOR + " <encoding/>" + SystemUtils.LINE_SEPARATOR + " <add_to_result_filenames>N</add_to_result_filenames>" + SystemUtils.LINE_SEPARATOR + " <accept_filenames>N</accept_filenames>" + SystemUtils.LINE_SEPARATOR + " <accept_field/>" + SystemUtils.LINE_SEPARATOR + " <accept_stepname/>" + SystemUtils.LINE_SEPARATOR + " <file>" + SystemUtils.LINE_SEPARATOR + " <name>1</name>" + SystemUtils.LINE_SEPARATOR + " <filemask/>" + SystemUtils.LINE_SEPARATOR + " <exclude_filemask/>" + SystemUtils.LINE_SEPARATOR + " <file_required/>" + SystemUtils.LINE_SEPARATOR + " <include_subfolders/>" + SystemUtils.LINE_SEPARATOR + " <name>2</name>" + SystemUtils.LINE_SEPARATOR + " <filemask/>" + SystemUtils.LINE_SEPARATOR + " <exclude_filemask/>" + SystemUtils.LINE_SEPARATOR + " <file_required/>" + SystemUtils.LINE_SEPARATOR + " <include_subfolders/>" + SystemUtils.LINE_SEPARATOR + " <name>3</name>" + SystemUtils.LINE_SEPARATOR + " <filemask/>" + SystemUtils.LINE_SEPARATOR + " <exclude_filemask/>" + SystemUtils.LINE_SEPARATOR + " <file_required/>" + SystemUtils.LINE_SEPARATOR + " <include_subfolders/>" + SystemUtils.LINE_SEPARATOR + " </file>" + SystemUtils.LINE_SEPARATOR + " <fields>" + SystemUtils.LINE_SEPARATOR + " <field>" + SystemUtils.LINE_SEPARATOR + " <name>1</name>" + SystemUtils.LINE_SEPARATOR + " <type>String</type>" + SystemUtils.LINE_SEPARATOR + " <length>1</length>" + SystemUtils.LINE_SEPARATOR + " <precision>-1</precision>" + SystemUtils.LINE_SEPARATOR + " <trim_type>none</trim_type>" + SystemUtils.LINE_SEPARATOR + " <repeat>N</repeat>" + SystemUtils.LINE_SEPARATOR + " <format/>" + SystemUtils.LINE_SEPARATOR + " <currency/>" + SystemUtils.LINE_SEPARATOR + " <decimal/>" + SystemUtils.LINE_SEPARATOR + " <group/>" + SystemUtils.LINE_SEPARATOR + " </field>" + SystemUtils.LINE_SEPARATOR + " <field>" + SystemUtils.LINE_SEPARATOR + " <name>2</name>" + SystemUtils.LINE_SEPARATOR + " <type>String</type>" + SystemUtils.LINE_SEPARATOR + " <length>2</length>" + SystemUtils.LINE_SEPARATOR + " <precision>-1</precision>" + SystemUtils.LINE_SEPARATOR + " <trim_type>none</trim_type>" + SystemUtils.LINE_SEPARATOR + " <repeat>N</repeat>" + SystemUtils.LINE_SEPARATOR + " <format/>" + SystemUtils.LINE_SEPARATOR + " <currency/>" + SystemUtils.LINE_SEPARATOR + " <decimal/>" + SystemUtils.LINE_SEPARATOR + " <group/>" + SystemUtils.LINE_SEPARATOR + " </field>" + SystemUtils.LINE_SEPARATOR + " </fields>" + SystemUtils.LINE_SEPARATOR + " <sheets>" + SystemUtils.LINE_SEPARATOR + " <sheet>" + SystemUtils.LINE_SEPARATOR + " <name>1</name>" + SystemUtils.LINE_SEPARATOR + " <startrow>0</startrow>" + SystemUtils.LINE_SEPARATOR + " <startcol>0</startcol>" + SystemUtils.LINE_SEPARATOR + " </sheet>" + SystemUtils.LINE_SEPARATOR + " <sheet>" + SystemUtils.LINE_SEPARATOR + " <name>2</name>" + SystemUtils.LINE_SEPARATOR + " <startrow>0</startrow>" + SystemUtils.LINE_SEPARATOR + " <startcol>0</startcol>" + SystemUtils.LINE_SEPARATOR + " </sheet>" + SystemUtils.LINE_SEPARATOR + " <sheet>" + SystemUtils.LINE_SEPARATOR + " <name>3</name>" + SystemUtils.LINE_SEPARATOR + " <startrow>0</startrow>" + SystemUtils.LINE_SEPARATOR + " <startcol>0</startcol>" + SystemUtils.LINE_SEPARATOR + " </sheet>" + SystemUtils.LINE_SEPARATOR + " <sheet>" + SystemUtils.LINE_SEPARATOR + " <name>4</name>" + SystemUtils.LINE_SEPARATOR + " <startrow>0</startrow>" + SystemUtils.LINE_SEPARATOR + " <startcol>0</startcol>" + SystemUtils.LINE_SEPARATOR + " </sheet>" + SystemUtils.LINE_SEPARATOR + " </sheets>" + SystemUtils.LINE_SEPARATOR + " <strict_types>N</strict_types>" + SystemUtils.LINE_SEPARATOR + " <error_ignored>N</error_ignored>" + SystemUtils.LINE_SEPARATOR + " <error_line_skipped>N</error_line_skipped>" + SystemUtils.LINE_SEPARATOR + " <bad_line_files_destination_directory/>" + SystemUtils.LINE_SEPARATOR + " <bad_line_files_extension/>" + SystemUtils.LINE_SEPARATOR + " <error_line_files_destination_directory/>" + SystemUtils.LINE_SEPARATOR + " <error_line_files_extension/>" + SystemUtils.LINE_SEPARATOR + " <line_number_files_destination_directory/>" + SystemUtils.LINE_SEPARATOR + " <line_number_files_extension/>" + SystemUtils.LINE_SEPARATOR + " <shortFileFieldName/>" + SystemUtils.LINE_SEPARATOR + " <pathFieldName/>" + SystemUtils.LINE_SEPARATOR + " <hiddenFieldName/>" + SystemUtils.LINE_SEPARATOR + " <lastModificationTimeFieldName/>" + SystemUtils.LINE_SEPARATOR + " <uriNameFieldName/>" + SystemUtils.LINE_SEPARATOR + " <rootUriNameFieldName/>" + SystemUtils.LINE_SEPARATOR + " <extensionFieldName/>" + SystemUtils.LINE_SEPARATOR + " <sizeFieldName/>" + SystemUtils.LINE_SEPARATOR + " <spreadsheet_type/>" + SystemUtils.LINE_SEPARATOR, meta.getXML() ); } @Test public void testClone() throws KettleException { ExcelInputMeta clone = (ExcelInputMeta) meta.clone(); Assert.assertEquals( meta.getXML(), clone.getXML() ); } // Note - removed cloneTest as it's now covered by the load/save tester. }