Skip to content

Commit f877884

Browse files
Merge pull request #159 from OP-TED/TEDEFO-4991-consolidate-library-dependencies
TEDEFO-4991 Add templates root override to TranslatorOptions and SchematronGenerator
2 parents 9675e2b + 132b679 commit f877884

2 files changed

Lines changed: 48 additions & 3 deletions

File tree

src/main/java/eu/europa/ted/eforms/sdk/schematron/SchematronGenerator.java

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
import java.io.IOException;
1717
import java.io.StringWriter;
18+
import java.nio.file.Files;
19+
import java.nio.file.Path;
1820
import java.util.ArrayList;
1921
import java.util.HashMap;
2022
import java.util.LinkedHashMap;
@@ -37,6 +39,11 @@
3739
import eu.europa.ted.efx.model.rules.RuleNature;
3840
import eu.europa.ted.efx.model.rules.ValidationStage;
3941
import eu.europa.ted.efx.model.variables.Variable;
42+
import eu.europa.ted.efx.interfaces.TranslatorOptions;
43+
import freemarker.cache.ClassTemplateLoader;
44+
import freemarker.cache.FileTemplateLoader;
45+
import freemarker.cache.MultiTemplateLoader;
46+
import freemarker.cache.TemplateLoader;
4047
import freemarker.template.Configuration;
4148
import freemarker.template.Template;
4249
import freemarker.template.TemplateException;
@@ -57,17 +64,45 @@ public class SchematronGenerator implements ValidatorGenerator {
5764
private static final ObjectMapper JSON_MAPPER = new ObjectMapper()
5865
.enable(SerializationFeature.INDENT_OUTPUT);
5966

67+
private static final String CLASSPATH_TEMPLATES = "/freemarker/schematron";
68+
6069
private final Configuration freemarkerConfig;
6170

6271
public SchematronGenerator() {
63-
this.freemarkerConfig = new Configuration(Configuration.VERSION_2_3_31);
64-
this.freemarkerConfig.setClassForTemplateLoading(SchematronGenerator.class,
65-
"/freemarker/schematron");
72+
this(null);
73+
}
74+
75+
public SchematronGenerator(final TranslatorOptions options) {
76+
this.freemarkerConfig = new Configuration(Configuration.VERSION_2_3_34);
77+
this.freemarkerConfig.setTemplateLoader(this.resolveTemplateLoader(options));
6678
this.freemarkerConfig.setDefaultEncoding("UTF-8");
6779
this.freemarkerConfig.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
6880
this.freemarkerConfig.setLogTemplateExceptions(false);
6981
}
7082

83+
private TemplateLoader resolveTemplateLoader(final TranslatorOptions options) {
84+
final ClassTemplateLoader classpathLoader =
85+
new ClassTemplateLoader(SchematronGenerator.class, CLASSPATH_TEMPLATES);
86+
87+
if (options == null) {
88+
return classpathLoader;
89+
}
90+
91+
final Path templatesRoot = options.getTemplatesRoot();
92+
if (templatesRoot == null || !Files.isDirectory(templatesRoot)) {
93+
return classpathLoader;
94+
}
95+
96+
try {
97+
return new MultiTemplateLoader(new TemplateLoader[] {
98+
new FileTemplateLoader(templatesRoot.toFile()), classpathLoader
99+
});
100+
} catch (final IOException e) {
101+
logger.warn("Failed to load templates from {}, using classpath defaults", templatesRoot);
102+
return classpathLoader;
103+
}
104+
}
105+
71106
// #region ValidatorMarkupGenerator Implementation
72107

73108
@Override

src/main/java/eu/europa/ted/efx/interfaces/TranslatorOptions.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,16 @@ public interface TranslatorOptions {
3131
*/
3232
public Path getProfilerOutputPath();
3333

34+
/**
35+
* Returns the root directory for Freemarker templates. When set, templates are loaded
36+
* from this directory first, falling back to the classpath-bundled defaults.
37+
*
38+
* @return The templates root directory, or null to use classpath defaults only.
39+
*/
40+
default Path getTemplatesRoot() {
41+
return null;
42+
}
43+
3444
/**
3545
* Returns the include resolver for resolving {@code #include} directives in rules files.
3646
*

0 commit comments

Comments
 (0)