/* * The JabaJaba class library * Copyright (C) 1997-2003 ASAMI, Tomoharu (asami@AsamiOffice.com) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package com.AsamiOffice.xml; import java.net.MalformedURLException; import java.net.URL; import java.text.NumberFormat; import java.text.ParseException; import java.util.ArrayList; import java.util.List; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.AsamiOffice.io.UURL; import com.AsamiOffice.text.UString; /** * UElement * * @since Jan. 17, 2000 * @version Oct. 19, 2003 * @author ASAMI, Tomoharu (asami@AsamiOffice.com) */ public final class UElement { // element public static Element[] getElements(Element element) { NodeList children = element.getChildNodes(); List list = new ArrayList(); int size = children.getLength(); for (int i = 0;i < size;i++) { Node child = children.item(i); if (child.getNodeType() == Node.ELEMENT_NODE) { list.add(child); } } Element[] array = new Element[list.size()]; return ((Element[])list.toArray(array)); } public static Element[] getElements( Element element, String name ) { NodeList children = element.getChildNodes(); List list = new ArrayList(); int size = children.getLength(); for (int i = 0;i < size;i++) { Node child = children.item(i); if (child.getNodeType() == Node.ELEMENT_NODE) { Element candidate = (Element)child; if (name.equals(candidate.getTagName())) { list.add(child); } } } Element[] array = new Element[list.size()]; return ((Element[])list.toArray(array)); } public static Element[] getElements( Element element, String namespaceURI, String localName ) { NodeList children = element.getChildNodes(); List list = new ArrayList(); int size = children.getLength(); for (int i = 0;i < size;i++) { Node child = children.item(i); if (child.getNodeType() == Node.ELEMENT_NODE) { SmartElement candidate = new SmartElement((Element)child); if (candidate.isTag(namespaceURI, localName)) { list.add(child); } } } Element[] array = new Element[list.size()]; return ((Element[])list.toArray(array)); } public static Element getOnlyElement(Element element, String name) throws IllegalArgumentException { Element[] elements = getElements(element, name); switch (elements.length) { case 0: return (null); case 1: return (elements[0]); default: throw (new IllegalArgumentException()); } } public static Element getOnlyElement( Element element, String uri, String name ) throws IllegalArgumentException { Element[] elements = getElements(element, uri, name); switch (elements.length) { case 0: return (null); case 1: return (elements[0]); default: throw (new IllegalArgumentException()); } } public static Element[] getElementsRecursive( Element element, String name ) { NodeList nodes = element.getElementsByTagName(name); Element[] elements = new Element[nodes.getLength()]; for (int i = 0;i < elements.length;i++) { elements[i] = (Element)nodes.item(i); } return (elements); } public static Element getOnlyElementRecursive( Element element, String name ) throws IllegalArgumentException { NodeList nodes = element.getElementsByTagName(name); switch (nodes.getLength()) { case 0: return (null); case 1: break; default: throw (new IllegalArgumentException()); } return ((Element)nodes.item(0)); } // attribute operation public static String getAttributeAsCDATA(Element element, String name) { return (UString.checkNull(element.getAttribute(name))); } public static String getAttributeAsNMTOKEN(Element element, String name) { String cdata = UString.checkNull(element.getAttribute(name)); if (cdata == null) { return (null); } return (cdata.trim()); // XXX : check precise spec } public static String[] getAttributeAsNMTOKENS( Element element, String name ) { String cdata = UString.checkNull(element.getAttribute(name)); if (cdata == null) { return (null); } return (UString.getTokens(cdata)); } public static String getAttributeAsString(Element element, String name) { return (UString.checkNull(element.getAttribute(name))); } public static boolean getAttributeAsBoolean( Element element, String name ) { return (getAttributeAsBoolean(element, name, false)); } public static boolean getAttributeAsBoolean( Element element, String name, boolean defaultValue ) { String value = UString.checkNull(element.getAttribute(name)); if (value == null) { return (defaultValue); } if (value.equals("true")) { return (true); } else if (value.equals("false")) { return (false); } else { return (true); } } public static Number getAttributeAsNumber(Element element, String name) { return (getAttributeAsNumber(element, name, null)); } public static Number getAttributeAsNumber( Element element, String name, Number defaultValue ) { String value = UString.checkNull(element.getAttribute(name)); if (value == null) { return (defaultValue); } try { NumberFormat format = NumberFormat.getInstance(); Number number = format.parse(value); return (number); // XXX : Integer, Float } catch (ParseException e) { return (defaultValue); } } public static URL getAttributeAsURL(Element element, String name) throws MalformedURLException { String value = UString.checkNull(element.getAttribute(name)); if (value == null) { return (null); } return (new URL(value)); } public static URL getAttributeAsURLByFileOrURLName( Element element, String name ) throws IllegalArgumentException { String value = UString.checkNull(element.getAttribute(name)); if (value == null) { return (null); } try { return (UURL.getURLFromFileOrURLName(value)); } catch (MalformedURLException e) { throw (new InternalError()); // XXX } } public static URL getAttributeAsURLByFileOrURLNameWithXMLBase( Element element, String name ) throws IllegalArgumentException { return ( getAttributeAsURLByFileOrURLNameWithXMLBase(element, name, null) ); } public static URL getAttributeAsURLByFileOrURLNameWithXMLBase( Element element, String name, String baseURI ) throws IllegalArgumentException { String value = UString.checkNull(element.getAttribute(name)); if (value == null) { return (null); } try { URL url = new URL(value); return (url); } catch (MalformedURLException e) { } String xmlBase = UElement.getXMLBaseAsString(element); if (xmlBase != null) { if (!xmlBase.endsWith("/")) { xmlBase = xmlBase + "/"; } value = xmlBase + value; } try { URL url = new URL(value); return (url); } catch (MalformedURLException e) { } if (baseURI != null) { if (!baseURI.endsWith("/")) { baseURI = baseURI + "/"; } value = baseURI + value; } try { return (UURL.getURLFromFileOrURLName(value)); } catch (MalformedURLException e) { throw (new InternalError()); // XXX } } public static int getAttributeAsEnumerationNumber( Element element, String name, String[] candidates, int base ) { String value = UString.checkNull(element.getAttribute(name)); if (value == null) { return (-1); } for (int i = 0;i < candidates.length;i++) { if (candidates[i].equals(value)) { return (base + i); } } return (-1); } public static int getAttributeAsEnumerationNumber( Element element, String name, String[] candidates, int base, String defaultValue ) { String value = UString.checkNull(element.getAttribute(name)); if (value == null) { value = defaultValue; } for (int i = 0;i < candidates.length;i++) { if (candidates[i].equals(value)) { return (base + i); } } return (-1); } // method and attribute public static String getAttributeOfOnlyElementAsString( Element element, String tagName, String attrName ) throws IllegalArgumentException { Element target = getOnlyElement(element, tagName); if (target == null) { return (null); } return (UString.checkNull(target.getAttribute(attrName))); } public static String getAttributeOfOnlyElementRecursiveAsString( Element element, String tagName, String attrName ) throws IllegalArgumentException { Element target = getOnlyElementRecursive(element, tagName); if (target == null) { return (null); } return (UString.checkNull(target.getAttribute(attrName))); } public static Integer getAttributeOfOnlyElementAsInteger( Element element, String tagName, String attrName ) throws IllegalArgumentException { String data = getAttributeOfOnlyElementAsString( element, tagName, attrName ); if (data == null) { return (null); } return (Integer.valueOf(data)); } public static Float getAttributeOfOnlyElementAsFloat( Element element, String tagName, String attrName ) throws IllegalArgumentException { String data = getAttributeOfOnlyElementAsString( element, tagName, attrName ); if (data == null) { return (null); } return (Float.valueOf(data)); } public static Double getAttributeOfOnlyElementAsDouble( Element element, String tagName, String attrName ) throws IllegalArgumentException { String data = getAttributeOfOnlyElementAsString( element, tagName, attrName ); if (data == null) { return (null); } return (Double.valueOf(data)); } // data operation public static String getData(Element element) { return (UDOM.getDataValue(element)); } public static Number getDataAsNumber(Element element) { String data = getData(element); if (UString.isNull(data)) { return (null); } try { NumberFormat format = NumberFormat.getInstance(); Number number = format.parse(data); return (number); // XXX : Integer, Float } catch (ParseException e) { return (null); } } public static Number getDataAsNumber(Element element, String name) { NodeList nodes = element.getElementsByTagName(name); if (nodes == null) { return (null); } if (nodes.getLength() == 0) { return (null); } return (getDataAsNumber((Element)nodes.item(0))); } public static Long getDataAsLong(Element element) { String data = getData(element); if (UString.isNull(data)) { return (null); } try { Long number = Long.valueOf(data); return (number); } catch (NumberFormatException e) { return (null); } } public static Long getDataAsLong(Element element, String name) { NodeList nodes = element.getElementsByTagName(name); if (nodes == null) { return (null); } if (nodes.getLength() == 0) { return (null); } return (getDataAsLong((Element)nodes.item(0))); } // xml base public static String getXMLBaseAsString(Element root) { String uri = null; Node node = root; for (;;) { Element element = (Element)node; uri = UString.checkNull(element.getAttribute("xml:base")); if (uri != null) { try { URL url = new URL(uri); return (uri); } catch (MalformedURLException e) { } break; } node = node.getParentNode(); if (node == null) { return (null); } if (!(node instanceof Element)) { return (null); } } for (;;) { node = node.getParentNode(); if (node == null) { return (uri); } if (!(node instanceof Element)) { return (uri); } Element element = (Element)node; String base = UString.checkNull(element.getAttribute("xml:base")); if (base != null) { uri = base + uri; } try { URL url = new URL(uri); return (uri); } catch (MalformedURLException e) { } } } // update public static void appendElement( Element element, String tagName, String data ) { Document doc = element.getOwnerDocument(); Element item = doc.createElement(tagName); item.appendChild(doc.createTextNode(data)); element.appendChild(item); } public static void appendElement( Element element, String tagName, String attrName, String data ) { Document doc = element.getOwnerDocument(); Element item = doc.createElement(tagName); item.setAttribute(attrName, data); element.appendChild(item); } public static void updateElement( Element target, Element data, String keyAttr ) { updateElement(target, data, new String[] { keyAttr }); } public static void updateElement( Element target, Element data, String[] keyAttrs ) { String tagName = data.getTagName(); NodeList nodes = target.getElementsByTagName(tagName); int nNodes = nodes.getLength(); for (int i = 0;i < nNodes;i++) { Element element = (Element)nodes.item(i); if (_isSameAttrs(element, data, keyAttrs)) { target.replaceChild(data, element); return; } } target.appendChild(data); } protected static boolean _isSameAttrs( Element lhs, Element rhs, String[] attrs ) { for (int i = 0;i < attrs.length;i++) { String attr = attrs[i]; if (!lhs.getAttribute(attr).equals(rhs.getAttribute(attr))) { return (false); } } return (true); } }