You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by am...@apache.org on 2013/08/19 10:03:01 UTC

svn commit: r1515307 - in /xerces/c/trunk: src/xercesc/validators/schema/identity/ tests/src/XSTSHarness/regression/ tests/src/XSTSHarness/regression/XERCESC-2017/

Author: amassari
Date: Mon Aug 19 08:03:01 2013
New Revision: 1515307

URL: http://svn.apache.org/r1515307
Log:
When matching an XPath expression that is an union of several XPaths, keep track of the location where each part has been matched; one of the parts could match inside the subtree where another one has already matched, and we would not record it (XERCESC-2017)

Added:
    xerces/c/trunk/tests/src/XSTSHarness/regression/XERCESC-2017/
    xerces/c/trunk/tests/src/XSTSHarness/regression/XERCESC-2017/test.xml
    xerces/c/trunk/tests/src/XSTSHarness/regression/XERCESC-2017/test.xsd
    xerces/c/trunk/tests/src/XSTSHarness/regression/XERCESC-2017/test2.xml
Modified:
    xerces/c/trunk/src/xercesc/validators/schema/identity/IC_Selector.cpp
    xerces/c/trunk/src/xercesc/validators/schema/identity/IC_Selector.hpp
    xerces/c/trunk/src/xercesc/validators/schema/identity/XPathMatcher.hpp
    xerces/c/trunk/tests/src/XSTSHarness/regression/Xerces.testSet

