From 2d6b458aaab5eeb4829b1af9e4160e1561e58d40 Mon Sep 17 00:00:00 2001
From: Khaled Noaman <knoaman@apache.org>
Date: Sun, 23 Nov 2003 16:21:40 +0000
Subject: [PATCH] PSVI: create local elements of complex types

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@175433 13f79535-47bb-0310-9956-ffa450edef68
---
 src/xercesc/internal/XSObjectFactory.cpp | 26 +++++++++++++++++++++---
 src/xercesc/internal/XSObjectFactory.hpp |  4 ++++
 2 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/src/xercesc/internal/XSObjectFactory.cpp b/src/xercesc/internal/XSObjectFactory.cpp
index 18c9b8a1e..44fed0e28 100644
--- a/src/xercesc/internal/XSObjectFactory.cpp
+++ b/src/xercesc/internal/XSObjectFactory.cpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.3  2003/11/23 16:21:40  knoaman
+ * PSVI: create local elements of complex types
+ *
  * Revision 1.2  2003/11/21 22:34:46  neilg
  * More schema component model implementation, thanks to David Cargill.
  * In particular, this cleans up and completes the XSModel, XSNamespaceItem,
@@ -342,7 +345,8 @@ XSObjectFactory::addOrFind(DatatypeValidator* const validator,
 
 XSElementDeclaration*
 XSObjectFactory::addOrFind(SchemaElementDecl* const elemDecl,
-                           XSModel* const xsModel)
+                           XSModel* const xsModel,
+                           XSComplexTypeDefinition* enclosingTypeDef)
 {
     XSElementDeclaration* xsObj = (XSElementDeclaration*) getObjectFromMap(elemDecl, xsModel);
     if (!xsObj)
@@ -391,6 +395,13 @@ XSObjectFactory::addOrFind(SchemaElementDecl* const elemDecl,
             }
         }
 
+        XSConstants::SCOPE elemScope = XSConstants::SCOPE_ABSENT;
+
+        if (enclosingTypeDef)
+            elemScope = XSConstants::SCOPE_LOCAL;
+        else if (elemDecl->getEnclosingScope() == Grammar::TOP_LEVEL_SCOPE)
+            elemScope = XSConstants::SCOPE_GLOBAL;
+
         xsObj = new (fMemoryManager) XSElementDeclaration
         (
             elemDecl
@@ -399,6 +410,8 @@ XSObjectFactory::addOrFind(SchemaElementDecl* const elemDecl,
             , getAnnotationFromModel(xsModel, elemDecl)
             , icMap
             , xsModel
+            , elemScope
+            , enclosingTypeDef
             , fMemoryManager
         );
         putObjectInMap(elemDecl, xsObj, xsModel);
@@ -467,8 +480,15 @@ XSObjectFactory::addOrFind(ComplexTypeInfo* const typeInfo,
         );
         putObjectInMap(typeInfo, xsObj, xsModel);
 
-        // REVISIT
-        // process elements
+        // process local elements
+        unsigned int elemCount = typeInfo->elementCount();
+        for (unsigned int j=0; j<elemCount; j++)
+        {
+            SchemaElementDecl* elemDecl = typeInfo->elementAt(j);
+
+            if (elemDecl->getEnclosingScope() == typeInfo->getScopeDefined())
+                addOrFind(elemDecl, xsModel, xsObj);
+        }
     }
 
     return xsObj;
diff --git a/src/xercesc/internal/XSObjectFactory.hpp b/src/xercesc/internal/XSObjectFactory.hpp
index 67f9e9621..fd305dbe8 100644
--- a/src/xercesc/internal/XSObjectFactory.hpp
+++ b/src/xercesc/internal/XSObjectFactory.hpp
@@ -56,6 +56,9 @@
 
 /*
  * $Log$
+ * Revision 1.2  2003/11/23 16:21:40  knoaman
+ * PSVI: create local elements of complex types
+ *
  * Revision 1.1  2003/11/21 17:11:24  knoaman
  * Initial revision
  *
@@ -139,6 +142,7 @@ private:
     (
         SchemaElementDecl* const elemDecl
         , XSModel* const xsModel
+        , XSComplexTypeDefinition* const enclosingTypeDef = 0
     );
 
     XSComplexTypeDefinition* addOrFind
-- 
GitLab