Skip to content

Commit c216df5

Browse files
authored
Merge pull request #52 from kazuki43zoo/gh-51
Support to configure FreeMarker settings using properties file
2 parents 680a666 + 01e38fa commit c216df5

File tree

4 files changed

+51
-2
lines changed

4 files changed

+51
-2
lines changed

src/main/java/org/mybatis/scripting/freemarker/FreeMarkerLanguageDriver.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.io.IOException;
2323
import java.io.StringReader;
2424

25+
import freemarker.template.TemplateException;
2526
import org.apache.ibatis.executor.parameter.ParameterHandler;
2627
import org.apache.ibatis.mapping.BoundSql;
2728
import org.apache.ibatis.mapping.MappedStatement;
@@ -71,6 +72,14 @@ public FreeMarkerLanguageDriver(FreeMarkerLanguageDriverConfig driverConfig) {
7172
protected freemarker.template.Configuration createFreeMarkerConfiguration() {
7273
freemarker.template.Configuration cfg = new freemarker.template.Configuration(
7374
driverConfig.getIncompatibleImprovementsVersion());
75+
driverConfig.getFreemarkerSettings().forEach((name, value) -> {
76+
try {
77+
cfg.setSetting(name, value);
78+
} catch (TemplateException e) {
79+
throw new IllegalStateException(
80+
String.format("Fail to configure FreeMarker template setting. name[%s] value[%s]", name, value), e);
81+
}
82+
});
7483

7584
TemplateLoader templateLoader = new ClassTemplateLoader(this.getClass().getClassLoader(),
7685
driverConfig.getBasePackage());

src/main/java/org/mybatis/scripting/freemarker/FreeMarkerLanguageDriverConfig.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,15 @@ public class FreeMarkerLanguageDriverConfig {
5757
converters.put(String.class, String::trim);
5858
converters.put(Version.class, v -> new Version(v.trim()));
5959
converters.put(Charset.class, v -> Charset.forName(v.trim()));
60+
converters.put(Object.class, v -> v);
6061
TYPE_CONVERTERS = Collections.unmodifiableMap(converters);
6162
}
6263

64+
/**
65+
* The configuration properties.
66+
*/
67+
private Map<String, String> freemarkerSettings = new HashMap<>();
68+
6369
/**
6470
* The base directory for reading template resources.
6571
*/
@@ -75,6 +81,25 @@ public class FreeMarkerLanguageDriverConfig {
7581
*/
7682
private Version incompatibleImprovementsVersion = Configuration.VERSION_2_3_22;
7783

84+
/**
85+
* Get FreeMarker settings.
86+
*
87+
* @return FreeMarker settings
88+
*/
89+
public Map<String, String> getFreemarkerSettings() {
90+
return freemarkerSettings;
91+
}
92+
93+
/**
94+
* Set FreeMarker settings.
95+
*
96+
* @param freemarkerSettings
97+
* FreeMarker settings
98+
*/
99+
public void setFreemarkerSettings(Map<String, String> freemarkerSettings) {
100+
this.freemarkerSettings = freemarkerSettings;
101+
}
102+
78103
/**
79104
* Get a base directory for reading template resources.
80105
* <p>
@@ -168,10 +193,15 @@ public void setIncompatibleImprovementsVersion(Version incompatibleImprovementsV
168193
* <td>UTF-8</td>
169194
* </tr>
170195
* <tr>
171-
* <td>freemarker-incompatible-improvements-version</td>
196+
* <td>incompatible-improvements-version</td>
172197
* <td>The incompatible improvements version of freemarker</td>
173198
* <td>2.3.22</td>
174199
* </tr>
200+
* <tr>
201+
* <td>freemarker-settings.*</td>
202+
* <td>The settings of freemarker {@link Configuration#setSetting(String, String)}).</td>
203+
* <td>-</td>
204+
* </tr>
175205
* </table>
176206
*
177207
* @return a configuration instance

src/test/java/org/mybatis/scripting/freemarker/FreeMarkerLanguageDriverConfigTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,17 +75,25 @@ void newInstanceWithCustomPropertiesFile() {
7575
Assertions.assertEquals("sqls", config.getBasePackage());
7676
Assertions.assertEquals(Charset.forName("Windows-31J"), config.getDefaultEncoding());
7777
Assertions.assertEquals(Configuration.VERSION_2_3_28, config.getIncompatibleImprovementsVersion());
78+
Assertions.assertEquals(2, config.getFreemarkerSettings().size());
79+
Assertions.assertEquals("dollar", config.getFreemarkerSettings().get("interpolation_syntax"));
80+
Assertions.assertEquals("yes", config.getFreemarkerSettings().get("whitespace_stripping"));
7881
}
7982

8083
@Test
8184
void newInstanceWithCustomProperties() {
8285
Properties properties = new Properties();
8386
properties.setProperty("defaultEncoding", " " + StandardCharsets.ISO_8859_1.name() + " ");
8487
properties.setProperty("incompatibleImprovementsVersion", " 2.3.27 ");
88+
properties.setProperty("freemarkerSettings.interpolation_syntax", "dollar");
89+
properties.setProperty("freemarkerSettings.whitespace_stripping", "yes");
90+
8591
FreeMarkerLanguageDriverConfig config = FreeMarkerLanguageDriverConfig.newInstance(properties);
8692
Assertions.assertEquals("sql", config.getBasePackage());
8793
Assertions.assertEquals(StandardCharsets.ISO_8859_1, config.getDefaultEncoding());
8894
Assertions.assertEquals(Configuration.VERSION_2_3_27, config.getIncompatibleImprovementsVersion());
95+
Assertions.assertEquals("dollar", config.getFreemarkerSettings().get("interpolation_syntax"));
96+
Assertions.assertEquals("yes", config.getFreemarkerSettings().get("whitespace_stripping"));
8997
}
9098

9199
@Test

src/test/resources/mybatis-freemarker-custom.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@
1616

1717
base-package=sqls
1818
default-encoding=Windows-31J
19-
incompatible-improvements-version=2.3.28
19+
incompatible-improvements-version=2.3.28
20+
freemarker-settings.interpolation_syntax=dollar
21+
freemarker-settings.whitespace_stripping=yes

0 commit comments

Comments
 (0)