You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2017/01/19 09:46:29 UTC

incubator-freemarker git commit: Further cleanup in NodeModel static methods. Improved NodeModel and NodeListModel JavaDoc.

Repository: incubator-freemarker
Updated Branches:
  refs/heads/2.3-gae b2633ecd9 -> 780351258


Further cleanup in NodeModel static methods. Improved NodeModel and NodeListModel JavaDoc.


Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/78035125
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/78035125
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/78035125

Branch: refs/heads/2.3-gae
Commit: 780351258de39a2047acdd54aef8f54dcec4dbcb
Parents: b2633ec
Author: ddekany <dd...@apache.org>
Authored: Thu Jan 19 10:46:18 2017 +0100
Committer: ddekany <dd...@apache.org>
Committed: Thu Jan 19 10:46:18 2017 +0100

----------------------------------------------------------------------
 .../java/freemarker/ext/dom/NodeListModel.java  |  5 ++
 src/main/java/freemarker/ext/dom/NodeModel.java | 49 +++++++++++---------
 2 files changed, 31 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/78035125/src/main/java/freemarker/ext/dom/NodeListModel.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/dom/NodeListModel.java b/src/main/java/freemarker/ext/dom/NodeListModel.java
index b375478..1a97e37 100644
--- a/src/main/java/freemarker/ext/dom/NodeListModel.java
+++ b/src/main/java/freemarker/ext/dom/NodeListModel.java
@@ -28,6 +28,7 @@ import org.w3c.dom.NodeList;
 
 import freemarker.core.Environment;
 import freemarker.core._UnexpectedTypeErrorExplainerTemplateModel;
+import freemarker.template.Configuration;
 import freemarker.template.ObjectWrapper;
 import freemarker.template.SimpleScalar;
 import freemarker.template.SimpleSequence;
