diff --git a/src/main/asciidoc/user-guide.adoc b/src/main/asciidoc/user-guide.adoc index 21677f6..9aa9423 100644 --- a/src/main/asciidoc/user-guide.adoc +++ b/src/main/asciidoc/user-guide.adoc @@ -1030,13 +1030,8 @@ If does not match all, it throw an exception that indicate not found a template * `com/example/mapper/BaseMapper/BaseMapper-{methodName}.sql` + (fallback using declaring class of mapper method and default database) -If you want to customize the template file path format, please call static setter methods of the `TemplateFilePathProvider`. - -[NOTE] -==== -If you applied an user defined `ThymeleafLanguageDriverConfig` for `ThymeleafLanguageDriver`, -please apply same instance to the `TemplateFilePathProvider` using the `setLanguageDriverConfig` method. -==== +If you want to customize the template file path format, +you can customize using the <> that start with `template-file.path-provider`. == Cautions for usage @@ -1129,6 +1124,28 @@ The mybatis-thymeleaf provides following properties for customizing configuratio |`String[]` |`"*.sql"` +4+|*Template file path provider configuration(TemplateFilePathProvider)* + +|`template-file.path-provider.prefix` +|The prefix for adding to template file path +|`String` +|`""` + +|`template-file.path-provider.includes-package-path` +|Whether includes package path part +|`Boolean` +|`true` (includes package path) + +|`template-file.path-provider.separate-directory-per-mapper` +|Whether separate directory per mapper +|`Boolean` +|`true` (separate directory per mapper) + +|`template-file.path-provider.includes-mapper-name-when-separate-directory` +|Whether includes mapper name into file name when separate directory per mapper +|`Boolean` +|`true` (includes mapper name) + 4+|*Dialect configuration* |`dialect.prefix` @@ -1157,13 +1174,17 @@ The mybatis-thymeleaf provides following properties for customizing configuratio [source,properties] .src/main/resources/mybatis-thymeleaf.properties ---- -use-2way = true +use-2way = false customizer = com.example.MyTemplateEngineCustomizer template-file.cache-enabled = true template-file.cache-ttl = 3600000 template-file.encoding = UTF-8 -template-file.base-dir = templates/sqls/ +template-file.base-dir = templates/ template-file.patterns = *sql, *.sql.template +template-file.path-provider.prefix = sqls/ +template-file.path-provider.includes-package-path = false +template-file.path-provider.separate-directory-per-mapper = false +template-file.path-provider.includes-mapper-name-when-separate-directory = false dialect.prefix = mybatis dialect.like-escape-char = ~ dialect.like-escape-clause-format = escape '%s' @@ -1178,13 +1199,17 @@ These properties can be specified via factory method of `ThymeleafLanguageDriver ---- configuration.getLanguageRegistry().register( new ThymeleafLanguageDriver(ThymeleafLanguageDriverConfig.newInstance(c -> { - c.setUse2way(true); + c.setUse2way(false); c.setCustomizer(CustomTemplateEngineCustomizer.class); c.getTemplateFile().setCacheEnabled(false); c.getTemplateFile().setCacheTtl(3600000L); c.getTemplateFile().setEncoding(StandardCharsets.UTF_8); - c.getTemplateFile().setBaseDir("templates/sqls/"); + c.getTemplateFile().setBaseDir("templates/"); c.getTemplateFile().setPatterns("*.sql", "*.sql.template"); + c.getTemplateFile().getPathProvider().setPrefix("sqls/"); + c.getTemplateFile().getPathProvider().setIncludesPackagePath(false); + c.getTemplateFile().getPathProvider().setSeparateDirectoryPerMapper(false); + c.getTemplateFile().getPathProvider().setIncludesMapperNameWhenSeparateDirectory(false); c.getDialect().setPrefix("mybatis"); c.getDialect().setLikeEscapeChar('~'); c.getDialect().setLikeEscapeClauseFormat("escape '%s'"); diff --git a/src/main/java/org/mybatis/scripting/thymeleaf/ThymeleafLanguageDriver.java b/src/main/java/org/mybatis/scripting/thymeleaf/ThymeleafLanguageDriver.java index 40fb61c..735a89a 100644 --- a/src/main/java/org/mybatis/scripting/thymeleaf/ThymeleafLanguageDriver.java +++ b/src/main/java/org/mybatis/scripting/thymeleaf/ThymeleafLanguageDriver.java @@ -29,6 +29,7 @@ import org.apache.ibatis.scripting.defaults.DefaultParameterHandler; import org.apache.ibatis.session.Configuration; import org.mybatis.scripting.thymeleaf.expression.Likes; +import org.mybatis.scripting.thymeleaf.support.TemplateFilePathProvider; import org.thymeleaf.ITemplateEngine; import org.thymeleaf.TemplateEngine; import org.thymeleaf.templatemode.TemplateMode; @@ -60,6 +61,7 @@ public ThymeleafLanguageDriver() { */ public ThymeleafLanguageDriver(ThymeleafLanguageDriverConfig config) { this.templateEngine = createDefaultTemplateEngine(config); + TemplateFilePathProvider.setLanguageDriverConfig(config); } /** diff --git a/src/main/java/org/mybatis/scripting/thymeleaf/ThymeleafLanguageDriverConfig.java b/src/main/java/org/mybatis/scripting/thymeleaf/ThymeleafLanguageDriverConfig.java index f94717d..a2c3ade 100644 --- a/src/main/java/org/mybatis/scripting/thymeleaf/ThymeleafLanguageDriverConfig.java +++ b/src/main/java/org/mybatis/scripting/thymeleaf/ThymeleafLanguageDriverConfig.java @@ -179,6 +179,11 @@ public static class TemplateFileConfig { */ private Long cacheTtl; + /** + * The template file path provider configuration. + */ + private final PathProviderConfig pathProvider = new PathProviderConfig(); + /** * Get the character encoding for reading template resource file. *

@@ -289,6 +294,136 @@ public void setCacheTtl(Long cacheTtl) { this.cacheTtl = cacheTtl; } + /** + * Get the template file path provider configuration. + * + * @return the template file path provider configuration + * @since 1.0.1 + */ + public PathProviderConfig getPathProvider() { + return pathProvider; + } + + /** + * The template file path provider configuration. + * + * @since 1.0.1 + */ + public static class PathProviderConfig { + + /** + * The prefix for adding to template file path. + */ + private String prefix = ""; + + /** + * Whether includes package path part. + */ + private boolean includesPackagePath = true; + + /** + * Whether separate directory per mapper. + */ + private boolean separateDirectoryPerMapper = true; + + /** + * Whether includes mapper name into file name when separate directory per mapper. + */ + private boolean includesMapperNameWhenSeparateDirectory = true; + + /** + * Get a prefix for adding to template file path. + *

+ * Default is {@code ""}. + *

+ * + * @return a prefix for adding to template file path + */ + public String getPrefix() { + return prefix; + } + + /** + * Set the prefix for adding to template file path. + * + * @param prefix + * The prefix for adding to template file path + */ + public void setPrefix(String prefix) { + this.prefix = prefix; + } + + /** + * Get whether includes package path part. + *

+ * Default is {@code true}. + *

+ * + * @return If includes package path, return {@code true} + */ + public boolean isIncludesPackagePath() { + return includesPackagePath; + } + + /** + * Set whether includes package path part. + * + * @param includesPackagePath + * If want to includes, set {@code true} + */ + public void setIncludesPackagePath(boolean includesPackagePath) { + this.includesPackagePath = includesPackagePath; + } + + /** + * Get whether separate directory per mapper. + * + * @return If separate directory per mapper, return {@code true} + */ + public boolean isSeparateDirectoryPerMapper() { + return separateDirectoryPerMapper; + } + + /** + * Set whether separate directory per mapper. + *

+ * Default is {@code true}. + *

+ * + * @param separateDirectoryPerMapper + * If want to separate directory, set {@code true} + */ + public void setSeparateDirectoryPerMapper(boolean separateDirectoryPerMapper) { + this.separateDirectoryPerMapper = separateDirectoryPerMapper; + } + + /** + * Get whether includes mapper name into file name when separate directory per mapper. + *

+ * Default is {@code true}. + *

+ * + * @return If includes mapper name, set {@code true} + */ + public boolean isIncludesMapperNameWhenSeparateDirectory() { + return includesMapperNameWhenSeparateDirectory; + } + + /** + * Set whether includes mapper name into file name when separate directory per mapper. + *

+ * Default is {@code true}. + *

+ * + * @param includesMapperNameWhenSeparateDirectory + * If want to includes, set {@code true} + */ + public void setIncludesMapperNameWhenSeparateDirectory(boolean includesMapperNameWhenSeparateDirectory) { + this.includesMapperNameWhenSeparateDirectory = includesMapperNameWhenSeparateDirectory; + } + + } + } /** @@ -465,6 +600,33 @@ public void setLikeAdditionalEscapeTargetChars(Character... likeAdditionalEscape * {@code "*.sql"} * * + * + * Template file path provider configuration(TemplateFilePathProvider) + * + * + * template-file.path-provider.prefix + * The prefix for adding to template file path + * {@code ""} + * + * + * + * template-file.path-provider.includes-package-path + * Whether includes package path part + * {@code true} + * + * + * + * template-file.patterns + * Whether separate directory per mapper + * {@code true} + * + * + * + * template-file.patterns + * Whether includes mapper name into file name when separate directory per mapper + * {@code true} + * + * * Dialect configuration * * diff --git a/src/main/java/org/mybatis/scripting/thymeleaf/support/TemplateFilePathProvider.java b/src/main/java/org/mybatis/scripting/thymeleaf/support/TemplateFilePathProvider.java index 49da85f..d13ae98 100644 --- a/src/main/java/org/mybatis/scripting/thymeleaf/support/TemplateFilePathProvider.java +++ b/src/main/java/org/mybatis/scripting/thymeleaf/support/TemplateFilePathProvider.java @@ -23,6 +23,7 @@ import org.apache.ibatis.io.Resources; import org.mybatis.scripting.thymeleaf.ThymeleafLanguageDriver; import org.mybatis.scripting.thymeleaf.ThymeleafLanguageDriverConfig; +import org.mybatis.scripting.thymeleaf.ThymeleafLanguageDriverConfig.TemplateFileConfig.PathProviderConfig; /** * The SQL provider class that return the SQL template file path.
@@ -71,65 +72,9 @@ public class TemplateFilePathProvider { private static final ThymeleafLanguageDriverConfig DEFAULT_LANGUAGE_DRIVER_CONFIG = ThymeleafLanguageDriverConfig .newInstance(); - private static String prefix = ""; - private static boolean includesPackagePath = true; - private static boolean separateDirectoryPerMapper = true; - private static boolean includesMapperNameWhenSeparateDirectory = true; private static PathGenerator pathGenerator = DEFAULT_PATH_GENERATOR; private static ThymeleafLanguageDriverConfig languageDriverConfig = DEFAULT_LANGUAGE_DRIVER_CONFIG; - /** - * Set a prefix for adding to template file path. - *

- * Default is {@code ""}. - *

- * - * @param prefix - * a prefix for adding to template file path - */ - public static void setPrefix(String prefix) { - TemplateFilePathProvider.prefix = Optional.ofNullable(prefix).orElse(""); - } - - /** - * Set whether includes package path part. - *

- * Default is {@code true}. - *

- * - * @param includesPackagePath - * If want to includes, set {@code true} - */ - public static void setIncludesPackagePath(boolean includesPackagePath) { - TemplateFilePathProvider.includesPackagePath = includesPackagePath; - } - - /** - * Set whether separate directory per mapper. - *

- * Default is {@code true}. - *

- * - * @param separateDirectoryPerMapper - * If want to separate directory, set {@code true} - */ - public static void setSeparateDirectoryPerMapper(boolean separateDirectoryPerMapper) { - TemplateFilePathProvider.separateDirectoryPerMapper = separateDirectoryPerMapper; - } - - /** - * Set whether includes mapper name into file name when separate directory per mapper. - *

- * Default is {@code true}. - *

- * - * @param includesMapperNameWhenSeparateDirectory - * If want to includes, set {@code true} - */ - public static void setIncludesMapperNameWhenSeparateDirectory(boolean includesMapperNameWhenSeparateDirectory) { - TemplateFilePathProvider.includesMapperNameWhenSeparateDirectory = includesMapperNameWhenSeparateDirectory; - } - /** * Set custom implementation for {@link PathGenerator}. * @@ -173,15 +118,6 @@ public static void setLanguageDriverConfig(ThymeleafLanguageDriverConfig languag * database) * *
- * If you want to customize path format, please call the following methods. - * * * @param context * a context of SQL provider @@ -225,17 +161,18 @@ private static String generateTemplatePath(Class type, Method method, String String packageName = pkg == null ? "" : pkg.getName(); String className = type.getName().substring(packageName.length() + (packageName.length() == 0 ? 0 : 1)); + PathProviderConfig pathProviderConfig = languageDriverConfig.getTemplateFile().getPathProvider(); StringBuilder path = new StringBuilder(); - if (!prefix.isEmpty()) { - path.append(prefix); + if (!pathProviderConfig.getPrefix().isEmpty()) { + path.append(pathProviderConfig.getPrefix()); } - if (includesPackagePath && !packageName.isEmpty()) { + if (pathProviderConfig.isIncludesPackagePath() && !packageName.isEmpty()) { path.append(packageName.replace('.', '/')).append('/'); } path.append(className); - if (separateDirectoryPerMapper) { + if (pathProviderConfig.isSeparateDirectoryPerMapper()) { path.append('/'); - if (includesMapperNameWhenSeparateDirectory) { + if (pathProviderConfig.isIncludesMapperNameWhenSeparateDirectory()) { path.append(className).append('-'); } } else { @@ -246,6 +183,7 @@ private static String generateTemplatePath(Class type, Method method, String path.append('-').append(databaseId); } path.append(".sql"); + System.out.println(path); return path.toString(); } diff --git a/src/test/java/org/mybatis/scripting/thymeleaf/ThymeleafLanguageDriverTest.java b/src/test/java/org/mybatis/scripting/thymeleaf/ThymeleafLanguageDriverTest.java index 543dc2f..a91e1a3 100644 --- a/src/test/java/org/mybatis/scripting/thymeleaf/ThymeleafLanguageDriverTest.java +++ b/src/test/java/org/mybatis/scripting/thymeleaf/ThymeleafLanguageDriverTest.java @@ -16,7 +16,6 @@ package org.mybatis.scripting.thymeleaf; import java.io.Reader; -import java.io.UncheckedIOException; import java.lang.reflect.InvocationTargetException; import java.nio.charset.StandardCharsets; import java.sql.Connection; @@ -47,6 +46,8 @@ import org.mybatis.scripting.thymeleaf.integrationtest.domain.Name; import org.mybatis.scripting.thymeleaf.integrationtest.mapper.NameMapper; import org.mybatis.scripting.thymeleaf.integrationtest.mapper.NameParam; +import org.mybatis.scripting.thymeleaf.integrationtest.mapper.TemplateFilePathProviderMapper; +import org.mybatis.scripting.thymeleaf.support.TemplateFilePathProvider; import org.thymeleaf.TemplateEngine; import org.thymeleaf.templatemode.TemplateMode; import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver; @@ -87,6 +88,12 @@ static void setUp() throws Exception { sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); } + @BeforeEach + @AfterEach + void cleanup() { + TemplateFilePathProvider.setLanguageDriverConfig(null); + } + @BeforeEach void saveCurrentConfig() { currentConfigFile = System.getProperty("mybatis-thymeleaf.config"); @@ -159,7 +166,7 @@ void testCustomWithCustomConfigFileUsingSystemProperty() { Assertions.assertFalse(classLoaderTemplateResolver.isCacheable()); Assertions.assertEquals(Long.valueOf(30000), classLoaderTemplateResolver.getCacheTTLMs()); Assertions.assertEquals("ISO-8859-1", classLoaderTemplateResolver.getCharacterEncoding()); - Assertions.assertEquals("/templates/sqls/", classLoaderTemplateResolver.getPrefix()); + Assertions.assertEquals("templates/", classLoaderTemplateResolver.getPrefix()); Assertions.assertEquals(new LinkedHashSet<>(Arrays.asList("*.sql", "*.sql.template")), classLoaderTemplateResolver.getResolvablePatterns()); @@ -180,9 +187,10 @@ void testCustomWithCustomConfigFileUsingSystemProperty() { @Test void testCustomWithCustomConfigFileUsingMethodArgument() { + ThymeleafLanguageDriverConfig thymeleafLanguageDriverConfig = ThymeleafLanguageDriverConfig + .newInstance("mybatis-thymeleaf-custom.properties"); Configuration configuration = new Configuration(); - configuration.getLanguageRegistry().register( - new ThymeleafLanguageDriver(ThymeleafLanguageDriverConfig.newInstance("mybatis-thymeleaf-custom.properties"))); + configuration.getLanguageRegistry().register(new ThymeleafLanguageDriver(thymeleafLanguageDriverConfig)); configuration.setDefaultScriptingLanguage(ThymeleafLanguageDriver.class); new SqlSessionFactoryBuilder().build(configuration); @@ -196,7 +204,7 @@ void testCustomWithCustomConfigFileUsingMethodArgument() { Assertions.assertFalse(classLoaderTemplateResolver.isCacheable()); Assertions.assertEquals(Long.valueOf(30000), classLoaderTemplateResolver.getCacheTTLMs()); Assertions.assertEquals("ISO-8859-1", classLoaderTemplateResolver.getCharacterEncoding()); - Assertions.assertEquals("/templates/sqls/", classLoaderTemplateResolver.getPrefix()); + Assertions.assertEquals("templates/", classLoaderTemplateResolver.getPrefix()); Assertions.assertEquals(new LinkedHashSet<>(Arrays.asList("*.sql", "*.sql.template")), classLoaderTemplateResolver.getResolvablePatterns()); @@ -213,26 +221,38 @@ void testCustomWithCustomConfigFileUsingMethodArgument() { Assertions.assertEquals("escape '~'", expression.escapeClause()); Assertions.assertEquals("a~%~_~~b", expression.escapeWildcard("a%_~b")); }); + + Assertions.assertEquals("sqls/", thymeleafLanguageDriverConfig.getTemplateFile().getPathProvider().getPrefix()); + Assertions.assertFalse(thymeleafLanguageDriverConfig.getTemplateFile().getPathProvider().isIncludesPackagePath()); + Assertions + .assertFalse(thymeleafLanguageDriverConfig.getTemplateFile().getPathProvider().isSeparateDirectoryPerMapper()); + Assertions.assertFalse( + thymeleafLanguageDriverConfig.getTemplateFile().getPathProvider().isIncludesMapperNameWhenSeparateDirectory()); + } @Test void testCustomWithCustomizerFunction() { System.setProperty("mybatis-thymeleaf.config.file", "mybatis-thymeleaf-empty.properties"); + ThymeleafLanguageDriverConfig thymeleafLanguageDriverConfig = ThymeleafLanguageDriverConfig.newInstance(c -> { + c.setUse2way(false); + c.setCustomizer(CustomTemplateEngineCustomizer.class); + c.getTemplateFile().setCacheEnabled(false); + c.getTemplateFile().setCacheTtl(30000L); + c.getTemplateFile().setEncoding(StandardCharsets.ISO_8859_1); + c.getTemplateFile().setBaseDir("templates/"); + c.getTemplateFile().setPatterns("*.sql", "*.sql.template"); + c.getTemplateFile().getPathProvider().setPrefix("sqls/"); + c.getTemplateFile().getPathProvider().setIncludesPackagePath(false); + c.getTemplateFile().getPathProvider().setSeparateDirectoryPerMapper(false); + c.getTemplateFile().getPathProvider().setIncludesMapperNameWhenSeparateDirectory(false); + c.getDialect().setPrefix("mbs"); + c.getDialect().setLikeEscapeChar('~'); + c.getDialect().setLikeEscapeClauseFormat("escape '%s'"); + c.getDialect().setLikeAdditionalEscapeTargetChars('%', '_'); + }); Configuration configuration = new Configuration(); - configuration.getLanguageRegistry() - .register(new ThymeleafLanguageDriver(ThymeleafLanguageDriverConfig.newInstance(c -> { - c.setUse2way(false); - c.setCustomizer(CustomTemplateEngineCustomizer.class); - c.getTemplateFile().setCacheEnabled(false); - c.getTemplateFile().setCacheTtl(30000L); - c.getTemplateFile().setEncoding(StandardCharsets.ISO_8859_1); - c.getTemplateFile().setBaseDir("/templates/sqls/"); - c.getTemplateFile().setPatterns("*.sql", "*.sql.template"); - c.getDialect().setPrefix("mbs"); - c.getDialect().setLikeEscapeChar('~'); - c.getDialect().setLikeEscapeClauseFormat("escape '%s'"); - c.getDialect().setLikeAdditionalEscapeTargetChars('%', '_'); - }))); + configuration.getLanguageRegistry().register(new ThymeleafLanguageDriver(thymeleafLanguageDriverConfig)); configuration.setDefaultScriptingLanguage(ThymeleafLanguageDriver.class); new SqlSessionFactoryBuilder().build(configuration); @@ -246,7 +266,7 @@ void testCustomWithCustomizerFunction() { Assertions.assertFalse(classLoaderTemplateResolver.isCacheable()); Assertions.assertEquals(Long.valueOf(30000), classLoaderTemplateResolver.getCacheTTLMs()); Assertions.assertEquals("ISO-8859-1", classLoaderTemplateResolver.getCharacterEncoding()); - Assertions.assertEquals("/templates/sqls/", classLoaderTemplateResolver.getPrefix()); + Assertions.assertEquals("templates/", classLoaderTemplateResolver.getPrefix()); Assertions.assertEquals(new LinkedHashSet<>(Arrays.asList("*.sql", "*.sql.template")), classLoaderTemplateResolver.getResolvablePatterns()); @@ -263,6 +283,13 @@ void testCustomWithCustomizerFunction() { Assertions.assertEquals("escape '~'", expression.escapeClause()); Assertions.assertEquals("a~%~_~~b", expression.escapeWildcard("a%_~b")); }); + + Assertions.assertEquals("sqls/", thymeleafLanguageDriverConfig.getTemplateFile().getPathProvider().getPrefix()); + Assertions.assertFalse(thymeleafLanguageDriverConfig.getTemplateFile().getPathProvider().isIncludesPackagePath()); + Assertions + .assertFalse(thymeleafLanguageDriverConfig.getTemplateFile().getPathProvider().isSeparateDirectoryPerMapper()); + Assertions.assertFalse( + thymeleafLanguageDriverConfig.getTemplateFile().getPathProvider().isIncludesMapperNameWhenSeparateDirectory()); } @Test @@ -275,15 +302,21 @@ void testCustomWithBuilderUsingCustomProperties() { customProperties.setProperty("template-file.cache-enabled", "false"); customProperties.setProperty("template-file.cache-ttl", "30000"); customProperties.setProperty("template-file.encoding", "ISO-8859-1"); - customProperties.setProperty("template-file.base-dir", "/templates/sqls/"); + customProperties.setProperty("template-file.base-dir", "templates/"); customProperties.setProperty("template-file.patterns", "*.sql, *.sql.template"); + customProperties.setProperty("template-file.path-provider.prefix", "sqls/"); + customProperties.setProperty("template-file.path-provider.includes-package-path", "false"); + customProperties.setProperty("template-file.path-provider.separate-directory-per-mapper", "false"); + customProperties.setProperty("template-file.path-provider.includes-mapper-name-when-separate-directory", "false"); customProperties.setProperty("dialect.prefix", "mbs"); customProperties.setProperty("dialect.like-escape-char", "~"); customProperties.setProperty("dialect.like-escape-clause-format", "escape '%s'"); customProperties.setProperty("dialect.like-additional-escape-target-chars", "%,_"); - configuration.getLanguageRegistry() - .register(new ThymeleafLanguageDriver(ThymeleafLanguageDriverConfig.newInstance(customProperties))); + ThymeleafLanguageDriverConfig thymeleafLanguageDriverConfig = ThymeleafLanguageDriverConfig + .newInstance(customProperties); + + configuration.getLanguageRegistry().register(new ThymeleafLanguageDriver(thymeleafLanguageDriverConfig)); configuration.setDefaultScriptingLanguage(ThymeleafLanguageDriver.class); new SqlSessionFactoryBuilder().build(configuration); @@ -297,7 +330,7 @@ void testCustomWithBuilderUsingCustomProperties() { Assertions.assertFalse(classLoaderTemplateResolver.isCacheable()); Assertions.assertEquals(Long.valueOf(30000), classLoaderTemplateResolver.getCacheTTLMs()); Assertions.assertEquals("ISO-8859-1", classLoaderTemplateResolver.getCharacterEncoding()); - Assertions.assertEquals("/templates/sqls/", classLoaderTemplateResolver.getPrefix()); + Assertions.assertEquals("templates/", classLoaderTemplateResolver.getPrefix()); Assertions.assertEquals(new LinkedHashSet<>(Arrays.asList("*.sql", "*.sql.template")), classLoaderTemplateResolver.getResolvablePatterns()); @@ -314,6 +347,13 @@ void testCustomWithBuilderUsingCustomProperties() { Assertions.assertEquals("escape '~'", expression.escapeClause()); Assertions.assertEquals("a~%~_~~b", expression.escapeWildcard("a%_~b")); }); + + Assertions.assertEquals("sqls/", thymeleafLanguageDriverConfig.getTemplateFile().getPathProvider().getPrefix()); + Assertions.assertFalse(thymeleafLanguageDriverConfig.getTemplateFile().getPathProvider().isIncludesPackagePath()); + Assertions + .assertFalse(thymeleafLanguageDriverConfig.getTemplateFile().getPathProvider().isSeparateDirectoryPerMapper()); + Assertions.assertFalse( + thymeleafLanguageDriverConfig.getTemplateFile().getPathProvider().isIncludesMapperNameWhenSeparateDirectory()); } @Test diff --git a/src/test/java/org/mybatis/scripting/thymeleaf/integrationtest/TemplateFilePathProviderMapperTest.java b/src/test/java/org/mybatis/scripting/thymeleaf/integrationtest/TemplateFilePathProviderMapperTest.java index a370a92..603fd26 100644 --- a/src/test/java/org/mybatis/scripting/thymeleaf/integrationtest/TemplateFilePathProviderMapperTest.java +++ b/src/test/java/org/mybatis/scripting/thymeleaf/integrationtest/TemplateFilePathProviderMapperTest.java @@ -33,9 +33,9 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledIfSystemProperty; import org.mybatis.scripting.thymeleaf.ThymeleafLanguageDriver; +import org.mybatis.scripting.thymeleaf.ThymeleafLanguageDriverConfig; import org.mybatis.scripting.thymeleaf.integrationtest.domain.Name; import org.mybatis.scripting.thymeleaf.integrationtest.mapper.TemplateFilePathProviderMapper; -import org.mybatis.scripting.thymeleaf.support.TemplateFilePathProvider; @DisabledIfSystemProperty(named = "mybatis.version", matches = "3\\.4\\..*|3\\.5\\.0") class TemplateFilePathProviderMapperTest { @@ -59,14 +59,16 @@ static void setUp() throws Exception { } } - TemplateFilePathProvider.setPrefix("sql/"); - TemplateFilePathProvider.setIncludesPackagePath(false); - TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment = new Environment("development", transactionFactory, dataSource); Configuration configuration = new Configuration(environment); configuration.setMapUnderscoreToCamelCase(true); + configuration.getLanguageRegistry() + .register(new ThymeleafLanguageDriver(ThymeleafLanguageDriverConfig.newInstance(c -> { + c.getTemplateFile().getPathProvider().setPrefix("sql/"); + c.getTemplateFile().getPathProvider().setIncludesPackagePath(false); + }))); configuration.setDefaultScriptingLanguage(ThymeleafLanguageDriver.class); configuration.addMapper(TemplateFilePathProviderMapper.class); diff --git a/src/test/java/org/mybatis/scripting/thymeleaf/support/TemplateFilePathProviderTest.java b/src/test/java/org/mybatis/scripting/thymeleaf/support/TemplateFilePathProviderTest.java index d82c717..40d3a75 100644 --- a/src/test/java/org/mybatis/scripting/thymeleaf/support/TemplateFilePathProviderTest.java +++ b/src/test/java/org/mybatis/scripting/thymeleaf/support/TemplateFilePathProviderTest.java @@ -31,10 +31,6 @@ class TemplateFilePathProviderTest { @BeforeEach @AfterEach void clean() { - TemplateFilePathProvider.setPrefix(null); - TemplateFilePathProvider.setIncludesPackagePath(true); - TemplateFilePathProvider.setSeparateDirectoryPerMapper(true); - TemplateFilePathProvider.setIncludesMapperNameWhenSeparateDirectory(true); TemplateFilePathProvider.setCustomTemplateFilePathGenerator(null); TemplateFilePathProvider.setLanguageDriverConfig(null); } @@ -93,10 +89,11 @@ void notFoundSqlFile() { @Test void includesPackagePathAndSeparatesDirectoryPerMapperIsFalse() { - TemplateFilePathProvider.setIncludesPackagePath(false); - TemplateFilePathProvider.setSeparateDirectoryPerMapper(false); - TemplateFilePathProvider.setLanguageDriverConfig(ThymeleafLanguageDriverConfig - .newInstance(c -> c.getTemplateFile().setBaseDir("org/mybatis/scripting/thymeleaf/support/sql"))); + TemplateFilePathProvider.setLanguageDriverConfig(ThymeleafLanguageDriverConfig.newInstance(c -> { + c.getTemplateFile().setBaseDir("org/mybatis/scripting/thymeleaf/support/sql"); + c.getTemplateFile().getPathProvider().setIncludesPackagePath(false); + c.getTemplateFile().getPathProvider().setSeparateDirectoryPerMapper(false); + })); String path = TemplateFilePathProvider.providePath(TestMapper.class, extractMethod(TestMapper.class, "selectAllDesc"), null); Assertions.assertEquals("TestMapper-selectAllDesc.sql", path); @@ -104,10 +101,11 @@ void includesPackagePathAndSeparatesDirectoryPerMapperIsFalse() { @Test void baseDirEndWithSlash() { - TemplateFilePathProvider.setIncludesPackagePath(false); - TemplateFilePathProvider.setSeparateDirectoryPerMapper(false); - TemplateFilePathProvider.setLanguageDriverConfig(ThymeleafLanguageDriverConfig - .newInstance(c -> c.getTemplateFile().setBaseDir("org/mybatis/scripting/thymeleaf/support/sql/"))); + TemplateFilePathProvider.setLanguageDriverConfig(ThymeleafLanguageDriverConfig.newInstance(c -> { + c.getTemplateFile().setBaseDir("org/mybatis/scripting/thymeleaf/support/sql/"); + c.getTemplateFile().getPathProvider().setIncludesPackagePath(false); + c.getTemplateFile().getPathProvider().setSeparateDirectoryPerMapper(false); + })); String path = TemplateFilePathProvider.providePath(TestMapper.class, extractMethod(TestMapper.class, "selectAllDesc"), null); Assertions.assertEquals("TestMapper-selectAllDesc.sql", path); @@ -115,7 +113,8 @@ void baseDirEndWithSlash() { @Test void includesMapperNameWhenSeparateDirectoryIsFalse() { - TemplateFilePathProvider.setIncludesMapperNameWhenSeparateDirectory(false); + TemplateFilePathProvider.setLanguageDriverConfig(ThymeleafLanguageDriverConfig + .newInstance(c -> c.getTemplateFile().getPathProvider().setIncludesMapperNameWhenSeparateDirectory(false))); String path = TemplateFilePathProvider.providePath(TestMapper.class, extractMethod(TestMapper.class, "selectAllAsc"), null); Assertions.assertEquals("org/mybatis/scripting/thymeleaf/support/TestMapper/selectAllAsc.sql", path); @@ -123,9 +122,11 @@ void includesMapperNameWhenSeparateDirectoryIsFalse() { @Test void prefix() { - TemplateFilePathProvider.setPrefix("org/mybatis/scripting/thymeleaf/support/sql/"); - TemplateFilePathProvider.setIncludesPackagePath(false); - TemplateFilePathProvider.setSeparateDirectoryPerMapper(false); + TemplateFilePathProvider.setLanguageDriverConfig(ThymeleafLanguageDriverConfig.newInstance(c -> { + c.getTemplateFile().getPathProvider().setPrefix("org/mybatis/scripting/thymeleaf/support/sql/"); + c.getTemplateFile().getPathProvider().setIncludesPackagePath(false); + c.getTemplateFile().getPathProvider().setSeparateDirectoryPerMapper(false); + })); String path = TemplateFilePathProvider.providePath(TestMapper.class, extractMethod(TestMapper.class, "selectAllDesc"), null); Assertions.assertEquals("org/mybatis/scripting/thymeleaf/support/sql/TestMapper-selectAllDesc.sql", path); diff --git a/src/test/resources/mybatis-thymeleaf-custom.properties b/src/test/resources/mybatis-thymeleaf-custom.properties index cbfdbcc..a5beefe 100644 --- a/src/test/resources/mybatis-thymeleaf-custom.properties +++ b/src/test/resources/mybatis-thymeleaf-custom.properties @@ -19,8 +19,12 @@ customizer=org.mybatis.scripting.thymeleaf.CustomTemplateEngineCustomizer template-file.cache-enabled=false template-file.cache-ttl=30000 template-file.encoding=ISO-8859-1 -template-file.base-dir=/templates/sqls/ +template-file.base-dir=templates/ template-file.patterns= *.sql , *.sql.template +template-file.path-provider.prefix=sqls/ +template-file.path-provider.includes-package-path=false +template-file.path-provider.separate-directory-per-mapper=false +template-file.path-provider.includes-mapper-name-when-separate-directory=false dialect.prefix=mybatis dialect.like-escape-char=~ dialect.like-escape-clause-format=escape '%s'