/* Woodstox Lite ("wool") XML processor
 *
 * Copyright (c) 2006- Tatu Saloranta, tatu.saloranta@iki.fi
 *
 * Licensed under the License specified in the file LICENSE which is
 * included with the source code.
 * You may not use this file except in compliance with the License.
 *
 * 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.fasterxml.aalto.in;

This class encapsulates information about a namespace binding declaration, associated with start elements. Declarations are stored as a linked list, to minimize fixed allocations, and since they only need to be accessed directly when dealing with START_ELEMENT and END_ELEMENT, not when binding element or attribute names.
/** * This class encapsulates information about a namespace binding declaration, * associated with start elements. Declarations are stored as a linked list, * to minimize fixed allocations, and since they only need to be accessed * directly when dealing with START_ELEMENT and END_ELEMENT, not when * binding element or attribute names. */
public final class NsDeclaration {
Reference to the actual binding that will be updated by this declaration (URI changed when declaration comes in and goes out of scope)
/** * Reference to the actual binding that will be updated by this * declaration (URI changed when declaration comes in and goes out * of scope) */
private final NsBinding mBinding; private final String mPreviousURI; private final NsDeclaration mPrevDeclaration;
Nesting level of this declaration. Used when unbinding declarations, to see if the particular declaration is associated with the start element for which end element is pair.
/** * Nesting level of this declaration. Used when unbinding declarations, * to see if the particular declaration is associated with the start * element for which end element is pair. */
private final int mLevel; public NsDeclaration(NsBinding binding, String newURI, NsDeclaration prevDecl, int level) { mBinding = binding; mPrevDeclaration = prevDecl; mLevel = level; // Also, need to update the binding itself mPreviousURI = binding.mURI; binding.mURI = newURI; } public int getLevel() { return mLevel; } public NsDeclaration getPrev() { return mPrevDeclaration; } public NsBinding getBinding() { return mBinding; } public String getPrefix() { return mBinding.mPrefix; } public String getCurrNsURI() { return mBinding.mURI; } public boolean hasPrefix(String prefix) { return prefix.equals(mBinding.mPrefix); } public boolean hasNsURI(String uri) { return uri.equals(mBinding.mURI); }
Method called after END_ELEMENT is processed, to unbind declaration that now goes out of scope
/** * Method called after END_ELEMENT is processed, to unbind * declaration that now goes out of scope */
public NsDeclaration unbind() { mBinding.mURI = mPreviousURI; return mPrevDeclaration; } public boolean alreadyDeclared(String prefix, int level) { if (mLevel >= level) { if (prefix == mBinding.mPrefix) { return true; } NsDeclaration prev = mPrevDeclaration; while (prev != null && prev.mLevel >= level) { if (prefix == prev.mBinding.mPrefix) { return true; } prev = prev.mPrevDeclaration; } } return false; } public int countDeclsOnLevel(int level) { int count = 0; if (mLevel == level) { ++count; NsDeclaration prev = mPrevDeclaration; while (prev != null && prev.mLevel == level) { ++count; prev = prev.mPrevDeclaration; } } return count; } @Override public String toString() { return "[NS-DECL, prefix = <"+mBinding.mPrefix+">, current URI <"+mBinding.mURI+">, level "+mLevel+", prev URI <"+mPreviousURI+">]"; } }