1515
1616import java .io .IOException ;
1717import java .io .StringWriter ;
18+ import java .nio .file .Files ;
19+ import java .nio .file .Path ;
1820import java .util .ArrayList ;
1921import java .util .HashMap ;
2022import java .util .LinkedHashMap ;
3739import eu .europa .ted .efx .model .rules .RuleNature ;
3840import eu .europa .ted .efx .model .rules .ValidationStage ;
3941import 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 ;
4047import freemarker .template .Configuration ;
4148import freemarker .template .Template ;
4249import 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
0 commit comments