You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@daffodil.apache.org by sl...@apache.org on 2020/09/11 16:48:53 UTC

[incubator-daffodil] branch master updated: Added SDWs for discouraged assert and discriminator placements

This is an automated email from the ASF dual-hosted git repository.

slawrence pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-daffodil.git


The following commit(s) were added to refs/heads/master by this push:
     new 8afd972  Added SDWs for discouraged assert and discriminator placements
8afd972 is described below

commit 8afd9727f53f99cb1e7f21f08769be8727b73989
Author: Steinberger <rs...@tresys.com>
AuthorDate: Fri Aug 28 11:25:59 2020 -0400

    Added SDWs for discouraged assert and discriminator placements
    
    Modified: SequenceGroup adding checkDiscrimAndAssertPlacement
    to check for miplaced assert and discriminators
    Modified: discriminator.tdml
    adding discrimPlacementSDW and assertPlacementSDW
    Modified: TestDiscriminators.scala to add runners
    Modified: daffodil-propgen dafext.xsd adding new warnings
    
    Daffodil-2277
---
 .../org/apache/daffodil/dsom/SequenceGroup.scala   | 16 ++++
 .../resources/org/apache/daffodil/xsd/dafext.xsd   |  2 +
 .../section07/discriminators/discriminator.tdml    | 88 ++++++++++++++++++++++
 .../discriminators/TestDiscriminators.scala        |  4 +
 4 files changed, 110 insertions(+)

diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SequenceGroup.scala b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SequenceGroup.scala
index e2ec844..287ca32 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SequenceGroup.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/dsom/SequenceGroup.scala
@@ -26,6 +26,7 @@ import org.apache.daffodil.xml.XMLUtils
 import org.apache.daffodil.schema.annotation.props.gen.OccursCountKind
 import org.apache.daffodil.schema.annotation.props.gen.SequenceKind
 import org.apache.daffodil.Implicits.ns2String
+import org.apache.daffodil.api.WarnID
 import org.apache.daffodil.dsom.walker.SequenceView
 import org.apache.daffodil.grammar.SequenceGrammarMixin
 import org.apache.daffodil.schema.annotation.props.Found
@@ -41,6 +42,7 @@ import org.apache.daffodil.exceptions.Assert
 import org.apache.daffodil.runtime1.ChoiceBranchImpliedSequenceRuntime1Mixin
 import org.apache.daffodil.schema.annotation.props.FindPropertyMixin
 
