Skip to content
Snippets Groups Projects
Commit a3d2f5cd authored by brinn's avatar brinn
Browse files

fix: detection of non-admin java migration steps

add: support for non-admin and admin java migration steps in one migration script
change: allow specification of java migration steps anywhere in the migration script (was: just the first line)

SVN: 11111
parent c298ff59
No related branches found
No related tags found
No related merge requests found
......@@ -26,7 +26,7 @@ import ch.systemsx.cisd.common.logging.LogCategory;
import ch.systemsx.cisd.common.logging.LogFactory;
import ch.systemsx.cisd.common.parser.Line;
import ch.systemsx.cisd.common.parser.ParserUtilities;
import ch.systemsx.cisd.common.parser.filter.NonEmptyLineFilter;
import ch.systemsx.cisd.common.parser.filter.ILineFilter;
import ch.systemsx.cisd.common.utilities.ClassUtils;
import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
......@@ -76,18 +76,30 @@ public class MigrationStepExecutor extends SimpleJdbcDaoSupport implements IMigr
{
return null;
}
final Line firstNonEmptyLineOrNull =
ParserUtilities.tryGetFirstAcceptedLine(content, NonEmptyLineFilter.INSTANCE);
if (firstNonEmptyLineOrNull != null)
final ParserUtilities.LineSplitter splitter =
new ParserUtilities.LineSplitter(content, new ILineFilter()
{
public boolean acceptLine(String line, int lineNumber)
{
return StringUtils.isNotBlank(line) && line.startsWith("--");
}
});
IMigrationStep stepOrNull = null;
Line lineOrNull;
while (stepOrNull == null && (lineOrNull = splitter.tryNextLine()) != null)
{
return tryExtractMigrationStepFromLine(firstNonEmptyLineOrNull.getText());
stepOrNull = tryExtractMigrationStepFromLine(lineOrNull.getText());
}
return null;
return stepOrNull;
}
private final IMigrationStep tryExtractMigrationStepFromLine(final String lineToProcess)
{
final String line = StringUtils.deleteWhitespace(lineToProcess);
if (isAdmin == false && line.startsWith(JAVA_ADMIN_MIGRATION_STEP_PREFIX))
{
return null;
}
final String prefix =
isAdmin ? JAVA_ADMIN_MIGRATION_STEP_PREFIX : JAVA_MIGRATION_STEP_PREFIX;
if (line != null && line.startsWith(prefix))
......
/*
* Copyright 2008 ETH Zuerich, CISD
*
* 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 ch.systemsx.cisd.dbmigration.java;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.testng.AssertJUnit;
import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
/**
* A <code>IMigrationStep</code> implementation for test.
*
* @author Izabela Adamczyk
*/
public final class MigrationStepAdminFrom001To002 implements IMigrationStep
{
public static MigrationStepAdminFrom001To002 instance;
public final DatabaseConfigurationContext context;
public boolean preMigrationPerformed;
public boolean postMigrationPerformed;
public MigrationStepAdminFrom001To002(DatabaseConfigurationContext context)
{
AssertJUnit.assertNull("MigrationStepAdminFrom001To002 intance expected to be null",
instance);
this.context = context;
instance = this;
}
//
// IMigrationStep
//
public final void performPostMigration(final SimpleJdbcTemplate simpleJdbcTemplate)
throws DataAccessException
{
postMigrationPerformed = true;
}
public final void performPreMigration(final SimpleJdbcTemplate simpleJdbcTemplate)
throws DataAccessException
{
preMigrationPerformed = true;
}
}
......@@ -18,6 +18,9 @@ package ch.systemsx.cisd.dbmigration.java;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertSame;
import static org.testng.AssertJUnit.assertTrue;
import static org.testng.AssertJUnit.fail;
import org.apache.log4j.Level;
......@@ -41,7 +44,7 @@ import ch.systemsx.cisd.dbmigration.DatabaseConfigurationContext;
public final class MigrationStepExecutorTest
{
private DatabaseConfigurationContext dbContext;
private BufferedAppender logRecorder;
@BeforeMethod
......@@ -72,6 +75,7 @@ public final class MigrationStepExecutorTest
migrationStepExecutor.finish();
assertEquals("Migration step class 'MigrationStepFrom001To002' found for "
+ "migration script '001To002.sql'.", logRecorder.getLogContent());
assertSame(dbContext.getDataSource(), migrationStepExecutor.getDataSource());
logRecorder.resetLogContent();
script =
new Script("001To002.sql", "\n\n \n"
......@@ -81,14 +85,78 @@ public final class MigrationStepExecutorTest
+ "migration script '001To002.sql'.", logRecorder.getLogContent());
}
@Test
public final void testConfusionAdmin()
{
final MigrationStepExecutor migrationStepExecutor =
new MigrationStepExecutor(dbContext, false);
Script script =
new Script("001To002.sql",
"-- JAVA_ADMIN ch.systemsx.cisd.dbmigration.java.MigrationStepFrom001To002");
migrationStepExecutor.init(script);
migrationStepExecutor.performPreMigration();
migrationStepExecutor.performPostMigration();
migrationStepExecutor.finish();
assertTrue(logRecorder.getLogContent().indexOf(
"Migration step class 'MigrationStepFrom001To002' found for "
+ "migration script '001To002.sql'.") < 0);
logRecorder.resetLogContent();
script =
new Script("001To002.sql", "\n\n \n"
+ "--JAVA_ADMINch.systemsx.cisd.dbmigration.java.MigrationStepFrom001To002");
migrationStepExecutor.init(script);
assertTrue(logRecorder.getLogContent().indexOf(
"Migration step class 'MigrationStepFrom001To002' found for "
+ "migration script '001To002.sql'.") < 0);
}
@Test
public final void testHappyCaseAdmin()
{
MigrationStepAdminFrom001To002.instance = null;
final MigrationStepExecutor migrationStepExecutor =
new MigrationStepExecutor(dbContext, true);
Script script =
new Script("001To002.sql",
"-- JAVA_ADMIN ch.systemsx.cisd.dbmigration.java.MigrationStepFrom001To002");
"-- JAVA_ADMIN ch.systemsx.cisd.dbmigration.java.MigrationStepAdminFrom001To002");
migrationStepExecutor.init(script);
assertNotNull(MigrationStepAdminFrom001To002.instance);
assertSame(dbContext, MigrationStepAdminFrom001To002.instance.context);
assertFalse(MigrationStepAdminFrom001To002.instance.preMigrationPerformed);
migrationStepExecutor.performPreMigration();
assertTrue(MigrationStepAdminFrom001To002.instance.preMigrationPerformed);
assertFalse(MigrationStepAdminFrom001To002.instance.postMigrationPerformed);
migrationStepExecutor.performPostMigration();
assertTrue(MigrationStepAdminFrom001To002.instance.postMigrationPerformed);
migrationStepExecutor.finish();
assertEquals("Migration step class 'MigrationStepAdminFrom001To002' found for "
+ "migration script '001To002.sql'.", logRecorder.getLogContent());
assertSame(dbContext.getAdminDataSource(), migrationStepExecutor.getDataSource());
logRecorder.resetLogContent();
MigrationStepAdminFrom001To002.instance = null;
script =
new Script(
"001To002.sql",
"\n\n \n"
+ "--JAVA_ADMIN ch.systemsx.cisd.dbmigration.java.MigrationStepAdminFrom001To002");
migrationStepExecutor.init(script);
assertEquals("Migration step class 'MigrationStepAdminFrom001To002' found for "
+ "migration script '001To002.sql'.", logRecorder.getLogContent());
}
@Test
public final void testHappyCaseNormalAndAdmin()
{
MigrationStepAdminFrom001To002.instance = null;
final MigrationStepExecutor migrationStepExecutor =
new MigrationStepExecutor(dbContext, false);
final MigrationStepExecutor migrationStepExecutorAdmin =
new MigrationStepExecutor(dbContext, true);
Script script =
new Script(
"001To002.sql",
"-- JAVA ch.systemsx.cisd.dbmigration.java.MigrationStepFrom001To002\n"
+ "-- JAVA_ADMIN ch.systemsx.cisd.dbmigration.java.MigrationStepAdminFrom001To002");
migrationStepExecutor.init(script);
migrationStepExecutor.performPreMigration();
migrationStepExecutor.performPostMigration();
......@@ -96,12 +164,27 @@ public final class MigrationStepExecutorTest
assertEquals("Migration step class 'MigrationStepFrom001To002' found for "
+ "migration script '001To002.sql'.", logRecorder.getLogContent());
logRecorder.resetLogContent();
migrationStepExecutorAdmin.init(script);
migrationStepExecutorAdmin.performPreMigration();
migrationStepExecutorAdmin.performPostMigration();
migrationStepExecutorAdmin.finish();
assertEquals("Migration step class 'MigrationStepAdminFrom001To002' found for "
+ "migration script '001To002.sql'.", logRecorder.getLogContent());
logRecorder.resetLogContent();
MigrationStepAdminFrom001To002.instance = null;
script =
new Script("001To002.sql", "\n\n \n"
+ "--JAVA_ADMIN ch.systemsx.cisd.dbmigration.java.MigrationStepFrom001To002");
new Script(
"001To002.sql",
"\n\n \n"
+ "--JAVA ch.systemsx.cisd.dbmigration.java.MigrationStepFrom001To002\n \n \n\n"
+ "-- JAVA_ADMIN ch.systemsx.cisd.dbmigration.java.MigrationStepAdminFrom001To002");
migrationStepExecutor.init(script);
assertEquals("Migration step class 'MigrationStepFrom001To002' found for "
+ "migration script '001To002.sql'.", logRecorder.getLogContent());
logRecorder.resetLogContent();
migrationStepExecutorAdmin.init(script);
assertEquals("Migration step class 'MigrationStepAdminFrom001To002' found for "
+ "migration script '001To002.sql'.", logRecorder.getLogContent());
}
@Test
......@@ -128,13 +211,12 @@ public final class MigrationStepExecutorTest
}
@Test
public final void testUnhappyCase()
public final void testUnhappyCases()
{
final MigrationStepExecutor migrationStepExecutor =
new MigrationStepExecutor(dbContext, false);
Script script =
new Script("002To003.sql", "\n-- This is a comment\n"
+ "-- JAVA ch.systemsx.cisd.dbmigration.java.MigrationStepFrom002To003");
new Script("002To003.sql", "\n-- This is a comment\n-- This is another comment\n");
migrationStepExecutor.init(script);
assertEquals("No migration step class found for migration script '002To003.sql'.",
logRecorder.getLogContent());
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment