You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@daffodil.apache.org by ja...@apache.org on 2018/07/09 14:52:42 UTC
[incubator-daffodil] 05/13: Got everything compiling
This is an automated email from the ASF dual-hosted git repository.
jadams pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-daffodil.git
commit 4b57c2d673b245ce066cb180a66174341394d254
Author: Josh Adams <ja...@tresys.com>
AuthorDate: Tue May 29 14:01:29 2018 -0400
Got everything compiling
Fixed a few minor issues in the unit tests
---
.../daffodil/grammar/ElementBaseGrammarMixin.scala | 56 +++++++++++++++++-----
.../grammar/primitives/PrimitivesZoned.scala | 38 ++++++++-------
.../org/apache/daffodil/util/DecimalUtils.scala | 18 +++----
.../apache/daffodil/util/TestDecimalUtils.scala | 24 +++++-----
.../unparsers/ConvertTextNumberUnparser.scala | 42 ++++++++++++----
...rser.scala => ConvertZonedNumberUnparser.scala} | 0
6 files changed, 117 insertions(+), 61 deletions(-)
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/grammar/ElementBaseGrammarMixin.scala b/daffodil-core/src/main/scala/org/apache/daffodil/grammar/ElementBaseGrammarMixin.scala
index 76c4be2..e83e40a 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/grammar/ElementBaseGrammarMixin.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/grammar/ElementBaseGrammarMixin.scala
@@ -67,6 +67,18 @@ import org.apache.daffodil.grammar.primitives.ConvertTextUnsignedBytePrim
import org.apache.daffodil.grammar.primitives.ConvertTextUnsignedIntPrim
import org.apache.daffodil.grammar.primitives.ConvertTextUnsignedLongPrim
import org.apache.daffodil.grammar.primitives.ConvertTextUnsignedShortPrim
+import org.apache.daffodil.grammar.primitives.ConvertZonedBytePrim
+import org.apache.daffodil.grammar.primitives.ConvertZonedCombinator
+import org.apache.daffodil.grammar.primitives.ConvertZonedDecimalPrim
+import org.apache.daffodil.grammar.primitives.ConvertZonedIntPrim
+import org.apache.daffodil.grammar.primitives.ConvertZonedIntegerPrim
+import org.apache.daffodil.grammar.primitives.ConvertZonedLongPrim
+import org.apache.daffodil.grammar.primitives.ConvertZonedNonNegativeIntegerPrim
+import org.apache.daffodil.grammar.primitives.ConvertZonedShortPrim
+import org.apache.daffodil.grammar.primitives.ConvertZonedUnsignedBytePrim
+import org.apache.daffodil.grammar.primitives.ConvertZonedUnsignedIntPrim
+import org.apache.daffodil.grammar.primitives.ConvertZonedUnsignedLongPrim
+import org.apache.daffodil.grammar.primitives.ConvertZonedUnsignedShortPrim
import org.apache.daffodil.grammar.primitives.DelimiterStackCombinatorElement
import org.apache.daffodil.grammar.primitives.DynamicEscapeSchemeCombinatorElement
import org.apache.daffodil.grammar.primitives.ElementCombinator
@@ -112,7 +124,6 @@ import org.apache.daffodil.grammar.primitives.StringDelimitedEndOfData
import org.apache.daffodil.grammar.primitives.StringOfSpecifiedLength
import org.apache.daffodil.grammar.primitives.Terminator
import org.apache.daffodil.grammar.primitives.TrailingSkipRegion
-import org.apache.daffodil.grammar.primitives.ZonedTextIntPrim
import org.apache.daffodil.processors.TextJustificationType
import org.apache.daffodil.schema.annotation.props.Found
import org.apache.daffodil.schema.annotation.props.NotFound
@@ -552,43 +563,43 @@ trait ElementBaseGrammarMixin
}
private lazy val textByte = prod("textByte", impliedRepresentation == Representation.Text) {
- standardTextByte || zonedTextInt
+ standardTextByte || zonedTextByte
}
private lazy val textShort = prod("textShort", impliedRepresentation == Representation.Text) {
- standardTextShort || zonedTextInt
+ standardTextShort || zonedTextShort
}
private lazy val textLong = prod("textLong", impliedRepresentation == Representation.Text) {
- standardTextLong || zonedTextInt
+ standardTextLong || zonedTextLong
}
private lazy val textInteger = prod("textInteger", impliedRepresentation == Representation.Text) {
- standardTextInteger || zonedTextInt
+ standardTextInteger || zonedTextInteger
}
private lazy val textDecimal = prod("textDecimal", impliedRepresentation == Representation.Text) {
- standardTextDecimal || zonedTextInt
+ standardTextDecimal || zonedTextDecimal
}
private lazy val textNonNegativeInteger = prod("textNonNegativeInteger", impliedRepresentation == Representation.Text) {
- standardTextNonNegativeInteger || zonedTextInt
+ standardTextNonNegativeInteger || zonedTextNonNegativeInteger
}
private lazy val textUnsignedInt = prod("textUnsignedInt", impliedRepresentation == Representation.Text) {
- standardTextUnsignedInt || zonedTextInt
+ standardTextUnsignedInt || zonedTextUnsignedInt
}
private lazy val textUnsignedByte = prod("textUnsignedByte", impliedRepresentation == Representation.Text) {
- standardTextUnsignedByte || zonedTextInt
+ standardTextUnsignedByte || zonedTextUnsignedByte
}
private lazy val textUnsignedShort = prod("textUnsignedShort", impliedRepresentation == Representation.Text) {
- standardTextUnsignedShort || zonedTextInt
+ standardTextUnsignedShort || zonedTextUnsignedShort
}
private lazy val textUnsignedLong = prod("textUnsignedLong", impliedRepresentation == Representation.Text) {
- standardTextUnsignedLong || zonedTextInt
+ standardTextUnsignedLong || zonedTextUnsignedLong
}
//
@@ -617,8 +628,29 @@ trait ElementBaseGrammarMixin
textNumberRep == TextNumberRep.Standard) { ConvertTextCombinator(this, stringValue, ConvertTextUnsignedShortPrim(this)) }
private lazy val standardTextUnsignedByte = prod("standardTextUnsignedByte",
textNumberRep == TextNumberRep.Standard) { ConvertTextCombinator(this, stringValue, ConvertTextUnsignedBytePrim(this)) }
+
+ private lazy val zonedTextInteger = prod("zonedTextInteger",
+ textNumberRep == TextNumberRep.Zoned) { ConvertZonedCombinator(this, stringValue, ConvertZonedIntegerPrim(this)) }
+ private lazy val zonedTextDecimal = prod("zonedTextDecimal",
+ textNumberRep == TextNumberRep.Zoned) { ConvertZonedCombinator(this, stringValue, ConvertZonedDecimalPrim(this)) }
+ private lazy val zonedTextNonNegativeInteger = prod("zonedTextNonNegativeInteger",
+ textNumberRep == TextNumberRep.Zoned) { ConvertZonedCombinator(this, stringValue, ConvertZonedNonNegativeIntegerPrim(this)) }
+ private lazy val zonedTextLong = prod("zonedTextLong",
+ textNumberRep == TextNumberRep.Zoned) { ConvertZonedCombinator(this, stringValue, ConvertZonedLongPrim(this)) }
private lazy val zonedTextInt = prod("zonedTextInt",
- textNumberRep == TextNumberRep.Zoned) { ZonedTextIntPrim(this) }
+ textNumberRep == TextNumberRep.Zoned) { ConvertZonedCombinator(this, stringValue, ConvertZonedIntPrim(this)) }
+ private lazy val zonedTextShort = prod("zonedTextShort",
+ textNumberRep == TextNumberRep.Zoned) { ConvertZonedCombinator(this, stringValue, ConvertZonedShortPrim(this)) }
+ private lazy val zonedTextByte = prod("zonedTextByte",
+ textNumberRep == TextNumberRep.Zoned) { ConvertZonedCombinator(this, stringValue, ConvertZonedBytePrim(this)) }
+ private lazy val zonedTextUnsignedLong = prod("zonedTextUnsignedLong",
+ textNumberRep == TextNumberRep.Zoned) { ConvertZonedCombinator(this, stringValue, ConvertZonedUnsignedLongPrim(this)) }
+ private lazy val zonedTextUnsignedInt = prod("zonedTextUnsignedInt",
+ textNumberRep == TextNumberRep.Zoned) { ConvertZonedCombinator(this, stringValue, ConvertZonedUnsignedIntPrim(this)) }
+ private lazy val zonedTextUnsignedShort = prod("zonedTextUnsignedShort",
+ textNumberRep == TextNumberRep.Zoned) { ConvertZonedCombinator(this, stringValue, ConvertZonedUnsignedShortPrim(this)) }
+ private lazy val zonedTextUnsignedByte = prod("zonedTextUnsignedByte",
+ textNumberRep == TextNumberRep.Zoned) { ConvertZonedCombinator(this, stringValue, ConvertZonedUnsignedBytePrim(this)) }
private lazy val textDouble = prod("textDouble", impliedRepresentation == Representation.Text) {
standardTextDouble || zonedTextDouble
diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesZoned.scala b/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesZoned.scala
index 3d795d0..07acbd4 100644
--- a/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesZoned.scala
+++ b/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesZoned.scala
@@ -18,6 +18,7 @@
package org.apache.daffodil.grammar.primitives
import org.apache.daffodil.dsom._
+import org.apache.daffodil.dpath.NodeInfo.PrimType
import org.apache.daffodil.grammar.Gram
import org.apache.daffodil.grammar.Terminal
import com.ibm.icu.text.DecimalFormat
@@ -39,10 +40,13 @@ import org.apache.daffodil.processors.parsers.ConvertZonedUnsignedByteParserUnpa
import org.apache.daffodil.processors.parsers.ConvertZonedUnsignedLongParserUnparserHelper
import org.apache.daffodil.processors.parsers.ConvertZonedUnsignedShortParserUnparserHelper
import org.apache.daffodil.processors.parsers.ZonedFormatFactoryBase
-import org.apache.daffodil.processors.parsers.ZonedFormatFactoryDynamic
import org.apache.daffodil.processors.parsers.ZonedFormatFactoryStatic
import org.apache.daffodil.processors.parsers.ConvertZonedUnsignedIntParserUnparserHelper
import org.apache.daffodil.processors.parsers.Parser
+import org.apache.daffodil.schema.annotation.props.gen.TextNumberCheckPolicy
+import org.apache.daffodil.schema.annotation.props.gen.TextNumberRounding
+import org.apache.daffodil.util.Maybe._
+import org.apache.daffodil.util.MaybeDouble
case class ConvertZonedCombinator(e: ElementBase, value: Gram, converter: Gram)
extends Terminal(e, !(value.isEmpty || converter.isEmpty)) {
@@ -60,7 +64,7 @@ abstract class ConvertZonedNumberPrim[S](e: ElementBase)
def numFormatFactory: ZonedFormatFactoryBase[S] = {
val h = helper
- val (pattern, patternStripped) = {
+ val pattern = {
val p = e.textNumberPattern
val noEscapedTicksRegex = """''""".r
@@ -103,24 +107,22 @@ abstract class ConvertZonedNumberPrim[S](e: ElementBase)
case ex: IllegalArgumentException => e.SDE("Invalid textNumberPattern: " + ex.getMessage())
}
- (p, patternNoQuoted)
+ p
}
- val nff = if (isConstant) {
- new ZonedFormatFactoryStatic[S](e.termRuntimeData, h,
- e.textNumberCheckPolicy,
- pattern,
- e.textNumberRounding,
- roundingMode,
- roundingIncrement)
- } else {
- new ZonedFormatFactoryDynamic[S](e.termRuntimeData, h,
- e.textNumberCheckPolicy,
- pattern,
- e.textNumberRounding,
- roundingMode,
- roundingIncrement)
- }
+ val (roundingIncrement: MaybeDouble, roundingMode) =
+ e.textNumberRounding match {
+ case TextNumberRounding.Explicit => (MaybeDouble(e.textNumberRoundingIncrement), One(e.textNumberRoundingMode))
+ case TextNumberRounding.Pattern => (MaybeDouble.Nope, Nope)
+ }
+
+ val nff = new ZonedFormatFactoryStatic[S](
+ e.termRuntimeData, h,
+ e.textNumberCheckPolicy,
+ pattern,
+ e.textNumberRounding,
+ roundingMode,
+ roundingIncrement)
nff
}
diff --git a/daffodil-lib/src/main/scala/org/apache/daffodil/util/DecimalUtils.scala b/daffodil-lib/src/main/scala/org/apache/daffodil/util/DecimalUtils.scala
index 9a733e8..fbff5d7 100644
--- a/daffodil-lib/src/main/scala/org/apache/daffodil/util/DecimalUtils.scala
+++ b/daffodil-lib/src/main/scala/org/apache/daffodil/util/DecimalUtils.scala
@@ -426,7 +426,7 @@ object DecimalUtils {
if ((digit < 0) && !negative) {
negative = true
- decodedValue.append('-')
+ decodedValue.insert(0, '-')
}
decodedValue.append(java.lang.Math.abs(digit))
@@ -436,19 +436,19 @@ object DecimalUtils {
}
def zonedFromNumber(num: String, zonedStyle: TextZonedSignStyle): String = {
- val negative = (num.charAt(0) == '-')
- val inChars = negative match {
- case true => num.substring(0).toCharArray
- case false => num.toCharArray
+ val positive = (num.charAt(0) != '-')
+ val inChars = positive match {
+ case true => num.toCharArray
+ case false => num.substring(1).toCharArray
}
val encodedValue = new StringBuilder()
for (char <- inChars) {
val digit = zonedStyle match {
- case TextZonedSignStyle.AsciiStandard => convertToAsciiStandard(char, negative)
- case TextZonedSignStyle.AsciiTranslatedEBCDIC => convertToAsciiTranslatedEBCDIC(char, negative)
- case TextZonedSignStyle.AsciiCARealiaModified => convertToAsciiCARealiaModified(char, negative)
- case TextZonedSignStyle.AsciiTandemModified => convertToAsciiTandemModified(char, negative)
+ case TextZonedSignStyle.AsciiStandard => convertToAsciiStandard(char, positive)
+ case TextZonedSignStyle.AsciiTranslatedEBCDIC => convertToAsciiTranslatedEBCDIC(char, positive)
+ case TextZonedSignStyle.AsciiCARealiaModified => convertToAsciiCARealiaModified(char, positive)
+ case TextZonedSignStyle.AsciiTandemModified => convertToAsciiTandemModified(char, positive)
}
encodedValue.append(digit)
diff --git a/daffodil-lib/src/test/scala/org/apache/daffodil/util/TestDecimalUtils.scala b/daffodil-lib/src/test/scala/org/apache/daffodil/util/TestDecimalUtils.scala
index 20674b1..e2c3980 100644
--- a/daffodil-lib/src/test/scala/org/apache/daffodil/util/TestDecimalUtils.scala
+++ b/daffodil-lib/src/test/scala/org/apache/daffodil/util/TestDecimalUtils.scala
@@ -1281,8 +1281,8 @@ class TestDecimalUtils {
@Test def zonedIntAsciiStandardPos5() {
val num = "000000000001234567890"
val result = zonedToNumber(num, TextZonedSignStyle.AsciiStandard)
- assertEquals(result, "1234567890")
- assertEquals(zonedFromNumber(result, TextZonedSignStyle.AsciiStandard), "1234567890")
+ assertEquals(result, "000000000001234567890")
+ assertEquals(zonedFromNumber(result, TextZonedSignStyle.AsciiStandard), "000000000001234567890")
}
@Test def zonedIntAsciiStandardNeg1() {
@@ -1316,8 +1316,8 @@ class TestDecimalUtils {
@Test def zonedIntAsciiStandardNeg5() {
val num = "pppppppppppqrstuvwxyp"
val result = zonedToNumber(num, TextZonedSignStyle.AsciiStandard)
- assertEquals(result, "-1234567890")
- assertEquals(zonedFromNumber(result, TextZonedSignStyle.AsciiStandard), "qrstuvwxyp")
+ assertEquals(result, "-000000000001234567890")
+ assertEquals(zonedFromNumber(result, TextZonedSignStyle.AsciiStandard), num)
}
@Test def zonedIntAsciiCARealiaModifiedPos1() {
@@ -1351,8 +1351,8 @@ class TestDecimalUtils {
@Test def zonedIntAsciiCARealiaModifiedPos5() {
val num = "000000000001234567890"
val result = zonedToNumber(num, TextZonedSignStyle.AsciiCARealiaModified)
- assertEquals(result, "1234567890")
- assertEquals(zonedFromNumber(result, TextZonedSignStyle.AsciiCARealiaModified), "1234567890")
+ assertEquals(result, "000000000001234567890")
+ assertEquals(zonedFromNumber(result, TextZonedSignStyle.AsciiCARealiaModified), "000000000001234567890")
}
@Test def zonedIntAsciiCARealiaModifiedNeg1() {
@@ -1386,8 +1386,8 @@ class TestDecimalUtils {
@Test def zonedIntAsciiCARealiaModifiedNeg5() {
val num = " !\"#$%&'() "
val result = zonedToNumber(num, TextZonedSignStyle.AsciiCARealiaModified)
- assertEquals(result, "-1234567890")
- assertEquals(zonedFromNumber(result, TextZonedSignStyle.AsciiCARealiaModified), "!\"#$%&'() ")
+ assertEquals(result, "-000000000001234567890")
+ assertEquals(zonedFromNumber(result, TextZonedSignStyle.AsciiCARealiaModified), num)
}
@Test def zonedIntAsciiTandemModifiedPos1() {
@@ -1421,8 +1421,8 @@ class TestDecimalUtils {
@Test def zonedIntAsciiTandemModifiedPos5() {
val num = "000000000001234567890"
val result = zonedToNumber(num, TextZonedSignStyle.AsciiTandemModified)
- assertEquals(result, "1234567890")
- assertEquals(zonedFromNumber(result, TextZonedSignStyle.AsciiTandemModified), "1234567890")
+ assertEquals(result, "000000000001234567890")
+ assertEquals(zonedFromNumber(result, TextZonedSignStyle.AsciiTandemModified), num)
}
@Test def zonedIntAsciiTandemModifiedNeg1() {
@@ -1456,8 +1456,8 @@ class TestDecimalUtils {
@Test def zonedIntAsciiTandemModifiedNeg5() {
val num = "
"
val result = zonedToNumber(num, TextZonedSignStyle.AsciiTandemModified)
- assertEquals(result, "-1234567890")
- assertEquals(zonedFromNumber(result, TextZonedSignStyle.AsciiTandemModified), "
")
+ assertEquals(result, "-000000000001234567890")
+ assertEquals(zonedFromNumber(result, TextZonedSignStyle.AsciiTandemModified), num)
}
}
diff --git a/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/ConvertTextNumberUnparser.scala b/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/ConvertTextNumberUnparser.scala
index bfa31d4..2efa11a 100644
--- a/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/ConvertTextNumberUnparser.scala
+++ b/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/ConvertTextNumberUnparser.scala
@@ -17,12 +17,15 @@
package org.apache.daffodil.processors.unparsers
-import org.apache.daffodil.schema.annotation.props.gen.TextZonedSignStyle
import org.apache.daffodil.processors._
-import org.apache.daffodil.util.DecimalUtils
-import org.apache.daffodil.processors.parsers.ConvertZonedNumberParserUnparserHelperBase
-
-case class ConvertZonedCombinatorUnparser(
+import org.apache.daffodil.util.Maybe
+import org.apache.daffodil.util.Maybe._
+import org.apache.daffodil.cookers.EntityReplacer
+import org.apache.daffodil.exceptions.Assert
+import org.apache.daffodil.processors.parsers.NumberFormatFactoryBase
+import org.apache.daffodil.processors.parsers.ConvertTextNumberParserUnparserHelperBase
+
+case class ConvertTextCombinatorUnparser(
rd: TermRuntimeData,
valueUnparser: Unparser,
converterUnparser: Unparser)
@@ -41,9 +44,9 @@ case class ConvertZonedCombinatorUnparser(
}
}
-case class ConvertZonedNumberUnparser[S](
- helper: ConvertZonedNumberParserUnparserHelperBase[S],
- zonedSignStyle: TextZonedSignStyle,
+case class ConvertTextNumberUnparser[S](
+ helper: ConvertTextNumberParserUnparserHelperBase[S],
+ nff: NumberFormatFactoryBase[S],
override val context: ElementRuntimeData)
extends PrimUnparser
with ToBriefXMLImpl {
@@ -53,17 +56,36 @@ case class ConvertZonedNumberUnparser[S](
override def toString = "to(xs:" + helper.xsdType + ")"
override lazy val childProcessors = Nil
+ lazy val zeroRep: Maybe[String] = helper.zeroRepListRaw.headOption.map { zr =>
+ EntityReplacer { _.replaceForUnparse(zr) }
+ }
+
override def unparse(state: UState): Unit = {
val node = state.currentInfosetNode.asSimple
- val value = node.dataValueAsString
+ val value = node.dataValue
// The type of value should have the type of S, but type erasure makes this
// difficult to assert. Could probably check this with TypeTags or Manifest
// if we find this is not the case. Want something akin to:
// Assert.invariant(value.isInstanceOf[S])
- val strRep = DecimalUtils.zonedFromNumber(value, zonedSignStyle)
+ val strRep =
+ if (value == 0 && zeroRep.isDefined) {
+ zeroRep.get
+ } else {
+ // Needed because the DecimalFormat class of ICU will call
+ // doubleValue on scala's BigInt and BigDecimal because it
+ // doesn't recognize it as Java's BigInteger and BigDecimal.
+ // This caused large numbers to be truncated silently.
+ value match {
+ case bd: scala.math.BigDecimal => Assert.usageError("Received scala.math.BigDecimal, expected java.math.BigDecimal.")
+ case bi: scala.math.BigInt => Assert.usageError("Received scala.math.BigInt, expected java.math.BigInteger.")
+ case _ => // OK
+ }
+ val df = nff.getNumFormat(state)
+ df.get.format(value)
+ }
node.overwriteDataValue(strRep)
}
diff --git a/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/ConvertTextNumberUnparser.scala b/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/ConvertZonedNumberUnparser.scala
similarity index 100%
copy from daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/ConvertTextNumberUnparser.scala
copy to daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/ConvertZonedNumberUnparser.scala