Skip to content

Commit 2cf2875

Browse files
committed
Value API: some code cleanup + fixing mvc routes
1 parent 0fa6889 commit 2cf2875

6 files changed

Lines changed: 108 additions & 60 deletions

File tree

modules/jooby-apt/src/main/java/io/jooby/internal/apt/ParamKind.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import io.jooby.Formdata;
1010
import io.jooby.Multipart;
1111
import io.jooby.apt.Annotations;
12-
import io.jooby.internal.apt.asm.AnnotationParamWriter;
12+
import io.jooby.internal.apt.asm.NamedParamWriter;
1313
import io.jooby.internal.apt.asm.BodyWriter;
1414
import io.jooby.internal.apt.asm.FileUploadWriter;
1515
import io.jooby.internal.apt.asm.ObjectTypeWriter;
@@ -55,7 +55,7 @@ public enum ParamKind {
5555
}
5656

5757
@Override public ParamWriter newWriter() {
58-
return new AnnotationParamWriter();
58+
return new NamedParamWriter(true);
5959
}
6060
},
6161
QUERY_PARAM {
@@ -72,7 +72,7 @@ public enum ParamKind {
7272
}
7373

7474
@Override public ParamWriter newWriter() {
75-
return new AnnotationParamWriter();
75+
return new NamedParamWriter(true);
7676
}
7777
},
7878
COOKIE_PARAM {
@@ -89,7 +89,7 @@ public enum ParamKind {
8989
}
9090

9191
@Override public ParamWriter newWriter() {
92-
return new AnnotationParamWriter();
92+
return new NamedParamWriter(false);
9393
}
9494
},
9595
HEADER_PARAM {
@@ -106,7 +106,7 @@ public enum ParamKind {
106106
}
107107

108108
@Override public ParamWriter newWriter() {
109-
return new AnnotationParamWriter();
109+
return new NamedParamWriter(false);
110110
}
111111
},
112112
FLASH_PARAM {
@@ -123,7 +123,7 @@ public enum ParamKind {
123123
}
124124

125125
@Override public ParamWriter newWriter() {
126-
return new AnnotationParamWriter();
126+
return new NamedParamWriter(false);
127127
}
128128
},
129129
FORM_PARAM {
@@ -140,7 +140,7 @@ public enum ParamKind {
140140
}
141141

142142
@Override public ParamWriter newWriter() {
143-
return new AnnotationParamWriter();
143+
return new NamedParamWriter(true);
144144
}
145145
},
146146
SESSION_PARAM {
@@ -190,7 +190,9 @@ public Method singleValue(ParamDefinition param) throws NoSuchMethodException {
190190
}
191191

192192
public static ParamKind forTypeInjection(ParamDefinition param) {
193-
TypeMirror type = param.isOptional() ? param.getType().getArguments().get(0).getRawType() : param.getType().getRawType();
193+
TypeMirror type = param.isOptional() ?
194+
param.getType().getArguments().get(0).getRawType() :
195+
param.getType().getRawType();
194196
String rawType = type.toString().replace(Formdata.class.getName(), Multipart.class.getName());
195197
for (ParamKind value : values()) {
196198
try {

modules/jooby-apt/src/main/java/io/jooby/internal/apt/asm/AnnotationParamWriter.java

Lines changed: 0 additions & 42 deletions
This file was deleted.
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/**
2+
* Jooby https://jooby.io
3+
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
4+
* Copyright 2014 Edgar Espina
5+
*/
6+
package io.jooby.internal.apt.asm;
7+
8+
import io.jooby.internal.apt.ParamDefinition;
9+
import org.objectweb.asm.ClassWriter;
10+
import org.objectweb.asm.Label;
11+
import org.objectweb.asm.MethodVisitor;
12+
import org.objectweb.asm.Opcodes;
13+
14+
import java.lang.reflect.Method;
15+
16+
import static org.objectweb.asm.Opcodes.*;
17+
import static org.objectweb.asm.Opcodes.INVOKEINTERFACE;
18+
import static org.objectweb.asm.Type.getMethodDescriptor;
19+
20+
public class NamedParamWriter extends ValueWriter {
21+
22+
private boolean tryName;
23+
24+
public NamedParamWriter(boolean tryName) {
25+
this.tryName = tryName;
26+
}
27+
28+
@Override
29+
public void accept(ClassWriter writer, String handlerInternalName, MethodVisitor visitor,
30+
ParamDefinition parameter) throws Exception {
31+
if (tryName) {
32+
param(writer, parameter);
33+
Method paramMethod = parameter.getObjectValue();
34+
visitor.visitMethodInsn(INVOKEINTERFACE, CTX.getInternalName(), paramMethod.getName(),
35+
getMethodDescriptor(paramMethod), true);
36+
visitor.visitLdcInsn(parameter.getHttpName());
37+
visitor.visitMethodInsn(INVOKESTATIC, handlerInternalName, parameter.getName(),
38+
"(Lio/jooby/Value;Ljava/lang/String;)Lio/jooby/Value;", false);
39+
} else {
40+
Method paramMethod = parameter.getSingleValue();
41+
visitor.visitLdcInsn(parameter.getHttpName());
42+
visitor.visitMethodInsn(INVOKEINTERFACE, CTX.getInternalName(), paramMethod.getName(),
43+
getMethodDescriptor(paramMethod), true);
44+
}
45+
46+
super.accept(writer, handlerInternalName, visitor, parameter);
47+
}
48+
49+
private void param(ClassWriter writer, ParamDefinition parameter) {
50+
MethodVisitor methodVisitor = writer.visitMethod(ACC_PRIVATE | ACC_STATIC, parameter.getName(),
51+
"(Lio/jooby/Value;Ljava/lang/String;)Lio/jooby/Value;", null, null);
52+
methodVisitor.visitParameter("scope", 0);
53+
methodVisitor.visitParameter("name", 0);
54+
methodVisitor.visitCode();
55+
Label label0 = new Label();
56+
methodVisitor.visitLabel(label0);
57+
methodVisitor.visitVarInsn(ALOAD, 0);
58+
methodVisitor.visitVarInsn(ALOAD, 1);
59+
methodVisitor.visitMethodInsn(INVOKEINTERFACE, "io/jooby/Value", "get",
60+
"(Ljava/lang/String;)Lio/jooby/Value;", true);
61+
methodVisitor.visitVarInsn(ASTORE, 2);
62+
Label label1 = new Label();
63+
methodVisitor.visitLabel(label1);
64+
methodVisitor.visitVarInsn(ALOAD, 2);
65+
methodVisitor.visitMethodInsn(INVOKEINTERFACE, "io/jooby/Value", "isMissing", "()Z", true);
66+
Label label2 = new Label();
67+
methodVisitor.visitJumpInsn(IFEQ, label2);
68+
methodVisitor.visitVarInsn(ALOAD, 0);
69+
methodVisitor.visitMethodInsn(INVOKEINTERFACE, "io/jooby/Value", "size", "()I", true);
70+
methodVisitor.visitJumpInsn(IFLE, label2);
71+
methodVisitor.visitVarInsn(ALOAD, 0);
72+
Label label3 = new Label();
73+
methodVisitor.visitJumpInsn(GOTO, label3);
74+
methodVisitor.visitLabel(label2);
75+
methodVisitor.visitFrame(F_APPEND,1, new Object[] {"io/jooby/Value"}, 0, null);
76+
methodVisitor.visitVarInsn(ALOAD, 2);
77+
methodVisitor.visitLabel(label3);
78+
methodVisitor.visitFrame(F_SAME1, 0, null, 1, new Object[] {"io/jooby/Value"});
79+
methodVisitor.visitInsn(ARETURN);
80+
Label label4 = new Label();
81+
methodVisitor.visitLabel(label4);
82+
methodVisitor.visitMaxs(0, 0);
83+
methodVisitor.visitEnd();
84+
}
85+
}

modules/jooby-apt/src/test/java/output/MyController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.jooby.annotations.GET;
44
import io.jooby.annotations.Path;
5+
import io.jooby.annotations.PathParam;
56
import io.jooby.annotations.QueryParam;
67

78
import java.util.Map;
@@ -10,7 +11,7 @@
1011
public class MyController {
1112

1213
@GET
13-
public Integer doIt(Map<String, Object> map) {
14-
return map.size();
14+
public String doIt(@PathParam("p1") String p1) {
15+
return p1;
1516
}
1617
}

modules/jooby-apt/src/test/java/output/MyControllerHandler.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ public MyControllerHandler(Provider<MyController> provider) {
1919
}
2020

2121
@Nonnull @Override public Object apply(@Nonnull Context ctx) throws Exception {
22-
return provider.get().doIt(ctx.body(Reified.map(String.class, Object.class).getType()));
22+
return provider.get().doIt(param(ctx.path(), "p1").to(String.class));
2323
}
2424

25-
private static Integer x(Value x) {
26-
return x.to(Integer.class);
25+
private static Value param(Value scope, String name) {
26+
Value value = scope.get(name);
27+
return value.isMissing() && scope.size() > 0 ? scope : value;
2728
}
2829
}

modules/jooby-apt/src/test/java/tests/HandlerCompilerTest.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public void headerParam() throws Exception {
110110
@Test
111111
public void flashParam() throws Exception {
112112
new MvcHandlerCompilerRunner(new Provisioning())
113-
.compile("/p/flashParam", handler -> {
113+
.debug("/p/flashParam", handler -> {
114114
assertEquals("hey",
115115
handler.apply(MockContextHelper.mockContext().setFlashAttribute("message", "hey")));
116116
})
@@ -435,17 +435,18 @@ public void noTopLevel() throws Exception {
435435
@Test
436436
public void nullRoutes() throws Exception {
437437
new MvcHandlerCompilerRunner(new NullRoutes())
438+
.debug("/nullbean", handler -> {
439+
assertThrows(ProvisioningException.class,
440+
() -> handler.apply(MockContextHelper.mockContext()));
441+
})
438442
.compile("/nullok", handler -> {
439443
assertEquals("null", handler.apply(MockContextHelper.mockContext()));
440444
})
441445
.compile("/nonnull", handler -> {
442446
assertThrows(MissingValueException.class,
443447
() -> handler.apply(MockContextHelper.mockContext()));
444448
})
445-
.compile("/nullbean", handler -> {
446-
assertThrows(ProvisioningException.class,
447-
() -> handler.apply(MockContextHelper.mockContext()));
448-
})
449+
449450
;
450451
}
451452

0 commit comments

Comments
 (0)