All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.enhydra.xml.lazydom.LazyElementNS Maven / Gradle / Ivy

The newest version!
/*
 * Enhydra Java Application Server Project
 * 
 * The contents of this file are subject to the Enhydra Public License
 * Version 1.1 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License on
 * the Enhydra web site ( http://www.enhydra.org/ ).
 * 
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See 
 * the License for the specific terms governing rights and limitations
 * under the License.
 * 
 * The Initial Developer of the Enhydra Application Server is Lutris
 * Technologies, Inc. The Enhydra Application Server and portions created
 * by Lutris Technologies, Inc. are Copyright Lutris Technologies, Inc.
 * All Rights Reserved.
 * 
 * Contributor(s):
 * 
 * $Id: LazyElementNS.java,v 1.3 2005/01/26 08:29:24 jkjome Exp $
 */

package org.enhydra.xml.lazydom;

import org.enhydra.apache.xerces.dom.ElementNSImpl;
import org.enhydra.apache.xerces.dom.NodeImpl;
import org.enhydra.xml.io.PreFormattedText;
import org.w3c.dom.Attr;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * Implementation of the DOM Element with namespaces that supports lazy
 * instantiation of a template DOM.
 */
public class LazyElementNS extends ElementNSImpl implements LazyElement {
    /**
     * Constructor.
     * @param ownerDoc The document that owns this node.
     * @param template If not-null, get the parameters from this template.
     * @param namespaceURI The namespace for the node.  
     *  Will be ignored if template  is not-null.
     * @param qualifiedName The tag name for the node.
     *  Will be ignored if template is not-null.
     */
    protected LazyElementNS(LazyDocument ownerDoc,
                            LazyElement template,
                            String namespaceURI,
                            String qualifiedName) {
    	super(ownerDoc, 
              (template != null) ? template.getNamespaceURI() : namespaceURI,
              (template != null) ? template.getNodeName() : qualifiedName);
        if (template != null) {
            fTemplateNode = template;
            fNodeId = template.getNodeId();
        } else {
            // Not created from a template, mark all as expanded.
            fParentExpanded = true;
            fChildrenExpanded = true;
            fAttributesExpanded = true;
        }
    }

    //-------------------------------------------------------------------------
    // LazyElementNS specific
    //-------------------------------------------------------------------------

    /**
     * Template for this element.
     */
    private LazyElement fTemplateNode = null;

    /**
     * Mark the node as a template node and associated preformatted text.
     * @see LazyNode#makeTemplateNode
     * @see PreFormattedText#setPreFormattedText
     */
    public void makeTemplateNode(int nodeId,
                                 String text) {
        fNodeId = nodeId;
        fIsTemplateNode = true;
        fPreFormattedText = text;
    }

    /**
     * Get the template for this node.
     * @see LazyNode#getTemplateNode
     */
    public LazyElement getTemplateElement() {
        return fTemplateNode;
    }

    /**
     * @see Node#cloneNode
     */
    public Node cloneNode(boolean deep) {
        // If children are copied, we must expand now.
        if (deep && !fChildrenExpanded) {
            expandChildren();
        }
        // Attributes are always copied
        if (!fAttributesExpanded) {
            expandAttributes();
        }
        
        // This does a clone(), must clean up all fields.
        LazyElementNS newElement = (LazyElementNS)super.cloneNode(deep);
        newElement.fNodeId = NULL_NODE_ID;
        newElement.fParentExpanded = true;
        newElement.fChildrenExpanded = true;
        newElement.fAttributesExpanded = true;
        return newElement;
    }

    //-------------------------------------------------------------------------
    // LazyNode support
    //-------------------------------------------------------------------------

    /*
     * Node id for this element.
     */
    private int fNodeId = NULL_NODE_ID;

    /**
     * Is this a template node?
     */
    private boolean fIsTemplateNode;

    /*
     * @see LazyNode#makeTemplateNode
     */
    public void makeTemplateNode(int nodeId) {
        fNodeId = nodeId;
        fIsTemplateNode = true;
    }

    /**
     * @see LazyNode#getNodeId
     */
    public int getNodeId() {
        return fNodeId;
    }

    /**
     * @see LazyNode#isTemplateNode
     */
    public boolean isTemplateNode() {
        return fIsTemplateNode;
    }

    /**
     * @see LazyNode#getTemplateNode
     */
    public LazyNode getTemplateNode() {
        return fTemplateNode;
    }

    /**
     * @see LazyNode#templateClone
     */
    public LazyNode templateClone(Document ownerDocument) {
        return new LazyElementNS((LazyDocument)ownerDocument, this, null, null);
    }

    /**
     * Set the node value, invalidating the id.  All node data is modified
     * by this routine.
     * @see org.w3c.dom.Node#setNodeValue
     */
    public void setNodeValue(String value) {
        fNodeId = NULL_NODE_ID;
        super.setNodeValue(value);
    }

