/**
* 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.service.impl;
import java.io.BufferedWriter;
import java.io.StringWriter;
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.jumpmind.symmetric.TestConstants;
import org.jumpmind.symmetric.model.OutgoingBatch;
import org.jumpmind.symmetric.model.ProcessInfo;
import org.jumpmind.symmetric.model.Router;
import org.jumpmind.symmetric.model.Trigger;
import org.jumpmind.symmetric.model.TriggerRouter;
import org.jumpmind.symmetric.service.IDataExtractorService;
import org.jumpmind.symmetric.service.ITriggerRouterService;
import org.jumpmind.symmetric.transport.internal.InternalOutgoingTransport;
import org.junit.Before;
import org.junit.Test;
public abstract class AbstractDataExtractorServiceTest extends AbstractServiceTest {
protected static final String TEST_TABLE = "test_extract_table";
private static int id = 0;
@Before
public void setupForTest() {
ITriggerRouterService triggerRouterService = getTriggerRouterService();
TriggerRouter triggerRouter = triggerRouterService.findTriggerRouterById(true, TEST_TABLE,
TestConstants.ROUTER_ID_ROOT_2_TEST);
if (triggerRouter == null) {
triggerRouter = new TriggerRouter(
new Trigger(TEST_TABLE, TestConstants.TEST_CHANNEL_ID), new Router(
TestConstants.ROUTER_ID_ROOT_2_TEST, TestConstants.ROOT_2_TEST));
triggerRouterService.saveTriggerRouter(triggerRouter);
triggerRouterService.syncTriggers();
getDbDialect().truncateTable(TEST_TABLE);
}
resetBatches();
}
@Test
public void testExtractConfigurationStandalone() throws Exception {
IDataExtractorService dataExtractorService = getDataExtractorService();
StringWriter writer = new StringWriter();
dataExtractorService.extractConfigurationStandalone(TestConstants.TEST_CLIENT_NODE, writer);
String content = writer.getBuffer().toString();
assertNumberOfLinesThatStartWith(25, "table,", content, false, true);
assertNumberOfLinesThatStartWith(23, "columns,", content);
assertNumberOfLinesThatStartWith(23, "keys,", content);
assertNumberOfLinesThatStartWith(23, "sql,", content);
assertNumberOfLinesThatStartWith(0, "update,", content);
assertNumberOfLinesThatStartWith(65, "insert,", content, false, true);
assertNumberOfLinesThatStartWith(1, "commit,-9999", content);
assertNumberOfLinesThatStartWith(1, "batch,-9999", content);
assertNumberOfLinesThatStartWith(1, "nodeid,", content);
assertNumberOfLinesThatStartWith(1, "binary,", content);
}
@Test
public void testNothingToExtract() {
ExtractResults results = extract();
assertNotNull(results.getBatches());
assertEquals(0, results.getBatches().size());
assertTrue(StringUtils.isBlank(results.getCsv()));
}
@Test
public void testExtractOneBatchOneRow() {
save(new TestExtract(id++, "abc 123", "abcdefghijklmnopqrstuvwxyz", new Timestamp(
System.currentTimeMillis()), new Date(System.currentTimeMillis()), true,
Integer.MAX_VALUE, new BigDecimal(Double.toString(Math.PI))));
routeAndCreateGaps();
ExtractResults results = extract();
assertNotNull(results.getBatches());
assertEquals(1, results.getBatches().size());
assertNumberOfLinesThatStartWith(1, "insert,", results.getCsv());
long batchId = results.getBatches().get(0).getBatchId();
assertNumberOfLinesThatStartWith(1, "batch," + batchId, results.getCsv());
assertNumberOfLinesThatStartWith(1, "commit," + batchId, results.getCsv());
assertNumberOfLinesThatStartWith(1, "table," + TEST_TABLE, results.getCsv(), true, false);
// same batch should be extracted
results = extract();
assertNumberOfLinesThatStartWith(1, "batch," + batchId, results.getCsv());
assertNumberOfLinesThatStartWith(1, "commit," + batchId, results.getCsv());
}
protected ExtractResults extract() {
IDataExtractorService service = getDataExtractorService();
StringWriter writer = new StringWriter();
InternalOutgoingTransport transport = new InternalOutgoingTransport(new BufferedWriter(
writer));
List<OutgoingBatch> batches = service.extract(new ProcessInfo(), TestConstants.TEST_CLIENT_NODE, transport);
return new ExtractResults(batches, writer.getBuffer().toString());
}
protected void save(TestExtract obj) {
String updateSql = String
.format("update %s set varchar_value=?, longvarchar_value=?, timestamp_value=?, date_value=?, bit_value=?, bigint_value=?, decimal_value=? where id=?",
TEST_TABLE);
String insertSql = String
.format("insert into %s (varchar_value, longvarchar_value, timestamp_value, date_value, bit_value, bigint_value, decimal_value, id) values(?,?,?,?,?,?,?,?)",
TEST_TABLE);
if (0 == getSqlTemplate().update(
updateSql,
new Object[] { obj.getVarcharValue(), obj.getLongVarcharValue(),
obj.getTimestampValue(), obj.getDateValue(), obj.isBitValue(),
obj.getBigIntValue(), obj.getDecimalValue(), obj.getId() },
new int[] { Types.VARCHAR, Types.VARCHAR, Types.TIMESTAMP, Types.DATE, Types.BIT,
Types.NUMERIC, Types.NUMERIC, Types.NUMERIC })) {
getSqlTemplate().update(
insertSql,
new Object[] { obj.getVarcharValue(), obj.getLongVarcharValue(),
obj.getTimestampValue(), obj.getDateValue(), obj.isBitValue(),
obj.getBigIntValue(), obj.getDecimalValue(), obj.getId() },
new int[] { Types.VARCHAR, Types.VARCHAR, Types.TIMESTAMP, Types.DATE,
Types.BIT, Types.NUMERIC, Types.NUMERIC, Types.NUMERIC });
}
}
class ExtractResults {
private List<OutgoingBatch> batches;
private String csv;
public ExtractResults(List<OutgoingBatch> batches, String csv) {
this.batches = batches;
this.csv = csv;
}
public List<OutgoingBatch> getBatches() {
return batches;
}
public String getCsv() {
return csv;
}
}
class TestExtract {
private int id;
private String varcharValue;
private String longVarcharValue;
private Timestamp timestampValue;
private Date dateValue;
private boolean bitValue;
private long bigIntValue;
private BigDecimal decimalValue;
public TestExtract(int id, String varcharValue, String longVarcharValue,
Timestamp timestampValue, Date dateValue, boolean bitValue, long bigIntValue,
BigDecimal decimalValue) {
this.id = id;
this.varcharValue = varcharValue;
this.longVarcharValue = longVarcharValue;
this.timestampValue = timestampValue;
this.dateValue = dateValue;
this.bitValue = bitValue;
this.bigIntValue = bigIntValue;
this.decimalValue = decimalValue;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getVarcharValue() {
return varcharValue;
}
public void setVarcharValue(String varcharValue) {
this.varcharValue = varcharValue;
}
public String getLongVarcharValue() {
return longVarcharValue;
}
public void setLongVarcharValue(String longVarcharValue) {
this.longVarcharValue = longVarcharValue;
}
public Timestamp getTimestampValue() {
return timestampValue;
}
public void setTimestampValue(Timestamp timestampValue) {
this.timestampValue = timestampValue;
}
public Date getDateValue() {
return dateValue;
}
public void setDateValue(Date dateValue) {
this.dateValue = dateValue;
}
public boolean isBitValue() {
return bitValue;
}
public void setBitValue(boolean bitValue) {
this.bitValue = bitValue;
}
public long getBigIntValue() {
return bigIntValue;
}
public void setBigIntValue(long bigIntValue) {
this.bigIntValue = bigIntValue;
}
public BigDecimal getDecimalValue() {
return decimalValue;
}
public void setDecimalValue(BigDecimal decimalValue) {
this.decimalValue = decimalValue;
}
}
}