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

org.tinygroup.parser.node.NodeImpl Maven / Gradle / Ivy

The newest version!
/**
 *  Copyright (c) 1997-2013, www.tinygroup.org ([email protected]).
 *
 *  Licensed under the GPL, Version 3.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *       http://www.gnu.org/licenses/gpl.html
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.tinygroup.parser.node;

import org.tinygroup.commons.processor.Processor;
import org.tinygroup.parser.Node;
import org.tinygroup.parser.NodeType;

import java.io.IOException;
import java.io.OutputStream;
import java.util.*;

/**
 *
 * @author luoguo
 */
public abstract class NodeImpl, NT extends NodeType> implements Node {
    private Map attributes;
    private List attributeList;
    private String content = null;
    private List subNodes = new ArrayList();
    private T parent = null;
    private NT nodeType = null;
    private String nodeName = null;
    private String singleAttribute;

    public String getAttribute(String attributeName, String defaultValue) {
        String value = this.getAttribute(attributeName);
        if (value == null) {
            value = defaultValue;
        }
        return value;
    }

    public void write(OutputStream stream) throws IOException {
        this.write(stream, "UTF-8");
    }

    /**
     * 获取非对称标签属性
     *
     * @return String
     */
    public String getSingleAttribute() {
        return singleAttribute;
    }

    /**
     * 设置非对称标签属性
     *
     * @param singleAttribute
     * @return void
     */
    public void setSingleAttribute(String singleAttribute) {
        this.singleAttribute = singleAttribute;
    }

    protected abstract String encode(String str);

    protected abstract String decode(String str);

    /**
     * 设置结点名称
     *
     * @param nodeName
     * @return void
     */
    public T setNodeName(String nodeName) {
        this.nodeName = getCaseSensitiveName(nodeName);
        return (T)this;
    }

    /**
     * 构造函数
     *
     * @param nodeType
     */
    protected NodeImpl(NT nodeType) {
        this.nodeType = nodeType;
    }

    /**
     * 构造函数
     *
     * @param nodeName
     */
    protected NodeImpl(String nodeName) {
        this.nodeName = getCaseSensitiveName(nodeName);
    }

    /**
     * 构造函数
     *
     * @param nodeType
     * @param nodeName
     */
    protected NodeImpl(NT nodeType, String nodeName) {
        this(nodeType);
        if (nodeType.isHasHeader()) {
            this.nodeName = getCaseSensitiveName(nodeName);
        }
    }

    /**
     * 构造函数
     *
     * @param nodeName
     * @param nodeType
     */
    protected NodeImpl(String nodeName, NT nodeType) {
        this(nodeType, nodeName);
    }

    /**
     * 设置父结点
     *
     * @param parent
     */
    public T setParent(T parent) {
        this.parent = parent;
        return (T)this;
    }

    /**
     * 获取结点类型
     *
     * @return NT
     */
    public NT getNodeType() {
        return nodeType;
    }

    /**
     * 获取结点文本内容
     *
     * @return String
     */
    public String getContent() {
        if (nodeType.isHasContent()) {
            return content;
        } else {
            StringBuffer sb = new StringBuffer();
            if (subNodes != null) {
                for (T n : subNodes) {
                    if (n.getNodeType().isHasContent()) {
                        sb.append(n.getContent());
                    }
                }
                return sb.toString();
            } else {
                return null;
            }
        }
    }

    /**
     * 设置结点文本内容
     *
     * @param content
     */
    public T setContent(String content) {
        String contentString = decode(content.trim());
        if (nodeType.isHasContent()) {
            if (nodeType.isText()) {
                this.content = decode(contentString);
            } else {
                this.content = contentString;
            }
        } else {
            for(Node node:subNodes){
                if(node.getNodeType().isHasContent()){
                    node.setContent(content);
                    return (T)this;
                }
            }
            addContent(contentString);
        }
        return (T)this;
    }

    private String getEncodeContent() {
        if (nodeType.isText()) {
            return encode(content);
        } else {
            return content;
        }

    }

    /**
     * 获取结点属性
     *
     * @return Map
     */
    public Map getAttributes() {
        return attributes;
    }

    public List getAttributeList() {
        return attributeList;
    }

    public T setAttribute(Map attributeMap) {
        if (attributeMap != null) {
            for (String name : attributeMap.keySet()) {
                String value = attributeMap.get(name);
                name = getCaseSensitiveName(name);
                setAttribute(name, value);
            }
        }
        return (T)this;
    }

    /**
     * 获取子结点
     *
     * @return List
     */
    public List getSubNodes() {
        return subNodes;
    }

