/**
* Licensed to JumpMind Inc under one or more contributor
* license agreements. See the NOTICE file distributed
* with this work for additional information regarding
* copyright ownership. JumpMind Inc licenses this file
* to you under the GNU General Public License, version 3.0 (GPLv3)
* (the "License"); you may not use this file except in compliance
* with the License.
*
* You should have received a copy of the GNU General Public License,
* version 3.0 (GPLv3) along with this library; if not, see
* <http://www.gnu.org/licenses/>.
*
* 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.jumpmind.symmetric.io.data.writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jumpmind.db.DbTestUtils;
import org.jumpmind.db.model.Column;
import org.jumpmind.db.model.Table;
import org.jumpmind.symmetric.io.AbstractWriterTest;
import org.jumpmind.symmetric.io.data.CsvData;
import org.jumpmind.symmetric.io.data.DataEventType;
import org.jumpmind.symmetric.io.data.transform.AdditiveColumnTransform;
import org.jumpmind.symmetric.io.data.transform.BinaryLeftColumnTransform;
import org.jumpmind.symmetric.io.data.transform.ClarionDateTimeColumnTransform;
import org.jumpmind.symmetric.io.data.transform.ColumnsToRowsKeyColumnTransform;
import org.jumpmind.symmetric.io.data.transform.ColumnsToRowsValueColumnTransform;
import org.jumpmind.symmetric.io.data.transform.ConstantColumnTransform;
import org.jumpmind.symmetric.io.data.transform.CopyColumnTransform;
import org.jumpmind.symmetric.io.data.transform.CopyIfChangedColumnTransform;
import org.jumpmind.symmetric.io.data.transform.IColumnTransform;
import org.jumpmind.symmetric.io.data.transform.IdentityColumnTransform;
import org.jumpmind.symmetric.io.data.transform.JavaColumnTransform;
import org.jumpmind.symmetric.io.data.transform.LeftColumnTransform;
import org.jumpmind.symmetric.io.data.transform.MathColumnTransform;
import org.jumpmind.symmetric.io.data.transform.MultiplierColumnTransform;
import org.jumpmind.symmetric.io.data.transform.RemoveColumnTransform;
import org.jumpmind.symmetric.io.data.transform.SubstrColumnTransform;
import org.jumpmind.symmetric.io.data.transform.TransformColumn;
import org.jumpmind.symmetric.io.data.transform.TransformPoint;
import org.jumpmind.symmetric.io.data.transform.TransformTable;
import org.jumpmind.symmetric.io.data.transform.ValueMapColumnTransform;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
public class TransformWriterTest extends AbstractWriterTest {
protected MockDataWriter mockWriter = new MockDataWriter();
@BeforeClass
public static void setup() throws Exception {
platform = DbTestUtils.createDatabasePlatform(DbTestUtils.ROOT);
platform.createDatabase(platform.readDatabaseFromXml("/testDatabaseWriter.xml", true),
true, false);
}
@Test
public void testNoTransform() {
mockWriter.reset();
Table table = new Table("original", new Column("id"));
writeData(getTransformWriter(), new TableCsvData(table, new CsvData(DataEventType.INSERT,
new String[] { "1" }), new CsvData(DataEventType.INSERT, new String[] { "2" })));
List<CsvData> datas = mockWriter.writtenDatas.get(table.getFullyQualifiedTableName());
Assert.assertEquals(2, datas.size());
Assert.assertEquals("1", datas.get(0).getParsedData(CsvData.ROW_DATA)[0]);
Assert.assertEquals("2", datas.get(1).getParsedData(CsvData.ROW_DATA)[0]);
}
@Test
public void testTableNameChange() {
mockWriter.reset();
Table table = new Table("s1", new Column("id"));
writeData(getTransformWriter(), new TableCsvData(table, new CsvData(DataEventType.INSERT,
new String[] { "66" }), new CsvData(DataEventType.INSERT, new String[] { "77" })));
List<CsvData> datas = mockWriter.writtenDatas.get(table.getFullyQualifiedTableName());
Assert.assertNull(datas);
datas = mockWriter.writtenDatas.get("t1");
Assert.assertEquals(2, datas.size());
Assert.assertEquals("66", datas.get(0).getParsedData(CsvData.ROW_DATA)[0]);
Assert.assertEquals("77", datas.get(1).getParsedData(CsvData.ROW_DATA)[0]);
}
@Test
public void testAddColumn() {
mockWriter.reset();
Table table = new Table("s2", new Column("id"));
writeData(getTransformWriter(), new TableCsvData(table, new CsvData(DataEventType.INSERT,
new String[] { "2" }), new CsvData(DataEventType.INSERT, new String[] { "1" })));
List<CsvData> datas = mockWriter.writtenDatas.get(table.getFullyQualifiedTableName());
Assert.assertNull(datas);
datas = mockWriter.writtenDatas.get("t2");
Assert.assertEquals(2, datas.size());
Assert.assertEquals("2", datas.get(0).getParsedData(CsvData.ROW_DATA)[0]);
Assert.assertEquals("1", datas.get(1).getParsedData(CsvData.ROW_DATA)[0]);
Assert.assertEquals("added", datas.get(0).getParsedData(CsvData.ROW_DATA)[1]);
Assert.assertEquals("added", datas.get(1).getParsedData(CsvData.ROW_DATA)[1]);
}
@Test
public void testSimpleTableBeanShellMapping() throws Exception {
}
@Test
public void testTwoTablesMappedToOneInsert() throws Exception {
}
@Test
public void testTwoTablesMappedToOneDeleteUpdates() throws Exception {
}
@Test
public void testIgnoreRowExceptionFromBshMapping() throws Exception {
}
protected TransformWriter getTransformWriter() {
return new TransformWriter(platform, TransformPoint.LOAD, mockWriter, buildDefaultColumnTransforms(), new TransformTable[] {
new TransformTable("s1", "t1", TransformPoint.LOAD, new TransformColumn("id", "id",
true)),
new TransformTable("s2", "t2", TransformPoint.LOAD, new TransformColumn("id", "id",
true), new TransformColumn(null, "col2", false, "const", "added")) });
}
public static Map<String, IColumnTransform<?>> buildDefaultColumnTransforms() {
Map<String, IColumnTransform<?>> columnTransforms = new HashMap<String, IColumnTransform<?>>();
addColumnTransform(AdditiveColumnTransform.NAME, columnTransforms, new AdditiveColumnTransform());
addColumnTransform(JavaColumnTransform.NAME, columnTransforms, new JavaColumnTransform());
addColumnTransform(ConstantColumnTransform.NAME, columnTransforms, new ConstantColumnTransform());
addColumnTransform(CopyColumnTransform.NAME, columnTransforms, new CopyColumnTransform());
addColumnTransform(IdentityColumnTransform.NAME, columnTransforms, new IdentityColumnTransform());
addColumnTransform(MultiplierColumnTransform.NAME, columnTransforms, new MultiplierColumnTransform());
addColumnTransform(SubstrColumnTransform.NAME, columnTransforms, new SubstrColumnTransform());
addColumnTransform(LeftColumnTransform.NAME, columnTransforms, new LeftColumnTransform());
addColumnTransform(BinaryLeftColumnTransform.NAME, columnTransforms, new BinaryLeftColumnTransform());
addColumnTransform(RemoveColumnTransform.NAME, columnTransforms, new RemoveColumnTransform());
addColumnTransform(MathColumnTransform.NAME, columnTransforms, new MathColumnTransform());
addColumnTransform(ValueMapColumnTransform.NAME, columnTransforms, new ValueMapColumnTransform());
addColumnTransform(CopyIfChangedColumnTransform.NAME, columnTransforms, new CopyIfChangedColumnTransform());
addColumnTransform(ColumnsToRowsKeyColumnTransform.NAME, columnTransforms, new ColumnsToRowsKeyColumnTransform());
addColumnTransform(ColumnsToRowsValueColumnTransform.NAME, columnTransforms, new ColumnsToRowsValueColumnTransform());
addColumnTransform(ClarionDateTimeColumnTransform.NAME, columnTransforms, new ClarionDateTimeColumnTransform());
return columnTransforms;
}
public static void addColumnTransform(String name, Map<String, IColumnTransform<?>> columnTransforms, IColumnTransform<?> columnTransform) {
columnTransforms.put(name, columnTransform);
}
}