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/12 07:46:18 UTC

incubator-freemarker git commit: (Minor code cleanup in ext.dom; no functional changes)

Repository: incubator-freemarker
Updated Branches:
  refs/heads/2.3-gae 55b09e8de -> 6e15268f7


(Minor code cleanup in ext.dom; no functional changes)


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

Branch: refs/heads/2.3-gae
Commit: 6e15268f7812ebc659ab197c47681ed8b7b076f1
Parents: 55b09e8
Author: ddekany <dd...@apache.org>
Authored: Thu Jan 12 08:46:06 2017 +0100
Committer: ddekany <dd...@apache.org>
Committed: Thu Jan 12 08:46:06 2017 +0100

----------------------------------------------------------------------
 .../java/freemarker/core/CustomAttribute.java   |  1 +
 .../java/freemarker/ext/dom/DocumentModel.java  |  2 +-
 .../java/freemarker/ext/dom/DomStringUtil.java  |  8 ++---
 .../java/freemarker/ext/dom/ElementModel.java   |  8 ++---
 .../freemarker/ext/dom/JaxenXPathSupport.java   | 37 ++++++++++++--------
 .../java/freemarker/ext/dom/NodeListModel.java  | 10 +++---
 .../java/freemarker/ext/dom/XPathSupport.java   |  3 ++
 .../java/freemarker/ext/dom/_ExtDomApi.java     |  4 +--
 .../java/freemarker/template/_TemplateAPI.java  |  2 +-
 .../freemarker/template/utility/StringUtil.java |  2 +-
 10 files changed, 44 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/6e15268f/src/main/java/freemarker/core/CustomAttribute.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/CustomAttribute.java b/src/main/java/freemarker/core/CustomAttribute.java
index fe55eb9..249a97f 100644
--- a/src/main/java/freemarker/core/CustomAttribute.java
+++ b/src/main/java/freemarker/core/CustomAttribute.java
@@ -40,6 +40,7 @@ import freemarker.template.Template;
  *     myAttrValue = MY_ATTR.get(cfg);
  * </pre>
  */
