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