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")