You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2019/05/16 16:13:18 UTC
[tomee] 01/02: We remove parameters,
so don't attempt to copy parameter annotations
This is an automated email from the ASF dual-hosted git repository.
dblevins pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomee.git
commit f27acee2dc8f18f59aae0229b336fb4f9a2aa960
Author: David Blevins <da...@gmail.com>
AuthorDate: Fri May 17 00:35:12 2019 +0900
We remove parameters, so don't attempt to copy parameter annotations
---
.../microprofile/jwt/bval/ValidationGenerator.java | 70 +++++++++++++++++++++-
.../jwt/bval/ValidationGeneratorTest.java | 7 +++
.../{Shapes.java => Shapes$$JwtConstraints.java} | 15 +++--
.../tomee/microprofile/jwt/bval/data/Shapes.java | 4 +-
4 files changed, 88 insertions(+), 8 deletions(-)
diff --git a/mp-jwt/src/main/java/org/apache/tomee/microprofile/jwt/bval/ValidationGenerator.java b/mp-jwt/src/main/java/org/apache/tomee/microprofile/jwt/bval/ValidationGenerator.java
index ae32039..ee1a488 100644
--- a/mp-jwt/src/main/java/org/apache/tomee/microprofile/jwt/bval/ValidationGenerator.java
+++ b/mp-jwt/src/main/java/org/apache/tomee/microprofile/jwt/bval/ValidationGenerator.java
@@ -19,12 +19,15 @@ package org.apache.tomee.microprofile.jwt.bval;
import org.apache.openejb.dyni.DynamicSubclass;
import org.apache.openejb.util.proxy.ProxyGenerationException;
import org.apache.xbean.asm7.AnnotationVisitor;
+import org.apache.xbean.asm7.ClassReader;
+import org.apache.xbean.asm7.ClassVisitor;
import org.apache.xbean.asm7.ClassWriter;
import org.apache.xbean.asm7.MethodVisitor;
import org.apache.xbean.asm7.Opcodes;
import org.apache.xbean.asm7.Type;
import javax.validation.Constraint;
+import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.ArrayList;
@@ -141,7 +144,7 @@ public class ValidationGenerator implements Opcodes {
mv.visitMaxs(1, 1);
}
- DynamicSubclass.copyMethodAnnotations(target, visitors);
+ copyMethodAnnotations(target, visitors);
for (final MethodVisitor visitor : visitors.values()) {
visitor.visitEnd();
@@ -175,4 +178,69 @@ public class ValidationGenerator implements Opcodes {
private static boolean isConstraint(final Annotation annotation) {
return annotation.annotationType().isAnnotationPresent(Constraint.class);
}
+
+ public static void copyMethodAnnotations(final Class<?> classToProxy, final Map<String, MethodVisitor> visitors) throws ProxyGenerationException {
+ // Move all the annotations onto the newly implemented methods
+ // Ensures CDI and JAX-RS and JAX-WS still work
+ Class clazz = classToProxy;
+ while (clazz != null && !clazz.equals(Object.class)) {
+ try {
+ final ClassReader classReader = new ClassReader(DynamicSubclass.readClassFile(clazz));
+ final ClassVisitor copyMethodAnnotations = new CopyMethodAnnotations(visitors);
+ classReader.accept(copyMethodAnnotations, ClassReader.SKIP_CODE);
+ } catch (final IOException e) {
+ throw new ProxyGenerationException(e);
+ }
+ clazz = clazz.getSuperclass();
+ }
+ }
+
+ public static class MoveAnnotationsVisitor extends MethodVisitor {
+
+ private final MethodVisitor newMethod;
+
+ public MoveAnnotationsVisitor(final MethodVisitor movedMethod, final MethodVisitor newMethod) {
+ super(Opcodes.ASM7, movedMethod);
+ this.newMethod = newMethod;
+ }
+
+ @Override
+ public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
+ return newMethod.visitAnnotation(desc, visible);
+ }
+
+ @Override
+ public AnnotationVisitor visitParameterAnnotation(final int parameter, final String desc, final boolean visible) {
+ return super.visitParameterAnnotation(parameter, desc, visible);
+ }
+
+ @Override
+ public void visitEnd() {
+ newMethod.visitEnd();
+ super.visitEnd();
+ }
+ }
+
+ private static class CopyMethodAnnotations extends ClassVisitor {
+ private final Map<String, MethodVisitor> visitors;
+
+ public CopyMethodAnnotations(final Map<String, MethodVisitor> visitors) {
+ super(Opcodes.ASM7);
+ this.visitors = visitors;
+ }
+
+ @Override
+ public MethodVisitor visitMethod(final int access, final String name, final String desc, final String signature, final String[] exceptions) {
+ final MethodVisitor newMethod = visitors.remove(name + desc);
+
+ if (newMethod == null) {
+ return null;
+ }
+
+ final MethodVisitor oldMethod = super.visitMethod(access, name, desc, signature, exceptions);
+
+ return new MoveAnnotationsVisitor(oldMethod, newMethod);
+ }
+ }
+
}
diff --git a/mp-jwt/src/test/java/org/apache/tomee/microprofile/jwt/bval/ValidationGeneratorTest.java b/mp-jwt/src/test/java/org/apache/tomee/microprofile/jwt/bval/ValidationGeneratorTest.java
index 704bfd8..596ed5f 100644
--- a/mp-jwt/src/test/java/org/apache/tomee/microprofile/jwt/bval/ValidationGeneratorTest.java
+++ b/mp-jwt/src/test/java/org/apache/tomee/microprofile/jwt/bval/ValidationGeneratorTest.java
@@ -3,6 +3,8 @@ package org.apache.tomee.microprofile.jwt.bval;
import org.apache.openejb.util.proxy.ProxyGenerationException;
import org.apache.tomee.microprofile.jwt.bval.data.Colors;
import org.apache.tomee.microprofile.jwt.bval.data.Colors$$JwtConstraints;
+import org.apache.tomee.microprofile.jwt.bval.data.Shapes;
+import org.apache.tomee.microprofile.jwt.bval.data.Shapes$$JwtConstraints;
import org.junit.Assert;
import org.junit.Test;
@@ -30,6 +32,11 @@ public class ValidationGeneratorTest {
assertGeneration(Colors.class, Colors$$JwtConstraints.class);
}
+ @Test
+ public void test() throws Exception {
+ assertGeneration(Shapes.class, Shapes$$JwtConstraints.class);
+ }
+
private void assertGeneration(final Class<?> target, final Class<?> expectedClass) throws IOException, ProxyGenerationException {
final String actual = Asmifier.asmify(ValidationGenerator.generateFor(target));
final String expected = Asmifier.asmify(Asmifier.readClassFile(expectedClass));
diff --git a/mp-jwt/src/test/java/org/apache/tomee/microprofile/jwt/bval/data/Shapes.java b/mp-jwt/src/test/java/org/apache/tomee/microprofile/jwt/bval/data/Shapes$$JwtConstraints.java
similarity index 70%
copy from mp-jwt/src/test/java/org/apache/tomee/microprofile/jwt/bval/data/Shapes.java
copy to mp-jwt/src/test/java/org/apache/tomee/microprofile/jwt/bval/data/Shapes$$JwtConstraints.java
index 2179063..1ca30d2 100644
--- a/mp-jwt/src/test/java/org/apache/tomee/microprofile/jwt/bval/data/Shapes.java
+++ b/mp-jwt/src/test/java/org/apache/tomee/microprofile/jwt/bval/data/Shapes$$JwtConstraints.java
@@ -16,20 +16,23 @@
*/
package org.apache.tomee.microprofile.jwt.bval.data;
+import org.apache.tomee.microprofile.jwt.bval.Name;
import org.apache.tomee.microprofile.jwt.bval.ann.Audience;
import org.apache.tomee.microprofile.jwt.bval.ann.Issuer;
+import org.eclipse.microprofile.jwt.JsonWebToken;
-public class Shapes {
+public class Shapes$$JwtConstraints {
+ @Name("public void org.apache.tomee.microprofile.jwt.bval.data.Shapes.square(int)")
@Issuer("http://foo.bar.com")
@Audience("joe")
- public void square() {
+ public JsonWebToken square$$0() {
+ return null;
}
+ @Name("public void org.apache.tomee.microprofile.jwt.bval.data.Shapes.triangle(boolean)")
@Audience("jane")
- public void triangle(boolean isRight) {
- }
-
- public void circle() {
+ public JsonWebToken triangle$$1() {
+ return null;
}
}
diff --git a/mp-jwt/src/test/java/org/apache/tomee/microprofile/jwt/bval/data/Shapes.java b/mp-jwt/src/test/java/org/apache/tomee/microprofile/jwt/bval/data/Shapes.java
index 2179063..7f6b0a3 100644
--- a/mp-jwt/src/test/java/org/apache/tomee/microprofile/jwt/bval/data/Shapes.java
+++ b/mp-jwt/src/test/java/org/apache/tomee/microprofile/jwt/bval/data/Shapes.java
@@ -19,11 +19,13 @@ package org.apache.tomee.microprofile.jwt.bval.data;
import org.apache.tomee.microprofile.jwt.bval.ann.Audience;
import org.apache.tomee.microprofile.jwt.bval.ann.Issuer;
+import javax.ws.rs.PathParam;
+
public class Shapes {
@Issuer("http://foo.bar.com")
@Audience("joe")
- public void square() {
+ public void square(@PathParam("id") int id) {
}
@Audience("jane")