StringWriter buf = new StringWriter();
DataSourceAdapter invalid = new DataSourceAdapter("InvalidAdapter");
DataSourceAdapter valid = new DataSourceAdapter("ValidAdapter");
RelationalDatabase ds = new RelationalDatabase("DataSource");
RelationalSchema schema = new RelationalSchema();
final Upgrade upgrade = new Upgrade(null);
XMLMetadata metadata = new XMLMetadata(null, null, null, null, null)
{
public Upgrade getUpgrade(String sName) { return upgrade; }
};
SQLSchemaManager manager = m_adapter.createSchemaManager();
RelationalSchemaUpgrade upgradeVersion;
ds.setAdapter(valid);
ds.setComponent(new Component("Component"));
ds.setSchema(schema);
ds.setType(new DataSourceType("DataSourceType"));
ds.getType().setMetadata(metadata);
ds.getType().addAdapter(ds.getAdapter());
ds.getType().addAdapter(invalid);
((RelationalDatabaseFragment)ds.getDefaultFragment()).setDatabase("Database");
metadata.addDataSource(ds);
manager.setSQLAppender(manager.new SQLWriterAppender(buf));
schema.setVersionTable(new Table(schema));
schema.getVersionTable().setName("VersionTable");
schema.addTable(schema.getVersionTable());
upgrade.setMetadata(metadata);
// setup for first upgrade version
ExecStep execStep = new ExecStep(); // step lacking match for current adapter
SQLScript stepScript = new SQLScript();
SQLStatement stepStmt = new SQLStatement();
stepStmt.addAdapter(invalid.getName(), ds.getType());
stepStmt.setSQL("SQLStatement SQL");
stepScript.addStatement(stepStmt);
execStep.getScriptHolder().addScript(stepScript);
// single incompatible step
metadata.setVersion("1-step");
upgradeVersion = new RelationalSchemaUpgrade(metadata.getVersion());
upgradeVersion.addStep(execStep);
upgradeVersion.setDataSource(ds);
upgrade.addVersion(upgradeVersion);
try
{
upgrade.validate(null, null); // must fail since an incompatible step "1-step" exists
fail(); // exception expected
}
catch (MetadataException e)
{
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertEquals("err.meta.sql.statementAdapter", e.getErrorCode());
}
try
{
manager.upgrade(schema, null); //must fail since no compatible versions found to start with
fail(); // exception expected
}
catch (MetadataException e)
{
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertEquals("err.meta.sql.statementAdapter", e.getErrorCode());
}
try
{
manager.upgrade(schema, "1-step"); // must fail since step "1-step" is incompatible
fail(); // exception expected
}
catch (MetadataException e)
{
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertEquals("err.meta.sql.statementAdapter", e.getErrorCode());
}
// setup for second upgrade version
SupportAdapterStep adapterStep = new SupportAdapterStep();
CreateTableStep createTableStep = new CreateTableStep(); // step has match for current adapter
Table table = new Table(schema);
SQLScript tableScript = new SQLScript();
SQLStatement tableStmtInvalid = new SQLStatement();
SQLStatement tableStmtValid = new SQLStatement();
tableStmtInvalid.addAdapter(invalid.getName(), ds.getType());
tableStmtInvalid.setSQL("SQLStatement Table SQL Invalid");
tableStmtValid.addAdapter(ds.getAdapter().getName(), ds.getType());
tableStmtValid.setSQL("SQLStatement Table SQL Valid");
tableScript.addStatement(tableStmtValid);
tableScript.addStatement(tableStmtInvalid);
tableScript.addStatement(stepStmt);
table.setName("Table");
table.setType(Table.VIEW);
table.setViewScript(tableScript);
schema.addTable(table);
createTableStep.setName(table.getName());
createTableStep.setType(table.getType());
createTableStep.setViewScript(tableScript);
adapterStep.setAdapter(invalid);
// incompatible step -> compatible step
metadata.setVersion("2-step");
upgradeVersion = new RelationalSchemaUpgrade(metadata.getVersion());
upgradeVersion.addStep(adapterStep);
upgradeVersion.addStep(createTableStep);
upgradeVersion.setDataSource(ds);
upgrade.addVersion(upgradeVersion);
try
{
upgrade.validate(null, null); // must fail since an incompatible step "1-step" exists
fail(); // exception expected
}
catch (MetadataException e)
{
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertEquals("err.meta.sql.statementAdapter", e.getErrorCode());
}
try
{
manager.upgrade(schema, null); // must fail since an incompatible step "1-step" exists
fail(); // exception expected
}
catch (MetadataException e)
{
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertEquals("err.meta.sql.statementAdapter", e.getErrorCode());
}
buf.getBuffer().setLength(0);
ds.setAdapter(invalid);
manager.upgrade(schema, "2-step"); // validation of invalid adapter should not be prevented
AssertUtil.assertContained(tableStmtInvalid.getSQL(), buf.toString());
ds.setAdapter(valid);
try
{
manager.upgrade(schema, "2-step"); // must fail since validating current adapter from start
fail(); // exception expected
}
catch (MetadataException e)
{
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertTrue(e.getCause() instanceof MetadataException);
e = (MetadataException)e.getCause();
assertEquals("err.meta.sql.statementAdapter", e.getErrorCode());
}
adapterStep.setAdapter(ds.getAdapter());
upgrade.validate(null, null); // must pass since adapter validation from "2-step"
buf.getBuffer().setLength(0);
manager.upgrade(schema, null); // must upgrade starting from "2-step"
AssertUtil.assertContained(tableStmtValid.getSQL(), buf.toString());
// setup for third upgrade version
CreateColumnStep createColumnStep = new CreateColumnStep(); // step lacking match for adapter
Column column = new Column("Column", table);
ColumnOutline outline = new ColumnOutline(column.getName());
column.setType(Primitive.INTEGER);
table.addColumn(column);
outline.setType(column.getType());
createColumnStep.setOutline(outline);
createColumnStep.setTableName(table.getName());
createColumnStep.getScriptHolder().addScript(stepScript);
// incompatible step -> compatible step -> incompatible step
metadata.setVersion("3-step");
upgradeVersion = new RelationalSchemaUpgrade(metadata.getVersion());
upgradeVersion.addStep(createColumnStep);
upgradeVersion.setDataSource(ds);
upgrade.addVersion(upgradeVersion);
try
{
upgrade.validate(null, null);//must fail since an incompatible step exists after compatible
fail(); // exception expected
}
catch (MetadataException e)
{
assertTrue(e.getCause() instanceof MetadataException);