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 <[email protected]> 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")
