1818import static org .joor .Reflect .on ;
1919import static org .joor .Reflect .onClass ;
2020
21- import gg .jte .ContentType ;
22- import gg .jte .TemplateConfig ;
23- import gg .jte .compiler .TemplateParser ;
24- import gg .jte .compiler .TemplateParserVisitorAdapter ;
25- import gg .jte .compiler .TemplateType ;
2621import java .io .File ;
2722import java .io .IOException ;
28- import java .nio .charset .StandardCharsets ;
29- import java .nio .file .Files ;
30- import java .util .LinkedHashMap ;
31- import java .util .LinkedHashSet ;
3223import org .gradle .api .DefaultTask ;
3324import org .gradle .api .Plugin ;
3425import org .gradle .api .Project ;
3526import org .gradle .api .file .DirectoryProperty ;
36- import org .gradle .api .file .FileType ;
3727import org .gradle .api .plugins .JavaPluginExtension ;
3828import org .gradle .api .provider .Property ;
39- import org .gradle .api .tasks .Input ;
40- import org .gradle .api .tasks .InputDirectory ;
41- import org .gradle .api .tasks .OutputDirectory ;
42- import org .gradle .api .tasks .PathSensitive ;
43- import org .gradle .api .tasks .PathSensitivity ;
44- import org .gradle .api .tasks .SourceSet ;
45- import org .gradle .api .tasks .TaskAction ;
46- import org .gradle .work .ChangeType ;
29+ import org .gradle .api .tasks .*;
4730import org .gradle .work .Incremental ;
4831import org .gradle .work .InputChanges ;
4932
@@ -61,18 +44,19 @@ public void apply(Project project) {
6144 task .getInputs ().dir (extension .call ("getSourceDirectory" ));
6245 });
6346
64- var jteModelsTask = project .getTasks ().register ("jteModels" , RenderModelClasses .class , task -> {
47+ @ SuppressWarnings ("unchecked" )
48+ var jteModelsTask = project .getTasks ().register ("jteModels" , RenderModelClassesTask .class , task -> {
6549 var jteModels = new File (project .getLayout ().getBuildDirectory ().getAsFile ().get (), "jte-models" );
6650 main .getJava ().srcDir (jteModels );
6751 task .getOutputDir ().set (jteModels );
6852 task .getInputDir ().set ((File ) extension .call ("getSourceDirectory" ).call ("get" ).call ("toFile" ).get ());
6953 task .getPackageName ().set ((Property <String >) extension .call ("getPackageName" ).get ());
70- task .getContentType ().set ((Property <ContentType >) extension .call ("getContentType" ).get ());
54+ task .getContentType ().set ((Property <Enum <?> >) extension .call ("getContentType" ).get ());
7155 });
7256 project .getTasks ().named ("compileKotlin" ).configure (task -> task .dependsOn (jteModelsTask ));
7357 }
7458
75- public static abstract class RenderModelClasses extends DefaultTask {
59+ public static abstract class RenderModelClassesTask extends DefaultTask {
7660 @ Incremental
7761 @ PathSensitive (PathSensitivity .RELATIVE )
7862 @ InputDirectory
@@ -85,117 +69,11 @@ public static abstract class RenderModelClasses extends DefaultTask {
8569 abstract Property <String > getPackageName ();
8670
8771 @ Input
88- abstract Property <ContentType > getContentType ();
72+ abstract Property <Enum <?> > getContentType ();
8973
9074 @ TaskAction
9175 public void render (InputChanges changes ) throws IOException {
92- var templateConfig = new TemplateConfig (getContentType ().get (), getPackageName ().get ());
93- var renderer = new JteRenderer (getInputDir ().getAsFile ().get (), templateConfig );
94- for (var change : changes .getFileChanges (getInputDir ())) {
95- if (change .getFileType () == FileType .DIRECTORY ) {
96- return ;
97- }
98- String name = change .getFile ().getName ();
99- if (!name .endsWith (".jte" ) && !name .endsWith (".kte" )) {
100- continue ;
101- }
102- var targetFileJte = getOutputDir ().file (change .getNormalizedPath ()).get ().getAsFile ().getAbsolutePath ();
103- var targetFile = new File (targetFileJte .substring (0 , targetFileJte .length () - 4 ) + ".kt" );
104- if (change .getChangeType () == ChangeType .REMOVED ) {
105- targetFile .delete ();
106- } else {
107- targetFile .getParentFile ().mkdirs ();
108- Files .write (targetFile .toPath (), renderer .render (change .getFile ()).getBytes (StandardCharsets .UTF_8 ));
109- }
110- }
111- }
112- }
113-
114- static String convertJavaToKotlin (String javaType ) {
115- if (javaType .equals ("boolean" )) {
116- return "Boolean" ;
117- } else if (javaType .equals ("int" )) {
118- return "Int" ;
119- } else {
120- // e.g. `@param Result<?> records` -> `val records: Result<*>`
121- return javaType
122- .replace ("<?>" , "<*>" )
123- .replace ("java.util.Collection" , "Collection" )
124- .replace ("java.util.List" , "List" )
125- .replace ("java.util.Map" , "Map" )
126- .replace ("java.util.Set" , "Set" );
127- }
128- }
129-
130- static class JteRenderer {
131- final File rootDir ;
132- final TemplateConfig config ;
133-
134- JteRenderer (File rootDir , TemplateConfig config ) {
135- this .rootDir = rootDir ;
136- this .config = config ;
137- }
138-
139- String render (File file ) throws IOException {
140- var pkg = file .getParentFile ().getAbsolutePath ().substring (rootDir .getAbsolutePath ().length () + 1 ).replace (File .separatorChar , '.' );
141- var name = file .getName ();
142- var lastDot = name .lastIndexOf ('.' );
143- name = name .substring (0 , lastDot );
144- String ext = file .getName ().substring (lastDot );
145-
146- var imports = new LinkedHashSet <String >();
147- imports .add ("gg.jte.TemplateEngine" );
148- imports .add ("gg.jte.TemplateOutput" );
149- var params = new LinkedHashMap <String , String >();
150-
151- new TemplateParser (Files .readString (file .toPath ()), TemplateType .Template , new TemplateParserVisitorAdapter () {
152- @ Override
153- public void onImport (String importClass ) {
154- imports .add (importClass .replace ("static " , "" ));
155- }
156-
157- @ Override
158- public void onParam (String parameter ) {
159- var idxOfColon = parameter .indexOf (':' );
160- if (idxOfColon == -1 ) { // .jte
161- // lastIndexOf accounts for valid multiple spaces, e.g `Map<String, String> featureMap`
162- var spaceIdx = parameter .lastIndexOf (' ' );
163- var type = parameter .substring (0 , spaceIdx ).trim ();
164- var name = parameter .substring (spaceIdx + 1 ).trim ();
165- if (name .endsWith ("Nullable" )) {
166- type += "?" ;
167- }
168- params .put (name , convertJavaToKotlin (type ));
169- } else { // .kte
170- var name = parameter .substring (0 , idxOfColon ).trim ();
171- var type = parameter .substring (idxOfColon + 1 ).trim ();
172- params .put (name , type );
173- }
174- }
175- }, config ).parse ();
176-
177- var builder = new StringBuilder ();
178- builder .append ("package " + pkg + "\n " );
179- builder .append ("\n " );
180- for (var imp : imports ) {
181- builder .append ("import " + imp + "\n " );
182- }
183- builder .append ("\n " );
184- builder .append ("class " + name + "(\n " );
185- params .forEach ((paramName , type ) -> {
186- builder .append ("\t val " + paramName + ": " + type + ",\n " );
187- });
188- builder .append ("\t ) : common.JteModel {\n " );
189- builder .append ("\n " );
190- builder .append ("\t override fun render(engine: TemplateEngine, output: TemplateOutput) {\n " );
191- builder .append ("\t \t engine.render(\" " + pkg .replace ('.' , '/' ) + "/" + name + ext + "\" , mapOf(\n " );
192- params .forEach ((paramName , type ) -> {
193- builder .append ("\t \t \t \" " + paramName + "\" to " + paramName + ",\n " );
194- });
195- builder .append ("\t \t ), output)\n " );
196- builder .append ("\t }\n " );
197- builder .append ("}" );
198- return builder .toString ();
76+ onClass ("com.diffplug.webtools.jte.JteRenderer" ).call ("renderTask" , this , changes );
19977 }
20078 }
20179}
0 commit comments