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] > >