    //-------------------------------------------------------------------------
    // LazyParent support
    //-------------------------------------------------------------------------

    /**
     * Parent and children expanded flags.
     */
    private boolean fParentExpanded = false;
    private boolean fChildrenExpanded = false;
    
    /**
     * @see LazyParent#isParentExpanded()
     */
    public boolean isParentExpanded() {
        return fParentExpanded;
    }
    
    /**
     * @see LazyParent#setParentExpanded
     */
    public void setParentExpanded() {
        fParentExpanded = true;
    }
    
    /**
     * @see LazyParent#setParentWhileExpanding
     */
    public void setParentWhileExpanding(Node parent) {
        ownerNode = (NodeImpl)parent;
        flags |= OWNED;
        fParentExpanded = true;
    }
    
    /**
     * @see LazyParent#areChildrenExpanded()
     */
    public boolean areChildrenExpanded() {
        return fChildrenExpanded;
    }
    
    /**
     * @see LazyParent#setChildrenExpanded
     */
    public void setChildrenExpanded() {
        fChildrenExpanded = true;
    }

    /**
     * @see LazyParent#appendChildWhileExpanding
     */
    public void appendChildWhileExpanding(Node child) {
        super.insertBefore(child, null);
    }

    /**
     * Expand the parent of this element, if it is not already expanded.
     */
    private void expandParent() {
        ((LazyDocument)getOwnerDocument()).doExpandParent(this);
    }

    /**
     * Expand the children of this element, if they are not already expanded.
     */
    private void expandChildren() {
        ((LazyDocument)getOwnerDocument()).doExpandChildren(this);
    }

    /**
     * @see org.w3c.dom.Node#getParentNode
     */
    public Node getParentNode() {
        if (!fParentExpanded) {
            expandParent();
        }
        return super.getParentNode();
    }

    /**
     * @see org.w3c.dom.Node#getChildNodes
     */
    public NodeList getChildNodes() {
        if (!fChildrenExpanded) {
            expandChildren();
        }
        return super.getChildNodes();
    }

    /**
     * @see org.w3c.dom.Node#getFirstChild
     */
    public Node getFirstChild() {
        if (!fChildrenExpanded) {
            expandChildren();
        }
        return super.getFirstChild();
    }

    /**
     * @see org.w3c.dom.Node#getLastChild
     */
    public Node getLastChild() {
        if (!fChildrenExpanded) {
            expandChildren();
        }
        return super.getLastChild();
    }

    /**
     * @see org.w3c.dom.Node#getPreviousSibling
     */
    public Node getPreviousSibling() {
        if (!fParentExpanded) {
            expandParent();
        }
        return super.getPreviousSibling();
    }

    /**
     * @see org.w3c.dom.Node#getNextSibling
     */
    public Node getNextSibling() {
        if (!fParentExpanded) {
            expandParent();
        }
        return super.getNextSibling();
    }

   /**
     * @see org.w3c.dom.Node#insertBefore
     */
    public Node insertBefore(Node newChild, 
                             Node refChild)
        throws DOMException {
        if (!fChildrenExpanded) {
            expandChildren();
        }
        return super.insertBefore(newChild, refChild);
    }

    /**
     * @see org.w3c.dom.Node#replaceChild
     */
    public Node replaceChild(Node newChild, 
                             Node oldChild)
        throws DOMException {
        if (!fChildrenExpanded) {
            expandChildren();
        }
        return super.replaceChild(newChild, oldChild);
    }

    /**
     * @see org.w3c.dom.Node#removeChild
     */
    public Node removeChild(Node oldChild)
        throws DOMException {
        if (!fChildrenExpanded) {
            expandChildren();
        }
        return super.removeChild(oldChild);
    }

    /**
     * @see org.w3c.dom.Node#appendChild
     */
    public Node appendChild(Node newChild)
        throws DOMException {
        if (!fChildrenExpanded) {
            expandChildren();
        }
        return super.appendChild(newChild);
    }

    /**
     * @see org.w3c.dom.Node#hasChildNodes
     */
    public boolean hasChildNodes() {
        if (!fChildrenExpanded) {
            return fTemplateNode.hasChildNodes();
        } else {
            return super.hasChildNodes();
        }
    }
    
    /**
     * @see org.w3c.dom.Node#normalize
     */
    public void normalize() {
        if (!fChildrenExpanded) {
            expandChildren();
        }
        super.normalize();
    }

    //-------------------------------------------------------------------------
    // Attribute support
    //-------------------------------------------------------------------------

    /**
     * Attributes expanded flag.
     */
    private boolean fAttributesExpanded = false;

    /** 
     * Are the attributes of this node expanded?
     */
    public boolean areAttributesExpanded() {
        return fAttributesExpanded;
    }

