You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jdo-commits@db.apache.org by mb...@apache.org on 2012/04/06 23:47:58 UTC

svn commit: r1310602 - in /db/jdo/trunk/tck/src: conf/jdo-3_1-signatures.txt java/org/apache/jdo/tck/util/signature/SignatureVerifier.java

Author: mbo
Date: Fri Apr  6 21:47:58 2012
New Revision: 1310602

URL: http://svn.apache.org/viewvc?rev=1310602&view=rev
Log:
JDO-713: SignatureTest failure for method Discriminator.discriminatorColumnName()

Modified:
    db/jdo/trunk/tck/src/conf/jdo-3_1-signatures.txt
    db/jdo/trunk/tck/src/java/org/apache/jdo/tck/util/signature/SignatureVerifier.java

Modified: db/jdo/trunk/tck/src/conf/jdo-3_1-signatures.txt
URL: http://svn.apache.org/viewvc/db/jdo/trunk/tck/src/conf/jdo-3_1-signatures.txt?rev=1310602&r1=1310601&r2=1310602&view=diff
==============================================================================
--- db/jdo/trunk/tck/src/conf/jdo-3_1-signatures.txt (original)
+++ db/jdo/trunk/tck/src/conf/jdo-3_1-signatures.txt Fri Apr  6 21:47:58 2012
@@ -1263,6 +1263,7 @@ public annotation javax.jdo.annotations.
     String nullIndicatorColumn() default "";
     String nullIndicatorValue() default "";
     javax.jdo.annotations.Persistent[] members() default {};
+    javax.jdo.annotations.Discriminator discriminatorColumnName() default @javax.jdo.annotations.Discriminator;
 }
 
 public annotation javax.jdo.annotations.EmbeddedOnly extends java.lang.annotation.Annotation

