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") }
+
}