Modified: xerces/c/trunk/src/xercesc/validators/schema/identity/IC_Selector.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/validators/schema/identity/IC_Selector.cpp?rev=1515307&r1=1515306&r2=1515307&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/validators/schema/identity/IC_Selector.cpp (original)
+++ xerces/c/trunk/src/xercesc/validators/schema/identity/IC_Selector.cpp Mon Aug 19 08:03:01 2013
@@ -41,10 +41,21 @@ SelectorMatcher::SelectorMatcher(XercesX
     : XPathMatcher(xpath, selector->getIdentityConstraint(), manager)
     , fInitialDepth(initialDepth)
     , fElementDepth(0)
-    , fMatchedDepth(-1)
+    , fMatchedDepth(0)
     , fSelector(selector)
     , fFieldActivator(fieldActivator)
 {
+    fMatchedDepth = (int*) fMemoryManager->allocate
+    (
+        fLocationPathSize * sizeof(int)
+    );//new int[fLocationPathSize];
+    for(XMLSize_t k = 0;k<fLocationPathSize;k++)
+        fMatchedDepth[k] = -1;
+}
+
+SelectorMatcher::~SelectorMatcher()
+{
+    fMemoryManager->deallocate(fMatchedDepth);//delete [] fMatchedDepth;
 }
 
 // ---------------------------------------------------------------------------
@@ -54,7 +65,8 @@ void SelectorMatcher::startDocumentFragm
 
     XPathMatcher::startDocumentFragment();
     fElementDepth = 0;
-    fMatchedDepth = -1;
+    for(XMLSize_t k = 0;k<fLocationPathSize;k++)
+        fMatchedDepth[k] = -1;
 }
 
 void SelectorMatcher::startElement(const XMLElementDecl& elemDecl,
@@ -68,21 +80,28 @@ void SelectorMatcher::startElement(const
     XPathMatcher::startElement(elemDecl, urlId, elemPrefix, attrList, attrCount, validationContext);
     fElementDepth++;
 
-    // activate the fields, if selector is matched
-    unsigned char matched = isMatched();
-    if ((fMatchedDepth == -1 && ((matched & XP_MATCHED) == XP_MATCHED))
-        || ((matched & XP_MATCHED_D) == XP_MATCHED_D)) {
-
-        IdentityConstraint* ic = fSelector->getIdentityConstraint();
-        XMLSize_t count = ic->getFieldCount();
-
-        fMatchedDepth = fElementDepth;
-        fFieldActivator->startValueScopeFor(ic, fInitialDepth);
-
-        for (XMLSize_t i = 0; i < count; i++) {
-
-            XPathMatcher* matcher = fFieldActivator->activateField(ic->getFieldAt(i), fInitialDepth);
-            matcher->startElement(elemDecl, urlId, elemPrefix, attrList, attrCount, validationContext);
+    for(XMLSize_t k = 0;k<fLocationPathSize;k++)
+    {
+        // use the match flag of each member of the union
+        unsigned char matched = 0;
+        if (((fMatched[k] & XP_MATCHED) == XP_MATCHED)
+            && ((fMatched[k] & XP_MATCHED_DP) != XP_MATCHED_DP))
+            matched = fMatched[k];
+        if ((fMatchedDepth[k] == -1 && ((matched & XP_MATCHED) == XP_MATCHED))
+            || ((matched & XP_MATCHED_D) == XP_MATCHED_D)) {
+
+            IdentityConstraint* ic = fSelector->getIdentityConstraint();
+            XMLSize_t count = ic->getFieldCount();
+
+            fMatchedDepth[k] = fElementDepth;
+            fFieldActivator->startValueScopeFor(ic, fInitialDepth);
+
+            for (XMLSize_t i = 0; i < count; i++) {
+
+                XPathMatcher* matcher = fFieldActivator->activateField(ic->getFieldAt(i), fInitialDepth);
+                matcher->startElement(elemDecl, urlId, elemPrefix, attrList, attrCount, validationContext);
+            }
+            break;
         }
     }
 }
@@ -95,11 +114,16 @@ void SelectorMatcher::endElement(const X
 
     XPathMatcher::endElement(elemDecl, elemContent, validationContext, actualValidator);
 
-    if (fElementDepth-- == fMatchedDepth) {
+    for(XMLSize_t k = 0;k<fLocationPathSize;k++)
+    {
+        if (fElementDepth == fMatchedDepth[k]) {
 
-        fMatchedDepth = -1;
-        fFieldActivator->endValueScopeFor(fSelector->getIdentityConstraint(), fInitialDepth);
+            fMatchedDepth[k] = -1;
+            fFieldActivator->endValueScopeFor(fSelector->getIdentityConstraint(), fInitialDepth);
+            break;
+        }
     }
+    --fElementDepth;
 }
 
 // ---------------------------------------------------------------------------

Modified: xerces/c/trunk/src/xercesc/validators/schema/identity/IC_Selector.hpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/validators/schema/identity/IC_Selector.hpp?rev=1515307&r1=1515306&r2=1515307&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/validators/schema/identity/IC_Selector.hpp (original)
+++ xerces/c/trunk/src/xercesc/validators/schema/identity/IC_Selector.hpp Mon Aug 19 08:03:01 2013
@@ -95,7 +95,7 @@ public:
     // -----------------------------------------------------------------------
     //  Constructors/Destructor
     // -----------------------------------------------------------------------
-    ~SelectorMatcher() {}
+    ~SelectorMatcher();
 
     int getInitialDepth() const { return fInitialDepth; }
 
@@ -140,7 +140,7 @@ private:
     // -----------------------------------------------------------------------
     int             fInitialDepth;
     int             fElementDepth;
-    int             fMatchedDepth;
+    int*            fMatchedDepth;
     IC_Selector*    fSelector;
     FieldActivator* fFieldActivator;
 };

Modified: xerces/c/trunk/src/xercesc/validators/schema/identity/XPathMatcher.hpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/validators/schema/identity/XPathMatcher.hpp?rev=1515307&r1=1515306&r2=1515307&view=diff
==============================================================================
--- xerces/c/trunk/src/xercesc/validators/schema/identity/XPathMatcher.hpp (original)
+++ xerces/c/trunk/src/xercesc/validators/schema/identity/XPathMatcher.hpp Mon Aug 19 08:03:01 2013
@@ -126,6 +126,7 @@ private:
     void init(XercesXPath* const xpath);
     void cleanUp();
 
+protected:
     // -----------------------------------------------------------------------
     //  Data members
     //

Added: xerces/c/trunk/tests/src/XSTSHarness/regression/XERCESC-2017/test.xml
URL: http://svn.apache.org/viewvc/xerces/c/trunk/tests/src/XSTSHarness/regression/XERCESC-2017/test.xml?rev=1515307&view=auto
==============================================================================
--- xerces/c/trunk/tests/src/XSTSHarness/regression/XERCESC-2017/test.xml (added)
+++ xerces/c/trunk/tests/src/XSTSHarness/regression/XERCESC-2017/test.xml Mon Aug 19 08:03:01 2013
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<CONFIG xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd">
+	<DBS>
+		<DB ID="D"/>
+		<VDB ID="V">
+			<PARTS>
+				<PART_DB ID="V1"/>
+				<PART_DB ID="V2"/>
+			</PARTS>
+		</VDB>
+	</DBS>
+	<HOSTS>
+		<HOST ID="host1">
+			<DBS>
+				<DB ID="D"/>
+				<DB ID="V1"/>
+				<DB ID="V2"/>
+			</DBS>
+			<VDBS>
+				<DB ID="V"/>
+			</VDBS>
+		</HOST>
+	</HOSTS>
+</CONFIG>
\ No newline at end of file

Added: xerces/c/trunk/tests/src/XSTSHarness/regression/XERCESC-2017/test.xsd
URL: http://svn.apache.org/viewvc/xerces/c/trunk/tests/src/XSTSHarness/regression/XERCESC-2017/test.xsd?rev=1515307&view=auto
==============================================================================
--- xerces/c/trunk/tests/src/XSTSHarness/regression/XERCESC-2017/test.xsd (added)
+++ xerces/c/trunk/tests/src/XSTSHarness/regression/XERCESC-2017/test.xsd Mon Aug 19 08:03:01 2013
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+  <xs:element name="CONFIG">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="DBS"/>
+        <xs:element ref="HOSTS"/>
+      </xs:sequence>
+    </xs:complexType>
+	<xs:key name="DbIdKey">
+		<xs:selector xpath="./DBS/DB|./DBS/VDB|./DBS/VDB/PARTS/PART_DB" />
+		<xs:field xpath="@ID" />
+	</xs:key>
+	<xs:keyref name="DbIdRef" refer="DbIdKey">
+		<xs:selector xpath="./HOSTS/HOST/DBS/DB|./HOSTS/HOST/VDBS/DB" />
+		<xs:field xpath="@ID" />
+	</xs:keyref>
+  </xs:element>
+  <xs:element name="HOSTS">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="HOST"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="HOST">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="DBS"/>
+        <xs:element ref="VDBS"/>
+      </xs:sequence>
+      <xs:attribute name="ID" use="required" type="xs:NCName"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="VDBS">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="DB"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="DBS">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="DB"/>
+        <xs:element minOccurs="0" ref="VDB"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="VDB">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element ref="PARTS"/>
+      </xs:sequence>
+      <xs:attribute name="ID" use="required" type="xs:NCName"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="PARTS">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element maxOccurs="unbounded" ref="PART_DB"/>
+      </xs:sequence>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="PART_DB">
+    <xs:complexType>
+      <xs:attribute name="ID" use="required" type="xs:NCName"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="DB">
+    <xs:complexType>
+      <xs:attribute name="ID" use="required" type="xs:NCName"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>

Added: xerces/c/trunk/tests/src/XSTSHarness/regression/XERCESC-2017/test2.xml
URL: http://svn.apache.org/viewvc/xerces/c/trunk/tests/src/XSTSHarness/regression/XERCESC-2017/test2.xml?rev=1515307&view=auto
==============================================================================
--- xerces/c/trunk/tests/src/XSTSHarness/regression/XERCESC-2017/test2.xml (added)
+++ xerces/c/trunk/tests/src/XSTSHarness/regression/XERCESC-2017/test2.xml Mon Aug 19 08:03:01 2013
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<CONFIG xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd">
+	<DBS>
+		<DB ID="D"/>
+		<VDB ID="V">
+			<PARTS>
+				<PART_DB ID="V11"/>
+				<PART_DB ID="V21"/>
+			</PARTS>
+		</VDB>
+	</DBS>
+	<HOSTS>
+		<HOST ID="host1">
+			<DBS>
+				<DB ID="D"/>
+				<DB ID="V1"/>
+				<DB ID="V2"/>
+			</DBS>
+			<VDBS>
+				<DB ID="V"/>
+			</VDBS>
+		</HOST>
+	</HOSTS>
+</CONFIG>
\ No newline at end of file

Modified: xerces/c/trunk/tests/src/XSTSHarness/regression/Xerces.testSet
URL: http://svn.apache.org/viewvc/xerces/c/trunk/tests/src/XSTSHarness/regression/Xerces.testSet?rev=1515307&r1=1515306&r2=1515307&view=diff
==============================================================================
--- xerces/c/trunk/tests/src/XSTSHarness/regression/Xerces.testSet (original)
+++ xerces/c/trunk/tests/src/XSTSHarness/regression/Xerces.testSet Mon Aug 19 08:03:01 2013
@@ -842,4 +842,25 @@
       <current status="accepted" date="2010-09-28"/>
     </instanceTest>
   </testGroup>
+  <testGroup name="XERCESC-2017">
+    <annotation>
+      <documentation>XPath selector with multiple matches stops matching in a subtree once one match succeeds</documentation>
+    </annotation>
+    <documentationReference xlink:href="https://issues.apache.org/jira/browse/XERCESC-2017"/>
+    <schemaTest name="XERCESC-2017-1">
+      <schemaDocument xlink:href="./XERCESC-2017/test.xsd"/>
+      <expected validity="valid"/>
+      <current status="accepted" date="2013-08-18"/>
+    </schemaTest>
+    <instanceTest name="XERCESC-2017-2">
+      <instanceDocument xlink:href="./XERCESC-2017/test.xml"/>
+      <expected validity="valid"/>
+      <current status="accepted" date="2013-08-18"/>
+    </instanceTest>
+    <instanceTest name="XERCESC-2017-3">
+      <instanceDocument xlink:href="./XERCESC-2017/test2.xml"/>
+      <expected validity="invalid"/>
+      <current status="accepted" date="2013-08-18"/>
+    </instanceTest>
+  </testGroup>
 </testSet>



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