blob: db7c3331371652010c9f13552c5287583fa8187b [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.
*/
/*
* $Id: SchemaElementDecl.cpp 568078 2007-08-21 11:43:25Z amassari $
*/
// ---------------------------------------------------------------------------
// Includes
// ---------------------------------------------------------------------------
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/XMLUniDefs.hpp>
#include <xercesc/util/XMLUni.hpp>
#include <xercesc/validators/schema/SchemaAttDefList.hpp>
#include <xercesc/validators/schema/SchemaElementDecl.hpp>
#include <xercesc/validators/schema/identity/IdentityConstraint.hpp>
#include <xercesc/internal/XTemplateSerializer.hpp>
XERCES_CPP_NAMESPACE_BEGIN
// ---------------------------------------------------------------------------
// SchemaElementDecl: Constructors and Destructor
// ---------------------------------------------------------------------------
SchemaElementDecl::SchemaElementDecl(MemoryManager* const manager) :
XMLElementDecl(manager)
, fModelType(Any)
, fPSVIScope(PSVIDefs::SCP_ABSENT)
, fValidity(PSVIDefs::UNKNOWN)
, fValidation(PSVIDefs::NONE)
, fEnclosingScope(Grammar::TOP_LEVEL_SCOPE)
, fFinalSet(0)
, fBlockSet(0)
, fMiscFlags(0)
, fDefaultValue(0)
, fComplexTypeInfo(0)
, fAttDefs(0)
, fXsiComplexTypeInfo(0)
, fXsiSimpleTypeInfo(0)
, fIdentityConstraints(0)
, fAttWildCard(0)
, fSubstitutionGroupElem(0)
, fDatatypeValidator(0)
, fSeenValidation(false)
, fSeenNoValidation(false)
, fHadContent(false)
{
}
SchemaElementDecl::SchemaElementDecl(const XMLCh* const prefix
, const XMLCh* const localPart
, const int uriId
, const SchemaElementDecl::ModelTypes type
, const int enclosingScope
, MemoryManager* const manager) :
XMLElementDecl(manager)
, fModelType(type)
, fPSVIScope(PSVIDefs::SCP_ABSENT)
, fValidity(PSVIDefs::UNKNOWN)
, fValidation(PSVIDefs::NONE)
, fEnclosingScope(enclosingScope)
, fFinalSet(0)
, fBlockSet(0)
, fMiscFlags(0)
, fDefaultValue(0)
, fComplexTypeInfo(0)
, fAttDefs(0)
, fXsiComplexTypeInfo(0)
, fXsiSimpleTypeInfo(0)
, fIdentityConstraints(0)
, fAttWildCard(0)
, fSubstitutionGroupElem(0)
, fDatatypeValidator(0)
, fSeenValidation(false)
, fSeenNoValidation(false)
, fHadContent(false)
{
setElementName(prefix, localPart, uriId);
}
SchemaElementDecl::SchemaElementDecl(const QName* const elementName
, const SchemaElementDecl::ModelTypes type
, const int enclosingScope
, MemoryManager* const manager) :
XMLElementDecl(manager)
, fModelType(type)
, fPSVIScope(PSVIDefs::SCP_ABSENT)
, fValidity(PSVIDefs::UNKNOWN)
, fValidation(PSVIDefs::NONE)
, fEnclosingScope(enclosingScope)
, fFinalSet(0)
, fBlockSet(0)
, fMiscFlags(0)
, fDefaultValue(0)
, fComplexTypeInfo(0)
, fAttDefs(0)
, fXsiComplexTypeInfo(0)
, fXsiSimpleTypeInfo(0)
, fIdentityConstraints(0)
, fAttWildCard(0)
, fSubstitutionGroupElem(0)
, fDatatypeValidator(0)
, fSeenValidation(false)
, fSeenNoValidation(false)
, fHadContent(false)
{
setElementName(elementName);
}
SchemaElementDecl::~SchemaElementDecl()
{
getMemoryManager()->deallocate(fDefaultValue);//delete [] fDefaultValue;
delete fAttDefs;
delete fIdentityConstraints;
delete fAttWildCard;
}
// ---------------------------------------------------------------------------
// SchemaElementDecl: XMLElementDecl virtual interface implementation
// ---------------------------------------------------------------------------
XMLAttDef* SchemaElementDecl::findAttr(const XMLCh* const qName
, const unsigned int uriId
, const XMLCh* const baseName
, const XMLCh* const prefix
, const LookupOpts options
, bool& wasAdded) const
{
if (fComplexTypeInfo) {
return fComplexTypeInfo->findAttr(qName, uriId, baseName, prefix, options, wasAdded);
}
else {
if (options == XMLElementDecl::AddIfNotFound) {
SchemaAttDef* retVal = 0;
// If no att list exist yet, then create one
if (!fAttDefs) {
// Use a hash modulus of 29 and tell it owns its elements
((SchemaElementDecl*)this)->fAttDefs =
new (getMemoryManager()) RefHash2KeysTableOf<SchemaAttDef>(29, true, getMemoryManager());
}
retVal = fAttDefs->get(baseName, uriId);
// Fault it in if not found and ask to add it
if (!retVal)
{
// And add a default attribute for this name
retVal = new (getMemoryManager()) SchemaAttDef
(
prefix
, baseName
, uriId
, XMLAttDef::CData
, XMLAttDef::Implied
, getMemoryManager()
);
retVal->setElemId(getId());
fAttDefs->put((void*)retVal->getAttName()->getLocalPart(), uriId, retVal);
wasAdded = true;
}
else
{
wasAdded = false;
}
return retVal;
}
else {
wasAdded = false;
return 0;
}
}
}
XMLAttDefList& SchemaElementDecl::getAttDefList() const
{
if (!fComplexTypeInfo)
{
ThrowXMLwithMemMgr(RuntimeException, XMLExcepts::DV_InvalidOperation, getMemoryManager());
}
return fComplexTypeInfo->getAttDefList();
}
XMLElementDecl::CharDataOpts SchemaElementDecl::getCharDataOpts() const
{
SchemaElementDecl::ModelTypes modelType = fModelType;
if (fComplexTypeInfo) {
modelType = (SchemaElementDecl::ModelTypes) fComplexTypeInfo->getContentType();
}
XMLElementDecl::CharDataOpts retVal;
switch(modelType)
{
case Children :
retVal = XMLElementDecl::SpacesOk;
break;
case Empty :
retVal = XMLElementDecl::NoCharData;
break;
default :
retVal = XMLElementDecl::AllCharData;
break;
}
return retVal;
}
bool SchemaElementDecl::hasAttDefs() const
{
if (fComplexTypeInfo) {
return fComplexTypeInfo->hasAttDefs();
}
// If the collection hasn't been faulted in, then no att defs
return false;
}
bool SchemaElementDecl::resetDefs()
{
if (fComplexTypeInfo) {
return fComplexTypeInfo->resetDefs();
}
else if (fAttDefs) {
//all the attdefs here are faulted-in, so just reset the fAttDefs
//but still return false to indicate there is no real att defs
// defined in this element
fAttDefs->removeAll();
}
return false;
}
const XMLCh*
SchemaElementDecl::getFormattedContentModel() const
{
if (fComplexTypeInfo) {
return fComplexTypeInfo->getFormattedContentModel();
}
return 0;
}
// ---------------------------------------------------------------------------
// SchemaElementDecl: Getter methods
// ---------------------------------------------------------------------------
const SchemaAttDef* SchemaElementDecl::getAttDef(const XMLCh* const baseName, const int uriId) const
{
if (fComplexTypeInfo) {
return fComplexTypeInfo->getAttDef(baseName, uriId);
}
// If no complex type, then return a null
return 0;
}
SchemaAttDef* SchemaElementDecl::getAttDef(const XMLCh* const baseName, const int uriId)
{
if (fComplexTypeInfo) {
return fComplexTypeInfo->getAttDef(baseName, uriId);
}
// If no complex type, then return a null
return 0;
}
/***
* Support for Serialization/De-serialization
***/
IMPL_XSERIALIZABLE_TOCREATE(SchemaElementDecl)
void SchemaElementDecl::serialize(XSerializeEngine& serEng)
{
XMLElementDecl::serialize(serEng);
if (serEng.isStoring())
{
serEng<<(int)fModelType;
serEng<<(int)fPSVIScope;
serEng<<(int)fValidity;
serEng<<(int)fValidation;
serEng<<fEnclosingScope;
serEng<<fFinalSet;
serEng<<fBlockSet;
serEng<<fMiscFlags;
serEng.writeString(fDefaultValue);
serEng<<fComplexTypeInfo;
/***
* Serialize RefHash2KeysTableOf<SchemaAttDef>* fAttDefs;
***/
XTemplateSerializer::storeObject(fAttDefs, serEng);
serEng<<fXsiComplexTypeInfo;
DatatypeValidator::storeDV(serEng, (DatatypeValidator*)fXsiSimpleTypeInfo);
/***
* Serialize RefVectorOf<IdentityConstraint>* fIdentityConstraints;
***/
XTemplateSerializer::storeObject(fIdentityConstraints, serEng);
serEng<<fAttWildCard;
serEng<<fSubstitutionGroupElem;
DatatypeValidator::storeDV(serEng, fDatatypeValidator);
serEng<<fSeenValidation;
serEng<<fSeenNoValidation;
serEng<<fHadContent;
}
else
{
int i;
serEng>>i;
fModelType = (ModelTypes)i;
serEng>>i;
fPSVIScope = (PSVIDefs::PSVIScope)i;
serEng>>i;
fValidity = (PSVIDefs::Validity)i;
serEng>> i;
fValidation = (PSVIDefs::Validation)i;
serEng>>fEnclosingScope;
serEng>>fFinalSet;
serEng>>fBlockSet;
serEng>>fMiscFlags;
serEng.readString(fDefaultValue);
serEng>>fComplexTypeInfo;
/***
* DeSerialize RefHash2KeysTableOf<SchemaAttDef>* fAttDefs;
***/
XTemplateSerializer::loadObject(&fAttDefs, 29, true, serEng);
serEng>>fXsiComplexTypeInfo;
fXsiSimpleTypeInfo = DatatypeValidator::loadDV(serEng);
/***
* DeSerialize RefVectorOf<IdentityConstraint>* fIdentityConstraints;
***/
XTemplateSerializer::loadObject(&fIdentityConstraints, 16, true, serEng);
serEng>>fAttWildCard;
serEng>>fSubstitutionGroupElem;
fDatatypeValidator = DatatypeValidator::loadDV(serEng);
serEng>>fSeenValidation;
serEng>>fSeenNoValidation;
serEng>>fHadContent;
}
}
XMLElementDecl::objectType SchemaElementDecl::getObjectType() const
{
return Schema;
}
XERCES_CPP_NAMESPACE_END