    /**
     * Do work of expanding attributes.  Must be called while 
     * synchronized on the owner document.
     */
    private void doExpandAttributes(LazyDocument doc) {
        doc.enterExpansion();
        try {
            NamedNodeMap templateAttrs = fTemplateNode.getAttributes();
            if (templateAttrs != null) {
                int len = templateAttrs.getLength();
                for (int idx = 0; idx < len; idx++) {
                    Attr attr = (Attr)doc.getNodeFromTemplate((LazyNode)templateAttrs.item(idx));
                    super.setAttributeNode(attr);
                }
            }
            fAttributesExpanded = true;
        } finally {
            doc.leaveExpansion();
        }
    }

    /**
     * Expand the attributes of this element, if they are not already
     * expanded.
     */
    private void expandAttributes() {
        LazyDocument doc = (LazyDocument)getOwnerDocument();
        synchronized (doc) {
            if (!fAttributesExpanded) {
                doExpandAttributes(doc);
            }
        }
    }

    /**
     * @see org.w3c.dom.Node#getAttributes
     */
    public NamedNodeMap getAttributes() {
        if (!fAttributesExpanded) {
            expandAttributes();
        }
        return super.getAttributes();
    }

     /**
     * @see org.w3c.dom.Element#getAttribute
     */
    public String getAttribute(String name) {
        if (!fAttributesExpanded) {
            expandAttributes();
        }
        return super.getAttribute(name);
    }

    /**
     * @see org.w3c.dom.Element#setAttribute
     */
    public void setAttribute(String name, 
                             String value) throws DOMException  {
        if (!fAttributesExpanded) {
            expandAttributes();
        }
        super.setAttribute(name, value);
    }

    /**
     * @see org.w3c.dom.Element#removeAttribute
     */
    public void removeAttribute(String name) throws DOMException {
        if (!fAttributesExpanded) {
            expandAttributes();
        }
        super.removeAttribute(name);
    }

    /**
     * @see org.w3c.dom.Element#getAttributeNode
     */
    public Attr getAttributeNode(String name) {
        if (!fAttributesExpanded) {
            expandAttributes();
        }
        return super.getAttributeNode(name);
    }

    /**
     * @see org.w3c.dom.Element#setAttributeNode
     */
    public Attr setAttributeNode(Attr newAttr) throws DOMException {
        if (!fAttributesExpanded) {
            expandAttributes();
        }
        return super.setAttributeNode(newAttr);
    }

    /**
     * @see org.w3c.dom.Element#removeAttributeNode
     */
    public Attr removeAttributeNode(Attr oldAttr) throws DOMException {
        if (!fAttributesExpanded) {
            expandAttributes();
        }
        return super.removeAttributeNode(oldAttr);
    }

    /**
     * @see org.w3c.dom.Element#getAttributeNS
     */
    public String getAttributeNS(String namespaceURI, 
                                 String localName) {
        if (!fAttributesExpanded) {
            expandAttributes();
        }
        return super.getAttributeNS(namespaceURI, localName);
    }

    /**
     * @see org.w3c.dom.Element#setAttributeNS
     */
    public void setAttributeNS(String namespaceURI, 
                               String qualifiedName, 
                               String value) throws DOMException {
        if (!fAttributesExpanded) {
            expandAttributes();
        }
        super.setAttributeNS(namespaceURI, qualifiedName, value);
    }

    /**
     * @see org.w3c.dom.Element#removeAttributeNS
     */
    public void removeAttributeNS(String namespaceURI, 
                                  String localName) throws DOMException {
        if (!fAttributesExpanded) {
            expandAttributes();
        }
        super.removeAttributeNS(namespaceURI, localName);
    }

    /**
     * @see org.w3c.dom.Element#getAttributeNodeNS
     */
    public Attr getAttributeNodeNS(String namespaceURI, 
                                   String localName) {
        if (!fAttributesExpanded) {
            expandAttributes();
        }
        return super.getAttributeNodeNS(namespaceURI, localName);
    }

    /**
     * @see org.w3c.dom.Element#setAttributeNodeNS
     */
    public Attr setAttributeNodeNS(Attr newAttr) throws DOMException {
        if (!fAttributesExpanded) {
            expandAttributes();
        }
        return super.setAttributeNodeNS(newAttr);
    }

    //-------------------------------------------------------------------------
    // PreFormattedText specific
    //-------------------------------------------------------------------------

    /**
     * Pre-formatted text associated with the node.
     */
    private String fPreFormattedText;

    /**
     * @see PreFormattedText#getPreFormattedText
     */
    public String getPreFormattedText() {
        return fPreFormattedText;
    }

    /**
     * @see PreFormattedText#setPreFormattedText
     */
    public void setPreFormattedText(String text) {
        fPreFormattedText = text;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy