/*
* Copyright 2007 - 2017 the original author or authors.
*
* 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 net.sf.jailer;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import net.sf.jailer.database.BasicDataSource;
import net.sf.jailer.database.Session;
import net.sf.jailer.ui.CommandLineInstance;
import net.sf.jailer.util.SqlScriptExecutor;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSet;
import org.dbunit.operation.DatabaseOperation;
/**
* Tests export feature.
*
* @author Ralf Wisser
*/
public class ExportTestCase extends DbmsAwareTestCase {
private final File testDir;
private final File datamodelDir;
private final File initialDataset;
private final File expectedResult;
private final String format;
private final String scope;
private final boolean overwrite;
/**
* Constructor.
*
* @param name test case name
* @param initialDataset initial data
*/
public ExportTestCase(String name, File testDir, File datamodelDir, File initialDataset, File expectedResult, String format, String scope, boolean overwrite) {
super(name);
this.testDir = testDir;
this.datamodelDir = datamodelDir;
this.initialDataset = initialDataset;
this.expectedResult = expectedResult;
this.scope = scope;
this.format = format;
this.overwrite = overwrite;
}
/**
* Gets data set holding the initial DB state.
*/
protected IDataSet getDataSet() throws Exception {
return new FlatXmlDataSet(initialDataset, false, true);
}
/**
* Tests export.
*/
public void testExport() throws Exception {
File resultDir = new File(testDir, "result");
if (!resultDir.exists()) {
resultDir.mkdir();
}
File result = null;
if ("SQL".equals(format)) {
result = new File(resultDir, "export.sql");
}
if ("DBUNIT_FLAT_XML".equals(format)) {
result = new File(resultDir, "export-dataset.xml");
}
if ("XML".equals(format)) {
result = new File(resultDir, "export.xml");
}
if (!doExport(datamodelDir, new File(testDir, "extractionmodel.csv"), result, scope, format, overwrite)) {
return;
}
if (format.equals("DBUNIT_FLAT_XML")) {
assertEqualDatasets(expectedResult, result);
}
if (format.equals("SQL")) {
DatabaseOperation.DELETE_ALL.execute(getConnection(), getDataSet());
BasicDataSource dataSource = new BasicDataSource(connectionArguments.get(0), connectionArguments.get(1), connectionArguments.get(2), connectionArguments.get(3), 0);
Session statementExecutor = new Session(dataSource, dataSource.dbms);
new SqlScriptExecutor(statementExecutor, 1).executeScript(result.getCanonicalPath());
statementExecutor.shutDown();
assertDatabaseState(expectedResult.getCanonicalPath());
}
if (format.equals("XML")) {
assertTrue(XmlDocumentComparator.equals(
XmlDocumentComparator.parseXmlDocument(new File(testDir, "expected-xml.xml")),
XmlDocumentComparator.parseXmlDocument(result)));
}
}
/**
* Exports data.
*
* @param extractionModel extraction model file name
* @param scope GLOBAL or SESSION_LOCAL
* @param format
* @param overwrite
*/
private boolean doExport(File datamodel, File extractionModel, File result, String scope, String format, boolean overwrite) throws Exception {
if ("SESSION_LOCAL".equals(scope)) {
if (!"yes".equals(System.getProperty("DB_SUPPORTS_SESSION_LOCAL"))) {
return false;
}
} else {
List<String> ddlArgs = new ArrayList<String>();
ddlArgs.add("create-ddl");
ddlArgs.addAll(connectionArguments);
ddlArgs.add("-datamodel");
ddlArgs.add(datamodel.getCanonicalPath());
Jailer.main(ddlArgs.toArray(new String[0]));
}
List<String> args = new ArrayList<String>();
args.add("export");
args.add(extractionModel.getCanonicalPath());
args.addAll(connectionArguments);
args.add("-e");
args.add(result.getCanonicalPath());
args.add("-datamodel");
args.add(datamodel.getCanonicalPath());
args.add("-script-enhancer");
args.add(datamodel.getParent());
args.add("-scope");
args.add(scope);
args.add("-format");
args.add(format);
if (overwrite) {
args.add("-upsert-only");
}
System.out.println(args);
Jailer.main(args.toArray(new String[0]));
return true;
}
public String toString() {
return super.toString() + ": " + testDir + ", " + format + ", " + scope;
}
}