freemarker-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Daniel Dekany (JIRA)" <j...@apache.org>
Subject [jira] [Comment Edited] (FREEMARKER-41) XPathSupport executeQuery doesn't handle text() in models that isn't normalized
Date Sat, 10 Dec 2016 09:47:58 GMT

    [ https://issues.apache.org/jira/browse/FREEMARKER-41?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15733867#comment-15733867
] 

Daniel Dekany edited comment on FREEMARKER-41 at 12/10/16 9:47 AM:
-------------------------------------------------------------------

I have tried it with Jaxen. That returns a set of two nodes ("SA" and "MPLE"), which is the
expected (correct) result. So if we just magically glue together adjacent text nodes when
they are printed, and you print both nodes in order, you get "SAMPLE" and then "MPLE", which
is of course wrong. Yeah.


was (Author: ddekany):
I have tried it Jaxen. That returns a set of two nodes ("SA" and "MPLE")... So if we just
magically glue together adjacent text nodes when they are printed, and you print both nodes
in order, you get "SAMPLE" and then "MPLE", which is of course wrong. Yeah.

> XPathSupport executeQuery doesn't handle text() in models that isn't normalized
> -------------------------------------------------------------------------------
>
>                 Key: FREEMARKER-41
>                 URL: https://issues.apache.org/jira/browse/FREEMARKER-41
>             Project: Apache Freemarker
>          Issue Type: Bug
>          Components: engine
>    Affects Versions: 2.3.25-incubating
>            Reporter: Per Olsson
>
> XPath expressions that contains text() doesn't evaluate to the correct value when the
model isn't normalized and includes multiple text nodes. This will happen when the xml-parser
creates multiple text nodes due to performance or memory reasons and is a fully normal behaviour.
> The solution in the function executeQuery with the NodeIterator (files: freemarker/ext/dom/SunInternalXalanXPathSupport.java
and freemarker/ext/dom/XalanXPathSupport.java) doesn't handle adjacent(siblings) textnodes.
The problem probably also exists for CDATA nodes. I don't know if the jaxen solution behaves
in the same manner. 
> {code:title=...XPathSupport.java|borderStyle=solid} 
> synchronized public TemplateModel executeQuery(Object context, String xpathQuery) throws
TemplateModelException {
>   ...
>   NodeIterator nodeIterator = xresult.nodeset();
>   Node n;
>   do {
>       n = nodeIterator.nextNode();
>       if (n != null) {
>           result.add(n);
>       }
>   } while (n != null);
>   ...
> {code}
> Sample code to reproduce
> {code:title=Reproduce.java|borderStyle=solid}
>     Configuration cfg = new Configuration(Configuration.VERSION_2_3_25);
>     cfg.setDefaultEncoding("UTF-8");
>     ClassTemplateLoader ctl = new ClassTemplateLoader(App.class, "/");
>     cfg.setTemplateLoader(ctl);
>     // --- sample.ftl ---
>     // <#ftl>
>     // Text:${model["//root/text()"]}
>     // Node:${model["//root"]}
>     Template temp = cfg.getTemplate("sample.ftl");
>     // --- Model --- 
>     // Element:root
>     //     |- TextNode:SA
>     //     |- TextNode:MPLE
>     DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
>     DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
>     Document doc = docBuilder.newDocument();
>     Element rootElement = doc.createElement("root");
>     doc.appendChild(rootElement);
>     Text text = doc.createTextNode("SA");
>     rootElement.appendChild(text);
>     text = doc.createTextNode("MPLE");
>     rootElement.appendChild(text);
>     Map<String, Object> model = new HashMap<String, Object>();
>     model.put("model", doc);
>     StringWriter sw = new StringWriter();
>     temp.process(model, sw);
>     System.out.println(sw.toString());
>     // --- Actual output ---
>     // Text:SA
>     // Node:SAMPLE
>     // --- Expected output ---
>     // Text:SAMPLE
>     // Node:SAMPLE 
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message