    /**
     * 获取子结点
     */
    public List getSubNodes(String nodeName) {
        if (subNodes == null) {
            return null;
        }
        nodeName = getCaseSensitiveName(nodeName);
        List result = new ArrayList();
        for (T t : subNodes) {
            if (t.getNodeName() != null && t.getNodeName().equals(nodeName)) {
                result.add(t);
            }
        }
        if (result.size() == 0) {
            return null;
        }
        return result;
    }

    /**
     * 获取子孙结点列表
     */
    public List getSubNodesRecursively(String nodeName) {
        if (subNodes == null) {
            return null;
        }
        nodeName = getCaseSensitiveName(nodeName);
        List result = new ArrayList();
        for (T t : subNodes) {
            if (t.getNodeName() != null && t.getNodeName().equals(nodeName)) {
                result.add(t);
            }
            List progenyNodes = t.getSubNodesRecursively(nodeName);
            if (progenyNodes != null && progenyNodes.size() > 0) {
                result.addAll(progenyNodes);
            }
        }
        if (result.size() == 0) {
            return null;
        }
        return result;
    }

    /**
     * 查找子孙节点中,指定节点名称的第一个节点
     *
     * @param nodeName
     * @return
     */
    public T getSubNodeRecursively(String nodeName) {
        if (subNodes == null) {
            return null;
        }
        nodeName = getCaseSensitiveName(nodeName);
        for (T t : subNodes) {
            if (t.getNodeName() != null && t.getNodeName().equals(nodeName)) {
                return t;
            }
            T p = t.getSubNodeRecursively(nodeName);
            if (p != null) {
                return p;
            }
        }
        return null;
    }

    /**
     * 返回名字,如果大小写敏感,则没有变化,如果大小写不敏感,则统一变成小写
     *
     * @param name
     * @return
     */
    public String getCaseSensitiveName(String name) {
        if (!isCaseSensitive()) {
            name = name.toLowerCase();
        }
        return name;
    }

    /**
     * 查找子节点中,指定节点名称的第一个节点
     *
     * @param nodeName
     * @return
     */
    public T getSubNode(String nodeName) {
        if (subNodes == null) {
            return null;
        }
        nodeName = getCaseSensitiveName(nodeName);
        for (T t : subNodes) {
            if (t.getNodeName() != null && t.getNodeName().equals(nodeName)) {
                return t;
            }
        }
        return null;
    }

    /**
     * @return
     */
    private String getFooterBuffer() {
        StringBuffer sb = new StringBuffer();
        if (nodeName != null && nodeType.isHasHeader()) {
            sb.append(nodeName);
        }
        return sb.toString();
    }

    /**
     * 获取头标签内相关内容
     *
     * @return
     */
    private String getHeaderBuffer() {
        StringBuffer sb = new StringBuffer();
        if (nodeName != null) {
            sb.append(nodeName);
        }
        if (attributeList != null) {
            for (Attribute attribute : attributeList) {
                sb.append(" ");
                sb.append(attribute.getName()).append("=").append("\"").append(encode(attribute.getValue())).append("\"");
            }
        }
        if (singleAttribute != null) {
            sb.append(" ").append(singleAttribute);
        }
        return sb.toString();
    }

    /**
     * 获取完整的头标签,包括标签标识符、名字、属性
     */
    public void getHeader(StringBuffer sb) {
        nodeType.getHeader(sb, getHeaderBuffer());
    }

    /**
     * 获取完整的结尾标签 若为非对称标签则返回空
     */
    public void getFooter(StringBuffer sb) {
        if (!isSingleNode()) {
            nodeType.getTail(sb, getFooterBuffer());
        }
    }

    /**
     * 获取根结点
     */
    @SuppressWarnings("unchecked")
    public T getRoot() {
        T n = (T) this;
        while (n.getParent() != null) {
            n = n.getParent();
        }
        return n;
    }

    /**
     * 获取父结点
     */
    public T getParent() {
        return parent;
    }

    /**
     * 获取结点内容 若为文本内容,返回文本 若为子结点,返回子结点
     */

    public StringBuffer getBody() {
        StringBuffer sb = new StringBuffer();
        if (nodeType.isHasContent() && content != null) {
            sb.append(content);
        }
        if (nodeType.isHasBody() && subNodes != null) {
            for (T n : subNodes) {
                sb.append(n.toStringBuffer());
            }
        }
        return sb;
    }

