/* 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.out;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
This class is similar to PName
, in that it implements an efficient representation of prefixed names, but one used on output (Writer) side.
Note: unlike with Reader-side prefixed names, here we can not
assume that components are intern()
ed.
/**
* This class is similar to {@link com.fasterxml.aalto.in.PName}, in
* that it implements an efficient representation of prefixed names,
* but one used on output (Writer) side.
*<p>
* Note: unlike with Reader-side prefixed names, here we can not
* assume that components are <code>intern()</code>ed.
*/
public abstract class WName
{
protected final String _prefix;
protected final String _localName;
/*
//////////////////////////////////////////////////////////
// Life-cycle
//////////////////////////////////////////////////////////
*/
protected WName(String ln)
{
_prefix = null;
_localName = ln;
}
protected WName(String prefix, String ln)
{
_prefix = prefix;
_localName = ln;
}
/*
//////////////////////////////////////////////////////////
// Accessors
//////////////////////////////////////////////////////////
*/
Returns: Length of full (qualified) name, in native
serialization units (bytes or characters)
/**
* @return Length of full (qualified) name, in native
* serialization units (bytes or characters)
*/
public abstract int serializedLength();
public final String getPrefix() { return _prefix; }
public final String getPrefixedName()
{
if (_prefix == null) {
return _localName;
}
return _prefix + ":" +_localName;
}
public final String getLocalName() { return _localName; }
public final boolean hasPrefix() { return _prefix != null; }
/*
//////////////////////////////////////////////////////////
// Serialization
//////////////////////////////////////////////////////////
*/
public abstract int appendBytes(byte[] buffer, int offset);
public abstract void writeBytes(OutputStream out) throws IOException;
public abstract int appendChars(char[] buffer, int offset);
public abstract void writeChars(Writer w) throws IOException;
/*
//////////////////////////////////////////////////////////
// Redefined standard methods
//////////////////////////////////////////////////////////
*/
@Override
public String toString()
{
if (_prefix == null) {
return _localName;
}
return _prefix + ":" + _localName;
}
@Override
public final boolean equals(Object o)
{
if (o == this) {
return true;
}
// Straight identity comparison faster...
if (o.getClass() != getClass() && !(o instanceof WName)) {
return false;
}
WName other = (WName) o;
// Can not assume names are intern()ed, need to call equals()
if (other._localName.equals(_localName)) {
if (_prefix == null) {
return other._prefix == null;
}
return _prefix.equals(other._prefix);
}
return false;
}
Whether we should use internal hash, or the hash of prefixed
name string itself is an open question. For now, let's use
former.
/**
* Whether we should use internal hash, or the hash of prefixed
* name string itself is an open question. For now, let's use
* former.
*/
@Override
public int hashCode() {
int hash = _localName.hashCode();
if (_prefix != null) {
hash ^= _prefix.hashCode();
}
return hash;
}
/*
//////////////////////////////////////////////////////////
// Efficient comparison methods
//////////////////////////////////////////////////////////
*/
public final boolean hasName(String localName)
{
if (_prefix != null) {
return false;
}
return _localName.equals(localName);
}
public final boolean hasName(String prefix, String localName)
{
if (_localName == localName) { // very likely match
if (prefix == null) {
return (_prefix == null);
}
return prefix.equals(_prefix);
}
// hashCode() already computed for both (for index etc)
if (_localName.hashCode() != localName.hashCode()) {
return false;
}
if (prefix == null) {
if (_prefix != null) {
return false;
}
} else {
if (!prefix.equals(_prefix)) {
return false;
}
}
return _localName.equals(localName);
}
}