+// [2.4] Use generics; type parameter used for the type of the stored value 
 public class CustomAttribute {
     
     /**

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/6e15268f/src/main/java/freemarker/ext/dom/DocumentModel.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/dom/DocumentModel.java b/src/main/java/freemarker/ext/dom/DocumentModel.java
index fb161e0..06fe9dc 100644
--- a/src/main/java/freemarker/ext/dom/DocumentModel.java
+++ b/src/main/java/freemarker/ext/dom/DocumentModel.java
@@ -52,7 +52,7 @@ class DocumentModel extends NodeModel implements TemplateHashModel {
         } else if (key.equals("**")) {
             NodeList nl = ((Document) node).getElementsByTagName("*");
             return new NodeListModel(nl, this);
-        } else if (DomStringUtil.isXMLID(key)) {
+        } else if (DomStringUtil.isXMLNameLike(key)) {
             ElementModel em = (ElementModel) NodeModel.wrap(((Document) node).getDocumentElement());
             if (em.matchesName(key, Environment.getCurrentEnvironment())) {
                 return em;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/6e15268f/src/main/java/freemarker/ext/dom/DomStringUtil.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/dom/DomStringUtil.java b/src/main/java/freemarker/ext/dom/DomStringUtil.java
index 85df716..b93192b 100644
--- a/src/main/java/freemarker/ext/dom/DomStringUtil.java
+++ b/src/main/java/freemarker/ext/dom/DomStringUtil.java
@@ -33,19 +33,19 @@ final class DomStringUtil {
         // Not meant to be instantiated
     }
 
-    static boolean isXMLID(String name) {
-        return isXMLID(name, 0);
+    static boolean isXMLNameLike(String name) {
+        return isXMLNameLike(name, 0);
     }
     
     /**
-     * Check if the subvariable name is just an element name, or a more complex XPath expression.
+     * Check if the name looks like an XML element name.
      * 
      * @param firstCharIdx The index of the character in the string parameter that we treat as the beginning of the
      *      string to check. This is to spare substringing that has become more expensive in Java 7.  
      * 
      * @return whether the name is a valid XML element name. (This routine might only be 99% accurate. REVISIT)
      */
-    static boolean isXMLID(String name, int firstCharIdx) {
+    static boolean isXMLNameLike(String name, int firstCharIdx) {
         int ln = name.length();
         for (int i = firstCharIdx; i < ln; i++) {
             char c = name.charAt(i);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/6e15268f/src/main/java/freemarker/ext/dom/ElementModel.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/dom/ElementModel.java b/src/main/java/freemarker/ext/dom/ElementModel.java
index 21d0a35..3fbc15c 100644
--- a/src/main/java/freemarker/ext/dom/ElementModel.java
+++ b/src/main/java/freemarker/ext/dom/ElementModel.java
@@ -106,11 +106,11 @@ class ElementModel extends NodeModel implements TemplateScalarModel {
                         return wrap(nextSibling);
                     }
                 } else {
-                    // We don't anything like this that's element-specific; fall back 
+                    // We don't know anything like this that's element-specific; fall back 
                     return super.get(key);
                 }
             } else { // Starts with "@", but not with "@@"
-                if (DomStringUtil.isXMLID(key, 1)) {
+                if (DomStringUtil.isXMLNameLike(key, 1)) {
                     Attr att = getAttribute(key.substring(1));
                     if (att == null) { 
                         return new NodeListModel(this);
@@ -119,11 +119,11 @@ class ElementModel extends NodeModel implements TemplateScalarModel {
                 } else if (key.equals("@*")) {
                     return new NodeListModel(node.getAttributes(), this);
                 } else {
-                    // We don't anything like this that's element-specific; fall back 
+                    // We don't know anything like this that's element-specific; fall back 
                     return super.get(key);
                 }
             }
-        } else if (DomStringUtil.isXMLID(key)) {
+        } else if (DomStringUtil.isXMLNameLike(key)) {
             // We interpret key as an element name
             NodeListModel result = ((NodeListModel) getChildNodes()).filterByName(key);
             return result.size() != 1 ? result : result.get(0);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/6e15268f/src/main/java/freemarker/ext/dom/JaxenXPathSupport.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/dom/JaxenXPathSupport.java b/src/main/java/freemarker/ext/dom/JaxenXPathSupport.java
index ae10569..109e82b 100644
--- a/src/main/java/freemarker/ext/dom/JaxenXPathSupport.java
+++ b/src/main/java/freemarker/ext/dom/JaxenXPathSupport.java
@@ -65,32 +65,34 @@ import freemarker.template.utility.UndeclaredThrowableException;
  */
 class JaxenXPathSupport implements XPathSupport {
     
-    private static final CustomAttribute cache = 
+    private static final CustomAttribute XPATH_CACHE_ATTR = 
         new CustomAttribute(CustomAttribute.SCOPE_TEMPLATE) {
             @Override
             protected Object create() {
-                return new HashMap();
+                return new HashMap<String, BaseXPath>();
             }
         };
 
+        // [2.4] Can't we just use Collections.emptyList()? 
     private final static ArrayList EMPTY_ARRAYLIST = new ArrayList();
 
     public TemplateModel executeQuery(Object context, String xpathQuery) throws TemplateModelException {
         try {
             BaseXPath xpath;
-            Map xpathCache = (Map) cache.get();
+            Map<String, BaseXPath> xpathCache = (Map<String, BaseXPath>) XPATH_CACHE_ATTR.get();
             synchronized (xpathCache) {
-                xpath = (BaseXPath) xpathCache.get(xpathQuery);
+                xpath = xpathCache.get(xpathQuery);
                 if (xpath == null) {
-                    xpath = new BaseXPath(xpathQuery, fmDomNavigator);
+                    xpath = new BaseXPath(xpathQuery, FM_DOM_NAVIGATOR);
                     xpath.setNamespaceContext(customNamespaceContext);
-                    xpath.setFunctionContext(fmFunctionContext);
-                    xpath.setVariableContext(fmVariableContext);
+                    xpath.setFunctionContext(FM_FUNCTION_CONTEXT);
+                    xpath.setVariableContext(FM_VARIABLE_CONTEXT);
                     xpathCache.put(xpathQuery, xpath);
                 }
             }
             List result = xpath.selectNodes(context != null ? context : EMPTY_ARRAYLIST);
             if (result.size() == 1) {
+                // [2.4] Use the proper object wrapper (argument in 2.4) 
                 return ObjectWrapper.DEFAULT_WRAPPER.wrap(result.get(0));
             }
             NodeListModel nlm = new NodeListModel(result, null);
@@ -117,13 +119,13 @@ class JaxenXPathSupport implements XPathSupport {
         }
     };
 
-    private static final VariableContext fmVariableContext = new VariableContext() {
+    private static final VariableContext FM_VARIABLE_CONTEXT = new VariableContext() {
         public Object getVariableValue(String namespaceURI, String prefix, String localName)
         throws UnresolvableException {
             try {
                 TemplateModel model = Environment.getCurrentEnvironment().getVariable(localName);
                 if (model == null) {
-                    throw new UnresolvableException("Variable " + localName + " not found.");
+                    throw new UnresolvableException("Variable \"" + localName + "\" not found.");
                 }
                 if (model instanceof TemplateScalarModel) {
                     return ((TemplateScalarModel) model).getAsString();
@@ -140,11 +142,12 @@ class JaxenXPathSupport implements XPathSupport {
             } catch (TemplateModelException e) {
                 throw new UndeclaredThrowableException(e);
             }
-            throw new UnresolvableException("Variable " + localName + " is not a string, number, date, or boolean");
+            throw new UnresolvableException(
+                    "Variable \"" + localName + "\" exists, but it's not a string, number, date, or boolean");
         }
     };
      
-    private static final FunctionContext fmFunctionContext = new XPathFunctionContext() {
+    private static final FunctionContext FM_FUNCTION_CONTEXT = new XPathFunctionContext() {
         @Override
         public Function getFunction(String namespaceURI, String prefix, String localName)
         throws UnresolvableException {
@@ -156,14 +159,18 @@ class JaxenXPathSupport implements XPathSupport {
         }
     };
     
-    private static final CustomAttribute cachedTree = new CustomAttribute(CustomAttribute.SCOPE_TEMPLATE);
+    /**
+     * Stores the the template parsed as {@link Document} in the template itself.
+     */
+    private static final CustomAttribute FM_DOM_NAVIAGOTOR_CACHED_DOM
+            = new CustomAttribute(CustomAttribute.SCOPE_TEMPLATE);
      
-    private static final Navigator fmDomNavigator = new DocumentNavigator() {
+    private static final Navigator FM_DOM_NAVIGATOR = new DocumentNavigator() {
         @Override
         public Object getDocument(String uri) throws FunctionCallException {
             try {
                 Template raw = getTemplate(uri);
-                Document doc = (Document) cachedTree.get(raw);
+                Document doc = (Document) FM_DOM_NAVIAGOTOR_CACHED_DOM.get(raw);
                 if (doc == null) {
                     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                     factory.setNamespaceAware(true);
@@ -174,7 +181,7 @@ class JaxenXPathSupport implements XPathSupport {
                     // If the entity resolver got called 0 times, the document
                     // is standalone, so we can safely cache it
                     if (er.getCallCount() == 0) {
-                        cachedTree.set(doc, raw);
+                        FM_DOM_NAVIAGOTOR_CACHED_DOM.set(doc, raw);
                     }
                 }
                 return doc;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/6e15268f/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 4a37266..b375478 100644
--- a/src/main/java/freemarker/ext/dom/NodeListModel.java
+++ b/src/main/java/freemarker/ext/dom/NodeListModel.java
@@ -40,7 +40,6 @@ import freemarker.template.TemplateNodeModel;
 import freemarker.template.TemplateNumberModel;
 import freemarker.template.TemplateScalarModel;
 import freemarker.template.TemplateSequenceModel;
-import freemarker.template.utility.StringUtil;
 
 /**
  * Used when the result set contains 0 or multiple nodes; shouldn't be used when you have exactly 1 node. For exactly 1
@@ -49,6 +48,7 @@ import freemarker.template.utility.StringUtil;
  */
 class NodeListModel extends SimpleSequence implements TemplateHashModel, _UnexpectedTypeErrorExplainerTemplateModel {
     
+    // [2.4] make these private
     NodeModel contextNode;
     XPathSupport xpathSupport;
     
@@ -61,8 +61,8 @@ class NodeListModel extends SimpleSequence implements TemplateHashModel, _Unexpe
         }
     };
     
-    NodeListModel(Node node) {
-        this(NodeModel.wrap(node));
+    NodeListModel(Node contextNode) {
+        this(NodeModel.wrap(contextNode));
     }
     
     NodeListModel(NodeModel contextNode) {
@@ -142,9 +142,9 @@ class NodeListModel extends SimpleSequence implements TemplateHashModel, _Unexpe
                 }
             }
         }
-        if (DomStringUtil.isXMLID(key) 
+        if (DomStringUtil.isXMLNameLike(key) 
                 || ((key.startsWith("@")
-                        && (DomStringUtil.isXMLID(key, 1)  || key.equals("@@") || key.equals("@*"))))
+                        && (DomStringUtil.isXMLNameLike(key, 1)  || key.equals("@@") || key.equals("@*"))))
                 || key.equals("*") || key.equals("**")) {
             NodeListModel result = new NodeListModel(contextNode);
             for (int i = 0; i < size(); i++) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/6e15268f/src/main/java/freemarker/ext/dom/XPathSupport.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/dom/XPathSupport.java b/src/main/java/freemarker/ext/dom/XPathSupport.java
index 2d928c3..e51d812 100644
--- a/src/main/java/freemarker/ext/dom/XPathSupport.java
+++ b/src/main/java/freemarker/ext/dom/XPathSupport.java
@@ -23,5 +23,8 @@ import freemarker.template.TemplateModel;
 import freemarker.template.TemplateModelException;
 
 public interface XPathSupport {
+    
+    // [2.4] Add argument to pass down the ObjectWrapper to use 
     TemplateModel executeQuery(Object context, String xpathQuery) throws TemplateModelException;
+    
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/6e15268f/src/main/java/freemarker/ext/dom/_ExtDomApi.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/ext/dom/_ExtDomApi.java b/src/main/java/freemarker/ext/dom/_ExtDomApi.java
index 70ec0e4..178d8a8 100644
--- a/src/main/java/freemarker/ext/dom/_ExtDomApi.java
+++ b/src/main/java/freemarker/ext/dom/_ExtDomApi.java
@@ -32,8 +32,8 @@ public final class _ExtDomApi {
         // Not meant to be called
     }
     
-    static public boolean isXMLID(String name) {
-        return DomStringUtil.isXMLID(name);
+    static public boolean isXMLNameLike(String name) {
+        return DomStringUtil.isXMLNameLike(name);
     }
     
     static public boolean matchesName(String qname, String nodeName, String nsURI, Environment env) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/6e15268f/src/main/java/freemarker/template/_TemplateAPI.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/template/_TemplateAPI.java b/src/main/java/freemarker/template/_TemplateAPI.java
index c55a113..52606f6 100644
--- a/src/main/java/freemarker/template/_TemplateAPI.java
+++ b/src/main/java/freemarker/template/_TemplateAPI.java
@@ -100,7 +100,7 @@ public class _TemplateAPI {
     }
     
     /**
-     * [FM 2.4] getSettingNames() becomes to public; remove this.
+     * [2.4] getSettingNames() becomes to public; remove this.
      */
     public static Set/*<String>*/ getConfigurationSettingNames(Configuration cfg, boolean camelCase) {
         return cfg.getSettingNames(camelCase);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/6e15268f/src/main/java/freemarker/template/utility/StringUtil.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/template/utility/StringUtil.java b/src/main/java/freemarker/template/utility/StringUtil.java
index 27db53f..55ba617 100644
--- a/src/main/java/freemarker/template/utility/StringUtil.java
+++ b/src/main/java/freemarker/template/utility/StringUtil.java
@@ -1663,7 +1663,7 @@ public class StringUtil {
      */
     @Deprecated
     static public boolean isXMLID(String name) {
-        return _ExtDomApi.isXMLID(name);
+        return _ExtDomApi.isXMLNameLike(name);
     }
     
     /**