Repository: incubator-freemarker
Updated Branches:
  refs/heads/2.3-gae 6750d92be -> fbd6fa5f9


merging the commit to 2.3-gae


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

Branch: refs/heads/2.3-gae
Commit: d66cf48dbaf31428dd41abfe88a2f79b98f647d5
Parents: 6166efe
Author: Pradeep <[email protected]>
Authored: Sat Oct 24 01:33:15 2015 +0530
Committer: Pradeep <[email protected]>
Committed: Mon Jan 11 17:21:42 2016 +0530

----------------------------------------------------------------------
 src/main/java/freemarker/core/BuiltIn.java      | 12 ++++++---
 .../java/freemarker/core/BuiltInExtForNode.java | 21 ++++++++++++++++
 .../freemarker/core/BuiltInExtForNodes.java     | 26 ++++++++++++++++++++
 .../java/freemarker/core/BuiltinVariable.java   |  6 ++++-
 .../java/freemarker/ext/dom/ElementModel.java   | 14 +++++++++++
 src/main/java/freemarker/ext/dom/NodeModel.java | 23 +++++++++++++++--
 .../template/TemplateNodeModelExt.java          | 17 +++++++++++++
 7 files changed, 113 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d66cf48d/src/main/java/freemarker/core/BuiltIn.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/BuiltIn.java 
b/src/main/java/freemarker/core/BuiltIn.java
index ab796b0..63f2574 100644
--- a/src/main/java/freemarker/core/BuiltIn.java
+++ b/src/main/java/freemarker/core/BuiltIn.java
@@ -62,6 +62,8 @@ import freemarker.core.BuiltInsForSequences.seq_index_ofBI;
 import freemarker.core.BuiltInsForSequences.sortBI;
 import freemarker.core.BuiltInsForSequences.sort_byBI;
 import freemarker.core.BuiltInsForStringsMisc.evalBI;
+import freemarker.core.BuiltInExtForNodes.previousSiblingBI;
+import freemarker.core.BuiltInExtForNodes.nextSiblingBI;
 import freemarker.template.Configuration;
 import freemarker.template.TemplateDateModel;
 import freemarker.template.TemplateModel;