+
 /**
  * Base for anything sequence-like.
  *
@@ -92,6 +94,8 @@ abstract class SequenceGroupTermBase(
 
   requiredEvaluationsIfActivated(checkIfValidUnorderedSequence)
 
+  requiredEvaluationsIfActivated(checkIfNonEmptyAndDiscrimsOrAsserts)
+
   protected def apparentXMLChildren: Seq[Node]
 
   final override lazy val hasDelimiters = hasInitiator || hasTerminator || hasSeparator
@@ -148,6 +152,18 @@ abstract class SequenceGroupTermBase(
   }.value
 
   /**
+   * Provides validation for assert and discriminator placement
+   */
+  protected final lazy val checkIfNonEmptyAndDiscrimsOrAsserts: Unit = {
+    val msg = "Counterintuitive placement detected. Wrap the discriminator or assert " +
+      "in an empty sequence to evaluate before the contents."
+    if (groupMembers.size > 0 && discriminatorStatements.size > 0)
+      SDW(WarnID.DiscouragedDiscriminatorPlacement, msg)
+    if (groupMembers.size > 0 && assertStatements.size > 0)
+      SDW(WarnID.DiscouragedAssertPlacement, msg)
+  }
+
+  /**
    * Provides unordered sequence checks.  Will SDE if invalid.
    */
   protected final lazy val checkIfValidUnorderedSequence: Unit = {
diff --git a/daffodil-propgen/src/main/resources/org/apache/daffodil/xsd/dafext.xsd b/daffodil-propgen/src/main/resources/org/apache/daffodil/xsd/dafext.xsd
index 64fe2ed..57f31e7 100644
--- a/daffodil-propgen/src/main/resources/org/apache/daffodil/xsd/dafext.xsd
+++ b/daffodil-propgen/src/main/resources/org/apache/daffodil/xsd/dafext.xsd
@@ -453,6 +453,8 @@
           <xs:enumeration value="deprecatedPropertyDFDLXError" />
           <xs:enumeration value="deprecatedPropertyDFDLError" />
           <xs:enumeration value="deprecatedPropertySeparatorPolicy" />
+          <xs:enumeration value="discouragedDiscriminatorPlacement" />
+          <xs:enumeration value="discouragedAssertPlacement" />
           <xs:enumeration value="emptyElementParsePolicyError" />
           <xs:enumeration value="encodingErrorPolicyError" />
           <xs:enumeration value="escapeSchemeRefUndefined" />
diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/section07/discriminators/discriminator.tdml b/daffodil-test/src/test/resources/org/apache/daffodil/section07/discriminators/discriminator.tdml
index a4e4c87..93629b6 100644
--- a/daffodil-test/src/test/resources/org/apache/daffodil/section07/discriminators/discriminator.tdml
+++ b/daffodil-test/src/test/resources/org/apache/daffodil/section07/discriminators/discriminator.tdml
@@ -28,6 +28,94 @@
   defaultRoundTrip="true" 
   defaultValidation="on">
 
+  <tdml:defineSchema name="discrimAssertPlacement">
+    <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
+    <dfdl:format ref="ex:GeneralFormat" />
+
+    <xs:element name="root-discrim" dfdl:lengthKind="implicit" >
+      <xs:complexType>
+        <xs:sequence dfdl:separator="," dfdl:separatorPosition="infix">
+          <xs:annotation>
+            <xs:appinfo source="http://www.ogf.org/dfdl/">
+              <dfdl:discriminator testKind="pattern"
+                                  testPattern="\p{L}{3}"
+                                  message="discriminator failed for pattern '\p{L}{3}'" />
+            </xs:appinfo>
+          </xs:annotation>
+          <xs:element ref="ex:description" dfdl:lengthKind="delimited"/>
+          <xs:element ref="ex:quantity" dfdl:lengthKind="delimited"/>
+        </xs:sequence>
+      </xs:complexType>
+    </xs:element>
+
+    <xs:element name="root-assert" dfdl:lengthKind="implicit" >
+      <xs:complexType>
+        <xs:sequence dfdl:separator="," dfdl:separatorPosition="infix">
+          <xs:annotation>
+            <xs:appinfo source="http://www.ogf.org/dfdl/">
+              <dfdl:assert testKind="pattern"
+                                  testPattern="\p{L}{3}"
+                                  message="assert failed for pattern '\p{L}{3}'" />
+            </xs:appinfo>
+          </xs:annotation>
+          <xs:element ref="ex:description" dfdl:lengthKind="delimited"/>
+          <xs:element ref="ex:quantity" dfdl:lengthKind="delimited"/>
+        </xs:sequence>
+      </xs:complexType>
+    </xs:element>
+
+    <xs:element name="description" type="xs:string" />
+    <xs:element name="quantity" type="xs:int" />
+  </tdml:defineSchema>
+
+  <!--
+  Test name: discrimPlacementSDW
+  Schema: discrimPlacement, root root-discrim
+  Purpose: This test demonstrates the SDW resulting from discouraged discriminator placement
+  -->
+
+  <tdml:parserTestCase name="discrimPlacementSDW"
+                       root="root-discrim" model="discrimAssertPlacement"
+                       description="This test demonstrates the SDW resulting from discouraged discriminator placement">
+    <tdml:document>Hat,2</tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <root-discrim>
+          <description>Hat</description>
+          <quantity>2</quantity>
+        </root-discrim>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+    <tdml:warnings>
+      <tdml:warning>Schema Definition Warning</tdml:warning>
+      <tdml:warning>Wrap the discriminator or assert in an empty sequence</tdml:warning>
+    </tdml:warnings>
+  </tdml:parserTestCase>
+
+  <!--
+  Test name: assertPlacementSDW
+  Schema: discrimAssertPlacement, root root-assert
+  Purpose: This test demonstrates the SDW resulting from discouraged assert placement
+  -->
+
+  <tdml:parserTestCase name="assertPlacementSDW"
+                       root="root-assert" model="discrimAssertPlacement"
+                       description="This test demonstrates the SDW resulting from discouraged assert placement">
+    <tdml:document>Hat,2</tdml:document>
+    <tdml:infoset>
+      <tdml:dfdlInfoset>
+        <root-assert>
+          <description>Hat</description>
+          <quantity>2</quantity>
+        </root-assert>
+      </tdml:dfdlInfoset>
+    </tdml:infoset>
+    <tdml:warnings>
+      <tdml:warning>Schema Definition Warning</tdml:warning>
+      <tdml:warning>Wrap the discriminator or assert in an empty sequence</tdml:warning>
+    </tdml:warnings>
+  </tdml:parserTestCase>
+
   <tdml:defineSchema name="s0">
     <xs:include schemaLocation="org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
     <dfdl:format ref="ex:GeneralFormat" />
diff --git a/daffodil-test/src/test/scala/org/apache/daffodil/section07/discriminators/TestDiscriminators.scala b/daffodil-test/src/test/scala/org/apache/daffodil/section07/discriminators/TestDiscriminators.scala
index 2350ffb..c19f503 100644
--- a/daffodil-test/src/test/scala/org/apache/daffodil/section07/discriminators/TestDiscriminators.scala
+++ b/daffodil-test/src/test/scala/org/apache/daffodil/section07/discriminators/TestDiscriminators.scala
@@ -79,4 +79,8 @@ class TestDiscriminators {
   @Test def test_multipleDiscriminators3(): Unit = { runner2.runOneTest("multipleDiscriminators3") }
   @Test def test_multipleDiscriminators4(): Unit = { runner2.runOneTest("multipleDiscriminators4") }
   @Test def test_multipleDiscriminators5(): Unit = { runner2.runOneTest("multipleDiscriminators5") }
+
+  @Test def test_discrimPlacementSDW(): Unit = { runner.runOneTest("discrimPlacementSDW") }
+  @Test def test_assertPlacementSDW(): Unit = { runner.runOneTest("assertPlacementSDW") }
+
 }