Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright (c) 2003 The Visigoth Software Society. All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer.
  *
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in
  *    the documentation and/or other materials provided with the
  *    distribution.
  *
  * 3. The end-user documentation included with the redistribution, if
  *    any, must include the following acknowledgement:
  *       "This product includes software developed by the
  *        Visigoth Software Society (http://www.visigoths.org/)."
  *    Alternately, this acknowledgement may appear in the software itself,
  *    if and wherever such third-party acknowledgements normally appear.
  *
  * 4. Neither the name "FreeMarker", "Visigoth", nor any of the names of the 
  *    project contributors may be used to endorse or promote products derived
  *    from this software without prior written permission. For written
  *    permission, please contact visigoths@visigoths.org.
  *
  * 5. Products derived from this software may not be called "FreeMarker" or "Visigoth"
  *    nor may "FreeMarker" or "Visigoth" appear in their names
  *    without prior written permission of the Visigoth Software Society.
  *
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED.  IN NO EVENT SHALL THE VISIGOTH SOFTWARE SOCIETY OR
  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * ====================================================================
  *
  * This software consists of voluntary contributions made by many
  * individuals on behalf of the Visigoth Software Society. For more
  * information on the Visigoth Software Society, please see
  * http://www.visigoths.org/
  */
 
 package freemarker.template.utility;
 
 import org.w3c.dom.*;
 import java.util.*;

A convenient wrapper class for wrapping a Node in the W3C DOM API.

Author(s):
Jonathan Revusky
 
 
 public class DOMNodeModel implements TemplateHashModel {
 
     static private HashMap equivalenceTable = new HashMap();
     static {
         .put("*""children");
         .put("@*""attributes");
     }
 
     private Node node;
     private HashMap cache = new HashMap();
 
     public DOMNodeModel(Node node) {
         this. = node;
     }
 
     public TemplateModel get(String keythrows TemplateModelException {
         TemplateModel result = null;
         if (.containsKey(key)) {
             key = (String.get(key);
         }
         if (.containsKey(key)) {
             result = (TemplateModel.get(key);
         }
         if (result == null) {
             if ("attributes".equals(key)) {
                 NamedNodeMap attributes = .getAttributes();
                 if (attributes != null) {
                     SimpleHash hash = new SimpleHash();
                     for (int i = 0; i<attributes.getLength(); i++) {
                         Attr att = (Attrattributes.item(i);
                         hash.put(att.getName(), att.getValue());
                     }
                     result = hash;
                 }
             }
             else if (key.charAt(0) == '@') {
                if ( instanceof Element) {
                    String attValue = ((Element).getAttribute(key.substring(1));
                    result = new SimpleScalar(attValue);
                }
                else {
                    throw new TemplateModelException("Trying to get an attribute value for a non-element node");
                }
            }
            else if ("is_element".equals(key)) {
                result = ( instanceof Element) ?
                    . : .;
            }
            else if ("is_text".equals(key)) {
                result = ( instanceof Text) ?
                    . : .;
            }
            else if ("name".equals(key)) {
                result = new SimpleScalar(.getNodeName());
            }
            else if ("children".equals(key)) {
                result = new NodeListTM(.getChildNodes());
            }
            else if ("parent".equals(key)) {
                Node parent = .getParentNode();
                result = (parent == null) ? null : new DOMNodeModel(parent);
            }
            else if ("ancestorByName".equals(key)) {
                result = new AncestorByName();
            }
            else if ("nextSibling".equals(key)) {
                Node next = .getNextSibling();
                result = (next == null) ? null : new DOMNodeModel(next);
            }
            else if ("previousSibling".equals(key)) {
                Node previous = .getPreviousSibling();
                result = (previous == null) ? null : new DOMNodeModel(previous);
            }
            else if ("nextSiblingElement".equals(key)) {
                Node next = nextSiblingElement();
                result = (next == null) ? null : new DOMNodeModel(next);
            }
            else if ("previousSiblingElement".equals(key)) {
                Node previous = previousSiblingElement();
                result = (previous == null) ? null : new DOMNodeModel(previous);
            }
            else if ("nextElement".equals(key)) {
                Node next = nextElement();
                result = (next == null) ? null : new DOMNodeModel(next);
            }
            else if ("previousElement".equals(key)) {
                Node previous = previousElement();
                result = (previous == null) ? null : new DOMNodeModel(previous);
            }
            else if ("text".equals(key)) {
                result = new SimpleScalar(getText());
            }
            .put(keyresult);
        }
        return result;
    }
    public boolean isEmpty() {
        return false;
    }
    static private String getText(Node node) {
        String result = "";
        if (node instanceof Text) {
            result = ((Textnode).getData();
        }
        else if (node instanceof Element) {
            NodeList children = node.getChildNodes();
            for (int i= 0; i<children.getLength(); i++) {
                result += getText(children.item(i));
            }
        }
        return result;
    }
    static private Element nextSiblingElement(Node node) {
        Node next = node;
        while (next != null) {
            next = next.getNextSibling();
            if (next instanceof Element) {
                return (Elementnext;
            }
        }
        return null;
    }
    static private Element previousSiblingElement(Node node) {
        Node previous = node;
        while (previous != null) {
            previous = previous.getPreviousSibling();
            if (previous instanceof Element) {
                return (Elementprevious;
            }
        }
        return null;
    }
    static private Element nextElement(Node node) {
        if (node.hasChildNodes()) {
            NodeList children = node.getChildNodes();
            for (int i=0; i<children.getLength();i++) {
                Node child = children.item(i);
                if (child instanceof Element) {
                    return (Elementchild;
                }
            }
        }
        Element nextSiblingElement = nextSiblingElement(node);
        if (nextSiblingElement != null) {
            return nextSiblingElement;
        }
        Node parent = node.getParentNode();
        while (parent instanceof Element) {
            Element next = nextSiblingElement(parent);
            if (next != null) {
                return next;
            }
            parent = parent.getParentNode();
        }
        return null;
    }
    static private Element previousElement(Node node) {
        Element result = previousSiblingElement(node);
        if (result != null) {
            return result;
        }
        Node parent = node.getParentNode();
        if (parent instanceof Element) {
            return (Elementparent;
        }
        return null;
    }
    void setParent(DOMNodeModel parent) {
        if (parent != null) {
            .put("parent"parent);
        }
    }
    String getNodeName() {
        return .getNodeName();
    }
    class AncestorByName implements TemplateMethodModel {
        public Object exec(List argumentsthrows TemplateModelException {
            if (arguments.size() != 1) {
                throw new TemplateModelException("Expecting exactly one string argument here");
            }
            String nodeName = (Stringarguments.get(0);
            DOMNodeModel ancestor = (DOMNodeModelDOMNodeModel.this.get("parent");
            while (ancestor != null) {
                if (nodeName.equals(ancestor.getNodeName())) {
                    return ancestor;
                }
                ancestor = (DOMNodeModelancestor.get("parent");
            }
            return null;
        }
    }
        private NodeList nodeList;
        private TemplateModel[] nodes;
        NodeListTM(NodeList nodeList) {
            this. = nodeList;
             = new TemplateModel[nodeList.getLength()];
        }
        public TemplateModel get(int index) {
            DOMNodeModel result = (DOMNodeModel[index];
            if (result == null) {
                result = new DOMNodeModel(.item(index));
                [index] = result;
                result.setParent(DOMNodeModel.this);
            }
            return result;
        }
        public int size() {
            return .;
        }
        public Object exec(List argumentsthrows TemplateModelException {
            if (arguments.size() != 1) {
                throw new TemplateModelException("Expecting exactly one string argument here");
            }
            if (!( instanceof Element)) {
                throw new TemplateModelException("Expecting element here.");
            }
            Element elem = (Element;
            return new NodeListTM(elem.getElementsByTagName((Stringarguments.get(0)));
        }
    }
New to GrepCode? Check out our FAQ X