@@ -81,9 +83,10 @@ abstract class BuiltIn extends Expression implements 
Cloneable {
 
     static final Set<String> CAMEL_CASE_NAMES = new TreeSet<String>();
     static final Set<String> SNAKE_CASE_NAMES = new TreeSet<String>();
-    
-    static final int NUMBER_OF_BIS = 259;
-    static final HashMap<String, BuiltIn> BUILT_INS_BY_NAME = new 
HashMap(NUMBER_OF_BIS * 3 / 2 + 1, 1f);
+
+    static final int NUMBER_OF_BIS = 261;
+    static final HashMap builtins = new HashMap(NUMBER_OF_BIS * 3 / 2 + 1, 1f);
+
     static {
         // Note that you must update NUMBER_OF_BIS if you add new items here!
         
@@ -246,6 +249,8 @@ abstract class BuiltIn extends Expression implements 
Cloneable {
         putBI("number_to_time", "numberToTime", new 
number_to_dateBI(TemplateDateModel.TIME));
         putBI("number_to_datetime", "numberToDatetime", new 
number_to_dateBI(TemplateDateModel.DATETIME));
         putBI("parent", new parentBI());
+        putBI("previousSibling", new previousSiblingBI());
+        putBI("nextSibling", new nextSiblingBI());
         putBI("item_parity", "itemParity", new 
BuiltInsForLoopVariables.item_parityBI());
         putBI("item_parity_cap", "itemParityCap", new 
BuiltInsForLoopVariables.item_parity_capBI());
         putBI("reverse", new reverseBI());
@@ -284,6 +289,7 @@ abstract class BuiltIn extends Expression implements 
Cloneable {
         putBI("matches", new BuiltInsForStringsRegexp.matchesBI());
         putBI("groups", new BuiltInsForStringsRegexp.groupsBI());
         putBI("replace", new BuiltInsForStringsRegexp.replace_reBI());
+
         
         if (NUMBER_OF_BIS < BUILT_INS_BY_NAME.size()) {
             throw new AssertionError("Update NUMBER_OF_BIS! Should be: " + 
BUILT_INS_BY_NAME.size());

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d66cf48d/src/main/java/freemarker/core/BuiltInExtForNode.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/BuiltInExtForNode.java 
b/src/main/java/freemarker/core/BuiltInExtForNode.java
new file mode 100644
index 0000000..7e859b8
--- /dev/null
+++ b/src/main/java/freemarker/core/BuiltInExtForNode.java
@@ -0,0 +1,21 @@
+package freemarker.core;
+
+import freemarker.template.*;
+
+/**
+ * Created by Pmuruge on 10/23/2015.
+ */
+public abstract class BuiltInExtForNode extends BuiltIn {
+    @Override
+    TemplateModel _eval(Environment env)
+            throws TemplateException {
+        TemplateModel model = target.eval(env);
+        if (model instanceof TemplateNodeModelExt) {
+            return calculateResult((TemplateNodeModelExt) model, env);
+        } else {
+            throw new NonNodeException(target, model, env);
+        }
+    }
+    abstract TemplateModel calculateResult(TemplateNodeModelExt nodeModel, 
Environment env)
+            throws TemplateModelException;
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d66cf48d/src/main/java/freemarker/core/BuiltInExtForNodes.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/BuiltInExtForNodes.java 
b/src/main/java/freemarker/core/BuiltInExtForNodes.java
new file mode 100644
index 0000000..eeb20a8
--- /dev/null
+++ b/src/main/java/freemarker/core/BuiltInExtForNodes.java
@@ -0,0 +1,26 @@
+package freemarker.core;
+
+import freemarker.template.TemplateModel;
+import freemarker.template.TemplateModelException;
+import freemarker.template.TemplateNodeModelExt;
+
+/**
+ * Created by Pmuruge on 10/23/2015.
+ */
+public class BuiltInExtForNodes {
+
+    static class previousSiblingBI extends BuiltInExtForNode {
+        @Override
+        TemplateModel calculateResult(TemplateNodeModelExt nodeModel, 
Environment env) throws TemplateModelException {
+            return nodeModel.getPreviousSibling();
+        }
+    }
+
+    static class nextSiblingBI extends  BuiltInExtForNode {
+        @Override
+        TemplateModel calculateResult(TemplateNodeModelExt nodeModel, 
Environment env) throws TemplateModelException {
+            return nodeModel.getNextSibling();
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d66cf48d/src/main/java/freemarker/core/BuiltinVariable.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/BuiltinVariable.java 
b/src/main/java/freemarker/core/BuiltinVariable.java
index 5b0f4d2..0afea07 100644
--- a/src/main/java/freemarker/core/BuiltinVariable.java
+++ b/src/main/java/freemarker/core/BuiltinVariable.java
@@ -72,6 +72,8 @@ final class BuiltinVariable extends Expression {
     static final String URL_ESCAPING_CHARSET_CC = "urlEscapingCharset";
     static final String URL_ESCAPING_CHARSET = "url_escaping_charset";
     static final String NOW = "now";
+    static final String PREVIOUS_SIBLING = "previous";
+    static final String NEXT_SIBLING = "next";
     
     static final String[] SPEC_VAR_NAMES = new String[] {
         AUTO_ESC_CC,
@@ -107,7 +109,9 @@ final class BuiltinVariable extends Expression {
         URL_ESCAPING_CHARSET_CC,
         URL_ESCAPING_CHARSET,
         VARS,
-        VERSION
+        VERSION,
+        PREVIOUS_SIBLING,
+        NEXT_SIBLING
     };
 
     private final String name;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d66cf48d/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 fb6fccd..95e13fc 100644
--- a/src/main/java/freemarker/ext/dom/ElementModel.java
+++ b/src/main/java/freemarker/ext/dom/ElementModel.java
@@ -89,6 +89,20 @@ class ElementModel extends NodeModel implements 
TemplateScalarModel {
                 nu.outputContent(node.getAttributes(), buf);
                 return new SimpleScalar(buf.toString().trim());
             }
+            if (key.equals("@@previous")) {
+                XPathSupport xps = getXPathSupport();
+                if (xps != null) {
+                    return xps.executeQuery(node, 
"preceding-sibling::*[position()=1]");
+                }
+            }
+            if (key.equals("@@next")) {
+                XPathSupport xps = getXPathSupport();
+                if (xps != null) {
+                    TemplateModel next = xps.executeQuery(node, 
"following-sibling::*[position()=1]");
+                    System.out.println(next.toString());
+                    return next;
+                }
+            }
             if (StringUtil.isXMLID(key.substring(1))) {
                 Attr att = getAttribute(key.substring(1));
                 if (att == null) { 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d66cf48d/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 c338664..c518333 100644
--- a/src/main/java/freemarker/ext/dom/NodeModel.java
+++ b/src/main/java/freemarker/ext/dom/NodeModel.java
@@ -59,6 +59,7 @@ import freemarker.template.TemplateHashModel;
 import freemarker.template.TemplateModel;
 import freemarker.template.TemplateModelException;
 import freemarker.template.TemplateNodeModel;
+import freemarker.template.TemplateNodeModelExt;
 import freemarker.template.TemplateNumberModel;
 import freemarker.template.TemplateSequenceModel;
 
@@ -75,7 +76,7 @@ import freemarker.template.TemplateSequenceModel;
  * then), but should be used to represent a node set of exactly 1 node.
  */
 abstract public class NodeModel
-implements TemplateNodeModel, TemplateHashModel, TemplateSequenceModel,
+implements TemplateNodeModel, TemplateNodeModelExt, TemplateHashModel, 
TemplateSequenceModel,
     AdapterTemplateModel, WrapperTemplateModel, 
_UnexpectedTypeErrorExplainerTemplateModel {
 
     static private final Logger LOG = Logger.getLogger("freemarker.dom");
@@ -109,6 +110,8 @@ implements TemplateNodeModel, TemplateHashModel, 
TemplateSequenceModel,
     final Node node;
     private TemplateSequenceModel children;
     private NodeModel parent;
+    private NodeModel previousSibling;
+    private NodeModel nextSibling;
     
     /**
      * Sets the DOM Parser implementation to be used when building NodeModel
@@ -307,7 +310,23 @@ implements TemplateNodeModel, TemplateHashModel, 
TemplateSequenceModel,
         }
         return parent;
     }
-    
+
+    public TemplateNodeModel getPreviousSibling() throws 
TemplateModelException {
+        if (previousSibling == null) {
+            Node previous = node.getPreviousSibling();
+            previousSibling = wrap(previous);
+        }
+        return previousSibling;
+    }
+
+    public TemplateNodeModel getNextSibling() throws TemplateModelException {
+        if (nextSibling == null) {
+            Node next = node.getNextSibling();
+            nextSibling = wrap(next);
+        }
+        return nextSibling;
+    }
+
     public TemplateSequenceModel getChildNodes() {
         if (children == null) {
             children = new NodeListModel(node.getChildNodes(), this);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d66cf48d/src/main/java/freemarker/template/TemplateNodeModelExt.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/template/TemplateNodeModelExt.java 
b/src/main/java/freemarker/template/TemplateNodeModelExt.java
new file mode 100644
index 0000000..d2c8be0
--- /dev/null
+++ b/src/main/java/freemarker/template/TemplateNodeModelExt.java
@@ -0,0 +1,17 @@
+package freemarker.template;
+
+/**
+ * Created by Pmuruge on 10/22/2015.
+ */
+public interface TemplateNodeModelExt extends TemplateNodeModel {
+
+    /**
+     * @return the immediate Previous Sibling of this node
+     */
+    TemplateNodeModel getPreviousSibling() throws TemplateModelException;
+
+    /**
+     * @return the immediate next Sibling of this node
+     */
+    TemplateNodeModel getNextSibling() throws TemplateModelException;
+}

Reply via email to