16
16
17
17
package org .springframework .sbm .mule .actions .javadsl .translators .dwl ;
18
18
19
+ import com .fasterxml .jackson .annotation .JsonIgnore ;
20
+ import freemarker .template .Configuration ;
21
+ import freemarker .template .Template ;
22
+ import lombok .Setter ;
19
23
import org .mulesoft .schema .mule .ee .dw .TransformMessageType ;
24
+ import org .springframework .beans .factory .annotation .Autowired ;
20
25
import org .springframework .sbm .java .util .Helper ;
21
26
import org .springframework .sbm .mule .actions .javadsl .translators .DslSnippet ;
22
27
import org .springframework .sbm .mule .actions .javadsl .translators .MuleComponentToSpringIntegrationDslTranslator ;
23
28
import org .springframework .sbm .mule .api .toplevel .configuration .MuleConfigurations ;
24
29
import org .springframework .stereotype .Component ;
25
30
26
31
import javax .xml .namespace .QName ;
32
+ import java .io .StringWriter ;
33
+ import java .util .HashMap ;
27
34
import java .util .Map ;
28
- import java .util .Set ;
29
35
30
36
@ Component
31
37
public class DwlTransformTranslator implements MuleComponentToSpringIntegrationDslTranslator <TransformMessageType > {
32
38
public static final String TRANSFORM_STATEMENT_CONTENT = ".transform($CLASSNAME::transform)" ;
33
39
public static final String externalPackageName = "package com.example.javadsl;\n \n " ;
34
40
41
+ @ Autowired
42
+ @ Setter
43
+ @ JsonIgnore
44
+ private Configuration templateConfiguration ;
45
+
35
46
/* Define the stubs for adding the transformation as a comment to be addressed */
36
47
private static final String externalClassContentPrefixTemplate = externalPackageName +
37
48
"public class $CLASSNAME {\n " +
@@ -47,21 +58,10 @@ public class DwlTransformTranslator implements MuleComponentToSpringIntegrationD
47
58
" }\n " +
48
59
"}" ;
49
60
50
- /* Define the TriggerMesh specific stubs when enabled. This will capture the transformation, and send it along
61
+ /*
62
+ * Define the TriggerMesh specific stubs when enabled. This will capture the transformation, and send it along
51
63
* with the payload to the TriggerMesh Dataweave Transformation Service.
52
64
*/
53
- // Independent class to capture parts of the message header from the spring integration to inject into the transformation
54
- private static final String triggermeshDWPayload = "" +
55
- "package com.example.javadsl;\n \n " +
56
- "import lombok.Data;\n \n " +
57
- "@Data\n " +
58
- "public class TmDwPayload {\n " +
59
- "\t private String id;\n " +
60
- "\t private String source;\n " +
61
- "\t private String sourceType;\n " +
62
- "\t private String payload;\n " +
63
- "}\n " ;
64
-
65
65
private static final String triggermeshPayloadHandlerContent = "" +
66
66
".handle((p, h) -> {\n " +
67
67
" TmDwPayload dwPayload = new TmDwPayload();\n " +
@@ -71,62 +71,6 @@ public class DwlTransformTranslator implements MuleComponentToSpringIntegrationD
71
71
" dwPayload.setPayload(p.toString());\n " +
72
72
" return dwPayload;\n " +
73
73
" })" ;
74
- private static final String triggermeshImportsTemplate = "import com.fasterxml.jackson.databind.ObjectMapper;\n \n " +
75
- "import java.net.URI;\n " +
76
- "import java.net.http.HttpClient;\n " +
77
- "import java.net.http.HttpRequest;\n " +
78
- "import java.net.http.HttpResponse;\n " ;
79
-
80
- private static final String triggermeshDWTransformationClass = "" +
81
- "\t public static class DataWeavePayload {\n " +
82
- "\t public String input_data;\n " +
83
- "\t public String spell;\n " +
84
- "\t public String input_content_type;\n " +
85
- "\t public String output_content_type;\n " +
86
- "\t };" ;
87
-
88
- private static final String triggermeshClassTemplate = externalPackageName + triggermeshImportsTemplate +
89
- "\n public class $CLASSNAME {\n " +
90
- triggermeshDWTransformationClass + "\n \n " +
91
- "\t public static String transform(TmDwPayload payload) {\n " +
92
- "\t \t String uuid = payload.getId();\n " +
93
- "\t \t String url = System.getenv(\" K_SINK\" );\n " + // NOTE: K_SINK is the URL for the target transformation service
94
- "\t \t HttpClient client = HttpClient.newHttpClient();\n " +
95
- "\t \t HttpRequest.Builder requestBuilder;\n " +
96
- "\t \t DataWeavePayload dwPayload = new DataWeavePayload();\n " +
97
- "\t \t if (payload.getSourceType().contains(\" ;\" )) {\n " +
98
- "\t \t \t dwPayload.input_content_type = payload.getSourceType().split(\" ;\" )[0];\n " +
99
- "\t \t } else {\n " +
100
- "\t \t \t dwPayload.input_content_type = payload.getSourceType();\n " +
101
- "\t \t }\n " +
102
- "\t \t dwPayload.output_content_type = \" $OUTPUT_CONTENT_TYPE\" ;\n " +
103
- "\t \t //TODO: Verify the spell conforms to Dataweave 2.x: https://docs.mulesoft.com/mule-runtime/4.4/migration-dataweave\n " +
104
- "\t \t dwPayload.spell = \" $DWSPELL\" ;\n " +
105
- "\t \t dwPayload.input_data = payload.getPayload();\n " +
106
- "\t \t String body;\n \n " +
107
- "\t \t try {\n " +
108
- "\t \t \t requestBuilder = HttpRequest.newBuilder(new URI(url));\n " +
109
- "\t \t \t ObjectMapper om = new ObjectMapper();\n " +
110
- "\t \t \t body = om.writeValueAsString(dwPayload);\n " +
111
- "\t \t } catch (Exception e) {\n " +
112
- "\t \t \t System.out.println(\" Error sending request: \" + e.toString());\n " +
113
- "\t \t \t return null;\n " +
114
- "\t \t }\n \n " +
115
- "\t \t requestBuilder.setHeader(\" content-type\" , \" application/json\" );\n " +
116
- "\t \t requestBuilder.setHeader(\" ce-specversion\" , \" 1.0\" );\n " +
117
- "\t \t requestBuilder.setHeader(\" ce-source\" , payload.getSource());\n " +
118
- "\t \t requestBuilder.setHeader(\" ce-type\" , \" io.triggermesh.dataweave.transform\" );\n " +
119
- "\t \t requestBuilder.setHeader(\" ce-id\" , payload.getId());\n \n " +
120
- "\t \t HttpRequest request = requestBuilder.POST(HttpRequest.BodyPublishers.ofString(body)).build();\n \n " +
121
- "\t \t try {\n " +
122
- "\t \t \t HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());\n " +
123
- "\t \t \t // TODO: verify the response status and body\n " +
124
- "\t \t \t return response.body();\n " +
125
- "\t \t } catch (Exception e) {\n " +
126
- "\t \t \t System.out.println(\" Error sending event: \" + e.toString());\n " +
127
- "\t \t \t return null;\n " +
128
- "\t \t }\n " +
129
- "\t }\n " ;
130
74
131
75
@ Override
132
76
public Class <TransformMessageType > getSupportedMuleType () {
@@ -190,17 +134,25 @@ private DslSnippet formTriggerMeshDWLBasedDSLSnippet(TransformMessageType compon
190
134
// Locate the output content type based on the spell. If it isn't present, default to
191
135
// application/json
192
136
String outputContentType = getSpellOutputType (dwlSpell );
193
- String tmTransformationContent = triggermeshClassTemplate
194
- .replace ("$CLASSNAME" , className )
195
- .replace ("$OUTPUT_CONTENT_TYPE" , outputContentType )
196
- .replace ("$DWSPELL" , sanitizeSpell (dwlSpell ));
137
+ Map <String , String > templateParams = new HashMap <>();
138
+ templateParams .put ("className" , className );
139
+ templateParams .put ("outputContentType" , outputContentType );
140
+ templateParams .put ("dwSpell" , sanitizeSpell (dwlSpell ));
141
+
142
+ StringWriter sw = new StringWriter ();
143
+ try {
144
+ Template template = templateConfiguration .getTemplate ("triggermesh-dw-transformation-template.ftl" );
145
+ template .process (templateParams , sw );
146
+ } catch (Exception e ) {
147
+ throw new RuntimeException (e );
148
+ }
149
+
150
+ String tmTransformationContent = sw .toString ();
197
151
198
152
// Build the dw payload
199
153
return DslSnippet .builder ()
200
- .externalClassContent (triggermeshDWPayload )
201
154
.renderedSnippet (triggermeshPayloadHandlerContent + "\n " + replaceClassName (TRANSFORM_STATEMENT_CONTENT , className ))
202
155
.externalClassContent (tmTransformationContent )
203
- .requiredImports (Set .of ("java.net.URI" , "java.net.http.HttpClient" , "java.net.http.HttpRequest" , "java.net.http.HttpResponse" , "com.fasterxml.jackson.databind.ObjectMapper" ))
204
156
.build ();
205
157
}
206
158
0 commit comments