Modified: db/jdo/trunk/tck/src/java/org/apache/jdo/tck/util/signature/SignatureVerifier.java
URL: http://svn.apache.org/viewvc/db/jdo/trunk/tck/src/java/org/apache/jdo/tck/util/signature/SignatureVerifier.java?rev=1310602&r1=1310601&r2=1310602&view=diff
==============================================================================
--- db/jdo/trunk/tck/src/java/org/apache/jdo/tck/util/signature/SignatureVerifier.java (original)
+++ db/jdo/trunk/tck/src/java/org/apache/jdo/tck/util/signature/SignatureVerifier.java Fri Apr  6 21:47:58 2012
@@ -403,6 +403,11 @@ public class SignatureVerifier {
                 // don't check the actual values because only empty arrays
                 // are supported.
                 ok = actual.getClass().getComponentType().equals(expClass);
+            } else if (expClass.isAnnotation()) {
+                // check whether the type isAssignableFrom the class of the actual value, 
+                // if type is an annotation. The actual value is a dynamic proxy, 
+                // so an equals comparison does not work. 
+                ok = expClass.isAssignableFrom(actual.getClass());
             } else {
                 // get the actual value which must be a static class.field
                 Object expectedValue = null;
@@ -601,6 +606,11 @@ public class SignatureVerifier {
             mods |= Modifier.PUBLIC;
             mods |= Modifier.ABSTRACT;
         }
+        Class resultType = getClass(result);
+        if (resultType.isAnnotation()) {
+            // add ANNOTATION modifier if the result type is an annotation
+            mods |= ANNOTATION;
+        }
         if (mods != convertModifiers(method)) {
             handleMismatch(
                 "method declaration: non-matching modifiers;",
@@ -738,7 +748,8 @@ public class SignatureVerifier {
      * as if they had a special modifier.
      * @param cls the class
      * @return modifiers of the class with extra flags for enum and annotation
-     */protected int convertModifiers(Class cls) {
+     */
+    protected int convertModifiers(Class cls) {
         int result = cls.getModifiers();
         // first remove extraneous stuff
         result &= ALL_MODIFIERS;
@@ -755,7 +766,8 @@ public class SignatureVerifier {
      * as if they had a special modifier.
      * @param method the method
      * @return modifiers of the class with extra flags for enum and annotation
-     */protected int convertModifiers(Method method) {
+     */
+    protected int convertModifiers(Method method) {
         int result = method.getModifiers();
         // first remove extraneous stuff
         result &= ALL_MODIFIERS;
@@ -776,7 +788,8 @@ public class SignatureVerifier {
      * as if it had a special modifier.
      * @param field the field
      * @return modifiers of the class with extra flag for enum
-     */protected int convertModifiers(Field field) {
+     */
+    protected int convertModifiers(Field field) {
         int result = field.getModifiers();
         // first remove extraneous stuff
         result &= ALL_MODIFIERS;
@@ -1078,7 +1091,7 @@ public class SignatureVerifier {
             String t;
             if ((t = getLookAhead()) != null) {
                 if (t.charAt(0) != '{' || t.charAt(1) != '}') {
-                    setLookAhead(t); // not a string literal
+                    setLookAhead(t); // not an array literal
                     return null;
                 }
                 return t;
@@ -1091,17 +1104,47 @@ public class SignatureVerifier {
             ir.mark(1);
             char c = (char)ir.read();
             if (c != '{') {
-                ir.reset(); // not start of a string literal
+                ir.reset(); // not start of an array literal
                 return null;
             }
             c = (char)ir.read();
             if (c != '}') {
-                ir.reset(); // not end of a string literal
+                ir.reset(); // not end of an array literal
                 return null;
             }
         
             return "{}";
         }
+
+        /**
+         * Scans for an at-sign
+         * @return <code>null</code> if the next token is not an at-sign
+         */
+        protected String scanAtSign()
+            throws IOException, ParseException {
+            // parse stored token if any
+            String t;
+            if ((t = getLookAhead()) != null) {
+                if (t.charAt(0) != '@') {
+                    setLookAhead(t); // not an at-sign
+                    return null;
+                }
+                return t;
+            }
+
+            // parse first char
+            if (!skip()) {
+                throw new ParseException(msgUnexpectedEOF(), 0);
+            }
+            ir.mark(1);
+            char c = (char)ir.read();
+            if (c != '@') {
+                ir.reset(); // not an at-sign
+                return null;
+            }
+
+            return "@";
+        }
     
         /**
          * Returns the next token to be parsed.
@@ -1115,6 +1158,7 @@ public class SignatureVerifier {
             } else if ((t = scanNumberLiteral()) != null) {
             } else if ((t = scanStringLiteral()) != null) {
             } else if ((t = scanCharacterLiteral()) != null) {
+            } else if ((t = scanAtSign()) != null) {
             } else {
                 setLookAhead(t); // not an identifier, number, or string
                 // next non-white char
@@ -1186,6 +1230,51 @@ public class SignatureVerifier {
             }
             return field;
         }
+
+        /**
+         * Parses an annotation which is an at-sign followed by a fully qualified interface name.
+         * @return <code>null</code> if the next token is not an annotation, otherwise return 
+         * the annotation type name without the at-sign.
+         */
+        protected String parseAnnotation()
+            throws IOException, ParseException {
+            String t;
+            // parse stored token if any
+            if ((t = getLookAhead()) != null) {
+                if (t.charAt(0) != '@') {
+                    setLookAhead(t); // not a annotation
+                    return null;
+                }
+            } else if ((t = scanAtSign()) != null) {
+            } else {
+                return null;
+            }
+
+            final String identifier = demandIdentifier();
+            if (identifier == null) {
+                throw new ParseException(msgUnexpectedToken(parseToken()), 0);
+            }
+
+            return identifier;
+        }
+
+        /**
+         * Parses the default value specification of an annotation element and validates 
+         * that it is an element value, which is either an annotation or a constant.
+         * @return never <code>null</code>
+         */
+        protected String demandElementValue()
+            throws IOException, ParseException { 
+            final String annotation = parseAnnotation();
+            if (annotation != null) {
+                return annotation;
+            }
+            final String constant = demandConstant();
+            if (constant == null) {
+                throw new ParseException(msgUnexpectedToken(parseToken()), 0);
+            }
+            return constant;
+        }
     
         /**
          * Parses any available Java modifiers.
@@ -1379,7 +1468,7 @@ public class SignatureVerifier {
                         excepts = new String[]{};
                         value = null;
                     } else if (tt.equals("default")) {
-                        value = demandConstant();
+                        value = demandElementValue();
                         demandToken(";");
                         excepts = new String[]{};
                     } else {