Merge branch '2.3-gae' into 2.3
diff --git a/build.xml b/build.xml
index df89cbf..9bde387 100644
--- a/build.xml
+++ b/build.xml
@@ -688,14 +688,13 @@
   </parent>
   
   <groupId>org.freemarker</groupId>
-  <artifactId>freemarker-gae</artifactId>
+  <artifactId>freemarker</artifactId>
   <version>${mavenVersion}</version>
   
   <packaging>jar</packaging>
   
   <name>FreeMarker</name>
   <description>
-    Google App Engine compliant variation of FreeMarker.
     FreeMarker is a "template engine"; a generic tool to generate text output based on templates.
   </description>
   <url>http://freemarker.org/</url>
diff --git a/src/main/java/freemarker/core/Environment.java b/src/main/java/freemarker/core/Environment.java
index 45d4888..c92b1ec 100644
--- a/src/main/java/freemarker/core/Environment.java
+++ b/src/main/java/freemarker/core/Environment.java
@@ -1572,7 +1572,7 @@
     static private Macro getEnclosingMacro(TemplateElement stackEl) {
         while (stackEl != null) {
             if (stackEl instanceof Macro) return (Macro) stackEl;
-            stackEl = stackEl.getParent();
+            stackEl = (TemplateElement) stackEl.getParent();
         }
         return null;
     }
diff --git a/src/main/java/freemarker/core/FreeMarkerTree.java b/src/main/java/freemarker/core/FreeMarkerTree.java
index b63f3f3..81bbd91 100644
--- a/src/main/java/freemarker/core/FreeMarkerTree.java
+++ b/src/main/java/freemarker/core/FreeMarkerTree.java
@@ -16,13 +16,8 @@
 
 package freemarker.core;
 
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-
 import javax.swing.JTree;
 import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.TreeNode;
 
 import freemarker.template.Template;
 
