aboutsummaryrefslogtreecommitdiffstats
path: root/common/src/com/android/utils/XmlUtils.java
diff options
context:
space:
mode:
Diffstat (limited to 'common/src/com/android/utils/XmlUtils.java')
-rw-r--r--common/src/com/android/utils/XmlUtils.java278
1 files changed, 0 insertions, 278 deletions
diff --git a/common/src/com/android/utils/XmlUtils.java b/common/src/com/android/utils/XmlUtils.java
deleted file mode 100644
index 0969eb1..0000000
--- a/common/src/com/android/utils/XmlUtils.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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 com.android.utils;
-
-import static com.android.SdkConstants.AMP_ENTITY;
-import static com.android.SdkConstants.ANDROID_NS_NAME;
-import static com.android.SdkConstants.ANDROID_URI;
-import static com.android.SdkConstants.APOS_ENTITY;
-import static com.android.SdkConstants.APP_PREFIX;
-import static com.android.SdkConstants.LT_ENTITY;
-import static com.android.SdkConstants.QUOT_ENTITY;
-import static com.android.SdkConstants.XMLNS;
-import static com.android.SdkConstants.XMLNS_PREFIX;
-import static com.android.SdkConstants.XMLNS_URI;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-import java.util.HashSet;
-
-/** XML Utilities */
-public class XmlUtils {
- /**
- * Returns the namespace prefix matching the requested namespace URI.
- * If no such declaration is found, returns the default "android" prefix for
- * the Android URI, and "app" for other URI's. By default the app namespace
- * will be created. If this is not desirable, call
- * {@link #lookupNamespacePrefix(Node, String, boolean)} instead.
- *
- * @param node The current node. Must not be null.
- * @param nsUri The namespace URI of which the prefix is to be found,
- * e.g. {@link SdkConstants#ANDROID_URI}
- * @return The first prefix declared or the default "android" prefix
- * (or "app" for non-Android URIs)
- */
- @NonNull
- public static String lookupNamespacePrefix(@NonNull Node node, @NonNull String nsUri) {
- String defaultPrefix = ANDROID_URI.equals(nsUri) ? ANDROID_NS_NAME : APP_PREFIX;
- return lookupNamespacePrefix(node, nsUri, defaultPrefix, true /*create*/);
- }
-
- /**
- * Returns the namespace prefix matching the requested namespace URI. If no
- * such declaration is found, returns the default "android" prefix for the
- * Android URI, and "app" for other URI's.
- *
- * @param node The current node. Must not be null.
- * @param nsUri The namespace URI of which the prefix is to be found, e.g.
- * {@link SdkConstants#ANDROID_URI}
- * @param create whether the namespace declaration should be created, if
- * necessary
- * @return The first prefix declared or the default "android" prefix (or
- * "app" for non-Android URIs)
- */
- @NonNull
- public static String lookupNamespacePrefix(@NonNull Node node, @NonNull String nsUri,
- boolean create) {
- String defaultPrefix = ANDROID_URI.equals(nsUri) ? ANDROID_NS_NAME : APP_PREFIX;
- return lookupNamespacePrefix(node, nsUri, defaultPrefix, create);
- }
-
- /**
- * Returns the namespace prefix matching the requested namespace URI. If no
- * such declaration is found, returns the default "android" prefix.
- *
- * @param node The current node. Must not be null.
- * @param nsUri The namespace URI of which the prefix is to be found, e.g.
- * {@link SdkConstants#ANDROID_URI}
- * @param defaultPrefix The default prefix (root) to use if the namespace is
- * not found. If null, do not create a new namespace if this URI
- * is not defined for the document.
- * @param create whether the namespace declaration should be created, if
- * necessary
- * @return The first prefix declared or the provided prefix (possibly with a
- * number appended to avoid conflicts with existing prefixes.
- */
- public static String lookupNamespacePrefix(
- @Nullable Node node, @Nullable String nsUri, @Nullable String defaultPrefix,
- boolean create) {
- // Note: Node.lookupPrefix is not implemented in wst/xml/core NodeImpl.java
- // The following code emulates this simple call:
- // String prefix = node.lookupPrefix(NS_RESOURCES);
-
- // if the requested URI is null, it denotes an attribute with no namespace.
- if (nsUri == null) {
- return null;
- }
-
- // per XML specification, the "xmlns" URI is reserved
- if (XMLNS_URI.equals(nsUri)) {
- return XMLNS;
- }
-
- HashSet<String> visited = new HashSet<String>();
- Document doc = node == null ? null : node.getOwnerDocument();
-
- // Ask the document about it. This method may not be implemented by the Document.
- String nsPrefix = null;
- try {
- nsPrefix = doc != null ? doc.lookupPrefix(nsUri) : null;
- if (nsPrefix != null) {
- return nsPrefix;
- }
- } catch (Throwable t) {
- // ignore
- }
-
- // If that failed, try to look it up manually.
- // This also gathers prefixed in use in the case we want to generate a new one below.
- for (; node != null && node.getNodeType() == Node.ELEMENT_NODE;
- node = node.getParentNode()) {
- NamedNodeMap attrs = node.getAttributes();
- for (int n = attrs.getLength() - 1; n >= 0; --n) {
- Node attr = attrs.item(n);
- if (XMLNS.equals(attr.getPrefix())) {
- String uri = attr.getNodeValue();
- nsPrefix = attr.getLocalName();
- // Is this the URI we are looking for? If yes, we found its prefix.
- if (nsUri.equals(uri)) {
- return nsPrefix;
- }
- visited.add(nsPrefix);
- }
- }
- }
-
- // Failed the find a prefix. Generate a new sensible default prefix, unless
- // defaultPrefix was null in which case the caller does not want the document
- // modified.
- if (defaultPrefix == null) {
- return null;
- }
-
- //
- // We need to make sure the prefix is not one that was declared in the scope
- // visited above. Pick a unique prefix from the provided default prefix.
- String prefix = defaultPrefix;
- String base = prefix;
- for (int i = 1; visited.contains(prefix); i++) {
- prefix = base + Integer.toString(i);
- }
- // Also create & define this prefix/URI in the XML document as an attribute in the
- // first element of the document.
- if (doc != null) {
- node = doc.getFirstChild();
- while (node != null && node.getNodeType() != Node.ELEMENT_NODE) {
- node = node.getNextSibling();
- }
- if (node != null && create) {
- // This doesn't work:
- //Attr attr = doc.createAttributeNS(XMLNS_URI, prefix);
- //attr.setPrefix(XMLNS);
- //
- // Xerces throws
- //org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or
- // change an object in a way which is incorrect with regard to namespaces.
- //
- // Instead pass in the concatenated prefix. (This is covered by
- // the UiElementNodeTest#testCreateNameSpace() test.)
- Attr attr = doc.createAttributeNS(XMLNS_URI, XMLNS_PREFIX + prefix);
- attr.setValue(nsUri);
- node.getAttributes().setNamedItemNS(attr);
- }
- }
-
- return prefix;
- }
-
- /**
- * Converts the given attribute value to an XML-attribute-safe value, meaning that
- * single and double quotes are replaced with their corresponding XML entities.
- *
- * @param attrValue the value to be escaped
- * @return the escaped value
- */
- @NonNull
- public static String toXmlAttributeValue(@NonNull String attrValue) {
- for (int i = 0, n = attrValue.length(); i < n; i++) {
- char c = attrValue.charAt(i);
- if (c == '"' || c == '\'' || c == '<' || c == '&') {
- StringBuilder sb = new StringBuilder(2 * attrValue.length());
- appendXmlAttributeValue(sb, attrValue);
- return sb.toString();
- }
- }
-
- return attrValue;
- }
-
- /**
- * Converts the given attribute value to an XML-text-safe value, meaning that
- * less than and ampersand characters are escaped.
- *
- * @param textValue the text value to be escaped
- * @return the escaped value
- */
- @NonNull
- public static String toXmlTextValue(@NonNull String textValue) {
- for (int i = 0, n = textValue.length(); i < n; i++) {
- char c = textValue.charAt(i);
- if (c == '<' || c == '&') {
- StringBuilder sb = new StringBuilder(2 * textValue.length());
- appendXmlTextValue(sb, textValue);
- return sb.toString();
- }
- }
-
- return textValue;
- }
-
- /**
- * Appends text to the given {@link StringBuilder} and escapes it as required for a
- * DOM attribute node.
- *
- * @param sb the string builder
- * @param attrValue the attribute value to be appended and escaped
- */
- public static void appendXmlAttributeValue(@NonNull StringBuilder sb,
- @NonNull String attrValue) {
- int n = attrValue.length();
- // &, ", ' and < are illegal in attributes; see http://www.w3.org/TR/REC-xml/#NT-AttValue
- // (' legal in a " string and " is legal in a ' string but here we'll stay on the safe
- // side)
- for (int i = 0; i < n; i++) {
- char c = attrValue.charAt(i);
- if (c == '"') {
- sb.append(QUOT_ENTITY);
- } else if (c == '<') {
- sb.append(LT_ENTITY);
- } else if (c == '\'') {
- sb.append(APOS_ENTITY);
- } else if (c == '&') {
- sb.append(AMP_ENTITY);
- } else {
- sb.append(c);
- }
- }
- }
-
- /**
- * Appends text to the given {@link StringBuilder} and escapes it as required for a
- * DOM text node.
- *
- * @param sb the string builder
- * @param textValue the text value to be appended and escaped
- */
- public static void appendXmlTextValue(@NonNull StringBuilder sb, @NonNull String textValue) {
- for (int i = 0, n = textValue.length(); i < n; i++) {
- char c = textValue.charAt(i);
- if (c == '<') {
- sb.append(LT_ENTITY);
- } else if (c == '&') {
- sb.append(AMP_ENTITY);
- } else {
- sb.append(c);
- }
- }
- }
-}