Java tutorial
/*! ****************************************************************************** * * 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. }