From 89bda83e0570ab87c6e449f5955613d5385e90b3 Mon Sep 17 00:00:00 2001 From: "alexanders@b2ef00c0-3703-41da-baef-cfe82387ac0c" Date: Wed, 3 Feb 2010 00:50:41 +0000 Subject: removed obsolete svn folder from hg tree --HG-- extra : convert_revision : svn%3Ab2ef00c0-3703-41da-baef-cfe82387ac0c/trunk%408 --- .../xml/impl/xmlbeans/NamespaceHelper.java | 350 +++++++++++++++++++++ 1 file changed, 350 insertions(+) create mode 100644 infrastructure/rhino1_7R1/deprecatedsrc/org/mozilla/javascript/xml/impl/xmlbeans/NamespaceHelper.java (limited to 'infrastructure/rhino1_7R1/deprecatedsrc/org/mozilla/javascript/xml/impl/xmlbeans/NamespaceHelper.java') diff --git a/infrastructure/rhino1_7R1/deprecatedsrc/org/mozilla/javascript/xml/impl/xmlbeans/NamespaceHelper.java b/infrastructure/rhino1_7R1/deprecatedsrc/org/mozilla/javascript/xml/impl/xmlbeans/NamespaceHelper.java new file mode 100644 index 0000000..fc99c7e --- /dev/null +++ b/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 -- cgit v1.2.3