    /**
     * 返回当前结点完整的信息
     */
    public StringBuffer toStringBuffer() {
        StringBuffer sb = new StringBuffer();
        getHeader(sb);
        if (content != null) {
            sb.append(getEncodeContent());
        }
        if (subNodes != null) {
            for (T n : subNodes) {
                sb.append(n.toStringBuffer());
            }
        }
        getFooter(sb);
        return sb;
    }

    /**
     * 将结点数据写入指定的输出流中
     */
    public void write(OutputStream stream, String encode) throws IOException {
        StringBuffer sb = new StringBuffer();
        getHeader(sb);
        stream.write(sb.toString().getBytes(encode));
        if (content != null) {
            stream.write(getEncodeContent().getBytes(encode));
        }
        if (subNodes != null) {
            for (T n : subNodes) {
                n.write(stream);
            }
        }
        sb = new StringBuffer();
        getFooter(sb);
        stream.write(sb.toString().getBytes(encode));
    }

    /**
     * 根据属性名获取属性值
     */
    public String getAttribute(String attributeName) {
        if (attributes == null) {
            return null;
        }
        attributeName = getCaseSensitiveName(attributeName);
        return attributes.get(attributeName);
    }

    /**
     * 根据属性名删除指定的属性
     */
    public T removeAttribute(String attributeName) {
        String name = getCaseSensitiveName(attributeName);
        attributes.remove(name);
        if (attributeList != null) {
            Iterator iterator = attributeList.iterator();
            while (iterator.hasNext()) {
                Attribute attribute = iterator.next();
                if (attribute.getName().equals(name)) {
                    iterator.remove();
                    break;
                }
            }
        }
        return (T)this;
    }

    /**
     * 设置属性 若输入参数中的属性名不为空,属性值为空,则删除指定的属性 若输入参数中的属性名不为空,属性值不为空,则添加相应的属性
     */
    public T setAttribute(String attributeName, String value) {
    	if(value==null){
    		removeAttribute(attributeName);
    		return (T)this;
    	}
        value=decode(value);
        if (nodeType.isHasHeader()) {
            if (attributes == null) {
                attributes = new HashMap();
                attributeList = new ArrayList();
            }
            String name = getCaseSensitiveName(attributeName);
            if (attributes.containsKey(name)) {
                for (Attribute attribute : attributeList) {
                    if (name.equals(attribute.getName())) {
                        attribute.setValue(value);
                        break;
                    }
                }
            } else {
                //如果不存在,则新增
                attributeList.add(new Attribute(name, value));
            }
            attributes.put(name, value);
        }
        return (T)this;
    }

    /**
     * 添加子结点
     */
    @SuppressWarnings("unchecked")
    public T addNode(T node) {
        if (!nodeType.isHasBody() || node == null) {
            return null;
        }
        if (subNodes == null) {
            subNodes = new ArrayList();
        } else {
            if (subNodes.contains(node)) {
                return node;
            }
        }

        node.setParent((T) this);
        subNodes.add(node);
        return node;
    }

    /**
     * 添加所有节点
     *
     * @param nodes
     */
    public List addAll(List nodes) {
        if (!subNodes.equals(nodes) && nodeType.isHasBody() && nodes != null) {
            for (T t : nodes) {
                addNode(t);
            }
        }
        return nodes;
    }

    /**
     * 删除指定的子结点
     */
    public T removeNode(T node) {
        if (subNodes != null && subNodes.remove(node)) {
            node.setParent(null);
            return node;
        }
        return null;
    }

    /**
     * 删除所有子节点
     *
     * @return
     */
    public List removeSubNotes() {
        List r = subNodes;
        this.subNodes = null;
        return r;
    }


    public String toString() {
        return toStringBuffer().toString();
    }

    @SuppressWarnings("unchecked")
    public void foreach(Processor processor) {
        processor.process((T) this);
        if (subNodes != null) {
            for (T n : subNodes) {
                n.foreach(processor);
            }
        }
    }

    /**
     * 获取结点名称
     */
    public String getNodeName() {
        return nodeName;
    }

    /**
     * 检测是否为非对称结点 若为对称结点返回false 若为非对称结点返回true
     */
    public boolean isSingleNode() {
        return false;
    }

    public List removeNode(String nodeName) {
        nodeName = getCaseSensitiveName(nodeName);
        List removedNodeList = new ArrayList();
        if (subNodes != null) {
            for (int i = subNodes.size() - 1; i >= 0; i--) {
                T t = subNodes.get(i);
                if (t.getNodeName() != null && t.getNodeName().equals(nodeName)) {
                    removedNodeList.add(t);
                    subNodes.remove(i);
                }
            }
        }
        return removedNodeList;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy