Velocity
  1. Velocity
  2. VELOCITY-579

Can not access a member of class X with modifiers "public" even if method is public

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Blocker Blocker
    • Resolution: Fixed
    • Affects Version/s: 1.5
    • Fix Version/s: 1.6
    • Component/s: Engine
    • Labels:
      None

      Description

      When upgrading from 1.4 to 1.5 none of my template is working anymore.

      For example :

      [javadoc] ERROR [console:logVelocityMessage] - ASTMethod.execute() : exception invoking method 'tags' in class com.sun.tools.javadoc.MethodDocImpl
      [javadoc] ERROR [console:logVelocityMessage] - java.lang.IllegalAccessException: Class org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl can not access a member of class com.sun.tools.javadoc.DocImpl with modifiers "public"

      The method 'tags()' is public in com.sun.javadoc.Doc, but the implementation is package protected. So the java.lang.reflect.Method object is well returned by the org.apache.velocity.util.introspection.Introspector but not accessible from templates.
      The same errors occured for example for javax.servlet.http.HttpSession Weblogic's implementation which is not public, but methods are !

      It's not possible to wrap all objects javax.servlet.http.HttpSession into public implementations ...

      The Introspector could call method.setAccessible(true) before returning Method object : if this method has been found, it is a public method !

        Activity

        Eric Ballet Baz created issue -
        Hide
        Will Glass-Husain added a comment -

        Can you clarify? Do you mean the method is public but the class is package protected?

        Show
        Will Glass-Husain added a comment - Can you clarify? Do you mean the method is public but the class is package protected?
        Hide
        Nathan Bubna added a comment -

        Yeah, this isn't clear to me either. Was this something that worked in Velocity 1.4 and stopped working in 1.5?

        It sounds related to the discussion and fixes that happened in VELTOOLS-66. Like maybe the changes made due to that bug report are what led to this?

        It's just odd that this led to an IllegalAccessException if the public methods in question were not declared in either a public class or a public interface, then Velocity shouldn't have acknowledged them at all (i think), so that it would never try to call them and end up with an IllegalAccessException. Or maybe i don't understand the problem?

        Can you recreate the problem in small example that we could try out?

        Show
        Nathan Bubna added a comment - Yeah, this isn't clear to me either. Was this something that worked in Velocity 1.4 and stopped working in 1.5? It sounds related to the discussion and fixes that happened in VELTOOLS-66 . Like maybe the changes made due to that bug report are what led to this? It's just odd that this led to an IllegalAccessException if the public methods in question were not declared in either a public class or a public interface, then Velocity shouldn't have acknowledged them at all (i think), so that it would never try to call them and end up with an IllegalAccessException. Or maybe i don't understand the problem? Can you recreate the problem in small example that we could try out?
        Hide
        Eric Ballet Baz added a comment -

        Yes it worked in Velocity 1.4 and stopped working in 1.5.

        To reproduce the problem :

        1) Add to your classpath the library "tools.jar" which you can find in the lib directory of the Sun JDK

        2) In your java test program add these two lines :

        com.sun.javadoc.MethodDoc methodDoc = new com.sun.tools.javadoc.MethodDocImpl(null, null);
        context.put("methodDoc", methodDoc);

        3) In your .vm template simply define :

        $methodDoc.tags()

        4) Run your test program

        You should see something like :

        ASTMethod.execute() : exception invoking method 'tags' in class com.sun.tools.javadoc.MethodDocImpl
        java.lang.IllegalAccessException: Class org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl can
        not access a member of class com.sun.tools.javadoc.DocImpl with modifiers "public"
        at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:295)
        at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:245)
        at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:203)
        at org.apache.velocity.runtime.parser.node.ASTReference.render(ASTReference.java:294)
        at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:318)
        at org.apache.velocity.Template.merge(Template.java:254)
        at Example.<init>(Example.java:100)
        at Example.main(Example.java:129)

        But the method tags() is very public ! it's defined in the following interface :
        http://java.sun.com/j2se/1.5.0/docs/guide/javadoc/doclet/spec/com/sun/javadoc/Doc.html#tags()
        and implemented as a public method in DocImpl.

        The problem here is that the class DocImpl is not public even if she implements public methods, this class is package protected :

        abstract class DocImpl implements Doc, Comparable

        This is exactly the same problem with the Weblogic implementation of javax.servlet.http.HttpSession which is not a public class, even if its methods are public!

        Show
        Eric Ballet Baz added a comment - Yes it worked in Velocity 1.4 and stopped working in 1.5. To reproduce the problem : 1) Add to your classpath the library "tools.jar" which you can find in the lib directory of the Sun JDK 2) In your java test program add these two lines : com.sun.javadoc.MethodDoc methodDoc = new com.sun.tools.javadoc.MethodDocImpl(null, null); context.put("methodDoc", methodDoc); 3) In your .vm template simply define : $methodDoc.tags() 4) Run your test program You should see something like : ASTMethod.execute() : exception invoking method 'tags' in class com.sun.tools.javadoc.MethodDocImpl java.lang.IllegalAccessException: Class org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl can not access a member of class com.sun.tools.javadoc.DocImpl with modifiers "public" at sun.reflect.Reflection.ensureMemberAccess(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:295) at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:245) at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:203) at org.apache.velocity.runtime.parser.node.ASTReference.render(ASTReference.java:294) at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:318) at org.apache.velocity.Template.merge(Template.java:254) at Example.<init>(Example.java:100) at Example.main(Example.java:129) But the method tags() is very public ! it's defined in the following interface : http://java.sun.com/j2se/1.5.0/docs/guide/javadoc/doclet/spec/com/sun/javadoc/Doc.html#tags( ) and implemented as a public method in DocImpl. The problem here is that the class DocImpl is not public even if she implements public methods, this class is package protected : abstract class DocImpl implements Doc, Comparable This is exactly the same problem with the Weblogic implementation of javax.servlet.http.HttpSession which is not a public class, even if its methods are public!
        Hide
        Nathan Bubna added a comment -

        Appears to have been fixed in 1.6, since i cannot replicate this anymore with testcase or following Eric's instructions.

        Show
        Nathan Bubna added a comment - Appears to have been fixed in 1.6, since i cannot replicate this anymore with testcase or following Eric's instructions.
        Nathan Bubna made changes -
        Field Original Value New Value
        Status Open [ 1 ] Resolved [ 5 ]
        Resolution Fixed [ 1 ]
        Fix Version/s 1.6 [ 12310290 ]
        Hide
        Nathan Bubna added a comment -

        @#%! So, in hopes of creating a beta1 test build, i switch to java 1.4.2 and tried running things. apart from the various 1.5-isms that snuck past me, i also discovered that the test case for this bugger fails in Java 1.4.x.

        Testcase: testPublicMethodInheritedFromPrivateClass took 0.031 sec
        FAILED
        expected:<bar> but was:<$bar.bar()>
        junit.framework.ComparisonFailure: expected:<bar> but was:<$bar.bar()>
        at org.apache.velocity.test.BaseEvalTestCase.assertEvalEquals(BaseEvalTestCase.java:85)
        at org.apache.velocity.test.issues.Velocity579TestCase.testPublicMethodInheritedFromPrivateClass(Velocity579TestCase.java:45)

        lame. so why do we still support java 1.4, again?

        Show
        Nathan Bubna added a comment - @#%! So, in hopes of creating a beta1 test build, i switch to java 1.4.2 and tried running things. apart from the various 1.5-isms that snuck past me, i also discovered that the test case for this bugger fails in Java 1.4.x. Testcase: testPublicMethodInheritedFromPrivateClass took 0.031 sec FAILED expected:<bar> but was:<$bar.bar()> junit.framework.ComparisonFailure: expected:<bar> but was:<$bar.bar()> at org.apache.velocity.test.BaseEvalTestCase.assertEvalEquals(BaseEvalTestCase.java:85) at org.apache.velocity.test.issues.Velocity579TestCase.testPublicMethodInheritedFromPrivateClass(Velocity579TestCase.java:45) lame. so why do we still support java 1.4, again?
        Nathan Bubna made changes -
        Resolution Fixed [ 1 ]
        Status Resolved [ 5 ] Reopened [ 4 ]
        Hide
        Nathan Bubna added a comment -

        Sorry. Quasi-false alarm. It was the test for VELOCITY-70 that failed...

        Show
        Nathan Bubna added a comment - Sorry. Quasi-false alarm. It was the test for VELOCITY-70 that failed...
        Nathan Bubna made changes -
        Resolution Fixed [ 1 ]
        Status Reopened [ 4 ] Resolved [ 5 ]
        Mark Thomas made changes -
        Workflow jira [ 12419498 ] Default workflow, editable Closed status [ 12551961 ]
        Mark Thomas made changes -
        Workflow Default workflow, editable Closed status [ 12551961 ] jira [ 12552340 ]

          People

          • Assignee:
            Unassigned
            Reporter:
            Eric Ballet Baz
          • Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development