stevedlawrence commented on a change in pull request #83: Adding value of 'bcd' 
to binaryCalendarRep
URL: https://github.com/apache/incubator-daffodil/pull/83#discussion_r203350253
 
 

 ##########
 File path: 
daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesDateTime.scala
 ##########
 @@ -243,3 +275,155 @@ case class ConvertBinaryDateTimeSecMilliPrim(e: 
ElementBase, lengthInBits: Long)
     lengthInBits.toInt,
     !epochCalendar.getTimeZone.equals(TimeZone.UNKNOWN_ZONE))
 }
+
+abstract class BCDRuntimeLength(e: ElementBase) extends 
BinaryPackedDecimalCalendarPrimBase(e, true) {
+
+  override lazy val parser = new BinaryCalendarBCDRuntimeLengthParser(
+    e.elementRuntimeData,
+    false,
+    pattern,
+    localeEv,
+    calendarEv,
+    xsdType,
+    prettyType,
+    e.lengthEv,
+    e.lengthUnits)
+
+  override lazy val unparser =
+    new BinaryCalendarBCDRuntimeLengthUnparser(
+    e.elementRuntimeData,
+    pattern,
+    localeEv,
+    calendarEv,
+    e.lengthEv,
+    e.lengthUnits)
+}
+
+abstract class BCDKnownLength(e: ElementBase, lengthInBits: Long) extends 
BinaryPackedDecimalCalendarPrimBase(e, true) {
+
+  override lazy val parser = new BinaryCalendarBCDKnownLengthParser(
+    e.elementRuntimeData,
+    false,
+    lengthInBits.toInt,
+    pattern,
+    localeEv,
+    calendarEv,
+    xsdType,
+    prettyType)
+
+  override lazy val unparser =
+    new BinaryCalendarBCDKnownLengthUnparser(
+    e.elementRuntimeData,
+    lengthInBits.toInt,
+    pattern,
+    localeEv,
+    calendarEv)
+}
+
+abstract class BCDDelimitedLength(e: ElementBase, xsdType: String, prettyType: 
String)
+  extends StringDelimited(e)
+  with CalendarPrimBase {
+
+  lazy val pattern: String = {
+    val p = e.calendarPatternKind match {
+      case CalendarPatternKind.Explicit => e.calendarPattern
+      case _ => Assert.impossibleCase
+    }
+
+    p.toSeq.foreach(char =>
+      if (!validFormatCharacters.contains(char)) {
+        SDE("Character '%s' not allowed in dfdl:calendarPattern for xs:%s with 
a binaryCalendarRep of '%s'".format(char, xsdType, e.binaryCalendarRep))
+      })
+
+    if (p.indexOf("S" * (TextCalendarConstants.maxFractionalSeconds + 1)) >= 
0) {
+      SDE("More than %d fractional seconds unsupported in dfdl:calendarPattern 
for xs:%s".format(TextCalendarConstants.maxFractionalSeconds, xsdType))
+    }
+
+    p
+  }
+
+  val isDelimRequired: Boolean = false
+
+  override lazy val parser = new BinaryCalendarBCDDelimitedLengthParser(
+    e.elementRuntimeData,
+    false,
+    pattern,
+    localeEv,
+    calendarEv,
+    xsdType,
+    prettyType,
+    textDelimitedParser,
+    fieldDFAParseEv,
+    isDelimRequired)
+
+  override lazy val unparser =
+    new BinaryCalendarBCDDelimitedLengthUnparser(
+    e.elementRuntimeData,
+    pattern,
+    localeEv,
+    calendarEv)
+
+}
+
+case class BCDDateKnownLengthPrim(e: ElementBase, lengthInBits: Long)
+    extends BCDKnownLength(e, lengthInBits) {
+  protected override val xsdType = "date"
+  protected override val prettyType = "Date"
+  protected override val infosetPattern = "uuuu-MM-ddxxx"
+  protected override val validFormatCharacters = "dDeEFGMuwWyXxYzZ".toSeq
 
 Review comment:
   Are these characters correct? The spec says that only characters and symbols 
that always result in digits can be used. For example, the 'E' character always 
results in a string (e.g. Tue, Tuesday, etc.), so that shouldn't be allowed. 
Making things more complex, a single 'e' character results in a number, but 
more than one e's in a pattern a string day of week. So we can allow a single 
'e', but multiple 'e's shouldn't be allowed. We might need some more complex 
logic to detect invalid patterns.

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to