diff options
Diffstat (limited to 'ACE/ACEXML/parser/debug_validator')
10 files changed, 1169 insertions, 0 deletions
diff --git a/ACE/ACEXML/parser/debug_validator/Debug_Attributes_Builder.cpp b/ACE/ACEXML/parser/debug_validator/Debug_Attributes_Builder.cpp new file mode 100644 index 00000000000..65ae6e3776d --- /dev/null +++ b/ACE/ACEXML/parser/debug_validator/Debug_Attributes_Builder.cpp @@ -0,0 +1,215 @@ +// $Id$ + +#include "ACEXML/common/SAXExceptions.h" +#include "ACEXML/parser/debug_validator/Debug_Attributes_Builder.h" + +ACEXML_Debug_Attribute_Builder::ACEXML_Debug_Attribute_Builder () + : type_ (ERROR_TYPE), + default_decl_ (INVALID) +{ +} + +ACEXML_Debug_Attribute_Builder::ACEXML_Debug_Attribute_Builder (const ACEXML_Debug_Attribute_Builder &rhs) + : name_ (rhs.name_), + type_ (rhs.type_), + default_decl_ (rhs.default_decl_), + default_value_ (rhs.default_value_), + att_value_queue_ (rhs.att_value_queue_) +{ +} + +ACEXML_Debug_Attribute_Builder::~ACEXML_Debug_Attribute_Builder () +{ +} + +int +ACEXML_Debug_Attribute_Builder::setName (const ACEXML_Char *n) +{ + this->name_.set (n, 0); + return 0; +} + +const ACEXML_Char * +ACEXML_Debug_Attribute_Builder::getName (void) +{ + return this->name_.fast_rep (); +} + +int +ACEXML_Debug_Attribute_Builder::setAttType (const ATT_TYPE type + ACEXML_ENV_ARG_DECL) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + if (this->type_ == ERROR_TYPE) + { + this->type_ = type; + return 0; + } + ACEXML_THROW_RETURN (ACEXML_SAXParseException (ACE_TEXT("Attribute type redefinition in Debug Validator")), -1); + +} + +int +ACEXML_Debug_Attribute_Builder::insertList (const ACEXML_Char *n + ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + ACEXML_String str (n, 0, 0); + + this->att_value_queue_.enqueue_tail (str); + return 0; +} + +int +ACEXML_Debug_Attribute_Builder::setDefault (const DEFAULT_DECL def, + const ACEXML_Char *value + ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + this->default_decl_ = def; + this->default_value_.set (value, 0); + return 0; +} + +int +ACEXML_Debug_Attribute_Builder::validAttr (void) +{ + // @@ Not implemented. Always return 1 (true) for now. + return 1; +} + +void +ACEXML_Debug_Attribute_Builder::dump (void) +{ + cout << this->name_ << " "; + + switch (this->type_) + { + case CDATA: + cout << "CDATA "; + break; + case ID: + cout << "ID "; + break; + case IDREF: + cout << "IDREF "; + break; + case IDREFS: + cout << "IDREFS "; + break; + case ENTITY: + cout << "ENTITY "; + break; + case ENTITIES: + cout << "ENTITIES "; + break; + case NMTOKEN: + cout << "NMTOKEN "; + break; + case NMTOKENS: + cout << "NMTOKENS "; + break; + case NOTATION: + cout << "NOTATION "; + // Fall thru + case ENUMERATION: + { + cout << "("; + ACEXML_STRING_QUEUE_ITERATOR iter (this->att_value_queue_); + ACEXML_String *n = 0; + + while (iter.advance () != 0) + { + if (n == 0) + cout << " | "; + iter.next (n); + cout << *n; + } + cout << ") "; + } + break; + default: + cout << "*** UNKNOWN TYPE ***"; + break; + } + + switch (this->default_decl_) + { + case REQUIRED: + cout << "#REQUIRED"; + break; + case IMPLIED: + cout << "#IMPLIED"; + break; + case FIXED: + cout << "#FIXED " << this->default_value_; + break; + default: + cout << "**** UNDEFINED DEFAULT DECL ****"; + break; + } +} +// ======================================== + +ACEXML_Debug_Attributes_Builder::ACEXML_Debug_Attributes_Builder () +{ +} + +ACEXML_Debug_Attributes_Builder::~ACEXML_Debug_Attributes_Builder () +{ +} + +int +ACEXML_Debug_Attributes_Builder::setElement (const ACEXML_Char *, + const ACEXML_Char *, + const ACEXML_Char *qName ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + this->element_name_.set (qName, 0); + return 0; +} + +ACEXML_Attribute_Def_Builder * +ACEXML_Debug_Attributes_Builder::getAttribute_Def_Builder () +{ + ACEXML_Attribute_Def_Builder *tmp; + + ACE_NEW_RETURN (tmp, + ACEXML_Debug_Attribute_Builder (), + 0); + return tmp; +} + +int +ACEXML_Debug_Attributes_Builder::insertAttribute (ACEXML_Attribute_Def_Builder *def ACEXML_ENV_ARG_DECL) +{ + ACEXML_Attribute_Def_Builder::VAR ptr (def); + + if (def != 0) + { + ACEXML_String attname (def->getName (), 0, 0); + ACEXML_Debug_Attribute_Builder *ptr = + dynamic_cast<ACEXML_Debug_Attribute_Builder *> (def); + this->attributes_.bind (attname, *ptr); + return 0; + } + ACEXML_THROW_RETURN (ACEXML_SAXParseException (ACE_TEXT("ACEXML_Debug_Attributes_Builder internal error")), -1); +} + +void +ACEXML_Debug_Attributes_Builder::dump (void) +{ + // @@ Print print. + cout << "<!ATTLIST " << this->element_name_ << endl; + + ACEXML_ATT_MAP_ITER iter (this->attributes_); + ACEXML_ATT_MAP_ENTRY *item; + + while (iter.advance () != 0) + { + iter.next (item); + cout << "\n\t"; + item->int_id_.dump (); + } + cout << ">" << endl; +} diff --git a/ACE/ACEXML/parser/debug_validator/Debug_Attributes_Builder.h b/ACE/ACEXML/parser/debug_validator/Debug_Attributes_Builder.h new file mode 100644 index 00000000000..42a8273e2fe --- /dev/null +++ b/ACE/ACEXML/parser/debug_validator/Debug_Attributes_Builder.h @@ -0,0 +1,170 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file Debug_Attributes_Builder.h + * + * $Id$ + * + * @author Nanbor Wang <nanbor@cs.wustl.edu> + */ +//============================================================================= +#ifndef _ACEXML_DEBUG_ATTRIBUTES_BUILDER_H_ +#define _ACEXML_DEBUG_ATTRIBUTES_BUILDER_H_ + +#include /**/ "ace/pre.h" +#include "ACEXML/parser/debug_validator/Debug_DTD_Manager_Export.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "ACEXML/common/Attributes_Def_Builder.h" +#include "ace/Hash_Map_Manager.h" +#include "ace/Unbounded_Queue.h" + +typedef ACE_Unbounded_Queue<ACEXML_String> ACEXML_STRING_QUEUE; +typedef ACE_Unbounded_Queue_Iterator<ACEXML_String> ACEXML_STRING_QUEUE_ITERATOR; + +/** + * @class ACEXML_Debug_Attribute_Builder Debug_Attributes_Builder.h "parser/debug_validator/Debug_Attributes_Builder.h" + * + * This class prints out the Attribute definition for debugging purpose. + */ +class ACEXML_DEBUG_DTD_MANAGER_Export ACEXML_Debug_Attribute_Builder + : public ACEXML_Attribute_Def_Builder +{ +public: + ACEXML_Debug_Attribute_Builder (); + + ACEXML_Debug_Attribute_Builder (const ACEXML_Debug_Attribute_Builder &rhs); + + virtual ~ACEXML_Debug_Attribute_Builder (); + + /** + * Specify the name of the attribute. + */ + virtual int setName (const ACEXML_Char *n); + virtual const ACEXML_Char *getName (void); + + /** + * Set the attribute type. + */ + virtual int setAttType (const ATT_TYPE type ACEXML_ENV_ARG_DECL) + ACE_THROW_SPEC ((ACEXML_SAXException)) ; + + /** + * Insert an element for NOTATION or ENUMERATION type attribute. + */ + virtual int insertList (const ACEXML_Char *Name ACEXML_ENV_ARG_DECL) + ACE_THROW_SPEC ((ACEXML_SAXException)) ; + + /** + * Set default attribute declaration. + */ + virtual int setDefault (const DEFAULT_DECL def, + const ACEXML_Char *value ACEXML_ENV_ARG_DECL) + ACE_THROW_SPEC ((ACEXML_SAXException)) + ; + + /** + * Check validity of the current attribute definition being built. + * + * @retval 0 if the attribute is not a valid combo. + */ + virtual int validAttr (void); + + + /** + * Dump the content of the attribute definition. + */ + virtual void dump (void); +private: + /// Attribute name. + ACEXML_String name_; + + /// Type of attribute. + ATT_TYPE type_; + + /// Default value type. + DEFAULT_DECL default_decl_; + + /// Default attribute value. + ACEXML_String default_value_; + + /// Holds a queue of enumerated attribute values. + ACEXML_STRING_QUEUE att_value_queue_; +}; + +typedef ACE_Hash_Map_Entry<ACEXML_String, + ACEXML_Debug_Attribute_Builder> ACEXML_ATT_MAP_ENTRY; + +typedef ACE_Hash_Map_Manager_Ex <ACEXML_String, + ACEXML_Debug_Attribute_Builder, + ACE_Hash<ACEXML_String>, + ACE_Equal_To<ACEXML_String>, + ACE_Null_Mutex> ACEXML_ATT_MAP; + +typedef ACE_Hash_Map_Iterator_Ex<ACEXML_String, + ACEXML_Debug_Attribute_Builder, + ACE_Hash<ACEXML_String>, + ACE_Equal_To<ACEXML_String>, + ACE_Null_Mutex> ACEXML_ATT_MAP_ITER; + +typedef ACE_Hash_Map_Reverse_Iterator_Ex<ACEXML_String, + ACEXML_Debug_Attribute_Builder, + ACE_Hash<ACEXML_String>, + ACE_Equal_To<ACEXML_String>, + ACE_Null_Mutex> ACEXML_ATT_MAP_REVERSE_ITER; + +/** + * @class ACEXML_Debug_Attributes_Builder Debug_Attributes_Builder.h "parser/debug_validator/Debug_Attributes_Builder.h" + * + * This class prints out Attribute definitions for debugging purpose. + */ +class ACEXML_DEBUG_DTD_MANAGER_Export ACEXML_Debug_Attributes_Builder + : public ACEXML_Attributes_Def_Builder +{ +public: + ACEXML_Debug_Attributes_Builder (); + + virtual ~ACEXML_Debug_Attributes_Builder (); + + /** + * Set the element name that the attribute builder applies. + * + * @retval 0 if valid, -1 otherwise. + */ + virtual int setElement (const ACEXML_Char *namespaceURI, + const ACEXML_Char *localName, + const ACEXML_Char *qName ACEXML_ENV_ARG_DECL) + ACE_THROW_SPEC ((ACEXML_SAXException)) + ; + + /** + * Acquire an Attribute_Builder. + */ + virtual ACEXML_Attribute_Def_Builder *getAttribute_Def_Builder (); + + /** + * Add a definition for one attribute. + */ + virtual int insertAttribute (ACEXML_Attribute_Def_Builder *def ACEXML_ENV_ARG_DECL); + + + /** + * Dump the content of the attribute definition. + */ + virtual void dump (void); +protected: + /// The name of the element type these attributes applied. + ACEXML_String element_name_; + + /// Collection of attributes. + ACEXML_ATT_MAP attributes_; +}; + + +#include /**/ "ace/post.h" + +#endif /* _ACEXML_DEBUG_ATTRIBUTES_BUILDER_H_ */ diff --git a/ACE/ACEXML/parser/debug_validator/Debug_DTD_Manager.cpp b/ACE/ACEXML/parser/debug_validator/Debug_DTD_Manager.cpp new file mode 100644 index 00000000000..d0745d13bfc --- /dev/null +++ b/ACE/ACEXML/parser/debug_validator/Debug_DTD_Manager.cpp @@ -0,0 +1,71 @@ +// -*- C++ -*- $Id$ + +#include "ACEXML/common/SAXExceptions.h" +#include "ACEXML/parser/debug_validator/Debug_DTD_Manager.h" +#include "ACEXML/parser/debug_validator/Debug_Element_Builder.h" +#include "ACEXML/parser/debug_validator/Debug_Attributes_Builder.h" + +ACEXML_Debug_DTD_Manager::ACEXML_Debug_DTD_Manager () +{ + +} + +ACEXML_Debug_DTD_Manager::~ACEXML_Debug_DTD_Manager () +{ + +} + +ACEXML_Element_Def_Builder * +ACEXML_Debug_DTD_Manager::getElement_Def_Builder () +{ + return new ACEXML_Debug_Element_Builder (); +} + +int +ACEXML_Debug_DTD_Manager::insertElement_Definition (ACEXML_Element_Def_Builder *def ACEXML_ENV_ARG_DECL) +{ + ACEXML_Element_Def_Builder::VAR ptr (def); + + if (def != 0) + { + ptr->dump (); + return 0; + } + + ACEXML_THROW_RETURN (ACEXML_SAXParseException (ACE_TEXT("ACEXML_Debug_Attributes_Builder internal error")), -1); +} + +ACEXML_Attributes_Def_Builder * +ACEXML_Debug_DTD_Manager::getAttribute_Def_Builder () +{ + ACEXML_Attributes_Def_Builder *tmp; + ACE_NEW_RETURN (tmp, + ACEXML_Debug_Attributes_Builder (), + 0); + return tmp; +} + +int +ACEXML_Debug_DTD_Manager::insertAttributes_Definition (ACEXML_Attributes_Def_Builder *def ACEXML_ENV_ARG_DECL) +{ + ACEXML_Attributes_Def_Builder::VAR ptr (def); + if (def != 0) + { + ptr->dump (); + return 0; + } + + ACEXML_THROW_RETURN (ACEXML_SAXParseException (ACE_TEXT("ACEXML_Debug_Attributes_Builder internal error")), -1); +} + +ACEXML_Validator * +ACEXML_Debug_DTD_Manager::getValidator (const ACEXML_Char *namespaceURI, + const ACEXML_Char *localName, + const ACEXML_Char *qName ACEXML_ENV_ARG_DECL) +{ + ACE_UNUSED_ARG (namespaceURI); + ACE_UNUSED_ARG (localName); + ACE_UNUSED_ARG (qName); + + ACEXML_THROW_RETURN (ACEXML_SAXNotSupportedException (ACE_TEXT ("getValidator()")), 0); +} diff --git a/ACE/ACEXML/parser/debug_validator/Debug_DTD_Manager.h b/ACE/ACEXML/parser/debug_validator/Debug_DTD_Manager.h new file mode 100644 index 00000000000..0849d95ecb2 --- /dev/null +++ b/ACE/ACEXML/parser/debug_validator/Debug_DTD_Manager.h @@ -0,0 +1,76 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file Debug_DTD_Manager.h + * + * $Id$ + * + * @author Nanbor Wang <nanbor@cs.wustl.edu> + */ +//============================================================================= +#ifndef _ACEXML_DEBUG_DTD_Manager_H_ +#define _ACEXML_DEBUG_DTD_Manager_H_ + +#include /**/ "ace/pre.h" +#include "ACEXML/parser/debug_validator/Debug_DTD_Manager_Export.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "ACEXML/common/DTD_Manager.h" + +class ACEXML_DEBUG_DTD_MANAGER_Export ACEXML_Debug_DTD_Manager : public ACEXML_DTD_Manager +{ +public: + ACEXML_Debug_DTD_Manager (); + + virtual ~ACEXML_Debug_DTD_Manager (); + + /** + * Acquire a pointer to an element definition builder. The XML parser use + * this interface to acquire the definition builder and use the builder + * to create the DTD element definition. The resulting builder is then + * registered with the DTD Manager or destroyed if error occured when the + * builder encountered errors. + * + * @retval 0 if error occurs creating the builder. + */ + virtual ACEXML_Element_Def_Builder *getElement_Def_Builder (); + + /** + * Insert a new element definition into the DTD Manager. + * + * @retval 0 if success, -1 if error. + */ + virtual int insertElement_Definition (ACEXML_Element_Def_Builder *def ACEXML_ENV_ARG_DECL); + + /** + * Acquire a pointer to an attributes definition builder. + * + */ + virtual ACEXML_Attributes_Def_Builder *getAttribute_Def_Builder (); + + /** + * Insert a new attributes definition into the DTD Manager. + * + * @retval 0 if success, -1 otherwise. + */ + virtual int insertAttributes_Definition (ACEXML_Attributes_Def_Builder *def ACEXML_ENV_ARG_DECL); + + /** + * Acquire an element validator to validate an XML element. + * + * @todo I haven't figured out what memory management scheme + * we should use for the acquired validator. + */ + virtual ACEXML_Validator *getValidator (const ACEXML_Char *namespaceURI, + const ACEXML_Char *localName, + const ACEXML_Char *qName ACEXML_ENV_ARG_DECL); +}; + +#include /**/ "ace/post.h" + + +#endif /* _ACEXML_DTD_Manager_H_ */ diff --git a/ACE/ACEXML/parser/debug_validator/Debug_DTD_Manager_Export.h b/ACE/ACEXML/parser/debug_validator/Debug_DTD_Manager_Export.h new file mode 100644 index 00000000000..b4cf1c8a536 --- /dev/null +++ b/ACE/ACEXML/parser/debug_validator/Debug_DTD_Manager_Export.h @@ -0,0 +1,38 @@ + +// -*- C++ -*- +// $Id$ +// Definition for Win32 Export directives. +// This file is generated automatically by generate_export_file.pl -s ACEXML_DEBUG_DTD_MANAGER +// ------------------------------ +#ifndef ACEXML_DEBUG_DTD_MANAGER_EXPORT_H +#define ACEXML_DEBUG_DTD_MANAGER_EXPORT_H + +#include "ace/config-all.h" + +#if defined (ACE_AS_STATIC_LIBS) && !defined (ACEXML_DEBUG_DTD_MANAGER_HAS_DLL) +# define ACEXML_DEBUG_DTD_MANAGER_HAS_DLL 0 +#endif /* ACE_AS_STATIC_LIBS && ACEXML_DEBUG_DTD_MANAGER_HAS_DLL */ + +#if !defined (ACEXML_DEBUG_DTD_MANAGER_HAS_DLL) +# define ACEXML_DEBUG_DTD_MANAGER_HAS_DLL 1 +#endif /* ! ACEXML_DEBUG_DTD_MANAGER_HAS_DLL */ + +#if defined (ACEXML_DEBUG_DTD_MANAGER_HAS_DLL) && (ACEXML_DEBUG_DTD_MANAGER_HAS_DLL == 1) +# if defined (ACEXML_DEBUG_DTD_MANAGER_BUILD_DLL) +# define ACEXML_DEBUG_DTD_MANAGER_Export ACE_Proper_Export_Flag +# define ACEXML_DEBUG_DTD_MANAGER_SINGLETON_DECLARATION(T) ACE_EXPORT_SINGLETON_DECLARATION (T) +# define ACEXML_DEBUG_DTD_MANAGER_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_EXPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# else /* ACEXML_DEBUG_DTD_MANAGER_BUILD_DLL */ +# define ACEXML_DEBUG_DTD_MANAGER_Export ACE_Proper_Import_Flag +# define ACEXML_DEBUG_DTD_MANAGER_SINGLETON_DECLARATION(T) ACE_IMPORT_SINGLETON_DECLARATION (T) +# define ACEXML_DEBUG_DTD_MANAGER_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) ACE_IMPORT_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +# endif /* ACEXML_DEBUG_DTD_MANAGER_BUILD_DLL */ +#else /* ACEXML_DEBUG_DTD_MANAGER_HAS_DLL == 1 */ +# define ACEXML_DEBUG_DTD_MANAGER_Export +# define ACEXML_DEBUG_DTD_MANAGER_SINGLETON_DECLARATION(T) +# define ACEXML_DEBUG_DTD_MANAGER_SINGLETON_DECLARE(SINGLETON_TYPE, CLASS, LOCK) +#endif /* ACEXML_DEBUG_DTD_MANAGER_HAS_DLL == 1 */ + +#endif /* ACEXML_DEBUG_DTD_MANAGER_EXPORT_H */ + +// End of auto generated file. diff --git a/ACE/ACEXML/parser/debug_validator/Debug_Element_Builder.cpp b/ACE/ACEXML/parser/debug_validator/Debug_Element_Builder.cpp new file mode 100644 index 00000000000..48fff495365 --- /dev/null +++ b/ACE/ACEXML/parser/debug_validator/Debug_Element_Builder.cpp @@ -0,0 +1,148 @@ +// $Id$ + +#include "ACEXML/common/SAXExceptions.h" +#include "ACEXML/parser/debug_validator/Debug_Element_Builder.h" + +ACEXML_Debug_Element_Builder::ACEXML_Debug_Element_Builder () + : type_ (UNDEFINED), + root_ (0) +{ +} + +ACEXML_Debug_Element_Builder::~ACEXML_Debug_Element_Builder () +{ + delete this->root_; +} + +int +ACEXML_Debug_Element_Builder::setElementName (const ACEXML_Char *, + const ACEXML_Char *, + const ACEXML_Char *qName ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + this->element_.set (qName, 0); + return 0; +} + +int +ACEXML_Debug_Element_Builder::setContentType (CONTENT_TYPE type ACEXML_ENV_ARG_DECL) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + if (this->type_ == UNDEFINED) + { + this->type_ = type; + return 0; + } + + ACEXML_THROW_RETURN (ACEXML_SAXParseException (ACE_TEXT("Element type redefinition in Debug_Validator.")), -1); +} + +int +ACEXML_Debug_Element_Builder::insertMixedElement (const ACEXML_Char *, + const ACEXML_Char *, + const ACEXML_Char *qName ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + ACEXML_Element_Tree_Name_Node *node; + + // @@ We should "throw" an exception here instead of returning -1. + ACE_NEW_RETURN (node, + ACEXML_Element_Tree_Name_Node (qName), + -1); + + if (this->root_ == 0) + // @@ Memory leak if fail? + ACE_NEW_RETURN (this->root_, + ACEXML_Element_Tree_List_Node (), + -1); + + + return this->root_->insert (node); +} + +int +ACEXML_Debug_Element_Builder::startChildGroup () +{ + ACEXML_Element_Tree_List_Node *lnode; + + ACE_NEW_RETURN (lnode, + ACEXML_Element_Tree_List_Node (), + -1); + + if (this->root_ == 0) + { + this->root_ = lnode; + } + else + { + // @@ check error? + this->root_->insert (lnode); + } + + this->active_list_.push (lnode); + return 0; +} + +int +ACEXML_Debug_Element_Builder::endChildGroup (CARDINALITY ACEXML_ENV_ARG_DECL_NOT_USED) +{ + this->active_list_.pop (); + return 0; +} + +int +ACEXML_Debug_Element_Builder::setChoice () +{ + this->active_list_.top ()->set (ACEXML_Element_Tree_List_Node::CHOICE); + return 0; +} + +int +ACEXML_Debug_Element_Builder::setSequence () +{ + this->active_list_.top ()->set (ACEXML_Element_Tree_List_Node::SEQUENCE); + return 0; +} + +int +ACEXML_Debug_Element_Builder::insertElement (const ACEXML_Char *, + const ACEXML_Char *, + const ACEXML_Char *qName ACEXML_ENV_ARG_DECL_NOT_USED) + ACE_THROW_SPEC ((ACEXML_SAXException)) +{ + ACEXML_Element_Tree_Name_Node *node; + + // @@ We should "throw" an exception here instead of returning -1. + ACE_NEW_RETURN (node, + ACEXML_Element_Tree_Name_Node (qName), + -1); + + return this->active_list_.top ()->insert (node); +} + +void +ACEXML_Debug_Element_Builder::dump () +{ + cout << "<!ELEMENT " << this->element_; + + // @@ Also dump element contentspec here. + switch (this->type_) + { + case EMPTY: + cout << "EMPTY"; + break; + case ANY: + cout << "ANY"; + break; + case MIXED: + case CHILDREN: + // @@ Dump the content of this->root_ + cout << "*** not implemented ***"; + break; + default: + cout << "*** Unidentified element type ***"; + break; + } + + cout << ">" << endl; +} diff --git a/ACE/ACEXML/parser/debug_validator/Debug_Element_Builder.h b/ACE/ACEXML/parser/debug_validator/Debug_Element_Builder.h new file mode 100644 index 00000000000..79443b276ea --- /dev/null +++ b/ACE/ACEXML/parser/debug_validator/Debug_Element_Builder.h @@ -0,0 +1,127 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file Debug_Element_Builder.h + * + * $Id$ + * + * @author Nanbor Wang <nanbor@cs.wustl.edu> + */ +//============================================================================= +#ifndef _ACEXML_DEBUG_ELEMENT_BUILDER_H_ +#define _ACEXML_DEBUG_ELEMENT_BUILDER_H_ + +#include /**/ "ace/pre.h" +#include "ACEXML/parser/debug_validator/Debug_DTD_Manager_Export.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "ACEXML/common/Element_Def_Builder.h" +#include "ACEXML/parser/debug_validator/Element_Tree.h" + +/** + * @class ACEXML_Debug_Element_Builder Debug_Element_Builder.h "parser/debug_validator/Debug_Element_Builder.h" + * + * This class prints out the element definition for debugging purpose. + * + * @todo This class is not namespace-aware. + */ +class ACEXML_DEBUG_DTD_MANAGER_Export ACEXML_Debug_Element_Builder + : public ACEXML_Element_Def_Builder +{ +public: + ACEXML_Debug_Element_Builder (); + + virtual ~ACEXML_Debug_Element_Builder (); + + /** + * Define the name of the element. + * + * @retval 0 if valid, -1 otherwise. + */ + virtual int setElementName (const ACEXML_Char *namespaceURI, + const ACEXML_Char *localName, + const ACEXML_Char *qName ACEXML_ENV_ARG_DECL) + ACE_THROW_SPEC ((ACEXML_SAXException)) + ; + + /** + * Define the content type of the element. + * + * @retval 0 if valid, -1 otherwise. + */ + virtual int setContentType (CONTENT_TYPE type ACEXML_ENV_ARG_DECL) + ACE_THROW_SPEC ((ACEXML_SAXException)) + ; + + /** + * Insert one more element into Mixed definition. + */ + virtual int insertMixedElement (const ACEXML_Char *namespaceURI, + const ACEXML_Char *localName, + const ACEXML_Char *qName ACEXML_ENV_ARG_DECL) + ACE_THROW_SPEC ((ACEXML_SAXException)) + ; + + /** + * Start a new group of children. + */ + virtual int startChildGroup (); + + /** + * End a new group of children. + * + * @retval 0 on success. + */ + virtual int endChildGroup (CARDINALITY card ACEXML_ENV_ARG_DECL); + + /** + * Set the type of current child group to Choice. + * + * @retval 0 on success, -1 if the type of the child group has + * already been set and this action conflicts with the previous + * setting. + */ + virtual int setChoice (); + + /** + * Set the type of current child group to Sequence. + * + * @retval 0 on success, -1 if the type of the child group has + * already been set and this action conflicts with the previous + * setting. + */ + virtual int setSequence (); + + /** + * Insert an new element into the current child group. + * + * @retval 0 on success, -1 otherwise. + */ + virtual int insertElement (const ACEXML_Char *namespaceURI, + const ACEXML_Char *localName, + const ACEXML_Char *qName ACEXML_ENV_ARG_DECL) + ACE_THROW_SPEC ((ACEXML_SAXException)) + ; + + /** + * Dump the content of the attribute definition. + */ + virtual void dump (void); +private: + CONTENT_TYPE type_; + + ACEXML_String element_; + + ACEXML_Element_Tree_List_Node *root_; + + ACEXML_Element_Tree_List_Stack active_list_; +}; + + +#include /**/ "ace/post.h" + +#endif /* _ACEXML_DEBUG_ELEMENT_BUILDER_H_ */ diff --git a/ACE/ACEXML/parser/debug_validator/Element_Tree.cpp b/ACE/ACEXML/parser/debug_validator/Element_Tree.cpp new file mode 100644 index 00000000000..e9275061b52 --- /dev/null +++ b/ACE/ACEXML/parser/debug_validator/Element_Tree.cpp @@ -0,0 +1,72 @@ +// $Id$ + +#include "ACEXML/parser/debug_validator/Element_Tree.h" + +#if !defined (__ACEXML_INLINE__) +# include "ACEXML/parser/debug_validator/Element_Tree.i" +#endif /* __ACEXML_INLINE__ */ + +ACEXML_Element_Tree_Node::~ACEXML_Element_Tree_Node () +{ + delete this->next_; +} + +ACE_ALLOC_HOOK_DEFINE (ACEXML_Element_Tree_Node) + +void +ACEXML_Element_Tree_Name_Node::dump () +{ + cout << this->name_; +} + +ACE_ALLOC_HOOK_DEFINE (ACEXML_Element_Tree_Name_Node) + +ACEXML_Element_Tree_List_Node::~ACEXML_Element_Tree_List_Node (void) +{ + delete this->head_; +} + +int +ACEXML_Element_Tree_List_Node::insert (ACEXML_Element_Tree_Node *node) +{ + if (this->head_ == 0) + { + this->tail_ = this->head_ = node; + } + else + { + this->tail_->next (node); + this->tail_ = node; + } + return 0; +} + +void +ACEXML_Element_Tree_List_Node::dump (void) +{ + ACEXML_Element_Tree_Node *ptr = this->head_; + const ACEXML_Char *separator = (this->type_ == SEQUENCE) ? ACE_TEXT(" , ") : ACE_TEXT(" | "); + + cout << "("; + + if (ptr != 0) + { + ptr->dump (); + ptr = ptr->next (); + + while (ptr != 0) + { + cout << separator; + ptr->dump (); + ptr->next (); + } + } + + cout << ")"; +} + +ACE_ALLOC_HOOK_DEFINE (ACEXML_Element_Tree_List_Node) + + + +ACE_ALLOC_HOOK_DEFINE (ACEXML_Element_Tree_List_Stack) diff --git a/ACE/ACEXML/parser/debug_validator/Element_Tree.h b/ACE/ACEXML/parser/debug_validator/Element_Tree.h new file mode 100644 index 00000000000..a4efdbf1318 --- /dev/null +++ b/ACE/ACEXML/parser/debug_validator/Element_Tree.h @@ -0,0 +1,160 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file Element_Tree.h + * + * $Id$ + * + * @author Nanbor Wang <nanbor@cs.wustl.edu> + */ +//============================================================================= +#ifndef _ACEXML_ELEMENT_TREE_H_ +#define _ACEXML_ELEMENT_TREE_H_ + +#include /**/ "ace/pre.h" +#include "ACEXML/parser/debug_validator/Debug_DTD_Manager_Export.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +#pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "ACEXML/common/XML_Types.h" + +/** + * @class ACEXML_Element_Tree_Node Element_Tree.h "parser/debug_validator/Element_Tree.h" + * + * @brief An abstract base class for describing DTD child element definition. + * + * @sa ACEXML_Element_Tree_Name_Node, ACEXML_Element_Tree_List_Node + */ +class ACEXML_DEBUG_DTD_MANAGER_Export ACEXML_Element_Tree_Node +{ +public: + + /// Default constructor. + ACEXML_Element_Tree_Node (); + + /// Destructor + virtual ~ACEXML_Element_Tree_Node (); + + /// Accessor for next element in chain + ACEXML_Element_Tree_Node *next (); + void next (ACEXML_Element_Tree_Node *n); + + /// Displaying the content. + virtual void dump () = 0; + + ACE_ALLOC_HOOK_DECLARE; + +protected: + ACEXML_Element_Tree_Node *next_; +}; + +/** + * @class ACEXML_Element_Tree_Name_Node Element_Tree.h "parser/debug_validator/Element_Tree.h" + * + * @brief An abstract base class for describing a name node in a DTD child + * element definition. + * + * @sa ACEXML_Element_Tree_Node, ACEXML_Element_Tree_List_Node + */ +class ACEXML_DEBUG_DTD_MANAGER_Export ACEXML_Element_Tree_Name_Node + : public ACEXML_Element_Tree_Node +{ +public: + /// Constructor. + ACEXML_Element_Tree_Name_Node (const ACEXML_Char *name, + int release = 1); + + /// Change the name of this node. + void set (const ACEXML_Char *name, + int release = 1); + + virtual void dump (); + + ACE_ALLOC_HOOK_DECLARE; +protected: + ACEXML_String name_; +}; + +class ACEXML_Element_Tree_List_Stack; + +/** + * @class ACEXML_Element_Tree_List_Node Element_Tree.h "parser/debug_validator/Element_Tree.h" + * + * @brief An abstract base class for describing a node list in a DTD child + * element definition. + * + * @sa ACEXML_Element_Tree_Node, ACEXML_Element_Tree_Name_Node + */ +class ACEXML_DEBUG_DTD_MANAGER_Export ACEXML_Element_Tree_List_Node + : public ACEXML_Element_Tree_Node +{ +public: + friend class ACEXML_Element_Tree_List_Stack; + + typedef enum { + SEQUENCE, + CHOICE + } LIST_TYPE; + + /// Default constructor. + ACEXML_Element_Tree_List_Node (void); + + /// Destructor. + virtual ~ACEXML_Element_Tree_List_Node (void); + + /// Insert a new ACEXML_Element_Tree_Node into the list. + int insert (ACEXML_Element_Tree_Node *node); + + /// Get/set the type of list. + LIST_TYPE get (void); + int set (LIST_TYPE type); + + virtual void dump (); + + ACE_ALLOC_HOOK_DECLARE; +protected: + LIST_TYPE type_; + + ACEXML_Element_Tree_Node *head_; + + ACEXML_Element_Tree_Node *tail_; + + ACEXML_Element_Tree_List_Node *pop_next_; +}; + +/** + * @class ACEXML_Element_Tree_List_Stack Element_Tree.h "parser/debug_validator/Element_Tree.h" + * + * @brief A class for managing a stack of ACEXML_Element_Tree_List_Node's. + * + * @sa ACEXML_Element_Tree_List_Node + */ +class ACEXML_DEBUG_DTD_MANAGER_Export ACEXML_Element_Tree_List_Stack +{ +public: + ACEXML_Element_Tree_List_Stack (); + + void push (ACEXML_Element_Tree_List_Node *n); + + ACEXML_Element_Tree_List_Node *pop (void); + + ACEXML_Element_Tree_List_Node *top (void); + + int empty (void); + + ACE_ALLOC_HOOK_DECLARE; + +protected: + ACEXML_Element_Tree_List_Node *top_; +}; + +#if defined (__ACEXML_INLINE__) +# include "ACEXML/parser/debug_validator/Element_Tree.i" +#endif /* __ACEXML_INLINE__ */ + +#include /**/ "ace/post.h" + +#endif /* _ACEXML_ELEMENT_TREE_H_ */ diff --git a/ACE/ACEXML/parser/debug_validator/Element_Tree.i b/ACE/ACEXML/parser/debug_validator/Element_Tree.i new file mode 100644 index 00000000000..4b408835403 --- /dev/null +++ b/ACE/ACEXML/parser/debug_validator/Element_Tree.i @@ -0,0 +1,92 @@ +// $Id$ + +ACEXML_INLINE +ACEXML_Element_Tree_Node::ACEXML_Element_Tree_Node () + : next_ (0) +{ +} + +ACEXML_INLINE ACEXML_Element_Tree_Node * +ACEXML_Element_Tree_Node::next () +{ + return this->next_; +} + +ACEXML_INLINE void +ACEXML_Element_Tree_Node::next (ACEXML_Element_Tree_Node * n) +{ + this->next_ = n; +} + +ACEXML_INLINE +ACEXML_Element_Tree_Name_Node::ACEXML_Element_Tree_Name_Node (const ACEXML_Char *name, + int release) + : name_ (name, 0, release) +{ +} + +ACEXML_INLINE void +ACEXML_Element_Tree_Name_Node::set (const ACEXML_Char *name, + int release) +{ + this->name_.set (name, release); +} + +ACEXML_INLINE +ACEXML_Element_Tree_List_Node::ACEXML_Element_Tree_List_Node (void) + : type_ (SEQUENCE), + head_ (0), + tail_ (0), + pop_next_ (0) +{ +} + +ACEXML_INLINE ACEXML_Element_Tree_List_Node::LIST_TYPE +ACEXML_Element_Tree_List_Node::get (void) +{ + return this->type_; +} + +ACEXML_INLINE int +ACEXML_Element_Tree_List_Node::set (ACEXML_Element_Tree_List_Node::LIST_TYPE type) +{ + this->type_ = type; + return 0; +} + +ACEXML_INLINE +ACEXML_Element_Tree_List_Stack::ACEXML_Element_Tree_List_Stack (void) + : top_ (0) +{ +} + +ACEXML_INLINE ACEXML_Element_Tree_List_Node * +ACEXML_Element_Tree_List_Stack::top () +{ + return this->top_; +} + +ACEXML_INLINE void +ACEXML_Element_Tree_List_Stack::push (ACEXML_Element_Tree_List_Node *n) +{ + n->pop_next_ = this->top_; + this->top_ = n; +} + +ACEXML_INLINE ACEXML_Element_Tree_List_Node * +ACEXML_Element_Tree_List_Stack::pop () +{ + if (this->top_ != 0) + { + ACEXML_Element_Tree_List_Node *ptr = this->top_; + this->top_ = this->top_->pop_next_; + return ptr; + } + return 0; +} + +ACEXML_INLINE int +ACEXML_Element_Tree_List_Stack::empty () +{ + return this->top_ == 0; +} |