213 lines
7.6 KiB
C++
213 lines
7.6 KiB
C++
/*
|
|
* 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: SimpleContentModel.hpp 677705 2008-07-17 20:15:32Z amassari $
|
|
*/
|
|
|
|
#if !defined(XERCESC_INCLUDE_GUARD_SIMPLECONTENTMODEL_HPP)
|
|
#define XERCESC_INCLUDE_GUARD_SIMPLECONTENTMODEL_HPP
|
|
|
|
#include <xercesc/framework/XMLContentModel.hpp>
|
|
#include <xercesc/validators/common/ContentSpecNode.hpp>
|
|
|
|
XERCES_CPP_NAMESPACE_BEGIN
|
|
|
|
//
|
|
// SimpleContentModel is a derivative of the abstract content model base
|
|
// class that handles a small set of simple content models that are just
|
|
// way overkill to give the DFA treatment.
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// This guy handles the following scenarios:
|
|
//
|
|
// a
|
|
// a?
|
|
// a*
|
|
// a+
|
|
// a,b
|
|
// a|b
|
|
//
|
|
// These all involve a unary operation with one element type, or a binary
|
|
// operation with two elements. These are very simple and can be checked
|
|
// in a simple way without a DFA and without the overhead of setting up a
|
|
// DFA for such a simple check.
|
|
//
|
|
// NOTE: Pass the XMLElementDecl::fgPCDataElemId value to represent a
|
|
// PCData node. Pass XMLElementDecl::fgInvalidElemId for unused element
|
|
//
|
|
class SimpleContentModel : public XMLContentModel
|
|
{
|
|
public :
|
|
// -----------------------------------------------------------------------
|
|
// Constructors and Destructor
|
|
// -----------------------------------------------------------------------
|
|
SimpleContentModel
|
|
(
|
|
const bool dtd
|
|
, QName* const firstChild
|
|
, QName* const secondChild
|
|
, const ContentSpecNode::NodeTypes cmOp
|
|
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
|
|
);
|
|
|
|
~SimpleContentModel();
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
// Implementation of the ContentModel virtual interface
|
|
// -----------------------------------------------------------------------
|
|
virtual bool validateContent
|
|
(
|
|
QName** const children
|
|
, XMLSize_t childCount
|
|
, unsigned int emptyNamespaceId
|
|
, XMLSize_t* indexFailingChild
|
|
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
|
|
) const;
|
|
|
|
virtual bool validateContentSpecial
|
|
(
|
|
QName** const children
|
|
, XMLSize_t childCount
|
|
, unsigned int emptyNamespaceId
|
|
, GrammarResolver* const pGrammarResolver
|
|
, XMLStringPool* const pStringPool
|
|
, XMLSize_t* indexFailingChild
|
|
, MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
|
|
) const;
|
|
|
|
virtual ContentLeafNameTypeVector *getContentLeafNameTypeVector() const;
|
|
|
|
virtual unsigned int getNextState(unsigned int currentState,
|
|
XMLSize_t elementIndex) const;
|
|
|
|
virtual bool handleRepetitions( const QName* const curElem,
|
|
unsigned int curState,
|
|
unsigned int currentLoop,
|
|
unsigned int& nextState,
|
|
unsigned int& nextLoop,
|
|
XMLSize_t elementIndex,
|
|
SubstitutionGroupComparator * comparator) const;
|
|
|
|
virtual void checkUniqueParticleAttribution
|
|
(
|
|
SchemaGrammar* const pGrammar
|
|
, GrammarResolver* const pGrammarResolver
|
|
, XMLStringPool* const pStringPool
|
|
, XMLValidator* const pValidator
|
|
, unsigned int* const pContentSpecOrgURI
|
|
, const XMLCh* pComplexTypeName = 0
|
|
) ;
|
|
|
|
private :
|
|
// -----------------------------------------------------------------------
|
|
// Unimplemented constructors and operators
|
|
// -----------------------------------------------------------------------
|
|
SimpleContentModel();
|
|
SimpleContentModel(const SimpleContentModel&);
|
|
SimpleContentModel& operator=(const SimpleContentModel&);
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
// Private data members
|
|
//
|
|
// fFirstChild
|
|
// fSecondChild
|
|
// The first (and optional second) child node. The
|
|
// operation code tells us whether the second child is used or not.
|
|
//
|
|
// fOp
|
|
// The operation that this object represents. Since this class only
|
|
// does simple contents, there is only ever a single operation
|
|
// involved (i.e. the children of the operation are always one or
|
|
// two leafs.)
|
|
//
|
|
// fDTD
|
|
// Boolean to allow DTDs to validate even with namespace support. */
|
|
//
|
|
// -----------------------------------------------------------------------
|
|
QName* fFirstChild;
|
|
QName* fSecondChild;
|
|
ContentSpecNode::NodeTypes fOp;
|
|
bool fDTD;
|
|
MemoryManager* const fMemoryManager;
|
|
};
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// SimpleContentModel: Constructors and Destructor
|
|
// ---------------------------------------------------------------------------
|
|
inline SimpleContentModel::SimpleContentModel
|
|
(
|
|
const bool dtd
|
|
, QName* const firstChild
|
|
, QName* const secondChild
|
|
, const ContentSpecNode::NodeTypes cmOp
|
|
, MemoryManager* const manager
|
|
)
|
|
: fFirstChild(0)
|
|
, fSecondChild(0)
|
|
, fOp(cmOp)
|
|
, fDTD(dtd)
|
|
, fMemoryManager(manager)
|
|
{
|
|
if (firstChild)
|
|
fFirstChild = new (manager) QName(*firstChild);
|
|
else
|
|
fFirstChild = new (manager) QName(XMLUni::fgZeroLenString, XMLUni::fgZeroLenString, XMLElementDecl::fgInvalidElemId, manager);
|
|
|
|
if (secondChild)
|
|
fSecondChild = new (manager) QName(*secondChild);
|
|
else
|
|
fSecondChild = new (manager) QName(XMLUni::fgZeroLenString, XMLUni::fgZeroLenString, XMLElementDecl::fgInvalidElemId, manager);
|
|
}
|
|
|
|
inline SimpleContentModel::~SimpleContentModel()
|
|
{
|
|
delete fFirstChild;
|
|
delete fSecondChild;
|
|
}
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// SimpleContentModel: Virtual methods
|
|
// ---------------------------------------------------------------------------
|
|
inline unsigned int
|
|
SimpleContentModel::getNextState(unsigned int,
|
|
XMLSize_t) const {
|
|
|
|
return XMLContentModel::gInvalidTrans;
|
|
}
|
|
|
|
inline bool
|
|
SimpleContentModel::handleRepetitions( const QName* const curElem,
|
|
unsigned int curState,
|
|
unsigned int currentLoop,
|
|
unsigned int& nextState,
|
|
unsigned int& nextLoop,
|
|
XMLSize_t elementIndex,
|
|
SubstitutionGroupComparator * comparator) const
|
|
{
|
|
return true;
|
|
}
|
|
|
|
XERCES_CPP_NAMESPACE_END
|
|
|
|
#endif
|