--- a/ruby.rakeproject/src/org/netbeans/modules/ruby/modules/project/rake/RakeBasedProjectFactorySingleton.java +++ a/ruby.rakeproject/src/org/netbeans/modules/ruby/modules/project/rake/RakeBasedProjectFactorySingleton.java @@ -53,6 +53,7 @@ import java.util.Set; import java.util.WeakHashMap; import org.netbeans.api.project.Project; +import org.netbeans.modules.ruby.spi.project.support.rake.ProjectGenerator; import org.netbeans.spi.project.ProjectFactory; import org.netbeans.spi.project.ProjectState; import org.netbeans.modules.ruby.spi.project.support.rake.RakeBasedProjectType; @@ -178,11 +179,11 @@ if (!"project".equals(projectEl.getLocalName()) || !PROJECT_NS.equals(projectEl.getNamespaceURI())) { // NOI18N return null; } - Element typeEl = Util.findElement(projectEl, "type", PROJECT_NS); // NOI18N + Element typeEl = XMLUtil.findElement(projectEl, "type", PROJECT_NS); // NOI18N if (typeEl == null) { return null; } - String type = Util.findText(typeEl); + String type = XMLUtil.findText(typeEl); if (type == null) { return null; } --- a/ruby.rakeproject/src/org/netbeans/modules/ruby/modules/project/rake/Util.java +++ a/ruby.rakeproject/src/org/netbeans/modules/ruby/modules/project/rake/Util.java @@ -41,13 +41,7 @@ package org.netbeans.modules.ruby.modules.project.rake; -import java.util.ArrayList; -import java.util.List; import org.openide.ErrorManager; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; @@ -61,83 +55,6 @@ private Util() {} /** - * Search for an XML element in the direct children of a parent. - * DOM provides a similar method but it does a recursive search - * which we do not want. It also gives a node list and we want - * only one result. - * @param parent a parent element - * @param name the intended local name - * @param namespace the intended namespace - * @return the one child element with that name, or null if none or more than one - */ - public static Element findElement(Element parent, String name, String namespace) { - Element result = null; - NodeList l = parent.getChildNodes(); - int len = l.getLength(); - for (int i = 0; i < len; i++) { - if (l.item(i).getNodeType() == Node.ELEMENT_NODE) { - Element el = (Element)l.item(i); - if (name.equals(el.getLocalName()) && namespace.equals(el.getNamespaceURI())) { - if (result == null) { - result = el; - } else { - return null; - } - } - } - } - return result; - } - - /** - * Extract nested text from an element. - * Currently does not handle coalescing text nodes, CDATA sections, etc. - * @param parent a parent element - * @return the nested text, or null if none was found - */ - public static String findText(Element parent) { - NodeList l = parent.getChildNodes(); - for (int i = 0; i < l.getLength(); i++) { - if (l.item(i).getNodeType() == Node.TEXT_NODE) { - Text text = (Text)l.item(i); - return text.getNodeValue(); - } - } - return null; - } - - /** - * Find all direct child elements of an element. - * More useful than {@link Element#getElementsByTagNameNS} because it does - * not recurse into recursive child elements. - * Children which are all-whitespace text nodes are ignored; others cause - * an exception to be thrown. - * @param parent a parent element in a DOM tree - * @return a list of direct child elements (may be empty) - * @throws IllegalArgumentException if there are non-element children besides whitespace - */ - public static List findSubElements(Element parent) throws IllegalArgumentException { - NodeList l = parent.getChildNodes(); - List elements = new ArrayList(l.getLength()); - for (int i = 0; i < l.getLength(); i++) { - Node n = l.item(i); - if (n.getNodeType() == Node.ELEMENT_NODE) { - elements.add((Element)n); - } else if (n.getNodeType() == Node.TEXT_NODE) { - String text = ((Text)n).getNodeValue(); - if (text.trim().length() > 0) { - throw new IllegalArgumentException("non-ws text encountered in " + parent + ": " + text); // NOI18N - } - } else if (n.getNodeType() == Node.COMMENT_NODE) { - // skip - } else { - throw new IllegalArgumentException("unexpected non-element child of " + parent + ": " + n); // NOI18N - } - } - return elements; - } - - /** * Create an XML error handler that rethrows errors and fatal errors and logs warnings. * @return a standard error handler */ --- a/ruby.rakeproject/src/org/netbeans/modules/ruby/spi/project/support/rake/RakeProjectHelper.java +++ a/ruby.rakeproject/src/org/netbeans/modules/ruby/spi/project/support/rake/RakeProjectHelper.java @@ -389,7 +389,7 @@ Document doc = getConfigurationXml(shared); if (shared) { Element project = doc.getDocumentElement(); - Element config = Util.findElement(project, "configuration", PROJECT_NS); // NOI18N + Element config = XMLUtil.findElement(project, "configuration", PROJECT_NS); // NOI18N assert config != null; return config; } else { @@ -828,7 +828,7 @@ public Element run() { synchronized (modifiedMetadataPaths) { Element root = getConfigurationDataRoot(shared); - Element data = Util.findElement(root, elementName, namespace); + Element data = XMLUtil.findElement(root, elementName, namespace); if (data != null) { return cloneSafely(data); } else { @@ -866,7 +866,7 @@ public Void run() { synchronized (modifiedMetadataPaths) { Element root = getConfigurationDataRoot(shared); - Element existing = Util.findElement(root, fragment.getLocalName(), fragment.getNamespaceURI()); + Element existing = XMLUtil.findElement(root, fragment.getLocalName(), fragment.getNamespaceURI()); // XXX first compare to existing and return if the same if (existing != null) { root.removeChild(existing); @@ -908,7 +908,7 @@ public Boolean run() { synchronized (modifiedMetadataPaths) { Element root = getConfigurationDataRoot(shared); - Element data = Util.findElement(root, elementName, namespace); + Element data = XMLUtil.findElement(root, elementName, namespace); if (data != null) { root.removeChild(data); modifying(shared ? PROJECT_XML_PATH : PRIVATE_XML_PATH); --- a/ruby.rakeproject/src/org/netbeans/modules/ruby/spi/project/support/rake/ReferenceHelper.java +++ a/ruby.rakeproject/src/org/netbeans/modules/ruby/spi/project/support/rake/ReferenceHelper.java @@ -66,7 +66,6 @@ import org.netbeans.modules.ruby.api.project.rake.RakeArtifactQuery; import org.netbeans.api.queries.CollocationQuery; import org.netbeans.modules.ruby.modules.project.rake.RakeBasedProjectFactorySingleton; -import org.netbeans.modules.ruby.modules.project.rake.Util; import org.netbeans.spi.project.AuxiliaryConfiguration; import org.netbeans.spi.project.SubprojectProvider; import org.openide.ErrorManager; @@ -546,7 +545,7 @@ // Linear search; always keeping references sorted first by foreign project // name, then by target name. Element nextRefEl = null; - Iterator it = Util.findSubElements(references).iterator(); + Iterator it = XMLUtil.findSubElements(references).iterator(); while (it.hasNext()) { Element testRefEl = it.next(); RawReference testRef = RawReference.create(testRefEl); @@ -793,7 +792,7 @@ private static boolean removeRawReferenceElement(String foreignProjectName, String id, Element references, boolean escaped) throws IllegalArgumentException { // As with addRawReference, do a linear search through. - for (Element testRefEl : Util.findSubElements(references)) { + for (Element testRefEl : XMLUtil.findSubElements(references)) { RawReference testRef = RawReference.create(testRefEl); String refID = testRef.getID(); String refName = testRef.getForeignProjectName(); @@ -846,7 +845,7 @@ } private static RawReference[] getRawReferences(Element references) throws IllegalArgumentException { - List subEls = Util.findSubElements(references); + List subEls = XMLUtil.findSubElements(references); List refs = new ArrayList(subEls.size()); for (Element subEl : subEls) { refs.add(RawReference.create(subEl)); @@ -888,7 +887,7 @@ } private static RawReference getRawReference(String foreignProjectName, String id, Element references, boolean escaped) throws IllegalArgumentException { - for (Element subEl : Util.findSubElements(references)) { + for (Element subEl : XMLUtil.findSubElements(references)) { RawReference ref = RawReference.create(subEl); String refID = ref.getID(); String refName = ref.getForeignProjectName(); @@ -1513,7 +1512,7 @@ if (idx == -1) { throw new IllegalArgumentException("bad subelement name: " + elName); // NOI18N } - String val = Util.findText(el); + String val = XMLUtil.findText(el); if (val == null) { throw new IllegalArgumentException("empty subelement: " + el); // NOI18N } @@ -1531,7 +1530,7 @@ if (!REF_NAME.equals(xml.getLocalName()) || !REFS_NS2.equals(xml.getNamespaceURI())) { throw new IllegalArgumentException("bad element name: " + xml); // NOI18N } - List nl = Util.findSubElements(xml); + List nl = XMLUtil.findSubElements(xml); if (nl.size() < 6) { throw new IllegalArgumentException("missing or extra data: " + xml); // NOI18N } @@ -1546,7 +1545,7 @@ if (idx == -1) { throw new IllegalArgumentException("bad subelement name: " + elName); // NOI18N } - String val = Util.findText(el); + String val = XMLUtil.findText(el); if (val == null) { throw new IllegalArgumentException("empty subelement: " + el); // NOI18N } @@ -1564,9 +1563,9 @@ if (!"properties".equals(el.getLocalName())) { // NOI18N throw new IllegalArgumentException("bad subelement. expected 'properties': " + el); // NOI18N } - for (Element el2 : Util.findSubElements(el)) { + for (Element el2 : XMLUtil.findSubElements(el)) { String key = el2.getAttribute("name"); - String value = Util.findText(el2); + String value = XMLUtil.findText(el2); // #53553: NPE if (value == null) { value = ""; // NOI18N