Skip to content

Commit 84230a0

Browse files
committed
#44 - Add generator for Spark
1 parent 87acc6f commit 84230a0

File tree

16 files changed

+648
-0
lines changed

16 files changed

+648
-0
lines changed

http-generator-spark/pom.xml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
5+
<artifactId>avaje-http-spark-generator</artifactId>
6+
<!-- <version>0.5-SNAPSHOT</version>-->
7+
8+
<parent>
9+
<groupId>io.avaje</groupId>
10+
<artifactId>avaje-http-generator-parent</artifactId>
11+
<version>1.1-SNAPSHOT</version>
12+
<relativePath>..</relativePath>
13+
</parent>
14+
15+
<dependencies>
16+
17+
<dependency>
18+
<groupId>io.avaje</groupId>
19+
<artifactId>avaje-http-generator-core</artifactId>
20+
<version>${project.version}</version>
21+
</dependency>
22+
23+
</dependencies>
24+
25+
26+
<build>
27+
<plugins>
28+
<plugin>
29+
<groupId>org.apache.maven.plugins</groupId>
30+
<artifactId>maven-compiler-plugin</artifactId>
31+
<version>3.2</version>
32+
<configuration>
33+
<source>1.8</source>
34+
<target>1.8</target>
35+
<!-- Turn off annotation processing for building -->
36+
<compilerArgument>-proc:none</compilerArgument>
37+
</configuration>
38+
</plugin>
39+
</plugins>
40+
</build>
41+
42+
43+
</project>
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package io.avaje.http.generator.spark;
2+
3+
import io.avaje.http.api.MediaType;
4+
import io.avaje.http.generator.core.Append;
5+
import io.avaje.http.generator.core.MethodParam;
6+
import io.avaje.http.generator.core.MethodReader;
7+
import io.avaje.http.generator.core.PathSegments;
8+
import io.avaje.http.generator.core.ProcessingContext;
9+
import io.avaje.http.generator.core.WebMethod;
10+
11+
import java.util.List;
12+
13+
/**
14+
* Write code to register Web route for a given controller method.
15+
*/
16+
class ControllerMethodWriter {
17+
18+
private final MethodReader method;
19+
private final Append writer;
20+
private final WebMethod webMethod;
21+
private final ProcessingContext ctx;
22+
23+
ControllerMethodWriter(MethodReader method, Append writer, ProcessingContext ctx) {
24+
this.method = method;
25+
this.writer = writer;
26+
this.webMethod = method.getWebMethod();
27+
this.ctx = ctx;
28+
}
29+
30+
void write(boolean requestScoped) {
31+
32+
final PathSegments segments = method.getPathSegments();
33+
final String fullPath = segments.fullPathColon();
34+
35+
writer.append(" Spark.%s(\"%s\", (request, response) -> {", webMethod.name().toLowerCase(), fullPath).eol();
36+
writer.append(" response.status(%s);", method.getStatusCode()).eol();
37+
38+
List<PathSegments.Segment> matrixSegments = segments.matrixSegments();
39+
for (PathSegments.Segment matrixSegment : matrixSegments) {
40+
matrixSegment.writeCreateSegment(writer, ctx.platform());
41+
}
42+
43+
final List<MethodParam> params = method.getParams();
44+
for (MethodParam param : params) {
45+
param.writeCtxGet(writer, segments);
46+
}
47+
writer.append(" ");
48+
if (method.includeValidate()) {
49+
for (MethodParam param : params) {
50+
param.writeValidate(writer);
51+
}
52+
}
53+
if (!method.isVoid()) {
54+
writeContextReturn();
55+
}
56+
57+
if (requestScoped) {
58+
writer.append("factory.create(request, response).");
59+
} else {
60+
writer.append("controller.");
61+
}
62+
writer.append(method.simpleName()).append("(");
63+
for (int i = 0; i < params.size(); i++) {
64+
if (i > 0) {
65+
writer.append(", ");
66+
}
67+
params.get(i).buildParamName(writer);
68+
}
69+
writer.append(")");
70+
// if (!method.isVoid()) {
71+
// writer.append(";");//")"
72+
// }
73+
writer.append(";").eol();
74+
writer.append(" }");
75+
76+
// List<String> roles = method.roles();
77+
// if (!roles.isEmpty()) {
78+
// writer.append(", roles(");
79+
// for (int i = 0; i < roles.size(); i++) {
80+
// if (i > 0) {
81+
// writer.append(", ");
82+
// }
83+
// writer.append(Util.shortName(roles.get(i)));
84+
// }
85+
// writer.append(")");
86+
// }
87+
writer.append(");").eol().eol(); //)
88+
}
89+
90+
private void writeContextReturn() {
91+
final String produces = method.getProduces();
92+
if (produces == null || produces.equalsIgnoreCase(MediaType.APPLICATION_JSON)) {
93+
//writer.append("response.type(\"application/json\")");
94+
} else if (produces.equalsIgnoreCase(MediaType.TEXT_HTML)) {
95+
writer.append("response.type(\"text/html\");").eol().append(" ");
96+
} else if (produces.equalsIgnoreCase(MediaType.TEXT_PLAIN)) {
97+
writer.append("response.type(\"text/plain\");").eol().append(" ");
98+
} else {
99+
writer.append("response.type(\"%s\");", produces).eol().append(" ");
100+
}
101+
writer.append("return ");
102+
}
103+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package io.avaje.http.generator.spark;
2+
3+
import io.avaje.http.generator.core.BaseControllerWriter;
4+
import io.avaje.http.generator.core.ControllerReader;
5+
import io.avaje.http.generator.core.MethodReader;
6+
import io.avaje.http.generator.core.ProcessingContext;
7+
8+
import java.io.IOException;
9+
10+
/**
11+
* Write Javalin specific Controller WebRoute handling adapter.
12+
*/
13+
class ControllerWriter extends BaseControllerWriter {
14+
15+
private static final String AT_GENERATED = "@Generated(\"io.dinject.javalin-generator\")";
16+
private static final String API_BUILDER = "spark.Spark";
17+
18+
ControllerWriter(ControllerReader reader, ProcessingContext ctx) throws IOException {
19+
super(reader, ctx);
20+
reader.addImportType(API_BUILDER);
21+
}
22+
23+
void write() {
24+
writePackage();
25+
writeImports();
26+
writeClassStart();
27+
writeAddRoutes();
28+
writeClassEnd();
29+
}
30+
31+
private void writeAddRoutes() {
32+
writer.append(" @Override").eol();
33+
writer.append(" public void registerRoutes() {").eol().eol();
34+
for (MethodReader method : reader.getMethods()) {
35+
if (method.isWebMethod()) {
36+
writeForMethod(method);
37+
}
38+
}
39+
writer.append(" }").eol().eol();
40+
}
41+
42+
private void writeForMethod(MethodReader method) {
43+
new ControllerMethodWriter(method, writer, ctx).write(isRequestScoped());
44+
if (!reader.isDocHidden()) {
45+
method.buildApiDocumentation(ctx);
46+
}
47+
}
48+
49+
private void writeClassStart() {
50+
if (ctx.isGeneratedAvailable()) {
51+
writer.append(AT_GENERATED).eol();
52+
}
53+
writer.append("@Singleton").eol();
54+
writer.append("public class ").append(shortName).append("$route implements WebRoutes {").eol().eol();
55+
56+
String controllerName = "controller";
57+
String controllerType = shortName;
58+
if (isRequestScoped()) {
59+
controllerName = "factory";
60+
controllerType += "$factory";
61+
}
62+
writer.append(" private final %s %s;", controllerType, controllerName).eol();
63+
64+
if (reader.isIncludeValidator()) {
65+
writer.append(" private final Validator validator;").eol();
66+
}
67+
writer.eol();
68+
69+
writer.append(" public %s$route(%s %s", shortName, controllerType, controllerName);
70+
if (reader.isIncludeValidator()) {
71+
writer.append(", Validator validator");
72+
}
73+
writer.append(") {").eol();
74+
writer.append(" this.%s = %s;", controllerName, controllerName).eol();
75+
if (reader.isIncludeValidator()) {
76+
writer.append(" this.validator = validator;").eol();
77+
}
78+
writer.append(" }").eol().eol();
79+
}
80+
81+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package io.avaje.http.generator.spark;
2+
3+
import io.avaje.http.generator.core.Append;
4+
import io.avaje.http.generator.core.ControllerReader;
5+
import io.avaje.http.generator.core.ParamType;
6+
import io.avaje.http.generator.core.PlatformAdapter;
7+
8+
import java.util.List;
9+
10+
class SparkAdapter implements PlatformAdapter {
11+
12+
static final String REQ = "spark.Request";
13+
static final String RES = "spark.Response";
14+
15+
@Override
16+
public boolean isContextType(String rawType) {
17+
return REQ.equals(rawType) || RES.equals(rawType);
18+
}
19+
20+
@Override
21+
public String platformVariable(String rawType) {
22+
if (REQ.equals(rawType)) {
23+
return "request";
24+
}
25+
if (RES.equals(rawType)) {
26+
return "response";
27+
}
28+
return "unknownVariable for: " + rawType;
29+
}
30+
31+
@Override
32+
public boolean isBodyMethodParam() {
33+
return false;
34+
}
35+
36+
@Override
37+
public String bodyAsClass(String shortType) {
38+
return "ctx.bodyAsClass(" + shortType + ".class)";
39+
}
40+
41+
@Override
42+
public String indent() {
43+
return " ";
44+
}
45+
46+
@Override
47+
public void controllerRoles(List<String> roles, ControllerReader controller) {
48+
addRoleImports(roles, controller);
49+
}
50+
51+
@Override
52+
public void methodRoles(List<String> roles, ControllerReader controller) {
53+
addRoleImports(roles, controller);
54+
}
55+
56+
private void addRoleImports(List<String> roles, ControllerReader controller) {
57+
58+
}
59+
60+
@Override
61+
public void writeReadParameter(Append writer, ParamType paramType, String paramName) {
62+
switch (paramType) {
63+
case PATHPARAM:
64+
writer.append("request.params(\"%s\")", paramName);
65+
break;
66+
case QUERYPARAM:
67+
case FORMPARAM:
68+
writer.append("request.queryParams(\"%s\")", paramName);
69+
break;
70+
default:
71+
writer.append("request.%s(\"%s\")", paramType, paramName);
72+
}
73+
}
74+
75+
@Override
76+
public void writeReadParameter(Append writer, ParamType paramType, String paramName, String paramDefault) {
77+
switch (paramType) {
78+
case PATHPARAM:
79+
writer.append("request.params(\"%s\")", paramName);
80+
break;
81+
case QUERYPARAM:
82+
case FORMPARAM:
83+
writer.append("request.queryParamsOrDefault(\"%s\",\"%s\")", paramName, paramDefault);
84+
break;
85+
default:
86+
writer.append("request.%s(\"%s\",\"%s\")", paramType, paramName, paramDefault);
87+
}
88+
}
89+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.avaje.http.generator.spark;
2+
3+
import io.avaje.http.generator.core.BaseProcessor;
4+
import io.avaje.http.generator.core.ControllerReader;
5+
import io.avaje.http.generator.core.PlatformAdapter;
6+
import io.avaje.http.generator.core.ProcessingContext;
7+
8+
import java.io.IOException;
9+
10+
public class SparkProcessor extends BaseProcessor {
11+
12+
@Override
13+
protected PlatformAdapter providePlatformAdapter() {
14+
return new SparkAdapter();
15+
}
16+
17+
@Override
18+
public void writeControllerAdapter(ProcessingContext ctx, ControllerReader reader) throws IOException {
19+
new ControllerWriter(reader, ctx).write();
20+
}
21+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.avaje.http.generator.spark.SparkProcessor

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<module>http-generator-core</module>
3434
<module>http-generator-javalin</module>
3535
<module>http-generator-helidon</module>
36+
<module>http-generator-spark</module>
3637
<!-- <module>http-generator-client</module>-->
3738
<module>tests</module>
3839
</modules>

tests/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
<modules>
1313
<module>test-helidon</module>
1414
<module>test-javalin</module>
15+
<module>test-spark</module>
1516
<module>test-client</module>
1617
</modules>
1718

0 commit comments

Comments
 (0)