/** * AnalyzerBeans * Copyright (C) 2014 Neopost - Customer Information Management * * This copyrighted material is made available to anyone wishing to use, modify, * copy, or redistribute it subject to the terms and conditions of the GNU * Lesser General Public License, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this distribution; if not, write to: * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 USA */ package org.eobjects.analyzer.job.builder; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Set; import junit.framework.TestCase; import org.eobjects.analyzer.beans.convert.ConvertToNumberTransformer; import org.eobjects.analyzer.beans.mock.TransformerMock; import org.eobjects.analyzer.beans.transform.TableLookupTransformer; import org.eobjects.analyzer.configuration.AnalyzerBeansConfiguration; import org.eobjects.analyzer.configuration.AnalyzerBeansConfigurationImpl; import org.eobjects.analyzer.data.ConstantInputColumn; import org.eobjects.analyzer.data.InputColumn; import org.eobjects.analyzer.data.MockInputColumn; import org.eobjects.analyzer.data.MutableInputColumn; import org.eobjects.analyzer.descriptors.ConfiguredPropertyDescriptor; import org.eobjects.analyzer.descriptors.Descriptors; import org.eobjects.analyzer.descriptors.TransformerBeanDescriptor; import org.eobjects.analyzer.job.IdGenerator; import org.eobjects.analyzer.job.PrefixedIdGenerator; import org.eobjects.analyzer.util.InputColumnComparator; import org.apache.metamodel.schema.ColumnType; import org.apache.metamodel.schema.MutableColumn; import org.apache.metamodel.util.CollectionUtils; import org.apache.metamodel.util.HasNameMapper; public class TransformerJobBuilderTest extends TestCase { private AnalyzerBeansConfiguration configuration; private AnalysisJobBuilder ajb; @Override protected void setUp() throws Exception { super.setUp(); configuration = new AnalyzerBeansConfigurationImpl(); ajb = new AnalysisJobBuilder(configuration); ajb.addSourceColumn(new MutableColumn("fooInt", ColumnType.INTEGER)); ajb.addSourceColumn(new MutableColumn("fooStr", ColumnType.VARCHAR)); } public void testGetOutputColumnsRetainingAndSorting() throws Exception { final TransformerJobBuilder<?> tjb1 = ajb.addTransformer(TransformerMockForOutputColumnChanges.class); tjb1.addInputColumn(ajb.getSourceColumnByName("fooStr")); final TransformerJobBuilder<?> tjb2 = ajb.addTransformer(TransformerMockForOutputColumnChanges.class); tjb2.addInputColumn(ajb.getSourceColumnByName("fooStr")); assertEquals("[foo, bar, foo, bar]", getSortedOutputColumns(tjb1, tjb2)); // Column ordering is retained when configuration changes output column // names tjb1.setConfiguredProperty("Output column names", new String[] { "Hello", "There" }); tjb2.setConfiguredProperty("Output column names", new String[] { "Big", "World" }); assertEquals("[Hello, There, Big, World]", getSortedOutputColumns(tjb1, tjb2)); // Column ordering is retained when user changes output column name tjb1.getOutputColumns().get(0).setName("Howdy"); tjb1.getOutputColumns().get(1).setName("There"); tjb2.getOutputColumns().get(0).setName("Column3"); tjb2.getOutputColumns().get(1).setName("Column4"); assertEquals("[Howdy, There, Column3, Column4]", getSortedOutputColumns(tjb1, tjb2)); // Column names and ordering is reset when configuration changes output // columns size tjb1.setConfiguredProperty("Output column names", new String[] { "Hello", "To", "You" }); assertEquals("[Howdy, To, You, Column3, Column4]", getSortedOutputColumns(tjb1, tjb2)); } private String getSortedOutputColumns(TransformerJobBuilder<?> tjb1, TransformerJobBuilder<?> tjb2) { List<MutableInputColumn<?>> cols1 = tjb1.getOutputColumns(); List<MutableInputColumn<?>> cols2 = tjb2.getOutputColumns(); List<InputColumn<?>> list = new ArrayList<InputColumn<?>>(); list.addAll(cols1); list.addAll(cols2); Collections.sort(list, new InputColumnComparator()); List<String> names = CollectionUtils.map(list, new HasNameMapper()); return names.toString(); } public void testSetInvalidPropertyType() throws Exception { TransformerJobBuilder<TransformerMock> tjb = ajb.addTransformer(TransformerMock.class); try { tjb.setConfiguredProperty("Input", "hello"); fail("Exception expected"); } catch (IllegalArgumentException e) { assertEquals("Invalid value type: java.lang.String, expected: org.eobjects.analyzer.data.InputColumn", e.getMessage()); } } public void testIsConfigured() throws Exception { TransformerJobBuilder<TransformerMock> tjb = ajb.addTransformer(TransformerMock.class); assertFalse(tjb.isConfigured()); tjb.setConfiguredProperty("Some integer", null); tjb.addInputColumn(ajb.getSourceColumns().get(1)); assertFalse(tjb.isConfigured()); try { tjb.isConfigured(true); fail("Exception occurred"); } catch (UnconfiguredConfiguredPropertyException e) { assertEquals( "Property 'Some integer' is not properly configured (TransformerJobBuilder[transformer=Transformer mock,inputColumns=[MetaModelInputColumn[fooStr]]])", e.getMessage()); } tjb.setConfiguredProperty("Some integer", 10); assertTrue(tjb.isConfigured()); tjb.removeInputColumn(ajb.getSourceColumns().get(1)); assertFalse(tjb.isConfigured()); } public void testClearInputColumnsArray() throws Exception { TransformerJobBuilder<TransformerMock> tjb = ajb.addTransformer(TransformerMock.class); tjb.addInputColumn(ajb.getSourceColumns().get(1)); tjb.addInputColumn(new ConstantInputColumn("foo")); assertEquals(2, tjb.getInputColumns().size()); tjb.clearInputColumns(); assertEquals(0, tjb.getInputColumns().size()); } public void testAddNonRequiredColumn() throws Exception { final TransformerJobBuilder<TableLookupTransformer> tjb = ajb.addTransformer(TableLookupTransformer.class); final Set<ConfiguredPropertyDescriptor> inputProperties = tjb.getDescriptor().getConfiguredPropertiesForInput( true); assertEquals(1, inputProperties.size()); final ConfiguredPropertyDescriptor inputProperty = inputProperties.iterator().next(); assertFalse(inputProperty.isRequired()); assertNull(tjb.getConfiguredProperty(inputProperty)); tjb.addInputColumn(ajb.getSourceColumns().get(0)); assertNotNull(tjb.getConfiguredProperty(inputProperty)); } public void testClearInputColumnsSingle() throws Exception { TransformerJobBuilder<SingleInputColumnTransformer> tjb = ajb .addTransformer(SingleInputColumnTransformer.class); tjb.addInputColumn(ajb.getSourceColumns().get(1)); assertEquals(1, tjb.getInputColumns().size()); tjb.clearInputColumns(); assertEquals(0, tjb.getInputColumns().size()); } public void testGetAvailableInputColumns() throws Exception { assertEquals(2, ajb.getAvailableInputColumns(Object.class).size()); assertEquals(2, ajb.getAvailableInputColumns((Class<?>) null).size()); assertEquals(1, ajb.getAvailableInputColumns(String.class).size()); assertEquals(0, ajb.getAvailableInputColumns(Date.class).size()); } public void testInvalidInputColumnType() throws Exception { TransformerJobBuilder<SingleInputColumnTransformer> tjb = ajb .addTransformer(SingleInputColumnTransformer.class); assertEquals(0, tjb.getInputColumns().size()); assertFalse(tjb.isConfigured()); try { tjb.addInputColumn(ajb.getSourceColumns().get(0)); fail("Exception expected"); } catch (IllegalArgumentException e) { assertEquals("Unsupported InputColumn type: class java.lang.Integer, expected: class java.lang.String", e.getMessage()); } assertFalse(tjb.isConfigured()); tjb.addInputColumn(ajb.getSourceColumns().get(1)); assertEquals(1, tjb.getInputColumns().size()); assertTrue(tjb.isConfigured()); } public void testNoOutputWhenNotConfigured() throws Exception { TransformerJobBuilder<SingleInputColumnTransformer> tjb = ajb .addTransformer(SingleInputColumnTransformer.class); // not yet configured assertEquals(0, tjb.getOutputColumns().size()); tjb.addInputColumn(new MockInputColumn<String>("email", String.class)); assertEquals(2, tjb.getOutputColumns().size()); } public void testConfigureByConfigurableBean() throws Exception { IdGenerator IdGenerator = new PrefixedIdGenerator(""); TransformerBeanDescriptor<ConvertToNumberTransformer> descriptor = Descriptors .ofTransformer(ConvertToNumberTransformer.class); TransformerJobBuilder<ConvertToNumberTransformer> builder = new TransformerJobBuilder<ConvertToNumberTransformer>( new AnalysisJobBuilder(null), descriptor, IdGenerator); assertFalse(builder.isConfigured()); ConvertToNumberTransformer configurableBean = builder.getComponentInstance(); InputColumn<String> input = new MockInputColumn<String>("foo", String.class); configurableBean.setInput(input); assertTrue(builder.isConfigured()); ConfiguredPropertyDescriptor propertyDescriptor = descriptor.getConfiguredPropertiesForInput().iterator() .next(); InputColumn<?>[] value = (InputColumn<?>[]) builder.getConfiguredProperties().get(propertyDescriptor); assertEquals("[MockInputColumn[name=foo]]", Arrays.toString(value)); } public void testReplaceAutomaticOutputColumnNames() throws Exception { IdGenerator IdGenerator = new PrefixedIdGenerator(""); TransformerBeanDescriptor<TransformerMock> descriptor = Descriptors.ofTransformer(TransformerMock.class); TransformerJobBuilder<TransformerMock> builder = new TransformerJobBuilder<TransformerMock>( new AnalysisJobBuilder(new AnalyzerBeansConfigurationImpl()), descriptor, IdGenerator); MockInputColumn<String> colA = new MockInputColumn<String>("A", String.class); MockInputColumn<String> colB = new MockInputColumn<String>("B", String.class); MockInputColumn<String> colC = new MockInputColumn<String>("C", String.class); builder.addInputColumn(colA); builder.addInputColumn(colB); builder.addInputColumn(colC); List<MutableInputColumn<?>> outputColumns = builder.getOutputColumns(); assertEquals(3, outputColumns.size()); assertEquals( "[TransformedInputColumn[id=trans-0001-0002,name=Transformer mock (1)], TransformedInputColumn[id=trans-0001-0003,name=Transformer mock (2)], TransformedInputColumn[id=trans-0001-0004,name=Transformer mock (3)]]", outputColumns.toString()); builder.removeInputColumn(colB); outputColumns.get(0).setName("Foo A"); outputColumns = builder.getOutputColumns(); assertEquals(2, outputColumns.size()); assertEquals( "[TransformedInputColumn[id=trans-0001-0002,name=Foo A], TransformedInputColumn[id=trans-0001-0003,name=Transformer mock (2)]]", outputColumns.toString()); builder.addInputColumn(colB); outputColumns = builder.getOutputColumns(); assertEquals(3, outputColumns.size()); assertEquals( "[TransformedInputColumn[id=trans-0001-0002,name=Foo A], TransformedInputColumn[id=trans-0001-0003,name=Transformer mock (2)], TransformedInputColumn[id=trans-0001-0005,name=Transformer mock (3)]]", outputColumns.toString()); ConfiguredPropertyDescriptor inputColumnProperty = descriptor.getConfiguredPropertiesForInput().iterator() .next(); builder.setConfiguredProperty(inputColumnProperty, new InputColumn[] { colA, colB, colC }); outputColumns = builder.getOutputColumns(); assertEquals(3, outputColumns.size()); assertEquals( "[TransformedInputColumn[id=trans-0001-0002,name=Foo A], TransformedInputColumn[id=trans-0001-0003,name=Transformer mock (2)], TransformedInputColumn[id=trans-0001-0005,name=Transformer mock (3)]]", outputColumns.toString()); assertEquals("Transformer mock (1)", outputColumns.get(0).getInitialName()); } }