Re: FM 2.3.12: NullPointerException inBlockAssignment.getCanonicalForm() when assign body is zero length
"Klotz, Leigh" <[email protected]>
| Newsgroups | gmane.comp.web.freemarker.user |
|---|---|
| Message-ID | <E254B0A7E0268949ABFE5EA97B7D0CF404B9BDA7@USA7061MS01.na.xerox.net> |
JR, Thank you for the quick and detailed response. I'll start looking at SVN head. Briefly, we're looking at using Freemarker to replace an existing template language which dates back many years. As you suspected, I'm writing tools to do some of the work we've been able to do with our existing language. I'll send a note off to freemarker-devel. Leigh. -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Jonathan Revusky Sent: Tuesday, April 22, 2008 3:45 PM To: FreeMarker-user Subject: Re: [FreeMarker-user] FM 2.3.12: NullPointerException inBlockAssignment.getCanonicalForm() when assign body is zero length On Tue, Apr 22, 2008 at 11:27 PM, Klotz, Leigh <[email protected]> wrote: > Hello all; I've just joined this list, so please let me know if this > isn't the correct place to be posting . Well, I suppose it's an okay place to be posting. The bug tracker is also a possibility or maybe the dev list. We're not very picky about it. > > The following template gets an error in getCanonicalForm(): > > ---Failing Template--- > <#ftl> > <#assign x></#assign> > > ---Test Program--- > import java.io.IOException; > import freemarker.template.Configuration; > import freemarker.template.Template; > > public class CanonicalTest { > > public static void main(String args[]) throws IOException { > String filename = args[0]; > Configuration config = new Configuration(); > Template t = config.getTemplate(filename); > System.out.print(t.getRootTreeNode().getCanonicalForm()); > } > } > > ---Execution Trace--- > java -classpath > .\;c:/ds/svn1/docushare3/vendor/freemarker/freemarker.jar CanonicalTest > AssignFail.ftl > Exception in thread "main" java.lang.NullPointerException > at > freemarker.core.BlockAssignment.getCanonicalForm(BlockAssignment.java:15 > 0) > at > freemarker.core.MixedContent.getCanonicalForm(MixedContent.java:100) > at CanonicalTest.main(CanonicalTest.java:11) > > > This template will succeed: > ---Passing Template--- > <#ftl> > <#assign x> </#assign> > > I believe freemarker-2.3.12/src/freemarker/core/BlockAssignment.java > needs to have this: > ---Suggested Fix--- > public String getCanonicalForm() { > ... > return "<#" + key + " " + varName + > (namespaceExp != null ? " in " + > namespaceExp.getCanonicalForm() : "") > + ">" + (nestedBlock != null ? > nestedBlock.getCanonicalForm() : "") + "</#" + key + ">"; > } Yes, that's a bug in 2.3.x it seems. It's actually not present in the SVN head, which will (EVENTUALLY) be FM 2.4. We're hitting the NPE if the block is empty. I just committed a fix in the 2.3 branch. Thanks. The bug is not just there BTW if you call getCanonicalForm(). It just does bug out with a template like: <#assign x></assign>${x} The attempt to dereference caused an InvalidReferenceException. x was never assigned, even though it should still be assigned to the empty string, of course. I guess nobody ever reported this in so many years, because the block within an assignment block is basically never empty in practice. By the way, why are you playing around with getCanonicalForm()? Just curious. I think you should know that all that stuff has been completely reworked in a much more flexible way in 2.4, so if you're interested in writing some tool that mucks with FTL, you're better off probably using that, even though it's prerelease. See the freemarker.core.helpers.* package. http://freemarker.svn.sourceforge.net/viewvc/freemarker/trunk/freemarker /src/freemarker/core/helpers/ In particular, DefaultTreeDumper and CanonicalizingTreeDumper They implement the tree-walking API defined here: http://freemarker.svn.sourceforge.net/viewvc/freemarker/trunk/freemarker /src/freemarker/core/ast/ASTVisitor.java?view=markup That's the abstract base class. So all that getCanonicalForm() stuff will basically be superseded by the above. Oh, and probably any conversation that develops out of this might be more appropriate on freemarker-dev, but it's a borderline case, I suppose. We're not so strict about that. Regards, JR which implements the API defined here: > > > Leigh. > > ------------------------------------------------------------------------ - > This SF.net email is sponsored by the 2008 JavaOne(SM) Conference > Don't miss this year's exciting event. There's still time to save $100. > Use priority code J8TL2D2. > http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/j avaone > _______________________________________________ > FreeMarker-user mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/freemarker-user > ------------------------------------------------------------------------ - This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/j avaone _______________________________________________ FreeMarker-user mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/freemarker-user ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone