org.pentaho.di.trans.steps.excelinput.ExcelInputMetaTest.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.di.trans.steps.excelinput.ExcelInputMetaTest.java

Source

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