Hi Bubna,
   Sorry my poor english expresion, So jira is diffcult for me to express my
idea. Tomorrow I will post a patch code to the maillist. Because It is a
very critical bug for me.Would  Dev Team  patch the bug to version 1.6.1
soon?

Leon



2009/2/5 Nathan Bubna <[email protected]>

> Thanks for the detailed analysis.  Would you open an issue for this in
> our JIRA issue tracker?
>
> https://issues.apache.org/jira/browse/VELOCITY
>
> On Thu, Feb 5, 2009 at 7:32 AM, Leon sdh5724 <[email protected]> wrote:
> >  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;
> >    }
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to