diff --git a/src/main/java/org/apache/ibatis/migration/FileMigrationLoader.java b/src/main/java/org/apache/ibatis/migration/FileMigrationLoader.java index 27fdef36..47673289 100644 --- a/src/main/java/org/apache/ibatis/migration/FileMigrationLoader.java +++ b/src/main/java/org/apache/ibatis/migration/FileMigrationLoader.java @@ -27,11 +27,11 @@ import org.apache.ibatis.migration.utils.Util; public class FileMigrationLoader implements MigrationLoader { - private final File scriptsDir; + protected final File scriptsDir; - private final String charset; + protected final String charset; - private final Properties variables; + protected final Properties variables; public FileMigrationLoader(File scriptsDir, String charset, Properties variables) { super(); @@ -59,11 +59,11 @@ public List getMigrations() { return migrations; } - private boolean isSpecialFile(String filename) { + protected boolean isSpecialFile(String filename) { return "bootstrap.sql".equals(filename) || "onabort.sql".equals(filename); } - private Change parseChangeFromFilename(String filename) { + protected Change parseChangeFromFilename(String filename) { try { Change change = new Change(); int lastIndexOfDot = filename.lastIndexOf("."); @@ -105,7 +105,7 @@ public Reader getOnAbortReader() { return getSoleScriptReader(fileName); } - private Reader getSoleScriptReader(String fileName) { + protected Reader getSoleScriptReader(String fileName) { try { File scriptFile = Util.file(scriptsDir, fileName); if (scriptFile.exists()) { diff --git a/src/main/java/org/apache/ibatis/migration/FileMigrationLoaderFactory.java b/src/main/java/org/apache/ibatis/migration/FileMigrationLoaderFactory.java new file mode 100644 index 00000000..8c9e6df7 --- /dev/null +++ b/src/main/java/org/apache/ibatis/migration/FileMigrationLoaderFactory.java @@ -0,0 +1,23 @@ +/** + * Copyright 2010-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 org.apache.ibatis.migration; + +import java.io.File; +import java.util.Properties; + +public interface FileMigrationLoaderFactory { + MigrationLoader create(File scriptsDir, String charset, Properties variables); +} diff --git a/src/main/java/org/apache/ibatis/migration/commands/BaseCommand.java b/src/main/java/org/apache/ibatis/migration/commands/BaseCommand.java index 4b24304b..f9b8e078 100644 --- a/src/main/java/org/apache/ibatis/migration/commands/BaseCommand.java +++ b/src/main/java/org/apache/ibatis/migration/commands/BaseCommand.java @@ -36,6 +36,7 @@ import java.util.Date; import java.util.List; import java.util.Properties; +import java.util.ServiceLoader; import java.util.TimeZone; import org.apache.ibatis.datasource.unpooled.UnpooledDataSource; @@ -45,6 +46,7 @@ import org.apache.ibatis.migration.DataSourceConnectionProvider; import org.apache.ibatis.migration.Environment; import org.apache.ibatis.migration.FileMigrationLoader; +import org.apache.ibatis.migration.FileMigrationLoaderFactory; import org.apache.ibatis.migration.MigrationException; import org.apache.ibatis.migration.MigrationLoader; import org.apache.ibatis.migration.hook.FileHookScriptFactory; @@ -301,8 +303,17 @@ private File getCustomDriverPath() { } protected MigrationLoader getMigrationLoader() { - return new FileMigrationLoader(paths.getScriptPath(), environment().getScriptCharset(), - environment().getVariables()); + File scriptPath = paths.getScriptPath(); + String scriptCharset = environment().getScriptCharset(); + Properties variables = environment().getVariables(); + MigrationLoader migrationLoader = null; + for (FileMigrationLoaderFactory factory : ServiceLoader.load(FileMigrationLoaderFactory.class)) { + if (migrationLoader != null) { + throw new MigrationException("Found multiple implementations of FileMigrationLoaderFactory via SPI."); + } + migrationLoader = factory.create(scriptPath, scriptCharset, variables); + } + return migrationLoader != null ? migrationLoader : new FileMigrationLoader(scriptPath, scriptCharset, variables); } protected MigrationHook createUpHook() {