aboutsummaryrefslogtreecommitdiffstats
path: root/trunk/infrastructure/rhino1_7R1/deprecatedsrc/org/mozilla/javascript/xml/impl/xmlbeans/NamespaceHelper.java
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/infrastructure/rhino1_7R1/deprecatedsrc/org/mozilla/javascript/xml/impl/xmlbeans/NamespaceHelper.java')
-rw-r--r--trunk/infrastructure/rhino1_7R1/deprecatedsrc/org/mozilla/javascript/xml/impl/xmlbeans/NamespaceHelper.java350
1 files changed, 350 insertions, 0 deletions
diff --git a/trunk/infrastructure/rhino1_7R1/deprecatedsrc/org/mozilla/javascript/xml/impl/xmlbeans/NamespaceHelper.java b/trunk/infrastructure/rhino1_7R1/deprecatedsrc/org/mozilla/javascript/xml/impl/xmlbeans/NamespaceHelper.java
new file mode 100644
index 0000000..fc99c7e
--- /dev/null
+++ b/trunk/infrastructure/rhino1_7R1/deprecatedsrc/org/mozilla/javascript/xml/impl/xmlbeans/NamespaceHelper.java
@@ -0,0 +1,350 @@
+/* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ *
+ * ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (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.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Rhino code, released
+ * May 6, 1999.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1997-2000
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Milen Nankov
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * the GNU General Public License Version 2 or later (the "GPL"), in which
+ * case the provisions of the GPL are applicable instead of those above. If
+ * you wish to allow use of your version of this file only under the terms of
+ * the GPL and not to allow others to use your version of this file under the
+ * MPL, indicate your decision by deleting the provisions above and replacing
+ * them with the notice and other provisions required by the GPL. If you do
+ * not delete the provisions above, a recipient may use your version of this
+ * file under either the MPL or the GPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+package org.mozilla.javascript.xml.impl.xmlbeans;
+
+import java.util.*;
+import org.apache.xmlbeans.XmlCursor;
+
+import org.mozilla.javascript.*;
+
+class NamespaceHelper
+{
+ private XMLLibImpl lib;
+ private final Map prefixToURI = new HashMap();
+ private final Map uriToPrefix = new HashMap();
+ // A set of URIs that are used without explicit namespace declaration in scope.
+ private final Set undeclared = new HashSet();
+
+ private NamespaceHelper(XMLLibImpl lib)
+ {
+ this.lib = lib;
+ // Insert the default namespace
+ prefixToURI.put("", "");
+ Set prefixes = new HashSet();
+ prefixes.add("");
+ uriToPrefix.put("", prefixes);
+ }
+
+ /**
+ * Declared a new namespace
+ *
+ * @param prefix
+ * @param uri
+ * @param declarations
+ */
+ private void declareNamespace(String prefix, String uri, ObjArray declarations)
+ {
+ Set prefixes = (Set)uriToPrefix.get(uri);
+ if(prefixes == null)
+ {
+ prefixes = new HashSet();
+ uriToPrefix.put(uri, prefixes);
+ }
+
+ if(!prefixes.contains(prefix))
+ {
+ String oldURI = (String)prefixToURI.get(prefix);
+
+ // Add the new mapping
+ prefixes.add(prefix);
+ prefixToURI.put(prefix, uri);
+ if(declarations != null)
+ declarations.add(new Namespace(lib, prefix, uri));
+
+ if(oldURI != null)
+ {
+ // Update the existing mapping
+ prefixes = (Set)uriToPrefix.get(oldURI);
+ prefixes.remove(prefix);
+ }
+ }
+ }
+
+ /**
+ * Updates the internal state of this NamespaceHelper to reflect the
+ * existance of the XML token pointed to by the cursor.
+ */
+ private void processName(XmlCursor cursor, ObjArray declarations)
+ {
+ javax.xml.namespace.QName qname = cursor.getName();
+ String uri = qname.getNamespaceURI();
+ Set prefixes = (Set)uriToPrefix.get(uri);
+ if(prefixes == null || prefixes.size() == 0)
+ {
+ undeclared.add(uri);
+ if(declarations != null)
+ declarations.add(new Namespace(lib, uri));
+ }
+ }
+
+ /**
+ * Updates the internal state of this NamespaceHelper with the
+ * namespace information of the element pointed to by the cursor.
+ */
+ private void update(XmlCursor cursor, ObjArray declarations)
+ {
+ // Process the Namespace declarations
+ cursor.push();
+ while(cursor.toNextToken().isAnyAttr())
+ {
+ if(cursor.isNamespace())
+ {
+ javax.xml.namespace.QName name = cursor.getName();
+ String prefix = name.getLocalPart();
+ String uri = name.getNamespaceURI();
+
+ declareNamespace(prefix, uri, declarations);
+ }
+ }
+ cursor.pop();
+
+ // Process the element
+ processName(cursor, declarations);
+
+ // Process the attributes
+ cursor.push();
+ boolean hasNext = cursor.toFirstAttribute();
+ while(hasNext)
+ {
+ processName(cursor, declarations);
+ hasNext = cursor.toNextAttribute();
+ }
+ cursor.pop();
+ }
+
+ /**
+ * @return Object[] array of Namespace objects in scope at the cursor.
+ */
+ public static Object[] inScopeNamespaces(XMLLibImpl lib, XmlCursor cursor)
+ {
+ ObjArray namespaces = new ObjArray();
+ NamespaceHelper helper = new NamespaceHelper(lib);
+
+ cursor.push();
+
+ int depth = 0;
+ while(cursor.hasPrevToken())
+ {
+ if(cursor.isContainer())
+ {
+ cursor.push();
+ depth++;
+ }
+
+ cursor.toParent();
+ }
+
+ for(int i = 0; i < depth; i++)
+ {
+ cursor.pop();
+ helper.update(cursor, null);
+ }
+
+ Iterator i = helper.prefixToURI.entrySet().iterator();
+ while(i.hasNext())
+ {
+ Map.Entry entry = (Map.Entry)i.next();
+ Namespace ns = new Namespace(lib, (String)entry.getKey(),
+ (String)entry.getValue());
+ namespaces.add(ns);
+ }
+
+ i = helper.undeclared.iterator();
+ while(i.hasNext())
+ {
+ Namespace ns = new Namespace(lib, (String)i.next());
+ namespaces.add(ns);
+ }
+
+ cursor.pop();
+
+ return namespaces.toArray();
+ }
+
+ static Namespace getNamespace(XMLLibImpl lib, XmlCursor cursor,
+ Object[] inScopeNamespaces)
+ {
+ String uri;
+ String prefix;
+
+ if (cursor.isProcinst()) {
+ uri = "";
+ prefix = "";
+ } else {
+ javax.xml.namespace.QName qname = cursor.getName();
+ uri = qname.getNamespaceURI();
+ prefix = qname.getPrefix();
+ }
+
+ if (inScopeNamespaces == null)
+ return new Namespace(lib, prefix, uri);
+
+ Namespace result = null;
+ for (int i = 0; i != inScopeNamespaces.length; ++i) {
+ Namespace ns = (Namespace)inScopeNamespaces[i];
+ if(ns == null) continue;
+
+ String nsURI = ns.uri();
+ if(nsURI.equals(uri))
+ {
+ if(prefix.equals(ns.prefix()))
+ {
+ result = ns;
+ break;
+ }
+
+ if(result == null ||
+ (result.prefix() == null &&
+ ns.prefix() != null))
+ result = ns;
+ }
+ }
+
+ if(result == null)
+ result = new Namespace(lib, prefix, uri);
+
+ return result;
+ }
+
+ /**
+ * @return List of Namespace objects that are declared in the container pointed to by the cursor.
+ */
+ public static Object[] namespaceDeclarations(XMLLibImpl lib, XmlCursor cursor)
+ {
+ ObjArray declarations = new ObjArray();
+ NamespaceHelper helper = new NamespaceHelper(lib);
+
+ cursor.push();
+
+ int depth = 0;
+ while(cursor.hasPrevToken())
+ {
+ if(cursor.isContainer())
+ {
+ cursor.push();
+ depth++;
+ }
+
+ cursor.toParent();
+ }
+
+ for(int i = 0; i < depth - 1; i++)
+ {
+ cursor.pop();
+ helper.update(cursor, null);
+ }
+
+ if(depth > 0)
+ {
+ cursor.pop();
+ helper.update(cursor, declarations);
+ }
+
+ cursor.pop();
+
+ return declarations.toArray();
+ }
+
+ /**
+ * @return Prefix to URI map of all namespaces in scope at the cursor.
+ */
+ public static Map getAllNamespaces(XMLLibImpl lib, XmlCursor cursor)
+ {
+ NamespaceHelper helper = new NamespaceHelper(lib);
+
+ cursor.push();
+
+ int depth = 0;
+ while(cursor.hasPrevToken())
+ {
+ if(cursor.isContainer())
+ {
+ cursor.push();
+ depth++;
+ }
+
+ cursor.toParent();
+ }
+
+ for(int i = 0; i < depth; i++)
+ {
+ cursor.pop();
+ helper.update(cursor, null);
+ }
+
+ cursor.pop();
+
+ return helper.prefixToURI;
+ }
+
+ public static void getNamespaces(XmlCursor cursor, Map prefixToURI)
+ {
+ cursor.push();
+ while(cursor.toNextToken().isAnyAttr())
+ {
+ if(cursor.isNamespace())
+ {
+ javax.xml.namespace.QName name = cursor.getName();
+ String prefix = name.getLocalPart();
+ String uri = name.getNamespaceURI();
+
+ prefixToURI.put(prefix, uri);
+ }
+ }
+ cursor.pop();
+ }
+
+ public static void removeNamespace(XmlCursor cursor, String prefix)
+ {
+ cursor.push();
+ while(cursor.toNextToken().isAnyAttr())
+ {
+ if(cursor.isNamespace())
+ {
+ javax.xml.namespace.QName name = cursor.getName();
+ if(name.getLocalPart().equals(prefix))
+ {
+ cursor.removeXml();
+ break;
+ }
+ }
+ }
+ cursor.pop();
+ }
+} \ No newline at end of file