com.ctc.wstx.dtd.DTDId Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of woodstox-core Show documentation
Show all versions of woodstox-core Show documentation
Woodstox is a high-performance XML processor that implements Stax (JSR-173),
SAX2 and Stax2 APIs
/* Woodstox XML processor
*
* Copyright (c) 2004- Tatu Saloranta, [email protected]
*
* 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.ctc.wstx.dtd;
import java.net.URI;
/**
* Simple key object class, used for accessing (external) DTDs when stored for
* caching. Main idea is that the primary id of a DTD (public or system id;
* latter normalized if possible)
* has to match, as well as couple of on/off settings for parsing (namespace
* support, text normalization).
* Latter restriction is needed since although DTDs do not deal
* with (or understand) namespaces, some parsing is done to be able to validate
* namespace aware/non-aware documents, and handling differs between the two.
* As to primary key part, public id is used if one was defined; if so,
* comparison is String equality. If not, then system id is compared: system
* id has to be expressed as URL if so.
*/
public final class DTDId
{
protected final String mPublicId;
protected final URI mSystemId;
protected final int mConfigFlags;
protected final boolean mXml11;
protected int mHashCode = 0;
/*
///////////////////////////////////////////////////////////////////////
// Life-cycle:
///////////////////////////////////////////////////////////////////////
*/
private DTDId(String publicId, URI systemId, int configFlags, boolean xml11)
{
mPublicId = publicId;
mSystemId = systemId;
mConfigFlags = configFlags;
mXml11 = xml11;
}
public static DTDId constructFromPublicId(String publicId, int configFlags,
boolean xml11)
{
if (publicId == null || publicId.length() == 0) {
throw new IllegalArgumentException("Empty/null public id.");
}
return new DTDId(publicId, null, configFlags, xml11);
}
public static DTDId constructFromSystemId(URI systemId, int configFlags,
boolean xml11)
{
if (systemId == null) {
throw new IllegalArgumentException("Null system id.");
}
return new DTDId(null, systemId, configFlags, xml11);
}
public static DTDId construct(String publicId, URI systemId, int configFlags, boolean xml11)
{
if (publicId != null && publicId.length() > 0) {
return new DTDId(publicId, null, configFlags, xml11);
}
if (systemId == null) {
throw new IllegalArgumentException("Illegal arguments; both public and system id null/empty.");
}
return new DTDId(null, systemId, configFlags, xml11);
}
/*
///////////////////////////////////////////////////////////////////////
// Overridden standard methods
///////////////////////////////////////////////////////////////////////
*/
@Override
public int hashCode() {
int hash = mHashCode;
if (hash == 0) {
hash = mConfigFlags;
if (mPublicId != null) {
hash ^= mPublicId.hashCode();
} else {
hash ^= mSystemId.hashCode();
}
if (mXml11) {
hash ^= 1;
}
mHashCode = hash;
}
return hash;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer(60);
sb.append("Public-id: ");
sb.append(mPublicId);
sb.append(", system-id: ");
sb.append(mSystemId);
sb.append(" [config flags: 0x");
sb.append(Integer.toHexString(mConfigFlags));
sb.append("], xml11: ");
sb.append(mXml11);
return sb.toString();
}
@Override
public boolean equals(Object o)
{
if (o == this) return true;
if (o == null || o.getClass() != getClass()) return false;
DTDId other = (DTDId) o;
if (other.mConfigFlags != mConfigFlags
|| other.mXml11 != mXml11) {
return false;
}
if (mPublicId != null) {
String op = other.mPublicId;
return (op != null) && op.equals(mPublicId);
}
return mSystemId.equals(other.mSystemId);
}
}