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