/* 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+">]";
}
}