@@ -45,6 +46,10 @@ import freemarker.template.TemplateSequenceModel;
  * Used when the result set contains 0 or multiple nodes; shouldn't be used when you have exactly 1 node. For exactly 1
  * node, use {@link NodeModel#wrap(Node)}, because {@link NodeModel} subclasses can have extra features building on that
  * restriction, like single elements with text content can be used as FTL string-s.
+ * 
+ * <p>
+ * This class is not guaranteed to be thread safe, so instances of this shouldn't be used as shared variable (
+ * {@link Configuration#setSharedVariable(String, Object)}).
  */
 class NodeListModel extends SimpleSequence implements TemplateHashModel, _UnexpectedTypeErrorExplainerTemplateModel {
     

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/78035125/src/main/java/freemarker/ext/dom/NodeModel.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/dom/NodeModel.java b/src/main/java/freemarker/ext/dom/NodeModel.java
index 8b47457..b5b0ebe 100644
--- a/src/main/java/freemarker/ext/dom/NodeModel.java
+++ b/src/main/java/freemarker/ext/dom/NodeModel.java
@@ -52,6 +52,7 @@ import freemarker.core._UnexpectedTypeErrorExplainerTemplateModel;
 import freemarker.ext.util.WrapperTemplateModel;
 import freemarker.log.Logger;
 import freemarker.template.AdapterTemplateModel;
+import freemarker.template.Configuration;
 import freemarker.template.DefaultObjectWrapper;
 import freemarker.template.SimpleScalar;
 import freemarker.template.TemplateBooleanModel;
@@ -68,13 +69,18 @@ import freemarker.template.TemplateSequenceModel;
  * A base class for wrapping a single W3C DOM Node as a FreeMarker template model.
  * 
  * <p>
- * Note that {@link DefaultObjectWrapper} automatically wraps W3C DOM {@link Node}-s into this, so you may not need to
- * do that with this class manually. Though, before dropping the {@link Node}-s into the data-model, you may want to
+ * Note that {@link DefaultObjectWrapper} automatically wraps W3C DOM {@link Node}-s into this, so you may need do that
+ * with this class manually. However, before dropping the {@link Node}-s into the data-model, you certainly want to
  * apply {@link NodeModel#simplify(Node)} on them.
  * 
  * <p>
- * Note that this class can't be used to represent a result set of 0 or multiple nodes (we use {@link NodeListModel}
- * for that), but should be used to represent a node set of exactly 1 node instead of {@link NodeListModel}.
+ * This class is not guaranteed to be thread safe, so instances of this shouldn't be used as shared variable (
+ * {@link Configuration#setSharedVariable(String, Object)}).
+ * 
+ * <p>
+ * To represent a node sequence (such as a query result) of exactly 1 nodes, this class should be used instead of
+ * {@link NodeListModel}, as it adds extra capabilities by utilizing that we have exactly 1 node. If you need to wrap a
+ * node sequence of 0 or multiple nodes, you must use {@link NodeListModel}.
  */
 abstract public class NodeModel
 implements TemplateNodeModelEx, TemplateHashModel, TemplateSequenceModel,
@@ -398,7 +404,12 @@ implements TemplateNodeModelEx, TemplateHashModel, TemplateSequenceModel,
         return xps.executeQuery(node, query);
     }
     
-    public final int size() {return 1;}
+    /**
+     * Always returns 1.
+     */
+    public final int size() {
+        return 1;
+    }
     
     public final TemplateModel get(int i) {
         return i == 0 ? this : null;
@@ -495,7 +506,7 @@ implements TemplateNodeModelEx, TemplateHashModel, TemplateSequenceModel,
      * @see #simplify
      */
     static public void mergeAdjacentText(Node parent) {
-        mergeAdjacentText(parent, null);
+        mergeAdjacentText(parent, new StringBuilder(0));
     }
     
     static private void mergeAdjacentText(Node parent, StringBuilder collectorBuf) {
@@ -506,12 +517,8 @@ implements TemplateNodeModelEx, TemplateHashModel, TemplateSequenceModel,
                 boolean atFirstText = true;
                 while (next instanceof Text) { //
                     if (atFirstText) {
-                        if (collectorBuf == null) {
-                            collectorBuf = new StringBuilder(
-                                    child.getNodeValue().length() + next.getNodeValue().length());
-                        } else {
-                            collectorBuf.setLength(0);
-                        }
+                        collectorBuf.setLength(0);
+                        collectorBuf.ensureCapacity(child.getNodeValue().length() + next.getNodeValue().length());
                         collectorBuf.append(child.getNodeValue());
                         atFirstText = false;
                     }
@@ -537,7 +544,7 @@ implements TemplateNodeModelEx, TemplateHashModel, TemplateSequenceModel,
      * {@link #mergeAdjacentText(Node)}, but it does all that somewhat faster.
      */    
     static public void simplify(Node parent) {
-        simplify(parent, null);
+        simplify(parent, new StringBuilder(0));
     }
     
     static private void simplify(Node parent, StringBuilder collectorTextChildBuff) {
@@ -548,7 +555,7 @@ implements TemplateNodeModelEx, TemplateHashModel, TemplateSequenceModel,
             if (child.hasChildNodes()) {
                 if (collectorTextChild != null) {
                     // Commit pending text node merge:
-                    if (collectorTextChildBuff != null && collectorTextChildBuff.length() != 0) {
+                    if (collectorTextChildBuff.length() != 0) {
                         ((CharacterData) collectorTextChild).setData(collectorTextChildBuff.toString());
                         collectorTextChildBuff.setLength(0);
                     }
@@ -560,20 +567,16 @@ implements TemplateNodeModelEx, TemplateHashModel, TemplateSequenceModel,
                 int type = child.getNodeType();
                 if (type == Node.TEXT_NODE || type == Node.CDATA_SECTION_NODE ) {
                     if (collectorTextChild != null) {
-                        if (collectorTextChildBuff == null) {
-                            collectorTextChildBuff = new StringBuilder(
-                                    collectorTextChild.getNodeValue().length() + child.getNodeValue().length());
-                        }
                         if (collectorTextChildBuff.length() == 0) {
+                            collectorTextChildBuff.ensureCapacity(
+                                    collectorTextChild.getNodeValue().length() + child.getNodeValue().length());
                             collectorTextChildBuff.append(collectorTextChild.getNodeValue());
                         }
                         collectorTextChildBuff.append(child.getNodeValue());
                         parent.removeChild(child);
                     } else {
                         collectorTextChild = child;
-                        if (collectorTextChildBuff != null) {
-                            collectorTextChildBuff.setLength(0);
-                        }
+                        collectorTextChildBuff.setLength(0);
                     }
                 } else if (type == Node.COMMENT_NODE) {
                     parent.removeChild(child);
@@ -581,7 +584,7 @@ implements TemplateNodeModelEx, TemplateHashModel, TemplateSequenceModel,
                     parent.removeChild(child);
                 } else if (collectorTextChild != null) {
                     // Commit pending text node merge:
-                    if (collectorTextChildBuff != null && collectorTextChildBuff.length() != 0) {
+                    if (collectorTextChildBuff.length() != 0) {
                         ((CharacterData) collectorTextChild).setData(collectorTextChildBuff.toString());
                         collectorTextChildBuff.setLength(0);
                     }
@@ -593,7 +596,7 @@ implements TemplateNodeModelEx, TemplateHashModel, TemplateSequenceModel,
         
         if (collectorTextChild != null) {
             // Commit pending text node merge:
-            if (collectorTextChildBuff != null && collectorTextChildBuff.length() != 0) {
+            if (collectorTextChildBuff.length() != 0) {
                 ((CharacterData) collectorTextChild).setData(collectorTextChildBuff.toString());
                 collectorTextChildBuff.setLength(0);
             }