001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.modules.projectimport.jbuilder.parsing;
043:
044: import java.util.ArrayList;
045: import java.util.List;
046: import org.w3c.dom.Element;
047: import org.w3c.dom.Node;
048: import org.w3c.dom.NodeList;
049: import org.w3c.dom.Text;
050:
051: /**
052: * Utility methods for the module.
053: */
054: class Util {
055:
056: private Util() {
057: }
058:
059: // COPIED FROM org.netbeans.modules.project.ant:
060: // (except for namespace == null support in findElement)
061: // (and support for comments in findSubElements)
062:
063: /**
064: * Search for an XML element in the direct children of a parent.
065: * DOM provides a similar method but it does a recursive search
066: * which we do not want. It also gives a node list and we want
067: * only one result.
068: * @param parent a parent element
069: * @param name the intended local name
070: * @param namespace the intended namespace (or null)
071: * @return the one child element with that name, or null if none or more than one
072: */
073: public static Element findElement(Element parent, String name,
074: String namespace) {
075: Element result = null;
076: NodeList l = parent.getChildNodes();
077: for (int i = 0; i < l.getLength(); i++) {
078: if (l.item(i).getNodeType() == Node.ELEMENT_NODE) {
079: Element el = (Element) l.item(i);
080: if ((namespace == null && name.equals(el.getTagName()))
081: || (namespace != null
082: && name.equals(el.getLocalName()) && namespace
083: .equals(el.getNamespaceURI()))) {
084: if (result == null) {
085: result = el;
086: } else {
087: return null;
088: }
089: }
090: }
091: }
092: return result;
093: }
094:
095: /**
096: * Extract nested text from an element.
097: * Currently does not handle coalescing text nodes, CDATA sections, etc.
098: * @param parent a parent element
099: * @return the nested text, or null if none was found
100: */
101: public static String findText(Element parent) {
102: NodeList l = parent.getChildNodes();
103: for (int i = 0; i < l.getLength(); i++) {
104: if (l.item(i).getNodeType() == Node.TEXT_NODE) {
105: Text text = (Text) l.item(i);
106: return text.getNodeValue();
107: }
108: }
109: return null;
110: }
111:
112: /**
113: * Find all direct child elements of an element.
114: * More useful than {@link Element#getElementsByTagNameNS} because it does
115: * not recurse into recursive child elements.
116: * Children which are all-whitespace text nodes or comments are ignored; others cause
117: * an exception to be thrown.
118: * @param parent a parent element in a DOM tree
119: * @return a list of direct child elements (may be empty)
120: * @throws IllegalArgumentException if there are non-element children besides whitespace
121: */
122: public static List/*<Element>*/findSubElements(Element parent)
123: throws IllegalArgumentException {
124: NodeList l = parent.getChildNodes();
125: List/*<Element>*/elements = new ArrayList(l.getLength());
126: for (int i = 0; i < l.getLength(); i++) {
127: Node n = l.item(i);
128: if (n.getNodeType() == Node.ELEMENT_NODE) {
129: elements.add((Element) n);
130: } else if (n.getNodeType() == Node.TEXT_NODE) {
131: String text = ((Text) n).getNodeValue();
132: if (text.trim().length() > 0) {
133: throw new IllegalArgumentException(
134: "non-ws text encountered in " + parent
135: + ": " + text); // NOI18N
136: }
137: } else if (n.getNodeType() == Node.COMMENT_NODE) {
138: // OK, ignore
139: } else {
140: throw new IllegalArgumentException(
141: "unexpected non-element child of " + parent
142: + ": " + n); // NOI18N
143: }
144: }
145: return elements;
146: }
147:
148: }
|