@@ -32,26 +27,13 @@
  * @deprecated Will be removed, as Swing classes aren't accessible on Google App Engine.
  */
 public class FreeMarkerTree extends JTree {
-    private static final long serialVersionUID = 1L;
 
-    private final Map nodeMap = new HashMap();
-    
     public FreeMarkerTree(Template template) {
-        setTemplate(template);
-    }
-
-    private TreeNode getNode(TemplateElement element) {
-        TreeNode n = (TreeNode)nodeMap.get(element);
-        if(n != null) {
-            return n;
-        }
-        n = new TemplateElementTreeNode(element);
-        nodeMap.put(element, n);
-        return n;
+        super(template.getRootTreeNode());
     }
 
     public void setTemplate(Template template) {
-        this.setModel(new DefaultTreeModel(getNode(template.getRootTreeNode())));
+        this.setModel(new DefaultTreeModel(template.getRootTreeNode()));
         this.invalidate();
     }
 
@@ -59,55 +41,10 @@
                                      boolean expanded, boolean leaf, int row,
                                      boolean hasFocus) 
     {
-        if (value instanceof TemplateElementTreeNode) {
-            return ((TemplateElementTreeNode) value).element.getDescription();
+        if (value instanceof TemplateElement) {
+            return ((TemplateElement) value).getDescription();
         }
         return value.toString();
     }
     
-    private class TemplateElementTreeNode implements TreeNode {
-        private final TemplateElement element;
-        
-        TemplateElementTreeNode(TemplateElement element) {
-            this.element = element;
-        }
-
-        public Enumeration children() {
-            final Enumeration e = element.children();
-            return new Enumeration() {
-                public boolean hasMoreElements() {
-                    return e.hasMoreElements();
-                }
-                public Object nextElement() {
-                    return getNode((TemplateElement)e.nextElement());
-                }
-            };
-        }
-
-        public boolean getAllowsChildren() {
-            return element.getAllowsChildren();
-        }
-
-        public TreeNode getChildAt(int childIndex) {
-            return getNode(element.getChildAt(childIndex));
-        }
-
-        public int getChildCount() {
-            return element.getChildCount();
-        }
-
-        public int getIndex(TreeNode node) {
-            return element.getIndex(((TemplateElementTreeNode)node).element);
-        }
-
-        public TreeNode getParent() {
-            return getNode(element.getParent());
-        }
-
-        public boolean isLeaf() {
-            return element.isLeaf();
-        }
-        
-        
-    }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/freemarker/core/TemplateElement.java b/src/main/java/freemarker/core/TemplateElement.java
index 9643d4f..b3e6da9 100644
--- a/src/main/java/freemarker/core/TemplateElement.java
+++ b/src/main/java/freemarker/core/TemplateElement.java
@@ -23,6 +23,8 @@
 import java.util.Iterator;
 import java.util.List;
 
+import javax.swing.tree.TreeNode;
+
 import freemarker.template.SimpleSequence;
 import freemarker.template.TemplateException;
 import freemarker.template.TemplateNodeModel;
@@ -33,7 +35,7 @@
  * tree representation of the template necessarily 
  * descend from this abstract class.
  */
-abstract public class TemplateElement extends TemplateObject {
+abstract public class TemplateElement extends TemplateObject implements TreeNode {
 
     TemplateElement parent;
 
@@ -135,7 +137,7 @@
         return !isLeaf();
     }
 
-    public int getIndex(TemplateElement node) {
+    public int getIndex(TreeNode node) {
         if (nestedBlock instanceof MixedContent) {
             return nestedBlock.getIndex(node);
         }
@@ -176,7 +178,7 @@
         return Collections.enumeration(Collections.EMPTY_LIST);
     }
 
-    public TemplateElement getChildAt(int index) {
+    public TreeNode getChildAt(int index) {
         if (nestedBlock instanceof MixedContent) {
             return nestedBlock.getChildAt(index);
         }
@@ -187,7 +189,7 @@
             throw new ArrayIndexOutOfBoundsException("invalid index");
         }
         else if (nestedElements != null) {
-            return(TemplateElement) nestedElements.get(index);
+            return(TreeNode) nestedElements.get(index);
         }
         throw new ArrayIndexOutOfBoundsException("element has no children");
     }
@@ -214,7 +216,7 @@
         }
     }
     
-    public TemplateElement getParent() {
+    public TreeNode getParent() {
         return parent;
     }
 
diff --git a/src/main/java/freemarker/template/Template.java b/src/main/java/freemarker/template/Template.java
index 97cfffd..670205b 100644
--- a/src/main/java/freemarker/template/Template.java
+++ b/src/main/java/freemarker/template/Template.java
@@ -32,6 +32,8 @@
 import java.util.Map;
 import java.util.Vector;
 
+import javax.swing.tree.TreePath;
+
 import freemarker.cache.TemplateLoader;
 import freemarker.core.Configurable;
 import freemarker.core.Environment;
@@ -687,12 +689,11 @@
     }
     
     /**
-     * @return an array of the {@link TemplateElement}s containing the given 
-     * column and line numbers.
-     * @param column the column     
+     * @return an array of the elements containing the given column and line numbers.
+     * @param column the column
      * @param line the line
      */
-    public List containingElements(int column, int line) {
+    public TreePath containingElements(int column, int line) {
         ArrayList elements = new ArrayList();
         TemplateElement element = rootElement;
 mainloop:
@@ -710,11 +711,10 @@
         if (elements == null || elements.isEmpty()) {
             return null;
         }
-        return elements;
+        return new TreePath(elements.toArray());
     }
 
     static public class WrongEncodingException extends ParseException {
-        private static final long serialVersionUID = 1L;
 
         public String specifiedEncoding;
 
diff --git a/src/main/resources/freemarker/version.properties b/src/main/resources/freemarker/version.properties
index 3e68ad3..cee1cea 100644
--- a/src/main/resources/freemarker/version.properties
+++ b/src/main/resources/freemarker/version.properties
@@ -80,4 +80,4 @@
 # This should be automatically filled by the building tool (Ant).
 buildTimestamp=@timestampNice@
 
-isGAECompliant=true
+isGAECompliant=false
diff --git a/src/test/java/freemarker/test/TreeView.java b/src/test/java/freemarker/test/TreeView.java
index cd5eba9..53c29a1 100644
--- a/src/test/java/freemarker/test/TreeView.java
+++ b/src/test/java/freemarker/test/TreeView.java
@@ -60,7 +60,7 @@
     }
 
     static void usage() {
-        System.err.println("little toy program to display a compiled template as a tree.");
-        System.err.println("Usage: java freemarker.test.TreeView <templatefile>");
+        System.err.println("Little toy program to display a compiled template as a tree.");
+        System.err.println("Usage: java freemarker.testcase.TreeView <templatefile>");
     }
 }