/* * 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: ComplexTypeInfo.hpp 568078 2007-08-21 11:43:25Z amassari $ */ #if !defined(COMPLEXTYPEINFO_HPP) #define COMPLEXTYPEINFO_HPP /** * The class act as a place holder to store complex type information. * * The class is intended for internal use. */ // --------------------------------------------------------------------------- // Includes // --------------------------------------------------------------------------- #include #include #include #include #include #include #include XERCES_CPP_NAMESPACE_BEGIN // --------------------------------------------------------------------------- // Forward Declarations // --------------------------------------------------------------------------- class DatatypeValidator; class ContentSpecNode; class SchemaAttDefList; class SchemaElementDecl; class XSDLocator; class VALIDATORS_EXPORT ComplexTypeInfo : public XSerializable, public XMemory { public: // ----------------------------------------------------------------------- // Public Constructors/Destructor // ----------------------------------------------------------------------- ComplexTypeInfo(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager); ~ComplexTypeInfo(); // ----------------------------------------------------------------------- // Getter methods // ----------------------------------------------------------------------- bool getAbstract() const; bool getAdoptContentSpec() const; bool containsAttWithTypeId() const; bool getPreprocessed() const; int getDerivedBy() const; int getBlockSet() const; int getFinalSet() const; int getScopeDefined() const; unsigned int getElementId() const; int getContentType() const; unsigned int elementCount() const; XMLCh* getTypeName() const; DatatypeValidator* getBaseDatatypeValidator() const; DatatypeValidator* getDatatypeValidator() const; ComplexTypeInfo* getBaseComplexTypeInfo() const; ContentSpecNode* getContentSpec() const; const SchemaAttDef* getAttWildCard() const; SchemaAttDef* getAttWildCard(); const SchemaAttDef* getAttDef(const XMLCh* const baseName, const int uriId) const; SchemaAttDef* getAttDef(const XMLCh* const baseName, const int uriId); XMLAttDefList& getAttDefList() const; const SchemaElementDecl* elementAt(const unsigned int index) const; SchemaElementDecl* elementAt(const unsigned int index); XMLContentModel* getContentModel(const bool checkUPA = false); const XMLCh* getFormattedContentModel () const; XSDLocator* getLocator() const; const XMLCh* getTypeLocalName() const; const XMLCh* getTypeUri() const; /** * returns true if this type is anonymous **/ bool getAnonymous() const; // ----------------------------------------------------------------------- // Setter methods // ----------------------------------------------------------------------- void setAbstract(const bool isAbstract); void setAdoptContentSpec(const bool toAdopt); void setAttWithTypeId(const bool value); void setPreprocessed(const bool aValue = true); void setDerivedBy(const int derivedBy); void setBlockSet(const int blockSet); void setFinalSet(const int finalSet); void setScopeDefined(const int scopeDefined); void setElementId(const unsigned int elemId); void setTypeName(const XMLCh* const typeName); void setContentType(const int contentType); void setBaseDatatypeValidator(DatatypeValidator* const baseValidator); void setDatatypeValidator(DatatypeValidator* const validator); void setBaseComplexTypeInfo(ComplexTypeInfo* const typeInfo); void setContentSpec(ContentSpecNode* const toAdopt); void setAttWildCard(SchemaAttDef* const toAdopt); void addAttDef(SchemaAttDef* const toAdd); void addElement(SchemaElementDecl* const toAdd); /** * @deprecated; not thread-safe (will not work with shared grammars) */ void setContentModel(XMLContentModel* const newModelToAdopt); void setLocator(XSDLocator* const aLocator); /** * sets this type to be anonymous **/ void setAnonymous(); // ----------------------------------------------------------------------- // Helper methods // ----------------------------------------------------------------------- bool hasAttDefs() const; bool contains(const XMLCh* const attName); XMLAttDef* findAttr ( const XMLCh* const qName , const unsigned int uriId , const XMLCh* const baseName , const XMLCh* const prefix , const XMLElementDecl::LookupOpts options , bool& wasAdded ) const; bool resetDefs(); void checkUniqueParticleAttribution ( SchemaGrammar* const pGrammar , GrammarResolver* const pGrammarResolver , XMLStringPool* const pStringPool , XMLValidator* const pValidator ) ; /** * Return a singleton that represents 'anyType' * * @param emptyNSId the uri id of the empty namespace */ static ComplexTypeInfo* getAnyType(unsigned int emptyNSId); /** * Notification that lazy data has been deleted */ static void reinitAnyType(); /*** * Support for Serialization/De-serialization ***/ DECL_XSERIALIZABLE(ComplexTypeInfo) private: // ----------------------------------------------------------------------- // Unimplemented contstructors and operators // ----------------------------------------------------------------------- ComplexTypeInfo(const ComplexTypeInfo& elemInfo); ComplexTypeInfo& operator= (const ComplexTypeInfo& other); // ----------------------------------------------------------------------- // Private helper methods // ----------------------------------------------------------------------- void faultInAttDefList() const; XMLContentModel* createChildModel(ContentSpecNode* specNode, const bool isMixed); XMLContentModel* makeContentModel(const bool checkUPA = false); XMLContentModel* buildContentModel(ContentSpecNode* const specNode); XMLCh* formatContentModel () const ; ContentSpecNode* expandContentModel(ContentSpecNode* const curNode, const int minOccurs, const int maxOccurs); ContentSpecNode* convertContentSpecTree(ContentSpecNode* const curNode, const bool checkUPA = false); void resizeContentSpecOrgURI(); // ----------------------------------------------------------------------- // Private data members // ----------------------------------------------------------------------- bool fAnonymous; bool fAbstract; bool fAdoptContentSpec; bool fAttWithTypeId; bool fPreprocessed; int fDerivedBy; int fBlockSet; int fFinalSet; int fScopeDefined; int fContentType; unsigned int fElementId; unsigned int fUniqueURI; unsigned int fContentSpecOrgURISize; XMLCh* fTypeName; XMLCh* fTypeLocalName; XMLCh* fTypeUri; DatatypeValidator* fBaseDatatypeValidator; DatatypeValidator* fDatatypeValidator; ComplexTypeInfo* fBaseComplexTypeInfo; ContentSpecNode* fContentSpec; SchemaAttDef* fAttWildCard; SchemaAttDefList* fAttList; RefVectorOf* fElements; RefHash2KeysTableOf* fAttDefs; XMLContentModel* fContentModel; XMLCh* fFormattedModel; unsigned int* fContentSpecOrgURI; XSDLocator* fLocator; MemoryManager* fMemoryManager; static ComplexTypeInfo* fAnyType; }; // --------------------------------------------------------------------------- // ComplexTypeInfo: Getter methods // --------------------------------------------------------------------------- inline bool ComplexTypeInfo::getAbstract() const { return fAbstract; } inline bool ComplexTypeInfo::getAdoptContentSpec() const { return fAdoptContentSpec; } inline bool ComplexTypeInfo::containsAttWithTypeId() const { return fAttWithTypeId; } inline bool ComplexTypeInfo::getPreprocessed() const { return fPreprocessed; } inline int ComplexTypeInfo::getDerivedBy() const { return fDerivedBy; } inline int ComplexTypeInfo::getBlockSet() const { return fBlockSet; } inline int ComplexTypeInfo::getFinalSet() const { return fFinalSet; } inline int ComplexTypeInfo::getScopeDefined() const { return fScopeDefined; } inline unsigned int ComplexTypeInfo::getElementId() const { return fElementId; } inline int ComplexTypeInfo::getContentType() const { return fContentType; } inline unsigned int ComplexTypeInfo::elementCount() const { if (fElements) { return fElements->size(); } return 0; } inline XMLCh* ComplexTypeInfo::getTypeName() const { return fTypeName; } inline DatatypeValidator* ComplexTypeInfo::getBaseDatatypeValidator() const { return fBaseDatatypeValidator; } inline DatatypeValidator* ComplexTypeInfo::getDatatypeValidator() const { return fDatatypeValidator; } inline ComplexTypeInfo* ComplexTypeInfo::getBaseComplexTypeInfo() const { return fBaseComplexTypeInfo; } inline ContentSpecNode* ComplexTypeInfo::getContentSpec() const { return fContentSpec; } inline const SchemaAttDef* ComplexTypeInfo::getAttWildCard() const { return fAttWildCard; } inline SchemaAttDef* ComplexTypeInfo::getAttWildCard() { return fAttWildCard; } inline const SchemaAttDef* ComplexTypeInfo::getAttDef(const XMLCh* const baseName, const int uriId) const { return fAttDefs->get(baseName, uriId); } inline SchemaAttDef* ComplexTypeInfo::getAttDef(const XMLCh* const baseName, const int uriId) { return fAttDefs->get(baseName, uriId); } inline SchemaElementDecl* ComplexTypeInfo::elementAt(const unsigned int index) { if (!fElements) { return 0; // REVISIT - need to throw an exception } return fElements->elementAt(index); } inline const SchemaElementDecl* ComplexTypeInfo::elementAt(const unsigned int index) const { if (!fElements) { return 0; // REVISIT - need to throw an exception } return fElements->elementAt(index); } inline XMLContentModel* ComplexTypeInfo::getContentModel(const bool checkUPA) { if (!fContentModel && fContentSpec) fContentModel = makeContentModel(checkUPA); return fContentModel; } inline XSDLocator* ComplexTypeInfo::getLocator() const { return fLocator; } inline bool ComplexTypeInfo::getAnonymous() const { return fAnonymous; } inline const XMLCh* ComplexTypeInfo::getTypeLocalName() const { return fTypeLocalName; } inline const XMLCh* ComplexTypeInfo::getTypeUri() const { return fTypeUri; } // --------------------------------------------------------------------------- // ComplexTypeInfo: Setter methods // --------------------------------------------------------------------------- inline void ComplexTypeInfo::setAbstract(const bool isAbstract) { fAbstract = isAbstract; } inline void ComplexTypeInfo::setAdoptContentSpec(const bool toAdopt) { fAdoptContentSpec = toAdopt; } inline void ComplexTypeInfo::setAttWithTypeId(const bool value) { fAttWithTypeId = value; } inline void ComplexTypeInfo::setPreprocessed(const bool aValue) { fPreprocessed = aValue; } inline void ComplexTypeInfo::setDerivedBy(const int derivedBy) { fDerivedBy = derivedBy; } inline void ComplexTypeInfo::setBlockSet(const int blockSet) { fBlockSet = blockSet; } inline void ComplexTypeInfo::setFinalSet(const int finalSet) { fFinalSet = finalSet; } inline void ComplexTypeInfo::setScopeDefined(const int scopeDefined) { fScopeDefined = scopeDefined; } inline void ComplexTypeInfo::setElementId(const unsigned int elemId) { fElementId = elemId; } inline void ComplexTypeInfo::setContentType(const int contentType) { fContentType = contentType; } inline void ComplexTypeInfo::setTypeName(const XMLCh* const typeName) { fMemoryManager->deallocate(fTypeName);//delete [] fTypeName; fMemoryManager->deallocate(fTypeLocalName);//delete [] fTypeLocalName; fMemoryManager->deallocate(fTypeUri);//delete [] fTypeUri; if (typeName) { fTypeName = XMLString::replicate(typeName, fMemoryManager); int index = XMLString::indexOf(fTypeName, chComma); int length = XMLString::stringLen(fTypeName); fTypeLocalName = (XMLCh*) fMemoryManager->allocate ( (length - index + 1) * sizeof(XMLCh) ); //new XMLCh[length - index + 1]; XMLString::subString(fTypeLocalName, fTypeName, index + 1, length, fMemoryManager); fTypeUri = (XMLCh*) fMemoryManager->allocate ( (index + 1) * sizeof(XMLCh) ); //new XMLCh[index + 1]; XMLString::subString(fTypeUri, fTypeName, 0, index, fMemoryManager); } else { fTypeName = fTypeLocalName = fTypeUri = 0; } } inline void ComplexTypeInfo::setBaseDatatypeValidator(DatatypeValidator* const validator) { fBaseDatatypeValidator = validator; } inline void ComplexTypeInfo::setDatatypeValidator(DatatypeValidator* const validator) { fDatatypeValidator = validator; } inline void ComplexTypeInfo::setBaseComplexTypeInfo(ComplexTypeInfo* const typeInfo) { fBaseComplexTypeInfo = typeInfo; } inline void ComplexTypeInfo::addElement(SchemaElementDecl* const elem) { if (!fElements) { fElements = new (fMemoryManager) RefVectorOf(8, false, fMemoryManager); } else if (fElements->containsElement(elem)) { return; } fElements->addElement(elem); } inline void ComplexTypeInfo::setAttWildCard(SchemaAttDef* const toAdopt) { if (fAttWildCard) { delete fAttWildCard; } fAttWildCard = toAdopt; } inline void ComplexTypeInfo::setContentModel(XMLContentModel* const newModelToAdopt) { delete fContentModel; fContentModel = newModelToAdopt; // reset formattedModel if (fFormattedModel) { fMemoryManager->deallocate(fFormattedModel); fFormattedModel = 0; } } inline void ComplexTypeInfo::setAnonymous() { fAnonymous = true; } // --------------------------------------------------------------------------- // ComplexTypeInfo: Helper methods // --------------------------------------------------------------------------- inline bool ComplexTypeInfo::hasAttDefs() const { return !fAttDefs->isEmpty(); } inline bool ComplexTypeInfo::contains(const XMLCh* const attName) { RefHash2KeysTableOfEnumerator enumDefs(fAttDefs, false, fMemoryManager); while (enumDefs.hasMoreElements()) { if (XMLString::equals(attName, enumDefs.nextElement().getAttName()->getLocalPart())) { return true; } } return false; } XERCES_CPP_NAMESPACE_END #endif /** * End of file ComplexTypeInfo.hpp */