blob: 3de7bba5410b7cd1a29f85715fcc8312b3cf51a5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.
*/
#include "DOMTypeInfoImpl.hpp"
#include "DOMDocumentImpl.hpp"
#include <xercesc/framework/psvi/PSVIItem.hpp>
#include <xercesc/framework/psvi/XSTypeDefinition.hpp>
XERCES_CPP_NAMESPACE_BEGIN
/*static*/ DOMTypeInfoImpl DOMTypeInfoImpl::g_DtdValidatedElement;
/*static*/ DOMTypeInfoImpl DOMTypeInfoImpl::g_DtdNotValidatedAttribute;
/*static*/ DOMTypeInfoImpl DOMTypeInfoImpl::g_DtdValidatedCDATAAttribute(XMLUni::fgInfosetURIName, XMLUni::fgCDATAString);
/*static*/ DOMTypeInfoImpl DOMTypeInfoImpl::g_DtdValidatedIDAttribute(XMLUni::fgInfosetURIName, XMLUni::fgIDString);
/*static*/ DOMTypeInfoImpl DOMTypeInfoImpl::g_DtdValidatedIDREFAttribute(XMLUni::fgInfosetURIName, XMLUni::fgIDRefString);
/*static*/ DOMTypeInfoImpl DOMTypeInfoImpl::g_DtdValidatedIDREFSAttribute(XMLUni::fgInfosetURIName, XMLUni::fgIDRefsString);
/*static*/ DOMTypeInfoImpl DOMTypeInfoImpl::g_DtdValidatedENTITYAttribute(XMLUni::fgInfosetURIName, XMLUni::fgEntityString);
/*static*/ DOMTypeInfoImpl DOMTypeInfoImpl::g_DtdValidatedENTITIESAttribute(XMLUni::fgInfosetURIName, XMLUni::fgEntitiesString);
/*static*/ DOMTypeInfoImpl DOMTypeInfoImpl::g_DtdValidatedNMTOKENAttribute(XMLUni::fgInfosetURIName, XMLUni::fgNmTokenString);
/*static*/ DOMTypeInfoImpl DOMTypeInfoImpl::g_DtdValidatedNMTOKENSAttribute(XMLUni::fgInfosetURIName, XMLUni::fgNmTokensString);
/*static*/ DOMTypeInfoImpl DOMTypeInfoImpl::g_DtdValidatedNOTATIONAttribute(XMLUni::fgInfosetURIName, XMLUni::fgNotationString);
/*static*/ DOMTypeInfoImpl DOMTypeInfoImpl::g_DtdValidatedENUMERATIONAttribute(XMLUni::fgInfosetURIName, XMLUni::fgEnumerationString);
DOMTypeInfoImpl::DOMTypeInfoImpl(const XMLCh* namespaceUri/*=0*/, const XMLCh* name/*=0*/)
: fBitFields(0),
fTypeName(name),
fTypeNamespace(namespaceUri),
fMemberTypeName(0),
fMemberTypeNamespace(0),
fDefaultValue(0),
fNormalizedValue(0)
{
// by setting the fBitField to 0 we are also setting:
// - [validity]=VALIDITY_NOTKNOWN
// - [validitation attempted]=VALIDATION_NONE
// - [schema specified]=false
}
DOMTypeInfoImpl::DOMTypeInfoImpl(DOMDocumentImpl* ownerDoc, const DOMPSVITypeInfo* sourcePSVI)
: fBitFields(0),
fTypeName(0),
fTypeNamespace(0),
fMemberTypeName(0),
fMemberTypeNamespace(0),
fDefaultValue(0),
fNormalizedValue(0)
{
setNumericProperty(DOMPSVITypeInfo::PSVI_Validity,
sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Validity));
setNumericProperty(DOMPSVITypeInfo::PSVI_Validitation_Attempted,
sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Validitation_Attempted));
setNumericProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Type,
sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Type));
setNumericProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Anonymous,
sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Anonymous));
setNumericProperty(DOMPSVITypeInfo::PSVI_Nil,
sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Nil));
setNumericProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Anonymous,
sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Anonymous));
setNumericProperty(DOMPSVITypeInfo::PSVI_Schema_Specified,
sourcePSVI->getNumericProperty(DOMPSVITypeInfo::PSVI_Schema_Specified));
setStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Name,
ownerDoc->getPooledString(sourcePSVI->getStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Name)));
setStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Namespace,
ownerDoc->getPooledString(sourcePSVI->getStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Namespace)));
setStringProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Name,
ownerDoc->getPooledString(sourcePSVI->getStringProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Name)));
setStringProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Namespace,
ownerDoc->getPooledString(sourcePSVI->getStringProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Namespace)));
setStringProperty(DOMPSVITypeInfo::PSVI_Schema_Default,
ownerDoc->getPooledString(sourcePSVI->getStringProperty(DOMPSVITypeInfo::PSVI_Schema_Default)));
setStringProperty(DOMPSVITypeInfo::PSVI_Schema_Normalized_Value,
ownerDoc->getPooledString(sourcePSVI->getStringProperty(DOMPSVITypeInfo::PSVI_Schema_Normalized_Value)));
}
const XMLCh* DOMTypeInfoImpl::getName() const {
// if it's a DTD, return the data that was stored
if(!getNumericProperty(PSVI_Schema_Specified))
return fTypeName;
// if [validity] is "invalid" or "notKnown", the {target namespace} and {name} properties of the declared type if available, otherwise null.
if(!getNumericProperty(PSVI_Validity))
return fTypeName;
if(fMemberTypeName)
return fMemberTypeName;
return fTypeName;
}
const XMLCh* DOMTypeInfoImpl::getNamespace() const {
// if it's a DTD, return the data that was stored
if(!getNumericProperty(PSVI_Schema_Specified))
return fTypeNamespace;
// if [validity] is "invalid" or "notKnown", the {target namespace} and {name} properties of the declared type if available, otherwise null.
if(!getNumericProperty(PSVI_Validity))
return fTypeNamespace;
if(fMemberTypeName) // we check on the name, as the URI can be NULL
return fMemberTypeNamespace;
return fTypeNamespace;
}
const XMLCh* DOMTypeInfoImpl::getStringProperty(PSVIProperty prop) const {
switch(prop)
{
case PSVI_Type_Definition_Name: return fTypeName;
case PSVI_Type_Definition_Namespace: return fTypeNamespace;
case PSVI_Member_Type_Definition_Name: return fMemberTypeName;
case PSVI_Member_Type_Definition_Namespace: return fMemberTypeNamespace;
case PSVI_Schema_Default: return fDefaultValue;
case PSVI_Schema_Normalized_Value: return fNormalizedValue;
default: assert(false); /* it's not a string property */
}
return 0;
}
int DOMTypeInfoImpl::getNumericProperty(PSVIProperty prop) const {
switch(prop)
{
case PSVI_Validity: return (PSVIItem::VALIDITY_STATE)(fBitFields & 0x0003);
case PSVI_Validitation_Attempted: return (PSVIItem::ASSESSMENT_TYPE)((fBitFields >> 2) & 0x0003);
case PSVI_Type_Definition_Type: return (fBitFields & (1 << 5))?XSTypeDefinition::COMPLEX_TYPE:XSTypeDefinition::SIMPLE_TYPE;
case PSVI_Type_Definition_Anonymous: return (fBitFields & (1 << 6))?true:false;
case PSVI_Nil: return (fBitFields & (1 << 7))?true:false;
case PSVI_Member_Type_Definition_Anonymous: return (fBitFields & (1 << 8))?true:false;
case PSVI_Schema_Specified: return (fBitFields & (1 << 9))?true:false;
default: assert(false); /* it's not a numeric property */
}
return 0;
}
void DOMTypeInfoImpl::setStringProperty(PSVIProperty prop, const XMLCh* value) {
switch(prop)
{
case PSVI_Type_Definition_Name: fTypeName=value; break;
case PSVI_Type_Definition_Namespace: fTypeNamespace=value; break;
case PSVI_Member_Type_Definition_Name: fMemberTypeName=value; break;
case PSVI_Member_Type_Definition_Namespace: fMemberTypeNamespace=value; break;
case PSVI_Schema_Default: fDefaultValue=value; break;
case PSVI_Schema_Normalized_Value: fNormalizedValue=value; break;
default: assert(false); /* it's not a string property */
}
}
void DOMTypeInfoImpl::setNumericProperty(PSVIProperty prop, int value) {
switch(prop)
{
case PSVI_Validity: fBitFields |= (value & 0x0003); break;
case PSVI_Validitation_Attempted: fBitFields |= ((value & 0x0003) << 2); break;
case PSVI_Type_Definition_Type: fBitFields |= (value==XSTypeDefinition::COMPLEX_TYPE)?(1 << 5):0; break;
case PSVI_Type_Definition_Anonymous: fBitFields |= (value!=0)?(1 << 6):0; break;
case PSVI_Nil: fBitFields |= (value!=0)?(1 << 7):0; break;
case PSVI_Member_Type_Definition_Anonymous: fBitFields |= (value!=0)?(1 << 8):0; break;
case PSVI_Schema_Specified: fBitFields |= (value!=0)?(1 << 9):0; break;
default: assert(false); /* it's not a numeric property */
}
}
XERCES_CPP_NAMESPACE_END
/**
* End of file DOMTypeInfo.cpp
*/