31
31
import org .fugerit .java .doc .playground .facade .BasicInput ;
32
32
import org .fugerit .java .doc .playground .facade .InputFacade ;
33
33
34
+ import com .fasterxml .jackson .databind .JsonNode ;
35
+ import com .fasterxml .jackson .databind .ObjectMapper ;
36
+
34
37
import freemarker .cache .StringTemplateLoader ;
35
38
import freemarker .template .Configuration ;
36
39
import freemarker .template .Template ;
@@ -57,21 +60,29 @@ private void doHandle( DocTypeHandler handler, String type, int sourceType, Read
57
60
} );
58
61
}
59
62
63
+ private void handleConfiguration ( Configuration configuration , String freemarkerJsonData , String ftlData , String chainId ) {
64
+ StringTemplateLoader loader = new StringTemplateLoader ();
65
+ String chainData = "<#assign ftlData = " +freemarkerJsonData +">" +ftlData ;
66
+ loader .putTemplate ( chainId , chainData );
67
+ configuration .setTemplateLoader ( loader );
68
+ }
69
+
60
70
private void handleFtlx ( DocTypeHandler handler , String type , int sourceType , Reader reader , ByteArrayOutputStream baos , String freemarkerJsonData ) {
61
71
SafeFunction .apply ( () -> {
62
72
// volatile FreeMarker Template configuration
63
- String templateName = "current " +System .currentTimeMillis ();
73
+ String chainId = "current_ " +System .currentTimeMillis ();
64
74
Configuration configuration = new Configuration ( new Version ( FreeMarkerConfigStep .ATT_FREEMARKER_CONFIG_KEY_VERSION_LATEST ) );
65
- StringTemplateLoader loader = new StringTemplateLoader ();
66
- String templateData = "<#assign ftlData = " +freemarkerJsonData +">" +StreamIO .readString ( reader );
67
- loader .putTemplate ( templateName , templateData );
68
- configuration .setTemplateLoader ( loader );
69
- Template template = configuration .getTemplate ( templateName );
70
- Map <Object , Object > data = new HashMap <>();
71
- try ( StringWriter writer = new StringWriter () ) {
72
- template .process ( data , writer );
73
- try ( StringReader ftlReader = new StringReader ( writer .toString () ) ) {
74
- this .doHandle (handler , type , sourceType , ftlReader , baos );
75
+ ObjectMapper mapper = new ObjectMapper ();
76
+ try ( StringReader jsonReader = new StringReader (freemarkerJsonData ) ) {
77
+ JsonNode node = mapper .readTree ( jsonReader ); // parse json node to sanitize input
78
+ this .handleConfiguration (configuration , mapper .writeValueAsString ( node ), StreamIO .readString ( reader ), chainId );
79
+ Template currentChain = configuration .getTemplate ( chainId );
80
+ Map <Object , Object > data = new HashMap <>();
81
+ try ( StringWriter writer = new StringWriter () ) {
82
+ currentChain .process ( data , writer );
83
+ try ( StringReader ftlReader = new StringReader ( writer .toString () ) ) {
84
+ this .doHandle (handler , type , sourceType , ftlReader , baos );
85
+ }
75
86
}
76
87
}
77
88
configuration .clearTemplateCache ();
0 commit comments