/**
* 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.io.File;
import java.util.Collection;
import junit.framework.TestCase;
import org.apache.metamodel.schema.MutableColumn;
import org.apache.metamodel.schema.MutableTable;
import org.eobjects.analyzer.configuration.AnalyzerBeansConfigurationImpl;
import org.eobjects.analyzer.data.MetaModelInputColumn;
import org.eobjects.analyzer.test.MockFilter;
import org.eobjects.analyzer.test.MockFilter.Category;
import org.eobjects.analyzer.test.MockTransformer;
import org.eobjects.analyzer.test.mock.MockDatastore;
import org.junit.Test;
public class AnalysisJobBuilderTest extends TestCase {
@Test
public void testGetAvailableInputColumnsForComponentPreventsCyclicDependencies() throws Exception {
final MutableTable table = new MutableTable("table");
final MutableColumn column = new MutableColumn("foo").setTable(table);
table.addColumn(column);
try (AnalysisJobBuilder ajb = new AnalysisJobBuilder(new AnalyzerBeansConfigurationImpl())) {
final MockDatastore datastore = new MockDatastore();
ajb.setDatastore(datastore);
ajb.addSourceColumn(new MetaModelInputColumn(column));
final TransformerJobBuilder<MockTransformer> transformer1 = ajb.addTransformer(MockTransformer.class);
transformer1.addInputColumn(ajb.getSourceColumnByName("foo"));
transformer1.getOutputColumns().get(0).setName("out1");
assertEquals("[TransformedInputColumn[id=trans-0001-0002,name=out1]]", transformer1.getOutputColumns()
.toString());
assertEquals("[MetaModelInputColumn[table.foo]]", ajb.getAvailableInputColumns(transformer1).toString());
final TransformerJobBuilder<MockTransformer> transformer2 = ajb.addTransformer(MockTransformer.class);
transformer2.addInputColumn(transformer1.getOutputColumns().get(0));
transformer2.getOutputColumns().get(0).setName("out2");
assertEquals("[MetaModelInputColumn[table.foo]]", ajb.getAvailableInputColumns(transformer1).toString());
assertEquals("[MetaModelInputColumn[table.foo], TransformedInputColumn[id=trans-0001-0002,name=out1]]", ajb
.getAvailableInputColumns(transformer2).toString());
final TransformerJobBuilder<MockTransformer> transformer3 = ajb.addTransformer(MockTransformer.class);
assertEquals("[MetaModelInputColumn[table.foo]]", ajb.getAvailableInputColumns(transformer1).toString());
assertEquals("[MetaModelInputColumn[table.foo], TransformedInputColumn[id=trans-0001-0002,name=out1]]", ajb
.getAvailableInputColumns(transformer2).toString());
assertEquals(
"[MetaModelInputColumn[table.foo], TransformedInputColumn[id=trans-0001-0002,name=out1], TransformedInputColumn[id=trans-0003-0004,name=out2]]",
ajb.getAvailableInputColumns(transformer3).toString());
transformer3.addInputColumn(ajb.getSourceColumns().get(0));
transformer3.getOutputColumns().get(0).setName("out3");
assertEquals("[MetaModelInputColumn[table.foo], TransformedInputColumn[id=trans-0005-0006,name=out3]]", ajb
.getAvailableInputColumns(transformer1).toString());
assertEquals(
"[MetaModelInputColumn[table.foo], TransformedInputColumn[id=trans-0001-0002,name=out1], TransformedInputColumn[id=trans-0005-0006,name=out3]]",
ajb.getAvailableInputColumns(transformer2).toString());
assertEquals(
"[MetaModelInputColumn[table.foo], TransformedInputColumn[id=trans-0001-0002,name=out1], TransformedInputColumn[id=trans-0003-0004,name=out2]]",
ajb.getAvailableInputColumns(transformer3).toString());
transformer2.clearInputColumns();
transformer2.addInputColumn(transformer3.getOutputColumns().get(0));
assertEquals(
"[MetaModelInputColumn[table.foo], TransformedInputColumn[id=trans-0003-0004,name=out2], TransformedInputColumn[id=trans-0005-0006,name=out3]]",
ajb.getAvailableInputColumns(transformer1).toString());
assertEquals(
"[MetaModelInputColumn[table.foo], TransformedInputColumn[id=trans-0001-0002,name=out1], TransformedInputColumn[id=trans-0005-0006,name=out3]]",
ajb.getAvailableInputColumns(transformer2).toString());
assertEquals("[MetaModelInputColumn[table.foo], TransformedInputColumn[id=trans-0001-0002,name=out1]]", ajb
.getAvailableInputColumns(transformer3).toString());
}
}
/**
* Builds a scenario with 2 transformers and a filter inbetween. When a
* filter outcome is set as the default requirement, that requirement should
* only be set on the succeeding (not preceeding) transformer.
*/
public void testSetDefaultRequirementNonCyclic() throws Exception {
MutableTable table = new MutableTable("table");
MutableColumn column = new MutableColumn("foo").setTable(table);
table.addColumn(column);
// set up
try (AnalysisJobBuilder ajb = new AnalysisJobBuilder(new AnalyzerBeansConfigurationImpl())) {
MockDatastore datastore = new MockDatastore();
ajb.setDatastore(datastore);
ajb.addSourceColumn(new MetaModelInputColumn(column));
// add a transformer
TransformerJobBuilder<MockTransformer> tjb1 = ajb.addTransformer(MockTransformer.class);
tjb1.addInputColumn(ajb.getSourceColumns().get(0));
assertTrue(tjb1.isConfigured(true));
// add filter
FilterJobBuilder<MockFilter, Category> filter = ajb.addFilter(MockFilter.class);
filter.addInputColumn(tjb1.getOutputColumns().get(0));
filter.getComponentInstance().setSomeEnum(Category.VALID);
filter.getComponentInstance().setSomeFile(new File("."));
assertTrue(filter.isConfigured(true));
// set default requirement
ajb.setDefaultRequirement(filter, Category.VALID);
// add another transformer
TransformerJobBuilder<MockTransformer> tjb2 = ajb.addTransformer(MockTransformer.class);
tjb2.addInputColumn(tjb1.getOutputColumns().get(0));
assertTrue(tjb2.isConfigured(true));
// assertions
assertEquals("Mock filter=VALID", tjb2.getComponentRequirement().toString());
assertEquals(null, filter.getComponentRequirement());
assertEquals(null, tjb1.getComponentRequirement());
final Collection<ComponentBuilder> componentBuilders = ajb.getComponentBuilders();
assertEquals(
"[FilterJobBuilder[filter=Mock filter,inputColumns=[TransformedInputColumn[id=trans-0001-0002,name=mock output]]], "
+ "TransformerJobBuilder[transformer=Mock transformer,inputColumns=[MetaModelInputColumn[table.foo]]], "
+ "TransformerJobBuilder[transformer=Mock transformer,inputColumns=[TransformedInputColumn[id=trans-0001-0002,name=mock output]]]]",
componentBuilders.toString());
}
}
}