blob: 196a87c7eb5df595efec057149bb87db49f4495b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Sybase, Inc. and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.pagedesigner.utils;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.wst.xml.core.internal.document.ElementImpl;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
/**
* @author mengbo
*/
public class DOMUtil {
/**
* @param parent
* @param tag
* @return the list of child elements of parent that are Elements
* and that have name 'tag' ignoring case
*/
public static List getChildElementsByTagIgnoreCase(Element parent,
String tag) {
List ret = new ArrayList();
NodeList nodeList = parent.getChildNodes();
for (int i = 0, size = nodeList.getLength(); i < size; i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
String t = node.getNodeName();
if (tag.equalsIgnoreCase(t)) {
ret.add(node);
}
}
}
return ret;
}
/**
* @param ele
* @return the element value of the TEXT_NODE children of element
* concat'd together
*/
public static String getTextElementValue(Element ele) {
StringBuffer buffer = new StringBuffer();
Node node = ele.getFirstChild();
while (node != null) {
if (node.getNodeType() == Node.TEXT_NODE) {
buffer.append(node.getNodeValue());
} else if (node.getNodeType() == Node.CDATA_SECTION_NODE) {
buffer.append(node.getNodeValue());
}
node = node.getNextSibling();
}
return buffer.toString();
}
/**
* @param element
* @param string
* @return the attribute named string on element ignoring case in the comparison
* or null if not found
*/
public static String getAttributeIgnoreCase(Element element, String string) {
NamedNodeMap map = element.getAttributes();
for (int i = 0; i < map.getLength(); i++) {
Node attr = map.item(i);
if (string.equalsIgnoreCase(attr.getNodeName())) {
return attr.getNodeValue();
}
}
return null;
}
/**
* @param parent
* @param tags
* @return the list of children of parent with name in tags ignoring case
*/
public static List getChildrenByTagsIgnoreCase(Element parent, String[] tags) {
List result = new ArrayList();
NodeList nodeList = parent.getChildNodes();
for (int i = 0, size = nodeList.getLength(); i < size; i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
String t = node.getNodeName();
for (int k = 0; k < tags.length; k++) {
if (tags[k].equalsIgnoreCase(t)) {
result.add(node);
break;
}
}
}
}
return result;
}
/**
* @param ele
*/
public static void removeAllChildren(Element ele) {
((ElementImpl) ele).removeChildNodes();
}
/**
* @param ele
* @param value
*/
public static void setTextElementValue(Element ele, String value) {
removeAllChildren(ele);
Text txt = ele.getOwnerDocument().createTextNode(value);
ele.appendChild(txt);
}
/**
* @param ele
* @param attr
* @param defaultvalue
* @return the integer attribute of ele called attr. Default value
* is returned if the attribute is not found.
*/
public static int getIntAttributeIgnoreCase(Element ele, String attr,
int defaultvalue) {
if (ele == null) {
return defaultvalue;
}
String attrvalue = getAttributeIgnoreCase(ele, attr);
if (attrvalue == null) {
return defaultvalue;
}
try {
return Integer.parseInt(attrvalue);
} catch (NumberFormatException ex) {
return defaultvalue;
}
}
/**
* get all child elements
*
* @param ele
* @return the list of element children of type ELEMENT_NODE
*/
public static List getElementChildren(Element ele) {
List ret = new ArrayList();
NodeList nodeList = ele.getChildNodes();
for (int i = 0, size = nodeList.getLength(); i < size; i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
ret.add(node);
}
}
return ret;
}
/**
* judge whether element has an attribute named attrName
*
* @param ele
* @param attrName
* @return true if element has attribute called attrName ignoring
* case in the comparison.
*/
public static boolean hasAttribute(Element ele, String attrName) {
NamedNodeMap map = ele.getAttributes();
for (int i = 0; i < map.getLength(); i++) {
Node attr = map.item(i);
if (attr.getNodeName().equalsIgnoreCase(attrName)) {
return true;
}
}
return false;
}
/**
* @param node
* @param sb
*/
public static void nodeToString(Node node, StringBuffer sb) {
int type = node.getNodeType();
switch (type) {
case Node.DOCUMENT_NODE:
sb.append("<?xml version=\"1.0\" ?>"); //$NON-NLS-1$
nodeToString(((Document) node).getDocumentElement(), sb);
break;
case Node.ELEMENT_NODE:
sb.append("<"); //$NON-NLS-1$
sb.append(node.getNodeName());
NamedNodeMap attrs = node.getAttributes();
for (int i = 0; i < attrs.getLength(); i++) {
Node attr = attrs.item(i);
sb.append(" " + attr.getNodeName() + "=\"" //$NON-NLS-1$ //$NON-NLS-2$
+ attr.getNodeValue() + "\""); //$NON-NLS-1$
}
NodeList children = node.getChildNodes();
if (children != null) {
int len = children.getLength();
if (len != 0) {
sb.append(">"); //$NON-NLS-1$
}
for (int i = 0; i < len; i++) {
nodeToString(children.item(i), sb);
}
}
break;
case Node.ENTITY_REFERENCE_NODE:
sb.append("&"); //$NON-NLS-1$
sb.append(node.getNodeName());
sb.append(";"); //$NON-NLS-1$
break;
case Node.CDATA_SECTION_NODE:
sb.append("<![CDATA["); //$NON-NLS-1$
sb.append(node.getNodeValue());
sb.append("]]>"); //$NON-NLS-1$
break;
case Node.TEXT_NODE:
sb.append(node.getNodeValue());
break;
case Node.PROCESSING_INSTRUCTION_NODE:
sb.append("<?"); //$NON-NLS-1$
sb.append(node.getNodeName());
String data = node.getNodeValue();
{
sb.append(" "); //$NON-NLS-1$
sb.append(data);
}
sb.append("?>"); //$NON-NLS-1$
break;
}
if (type == Node.ELEMENT_NODE) {
if (node.getFirstChild() != null) {
sb.append("</"); //$NON-NLS-1$
sb.append(node.getNodeName());
sb.append(">"); //$NON-NLS-1$
} else {
sb.append("/>"); //$NON-NLS-1$
}
}
}
}