diff -r 000000000000 -r 373ffda63c9a src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/NameBuilder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/jaxws_classes/com/sun/xml/internal/bind/v2/runtime/NameBuilder.java Wed Apr 27 01:27:09 2016 +0800 @@ -0,0 +1,143 @@ +/* + * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.xml.internal.bind.v2.runtime; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import javax.xml.namespace.QName; + +import com.sun.xml.internal.bind.v2.util.QNameMap; + +/** + * Creates {@link Name}s and assign index numbers to them. + * + *

+ * During this process, this class also finds out which namespace URIs + * are statically known to be un-bindable as the default namespace. + * Those are the namespace URIs that are used by attribute names. + * + * @author Kohsuke Kawaguchi + */ +@SuppressWarnings({"StringEquality"}) +public final class NameBuilder { + private Map uriIndexMap = new HashMap(); + private Set nonDefaultableNsUris = new HashSet(); + private Map localNameIndexMap = new HashMap(); + private QNameMap elementQNameIndexMap = new QNameMap(); + private QNameMap attributeQNameIndexMap = new QNameMap(); + + public Name createElementName(QName name) { + return createElementName(name.getNamespaceURI(),name.getLocalPart()); + } + + public Name createElementName(String nsUri, String localName) { + return createName(nsUri, localName, false, elementQNameIndexMap); + } + + public Name createAttributeName(QName name) { + return createAttributeName(name.getNamespaceURI(),name.getLocalPart()); + } + + public Name createAttributeName(String nsUri, String localName) { + assert nsUri.intern()==nsUri; + assert localName.intern()==localName; + + if(nsUri.length()==0) + return new Name( + allocIndex(attributeQNameIndexMap,"",localName), + -1, + nsUri, + allocIndex(localNameIndexMap,localName), + localName, + true); + else { + nonDefaultableNsUris.add(nsUri); + return createName(nsUri,localName, true, attributeQNameIndexMap); + } + } + + private Name createName(String nsUri, String localName, boolean isAttribute, QNameMap map) { + assert nsUri.intern()==nsUri; + assert localName.intern()==localName; + + return new Name( + allocIndex(map,nsUri,localName), + allocIndex(uriIndexMap,nsUri), + nsUri, + allocIndex(localNameIndexMap,localName), + localName, + isAttribute ); + } + + private int allocIndex(Map map, String str) { + Integer i = map.get(str); + if(i==null) { + i = map.size(); + map.put(str,i); + } + return i; + } + + private int allocIndex(QNameMap map, String nsUri, String localName) { + Integer i = map.get(nsUri,localName); + if(i==null) { + i = map.size(); + map.put(nsUri,localName,i); + } + return i; + } + + /** + * Wraps up everything and creates {@link NameList}. + */ + public NameList conclude() { + boolean[] nsUriCannotBeDefaulted = new boolean[uriIndexMap.size()]; + for (Map.Entry e : uriIndexMap.entrySet()) { + nsUriCannotBeDefaulted[e.getValue()] = nonDefaultableNsUris.contains(e.getKey()); + } + + NameList r = new NameList( + list(uriIndexMap), + nsUriCannotBeDefaulted, + list(localNameIndexMap), + elementQNameIndexMap.size(), + attributeQNameIndexMap.size() ); + // delete them so that the create method can never be called again + uriIndexMap = null; + localNameIndexMap = null; + return r; + } + + private String[] list(Map map) { + String[] r = new String[map.size()]; + for (Map.Entry e : map.entrySet()) + r[e.getValue()] = e.getKey(); + return r; + } +}