You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by ro...@apache.org on 2006/08/08 14:40:39 UTC

svn commit: r429639 - in /incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo: SAX2Attributes.cpp SAX2Attributes.h SDOSchemaSAX2Parser.cpp SDOSchemaSAX2Parser.h

Author: robbinspg
Date: Tue Aug  8 05:40:38 2006
New Revision: 429639

URL: http://svn.apache.org/viewvc?rev=429639&view=rev
Log:
TUSCANY-587 Pass the maxOccurs attribute from the <group ref= definition to the top level choice/sequence elements of the group

Modified:
    incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SAX2Attributes.cpp
    incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SAX2Attributes.h
    incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.cpp
    incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.h

Modified: incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SAX2Attributes.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SAX2Attributes.cpp?rev=429639&r1=429638&r2=429639&view=diff
==============================================================================
--- incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SAX2Attributes.cpp (original)
+++ incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SAX2Attributes.cpp Tue Aug  8 05:40:38 2006
@@ -56,7 +56,37 @@
             return attributes.size();
         }
         
-        
+
+        const SAX2Attribute* SAX2Attributes::getAttribute(const SDOXMLString& attributeName) const
+        {
+            for (int i=0; i < attributes.size(); i++)
+            {
+                if (attributes[i].getName().equalsIgnoreCase(attributeName))
+                {
+                    return &attributes[i];
+                }
+            }
+            return NULL;
+        }
+
+        void SAX2Attributes::addAttribute(const SAX2Attribute& attr)
+        {
+            for (int i=0; i < attributes.size(); i++)
+            {
+                if (attributes[i].getUri().equals(attr.getUri()))
+                {                    
+                    if (attributes[i].getName().equals(attr.getName()))
+                    {
+                        // oeverwrite this attribute
+                        attributes[i] = attr;
+                        return;
+                    }
+                }
+            }           
+            attributes.insert(attributes.end(), attr);
+        }
+
+
         const SDOXMLString SAX2Attributes::nullValue;
         
         const SDOXMLString& SAX2Attributes::getValue(

Modified: incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SAX2Attributes.h
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SAX2Attributes.h?rev=429639&r1=429638&r2=429639&view=diff
==============================================================================
--- incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SAX2Attributes.h (original)
+++ incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SAX2Attributes.h Tue Aug  8 05:40:38 2006
@@ -58,7 +58,11 @@
 
             const SDOXMLString& getValue(
                 const SDOXMLString& attributeName) const; 
-            
+
+            const SAX2Attribute* getAttribute(
+                const SDOXMLString& attributeName) const; 
+
+            void addAttribute(const SAX2Attribute& attr);
         private:
             typedef std::vector<SAX2Attribute> ATTRIBUTE_LIST;
             ATTRIBUTE_LIST    attributes;

Modified: incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.cpp
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.cpp?rev=429639&r1=429638&r2=429639&view=diff
==============================================================================
--- incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.cpp (original)
+++ incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.cpp Tue Aug  8 05:40:38 2006
@@ -87,7 +87,8 @@
         void SDOSchemaSAX2Parser::replayEvents(
             const SDOXMLString& uri,
             const SDOXMLString& name,
-            bool isGroup)
+            bool isGroup,
+            const SAX2Attributes& groupAttributes)
         {
             for (int i=0;i< groupList.size(); i++)
             {
@@ -101,10 +102,33 @@
                        || uri.equals(groupList[i].uri))
                        )
                     {
+                        // Determine the maxOccurs value from the <group ref=... definition
+                        bool isMany = false;
+                        const SAX2Attribute* groupMaxOccurrs = groupAttributes.getAttribute("maxOccurs");
+                        if  (groupMaxOccurrs != 0 &&
+                            !groupMaxOccurrs->getValue().equalsIgnoreCase("1"))
+                        {
+                            isMany = true;
+                        }
+
+                        int level = 0;
+
                         for (int j=0;j< groupList[i].events.size();j++)
                         {
                             if (groupList[i].events[j].isStartEvent)
                             {
+                                // For top level <choice> or <sequence> we need to add the maxOccurrs
+                                // attribute from the group definition if it was "many"
+                                if ((level == 0) && isMany)
+                                {
+                                    if (groupList[i].events[j].localname.equalsIgnoreCase("choice") 
+                                        || groupList[i].events[j].localname.equalsIgnoreCase("sequence"))
+                                    {
+                                        // Add maxOccurs attribute to list
+                                        groupList[i].events[j].attributes.addAttribute(*groupMaxOccurrs);
+                                    }
+                                }
+
                                 startElementNs(
                                  (const SDOXMLString&)
                                  groupList[i].events[j].localname,
@@ -116,6 +140,8 @@
                                  groupList[i].events[j].namespaces,
                                  (const SAX2Attributes&) 
                                  groupList[i].events[j].attributes);
+
+                                level++;
                             }
                             else
                             {
@@ -126,6 +152,8 @@
                                  groupList[i].events[j].prefix,
                                  (const SDOXMLString&) 
                                  groupList[i].events[j].URI);
+
+                                level--;
                             }
                         }
                         return;
@@ -327,12 +355,12 @@
                                     if (qname.getURI().isNull())
                                     {
                                         replayEvents(schemaInfo.getTargetNamespaceURI(), qname.getLocalName(),
-                                        localname.equalsIgnoreCase("group"));
+                                        localname.equalsIgnoreCase("group"), attributes);
                                     }
                                     else
                                     {
                                         replayEvents(qname.getURI(), qname.getLocalName(),
-                                            localname.equalsIgnoreCase("group"));
+                                            localname.equalsIgnoreCase("group"), attributes);
                                     }
                                 }                        
                             }

Modified: incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.h
URL: http://svn.apache.org/viewvc/incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.h?rev=429639&r1=429638&r2=429639&view=diff
==============================================================================
--- incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.h (original)
+++ incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.h Tue Aug  8 05:40:38 2006
@@ -99,7 +99,8 @@
             virtual void replayEvents(
                 const SDOXMLString& uri,
                 const SDOXMLString& name,
-                bool isGroup);
+                bool isGroup,
+                const SAX2Attributes& groupAttributes);
 
             virtual void storeStartElementEvent(
                                 const SDOXMLString& localname,



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org