velocity-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Nathan Bubna (JIRA)" <...@velocity.apache.org>
Subject [jira] Created: (VELOCITY-689) ClassMap misses super interfaces
Date Thu, 05 Feb 2009 16:21:59 GMT
ClassMap misses super interfaces
--------------------------------

                 Key: VELOCITY-689
                 URL: https://issues.apache.org/jira/browse/VELOCITY-689
             Project: Velocity
          Issue Type: Bug
    Affects Versions: 1.6.1, 1.6, 1.5
            Reporter: Nathan Bubna
            Priority: Minor
             Fix For: 1.6.2, 1.7


Hi devs,
   when we upgrade to velocity1.6.1. But the process failed. we found a
critical bug in velocity1.6.1 . I have mock the bug in details:

   First step:

public interface ITestBean2{

    String getName();
}

public interface ITestBean extends ITestBean2 {

}

private static  class TestBean implements ITestBean {
       private String name = "test bean method name";
       public String getName() {
           return name;
       }
}

  then  set up velocity excute template code:

  context.put("testBean", new TestBean());
  System.out.println(evaluate("$testBean.getName()"));

  We found $testBean.getName() can not be rendered.The template can be
rendered in version1.4.  Then I debug several hours(I never read velocity
code before), we found a bug in class
org.apache.velocity.util.introspection.ClassMap::createMethodCache() .  Code
"classToReflect.getInterfaces() " is not correct used, Class.getInterfaces()
Can *ONLY* get parent interfaces,  it  can not get a super super interface.
So Code "createMethodCache()" missed a interface check.

Leon Liu
================================================
 private MethodCache createMethodCache()
   {
       MethodCache methodCache = new MethodCache(log);
       for (Class classToReflect = getCachedClass(); classToReflect != null
; classToReflect = classToReflect.getSuperclass())
       {
           if (Modifier.isPublic(classToReflect.getModifiers()))
           {
               populateMethodCacheWith(methodCache, classToReflect);
           }
           *Class [] interfaces = classToReflect.getInterfaces();*
           for (int i = 0; i < interfaces.length; i++)
           {
               if (Modifier.isPublic(interfaces[i].getModifiers()))
               {
                   populateMethodCacheWith(methodCache, interfaces[i]);
               }
           }
       }
       return methodCache;
   }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@velocity.apache.org
For additional commands, e-mail: dev-help@velocity.apache.org


Mime
View raw message