efinnegan closed pull request #86: Adding value of 'bcd' to binaryCalendarRep URL: https://github.com/apache/incubator-daffodil/pull/86
This is a PR merged from a forked repository. As GitHub hides the original diff on merge, it is displayed below for the sake of provenance: As this is a foreign pull request (from a fork), the diff is supplied below (as it won't show otherwise due to GitHub magic): 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 e83e40a50..db1e65aac 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 @@ -130,6 +130,7 @@ import org.apache.daffodil.schema.annotation.props.NotFound import org.apache.daffodil.schema.annotation.props.gen.BinaryCalendarRep import org.apache.daffodil.schema.annotation.props.gen.BinaryFloatRep import org.apache.daffodil.schema.annotation.props.gen.BinaryNumberRep +import org.apache.daffodil.schema.annotation.props.gen.CalendarPatternKind import org.apache.daffodil.schema.annotation.props.gen.LengthKind import org.apache.daffodil.schema.annotation.props.gen.LengthUnits import org.apache.daffodil.schema.annotation.props.gen.NilKind @@ -478,9 +479,9 @@ trait ElementBaseGrammarMixin case PrimType.DateTime => binaryCalendarRep match { case BinaryCalendarRep.BinarySeconds => 32 case BinaryCalendarRep.BinaryMilliseconds => 64 - case _ => schemaDefinitionError("Size of binary data '" + primType.name + "' with binaryCalendarRep='" + binaryCalendarRep + "' cannot be determined implicitly.") + case _ => schemaDefinitionError("Length of binary data '" + primType.name + "' with binaryCalendarRep='" + binaryCalendarRep + "' cannot be determined implicitly.") } - case _ => schemaDefinitionError("Size of binary data '" + primType.name + "' cannot be determined implicitly.") + case _ => schemaDefinitionError("Length of binary data '" + primType.name + "' cannot be determined implicitly.") } /** @@ -496,8 +497,14 @@ trait ElementBaseGrammarMixin case LengthKind.Implicit => implicitBinaryLengthInBits case LengthKind.Explicit if (lengthEv.isConstant) => explicitBinaryLengthInBits() case LengthKind.Explicit => -1 // means must be computed at runtime. - case LengthKind.Delimited if (binaryNumberRep == BinaryNumberRep.Binary) => subsetError("lengthKind='delimited' only supported for packed binary formats.") - case LengthKind.Delimited => -1 // only for packed binary data, length must be computed at runtime. + case LengthKind.Delimited => primType match { + case PrimType.DateTime | PrimType.Date | PrimType.Time => + if (binaryCalendarRep == BinaryCalendarRep.BinaryMilliseconds || binaryCalendarRep == BinaryCalendarRep.BinarySeconds) + SDE("lengthKind='delimited' only supported for packed binary formats.") + else -1 // only for packed binary data, length must be computed at runtime. + case _ => if (binaryNumberRep == BinaryNumberRep.Binary) SDE("lengthKind='delimited' only supported for packed binary formats.") + else -1 // only for packed binary data, length must be computed at runtime. + } case LengthKind.Pattern => schemaDefinitionError("Binary data elements cannot have lengthKind='pattern'.") case LengthKind.Prefixed => subsetError("lengthKind='prefixed' not yet supported.") case LengthKind.EndOfParent => schemaDefinitionError("Binary data elements cannot have lengthKind='endOfParent'.") @@ -652,6 +659,51 @@ trait ElementBaseGrammarMixin private lazy val zonedTextUnsignedByte = prod("zonedTextUnsignedByte", textNumberRep == TextNumberRep.Zoned) { ConvertZonedCombinator(this, stringValue, ConvertZonedUnsignedBytePrim(this)) } + + private lazy val bcdKnownLengthCalendar = prod("bcdKnownLengthCalendar", binaryCalendarRep == BinaryCalendarRep.Bcd) { + bcdDateKnownLength | bcdTimeKnownLength | bcdDateTimeKnownLength + } + private lazy val bcdRuntimeLengthCalendar = prod("bcdRuntimeLengthCalendar", binaryCalendarRep == BinaryCalendarRep.Bcd) { + bcdDateRuntimeLength | bcdTimeRuntimeLength | bcdDateTimeRuntimeLength + } + private lazy val bcdDelimitedLengthCalendar = prod("bcdDelimitedLengthCalendar", binaryCalendarRep == BinaryCalendarRep.Bcd) { + bcdDateDelimitedLength | bcdTimeDelimitedLength | bcdDateTimeDelimitedLength + } + + // BCD calendar with known length + private lazy val bcdDateKnownLength = prod("bcdDateKnownLength", primType == PrimType.Date) { + ConvertZonedCombinator(this, new BCDIntegerKnownLength(this, binaryNumberKnownLengthInBits), ConvertTextDatePrim(this)) + } + private lazy val bcdDateTimeKnownLength = prod("bcdDateTimeKnownLength", primType == PrimType.DateTime) { + ConvertZonedCombinator(this, new BCDIntegerKnownLength(this, binaryNumberKnownLengthInBits), ConvertTextDateTimePrim(this)) + } + private lazy val bcdTimeKnownLength = prod("bcdTimeKnownLength", primType == PrimType.Time) { + ConvertZonedCombinator(this, new BCDIntegerKnownLength(this, binaryNumberKnownLengthInBits), ConvertTextTimePrim(this)) + } + + // BCD calendar with runtime length + private lazy val bcdDateRuntimeLength = prod("bcdDateRuntimeLength", primType == PrimType.Date) { + ConvertZonedCombinator(this, new BCDIntegerRuntimeLength(this), ConvertTextDatePrim(this)) + } + private lazy val bcdDateTimeRuntimeLength = prod("bcdDateTimeRuntimeLength", primType == PrimType.DateTime) { + ConvertZonedCombinator(this, new BCDIntegerRuntimeLength(this), ConvertTextDateTimePrim(this)) + } + private lazy val bcdTimeRuntimeLength = prod("bcdTimeRuntimeLength", primType == PrimType.Time) { + ConvertZonedCombinator(this, new BCDIntegerRuntimeLength(this), ConvertTextTimePrim(this)) + } + + // BCD calendar with delimited length + private lazy val bcdDateDelimitedLength = prod("bcdDateDelimitedLength", primType == PrimType.Date) { + ConvertZonedCombinator(this, new BCDIntegerDelimitedEndOfData(this), ConvertTextDatePrim(this)) + } + private lazy val bcdDateTimeDelimitedLength = prod("bcdDateTimeDelimitedLength", primType == PrimType.DateTime) { + ConvertZonedCombinator(this, new BCDIntegerDelimitedEndOfData(this), ConvertTextDateTimePrim(this)) + } + private lazy val bcdTimeDelimitedLength = prod("bcdTimeDelimitedLength", primType == PrimType.Time) { + ConvertZonedCombinator(this, new BCDIntegerDelimitedEndOfData(this), ConvertTextTimePrim(this)) + } + + private lazy val textDouble = prod("textDouble", impliedRepresentation == Representation.Text) { standardTextDouble || zonedTextDouble } @@ -829,7 +881,19 @@ trait ElementBaseGrammarMixin case (_, n) => SDE("binary xs:dateTime must be 64 bits when binaryCalendarRep='binaryMilliseconds'. Length in bits was %s.", n) } case (_, BinaryCalendarRep.BinaryMilliseconds) => SDE("binaryCalendarRep='binaryMilliseconds' is not allowed with type %s", primType.name) - case _ => notYetImplemented("Type %s when representation='binary' and binaryCalendarRep=%s", primType.name, binaryCalendarRep.toString) + case (_, BinaryCalendarRep.Bcd) => { + if ((binaryNumberKnownLengthInBits != -1) && (binaryNumberKnownLengthInBits % 4) != 0) + SDE("The given length (%s bits) must be a multiple of 4 when using binaryCalendarRep='%s'.", binaryNumberKnownLengthInBits, binaryCalendarRep) + if (calendarPatternKind != CalendarPatternKind.Explicit) + SDE("calendarPatternKind must be 'explicit' when binaryCalendarRep='%s'", binaryCalendarRep) + + (lengthKind, binaryNumberKnownLengthInBits) match { + case (LengthKind.Delimited, -1) => bcdDelimitedLengthCalendar + case (_, -1) => bcdRuntimeLengthCalendar + case (_, _) => bcdKnownLengthCalendar + } + } + case _ => notYetImplemented("Type %s when representation='binary' and binaryCalendarRep=%s", primType.name, binaryCalendarRep.toString) } } diff --git a/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesDateTime.scala b/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesDateTime.scala index e6f275e6e..bef2ea3ce 100644 --- a/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesDateTime.scala +++ b/daffodil-core/src/main/scala/org/apache/daffodil/grammar/primitives/PrimitivesDateTime.scala @@ -23,6 +23,7 @@ import com.ibm.icu.util.Calendar import com.ibm.icu.util.TimeZone import com.ibm.icu.util.ULocale import org.apache.daffodil.dsom.ElementBase +import org.apache.daffodil.exceptions.Assert import org.apache.daffodil.grammar.Terminal import org.apache.daffodil.schema.annotation.props.gen.CalendarCheckPolicy import org.apache.daffodil.schema.annotation.props.gen.CalendarFirstDayOfWeek @@ -36,6 +37,8 @@ import org.apache.daffodil.processors.CalendarLanguageEv import org.apache.daffodil.processors.parsers.ConvertBinaryCalendarSecMilliParser import org.apache.daffodil.processors.parsers.ConvertTextCalendarParser import org.apache.daffodil.processors.parsers.TextCalendarConstants +import org.apache.daffodil.schema.annotation.props.gen.BinaryCalendarRep +import org.apache.daffodil.schema.annotation.props.gen.Representation import scala.Boolean abstract class ConvertCalendarPrimBase(e: ElementBase, guard: Boolean) @@ -54,26 +57,6 @@ abstract class ConvertTextCalendarPrimBase(e: ElementBase, guard: Boolean) protected def implicitPattern: String protected def validFormatCharacters: Seq[Char] - lazy val pattern: String = { - val p = e.calendarPatternKind match { - case CalendarPatternKind.Explicit => e.calendarPattern - case CalendarPatternKind.Implicit => implicitPattern - } - - val escapedText = "(''|'[^']+'|[^a-zA-Z])".r - val patternNoEscapes = escapedText.replaceAllIn(p, "") - patternNoEscapes.toSeq.foreach(char => - if (!validFormatCharacters.contains(char)) { - SDE("Character '%s' not allowed in dfdl:calendarPattern for xs:%s".format(char, xsdType)) - }) - - if (patternNoEscapes.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 firstDay = e.calendarFirstDayOfWeek match { case CalendarFirstDayOfWeek.Sunday => Calendar.SUNDAY case CalendarFirstDayOfWeek.Monday => Calendar.MONDAY @@ -92,13 +75,19 @@ abstract class ConvertTextCalendarPrimBase(e: ElementBase, guard: Boolean) } val TimeZoneRegex = """(UTC)?([+\-])?([01]\d|\d)(:?([0-5]\d))?""".r - val tzStr = e.calendarTimeZone match { - case TimeZoneRegex(_, plusOrMinus, hour, _, minute) => { - val pomStr = if (plusOrMinus == null) "+" else plusOrMinus - val minStr = if (minute == null) "" else minute - "GMT%s%s%s".format(pomStr, hour, minStr) + + // Binary calendars with a BinaryCalendarRep of 'bcd' or 'ibm4690Packed' should ignore the calendarTimeZone option + val tzStr = if (e.representation == Representation.Binary && e.binaryCalendarRep != BinaryCalendarRep.Packed) { + "" + } else { + e.calendarTimeZone match { + case TimeZoneRegex(_, plusOrMinus, hour, _, minute) => { + val pomStr = if (plusOrMinus == null) "+" else plusOrMinus + val minStr = if (minute == null) "" else minute + "GMT%s%s%s".format(pomStr, hour, minStr) + } + case _ => e.calendarTimeZone } - case _ => e.calendarTimeZone } val calendarTz: Option[TimeZone] = { @@ -146,6 +135,43 @@ abstract class ConvertTextCalendarPrimBase(e: ElementBase, guard: Boolean) cev } + lazy val pattern: String = { + val p = e.calendarPatternKind match { + case CalendarPatternKind.Explicit => e.calendarPattern + case CalendarPatternKind.Implicit => e.representation match { + case Representation.Binary => Assert.impossibleCase + case _ => implicitPattern + } + } + + val patternToCheck : String = if (e.representation == Representation.Text) { + val escapedText = "(''|'[^']+'|[^a-zA-Z])".r + escapedText.replaceAllIn(p, "") + } else { + p + } + patternToCheck.toSeq.foreach(char => + if (!validFormatCharacters.contains(char)) { + if (e.representation == Representation.Binary) + SDE("Character '%s' not allowed in dfdl:calendarPattern for xs:%s with a binaryCalendarRep of '%s'".format(char, xsdType, e.binaryCalendarRep)) + else + SDE("Character '%s' not allowed in dfdl:calendarPattern for xs:%s".format(char, xsdType)) + }) + + if (e.representation == Representation.Binary) { + // For binary calendars, calendarPattern can contain only characters that always result in digits, + // so more than 2 'e' or 'M' in a row aren't valid as they result in text + if (patternToCheck.contains("eee") || patternToCheck.contains("MMM")) { + SDE("dfdl:calendarPattern must only contain characters that result in the presentation of digits for xs:%s with a binaryCalendarRep of '%s'".format(xsdType, e.binaryCalendarRep)) + } + } + if (patternToCheck.indexOf("S" * (TextCalendarConstants.maxFractionalSeconds + 1)) >= 0) { + SDE("More than %d fractional seconds unsupported in dfdl:calendarPattern for xs:%s".format(TextCalendarConstants.maxFractionalSeconds, xsdType)) + } + + p + } + override lazy val parser = new ConvertTextCalendarParser( e.elementRuntimeData, xsdType, @@ -167,7 +193,12 @@ case class ConvertTextDatePrim(e: ElementBase) extends ConvertTextCalendarPrimBa protected override val prettyType = "Date" protected override val infosetPattern = "uuuu-MM-ddxxx" protected override val implicitPattern = "uuuu-MM-dd" - protected override val validFormatCharacters = "dDeEFGMuwWyXxYzZ".toSeq + protected override val validFormatCharacters = + if (e.representation == Representation.Binary) { + "dDeFMuwWyY".toSeq + } else { + "dDeEFGMuwWyXxYzZ".toSeq + } } case class ConvertTextTimePrim(e: ElementBase) extends ConvertTextCalendarPrimBase(e, true) { @@ -175,7 +206,12 @@ case class ConvertTextTimePrim(e: ElementBase) extends ConvertTextCalendarPrimBa protected override val prettyType = "Time" protected override val infosetPattern = "HH:mm:ss.SSSSSSxxx" protected override val implicitPattern = "HH:mm:ssZ" - protected override val validFormatCharacters = "ahHkKmsSvVzXxZ".toSeq + protected override val validFormatCharacters = + if (e.representation == Representation.Binary) { + "hHkKmsS".toSeq + } else { + "ahHkKmsSvVzXxZ".toSeq + } } case class ConvertTextDateTimePrim(e: ElementBase) extends ConvertTextCalendarPrimBase(e, true) { @@ -183,12 +219,12 @@ case class ConvertTextDateTimePrim(e: ElementBase) extends ConvertTextCalendarPr protected override val prettyType = "DateTime" protected override val infosetPattern = "uuuu-MM-dd'T'HH:mm:ss.SSSSSSxxx" protected override val implicitPattern = "uuuu-MM-dd'T'HH:mm:ss" - protected override val validFormatCharacters = "adDeEFGhHkKmMsSuwWvVyXxYzZ".toSeq -} - -abstract class ConvertBinaryCalendarPrimBase(e: ElementBase, guard: Boolean, lengthInBits: Long) - extends ConvertCalendarPrimBase(e, guard) { - + protected override val validFormatCharacters = + if (e.representation == Representation.Binary) { + "dDeFhHkKmMsSuwWyY".toSeq + } else { + "adDeEFGhHkKmMsSuwWvVyXxYzZ".toSeq + } } case class ConvertBinaryDateTimeSecMilliPrim(e: ElementBase, lengthInBits: Long) extends ConvertCalendarPrimBase(e, true) { diff --git a/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/ConvertBinaryCalendarUnparser.scala b/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/ConvertBinaryCalendarUnparser.scala index f948c2286..aef452c66 100644 --- a/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/ConvertBinaryCalendarUnparser.scala +++ b/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/ConvertBinaryCalendarUnparser.scala @@ -51,7 +51,7 @@ case class ConvertBinaryCalendarSecMilliUnparser( val calValue = node.dataValue match { case dc: DFDLCalendar => dc.calendar - case x => Assert.invariantFailed("ConvertTextCalendar received unsupported type. %s of type %s.".format(x, Misc.getNameFromClass(x))) + case x => Assert.invariantFailed("ConvertBinaryCalendar received unsupported type. %s of type %s.".format(x, Misc.getNameFromClass(x))) } // Adjust the time based on time zone - if a time zone wasn't specified, Calendar will assume the default diff --git a/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/PackedBinaryUnparserTraits.scala b/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/PackedBinaryUnparserTraits.scala index 6bedb5824..810f1ae15 100644 --- a/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/PackedBinaryUnparserTraits.scala +++ b/daffodil-runtime1-unparser/src/main/scala/org/apache/daffodil/processors/unparsers/PackedBinaryUnparserTraits.scala @@ -26,6 +26,7 @@ import org.apache.daffodil.exceptions.Assert import org.apache.daffodil.io.DataOutputStream import org.apache.daffodil.io.FormatInfo import org.apache.daffodil.processors.Evaluatable +import org.apache.daffodil.dpath.NodeInfo trait PackedBinaryConversion { def fromBigInteger(bigInt: JBigInteger, nBits: Int): Array[Byte] @@ -45,7 +46,18 @@ abstract class PackedBinaryBaseUnparser( override def unparse(state: UState): Unit = { val nBits = getBitLength(state) val node = state.currentInfosetNode.asSimple - val value = node.dataValue.asInstanceOf[JNumber] + + // Packed decimal calendars use the convert combinator which sets the string value of the calendar + // - using dataValue would give the Calendar value rather than that string. Since the Calendar value + // cannot be cast as a JNumber we need to use dataValueAsString and convert it to a JBigInteger. + // With packed numbers, dataValue is already a number so just use that. + val nodeValue = + node.erd.optPrimType.get match { + case NodeInfo.Date | NodeInfo.DateTime | NodeInfo.Time => new JBigInteger(node.dataValueAsString) + case _ => node.dataValue + } + + val value = nodeValue.asInstanceOf[JNumber] val dos = state.dataOutputStream val res = putNumber(dos, value, nBits, state) diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/section05/simple_types/SimpleTypes.tdml b/daffodil-test/src/test/resources/org/apache/daffodil/section05/simple_types/SimpleTypes.tdml index 8d215cd75..61cf5698b 100644 --- a/daffodil-test/src/test/resources/org/apache/daffodil/section05/simple_types/SimpleTypes.tdml +++ b/daffodil-test/src/test/resources/org/apache/daffodil/section05/simple_types/SimpleTypes.tdml @@ -263,9 +263,68 @@ dfdl:binaryCalendarRep="binarySeconds" dfdl:binaryCalendarEpoch="2000-1-1T00:00"/> <xs:element name="dateTimeBin11" type="xs:dateTime" dfdl:lengthKind="implicit" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="binarySeconds" dfdl:binaryCalendarEpoch="01-01-2000T00:00:00"/> + <xs:element name="dateTimeBin12" type="xs:dateTime" dfdl:lengthKind="delimited" dfdl:terminator=";" + dfdl:binaryCalendarRep="binarySeconds" dfdl:binaryCalendarEpoch="1977-01-01T00:00:07"/> + + <xs:element name="dateBinBCD" type="xs:date" dfdl:calendarPattern="MMddyy" dfdl:calendarPatternKind="explicit" + dfdl:lengthKind="explicit" dfdl:length="{ 3 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd" /> + <xs:element name="dateBinBCD2" type="xs:date" dfdl:calendarPattern="MMddyyyy" dfdl:calendarPatternKind="explicit" + dfdl:lengthKind="explicit" dfdl:length="{ 4 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/> + <xs:element name="dateBinBCD3" type="xs:date" dfdl:calendarPattern="MM-dd-yy" dfdl:calendarPatternKind="explicit" + dfdl:lengthKind="explicit" dfdl:length="{ 3 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/> + <xs:element name="dateBinBCD4" type="xs:date" dfdl:calendarPattern="MMddyy" dfdl:calendarPatternKind="explicit" + dfdl:lengthKind="explicit" dfdl:length="{ 7 }" dfdl:lengthUnits="bits" dfdl:binaryCalendarRep="bcd"/> + <xs:element name="dateBinBCD5" type="xs:date" dfdl:calendarPattern="MMEEyy" dfdl:calendarPatternKind="explicit" + dfdl:lengthKind="explicit" dfdl:length="{ 3 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/> + <xs:element name="dateBinBCD6" type="xs:date" dfdl:calendarPattern="MMddyyeee" dfdl:calendarPatternKind="explicit" + dfdl:lengthKind="explicit" dfdl:length="{ 3 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/> + <xs:element name="dateBinBCD7" type="xs:date" dfdl:calendarPattern="eMyy" dfdl:calendarPatternKind="explicit" + dfdl:lengthKind="explicit" dfdl:length="{ 16 }" dfdl:lengthUnits="bits" dfdl:binaryCalendarRep="bcd"/> + + <xs:element name="timeBinBCD" type="xs:time" dfdl:calendarPattern="HHmmss" dfdl:calendarPatternKind="explicit" + dfdl:lengthKind="explicit" dfdl:length="{ 3 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/> + <xs:element name="timeBinBCD2" type="xs:time" dfdl:calendarPattern="HHmmssSSSS" dfdl:calendarPatternKind="explicit" + dfdl:lengthKind="explicit" dfdl:length="{ 5 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/> + <xs:element name="timeBinBCD3" type="xs:time" dfdl:calendarPatternKind="implicit" + dfdl:lengthKind="explicit" dfdl:length="{ 5 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/> + <xs:element name="timeBinBCD4" type="xs:time" dfdl:calendarPattern="HHmmss" dfdl:calendarPatternKind="explicit" + dfdl:lengthKind="implicit" dfdl:binaryCalendarRep="bcd"/> + <xs:element name="timeBinBCD5" type="xs:time" dfdl:calendarPattern="HHmmss" dfdl:calendarPatternKind="explicit" + dfdl:lengthKind="delimited" dfdl:terminator=";" dfdl:binaryCalendarRep="bcd" dfdl:encoding="ISO-8859-1"/> + + <xs:element name="timeBinBCD6"> + <xs:complexType> + <xs:sequence> + <xs:element name="length" type="xs:int" dfdl:representation="binary" + dfdl:lengthKind="explicit" dfdl:length="{ 1 }" dfdl:lengthUnits="bytes" /> + <xs:element name="time" type="xs:time" dfdl:calendarPattern="HHmmss" dfdl:calendarPatternKind="explicit" + dfdl:lengthKind="explicit" dfdl:length="{ ../ex:length }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd" /> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="dateTimeBinBCD" type="xs:dateTime" dfdl:calendarPattern="MMddyyyyHHmmss" dfdl:calendarPatternKind="explicit" + dfdl:lengthKind="explicit" dfdl:length="{ 7 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/> + <xs:element name="dateTimeBinBCD2" type="xs:dateTime" dfdl:calendarPattern="MMddyyyyhhmmss" dfdl:calendarPatternKind="explicit" + dfdl:lengthKind="implicit" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/> + <xs:element name="dateTimeBinBCD3" type="xs:dateTime" dfdl:calendarPattern="MMddyyyyhhmmss" dfdl:calendarPatternKind="explicit" + dfdl:lengthKind="explicit" dfdl:length="{ 7 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="bcd"/> + + <xs:element name="dateTimeBinBCD4"> + <xs:complexType> + <xs:sequence> + <xs:element name="num1" type="xs:decimal" dfdl:encoding="ISO-8859-1" dfdl:representation="binary" dfdl:binaryNumberRep="bcd" + dfdl:lengthKind="delimited" dfdl:terminator=";" dfdl:binaryDecimalVirtualPoint="0"/> + <xs:element name="datetime" type="xs:dateTime" dfdl:calendarPattern="MMddyyyyHHmmss" dfdl:encoding="ISO-8859-1" + dfdl:calendarPatternKind="explicit" dfdl:binaryCalendarRep="bcd" dfdl:lengthKind="delimited" dfdl:terminator=";"/> + <xs:element name="num2" type="xs:decimal" dfdl:encoding="ISO-8859-1" dfdl:representation="binary" dfdl:binaryNumberRep="bcd" + dfdl:lengthKind="delimited" dfdl:terminator=";" dfdl:binaryDecimalVirtualPoint="0"/> + </xs:sequence> + </xs:complexType> + </xs:element> - <xs:element name="dateBin2" type="xs:date" dfdl:lengthKind="explicit" dfdl:length="{ 4 }" - dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="binarySeconds" dfdl:binaryCalendarEpoch="1970-01-01T00:00:00+00:00"/> + <xs:element name="dateBinInvalid" type="xs:date" dfdl:calendarPattern="yyyy.MM.dd" dfdl:calendarPatternKind="explicit" dfdl:lengthKind="explicit" + dfdl:length="{ 4 }" dfdl:lengthUnits="bytes" dfdl:binaryCalendarRep="binarySeconds" dfdl:binaryCalendarEpoch="1970-01-01T00:00:00+00:00"/> </tdml:defineSchema> @@ -1850,7 +1909,7 @@ <tdml:document><tdml:documentPart type="byte">ff ff fb ff ff ff fb</tdml:documentPart></tdml:document> <tdml:errors> <tdml:error>Schema Definition Error</tdml:error> - <tdml:error>Size of binary data 'nonNegativeInteger' cannot be determined implicitly.</tdml:error> + <tdml:error>Length of binary data 'nonNegativeInteger' cannot be determined implicitly.</tdml:error> </tdml:errors> </tdml:parserTestCase> @@ -1996,8 +2055,7 @@ </tdml:parserTestCase> <tdml:parserTestCase name="dateTimeBin2" root="dateTimeBin2" - model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" - roundTrip="false"> + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > <tdml:document> <tdml:documentPart type="bits">00000000 00000000 00000000 00111101</tdml:documentPart> @@ -2008,8 +2066,7 @@ </tdml:parserTestCase> <tdml:parserTestCase name="dateTimeBin3" root="dateTimeBin3" - model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" - roundTrip="false"> + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > <tdml:document> <tdml:documentPart type="bits">00000000 00000000 00000000 00111101</tdml:documentPart> @@ -2124,8 +2181,7 @@ </tdml:parserTestCase> <tdml:parserTestCase name="dateTimeBin11" root="dateTimeBin6" - model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" - roundTrip="true"> + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > <tdml:document> <tdml:documentPart type="bits">01111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111</tdml:documentPart> @@ -2156,8 +2212,7 @@ <!-- xs:dateTime with binaryCalendarRep='binaryMillieconds' - expecting an error for being 1 milisecond greater than the maximum date allowed --> <tdml:parserTestCase name="dateTimeBin13" root="dateTimeBin6" - model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" - roundTrip="true"> + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > <tdml:document> <tdml:documentPart type="bits">00000010 10001101 01000110 11111011 11111100 10101110 01100010 11101001</tdml:documentPart> @@ -2187,8 +2242,7 @@ <!-- xs:dateTime with binaryCalendarRep='binaryMillieconds' - expecting an error for being 1 milisecond less than the minimum date allowed --> <tdml:parserTestCase name="dateTimeBin15" root="dateTimeBin6" - model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" - roundTrip="true"> + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > <tdml:document> <tdml:documentPart type="bits">11111101 01110001 00110111 10110011 11111100 10101110 01100010 11100111</tdml:documentPart> @@ -2228,8 +2282,7 @@ </tdml:parserTestCase> <tdml:parserTestCase name="dateTimeBin18" root="dateTimeBin10" - model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" - roundTrip="false"> + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > <tdml:document> <tdml:documentPart type="bits">00000000 00000000 00000000 00111101</tdml:documentPart> @@ -2240,8 +2293,7 @@ </tdml:parserTestCase> <tdml:parserTestCase name="dateTimeBin19" root="dateTimeBin11" - model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" - roundTrip="false"> + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > <tdml:document> <tdml:documentPart type="bits">00000000 00000000 00000000 00111101</tdml:documentPart> @@ -2251,10 +2303,276 @@ </tdml:errors> </tdml:parserTestCase> - <tdml:parserTestCase name="dateBin2" root="dateBin2" + <tdml:parserTestCase name="dateTimeBin20" root="dateTimeBin12" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > + + <tdml:document> + <tdml:documentPart type="bits">00000000 00000000 00000000 00111101</tdml:documentPart> + </tdml:document> + <tdml:errors> + <tdml:error>Schema Definition Error: lengthKind='delimited' only supported for packed binary formats.</tdml:error> + </tdml:errors> + </tdml:parserTestCase> + + <tdml:parserTestCase name="dateBinBCD" root="dateBinBCD" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" + roundTrip="true"> + + <tdml:document> + <tdml:documentPart type="byte">12 14 23</tdml:documentPart> + </tdml:document> + <tdml:infoset> + <tdml:dfdlInfoset> + <dateBinBCD>2023-12-14</dateBinBCD> + </tdml:dfdlInfoset> + </tdml:infoset> + </tdml:parserTestCase> + + <tdml:parserTestCase name="dateBinBCD2" root="dateBinBCD2" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" + roundTrip="true"> + + <tdml:document> + <tdml:documentPart type="byte">12 14 20 23</tdml:documentPart> + </tdml:document> + <tdml:infoset> + <tdml:dfdlInfoset> + <dateBinBCD2>2023-12-14</dateBinBCD2> + </tdml:dfdlInfoset> + </tdml:infoset> + </tdml:parserTestCase> + + <tdml:parserTestCase name="dateBinBCD3" root="dateBinBCD" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > + + <tdml:document> + <tdml:documentPart type="byte">12 0F 23</tdml:documentPart> + </tdml:document> + <tdml:errors> + <tdml:error>Parse Error</tdml:error> + <tdml:error>Invalid low nibble</tdml:error> + </tdml:errors> + </tdml:parserTestCase> + + <tdml:parserTestCase name="dateBinBCD4" root="dateBinBCD3" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > + + <tdml:document> + <tdml:documentPart type="byte">08 17 48</tdml:documentPart> + </tdml:document> + <tdml:errors> + <tdml:error>Schema Definition Error</tdml:error> + <tdml:error>Character '-' not allowed in dfdl:calendarPattern for xs:date with a binaryCalendarRep of 'bcd'</tdml:error> + </tdml:errors> + </tdml:parserTestCase> + + <tdml:parserTestCase name="dateBinBCD5" root="dateBinBCD4" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > + + <tdml:document> + <tdml:documentPart type="bits">0000000</tdml:documentPart> + </tdml:document> + <tdml:errors> + <tdml:error>Schema Definition Error</tdml:error> + <tdml:error>The given length (7 bits) must be a multiple of 4 when using binaryCalendarRep='bcd'</tdml:error> + </tdml:errors> + </tdml:parserTestCase> + + <tdml:parserTestCase name="dateBinBCD6" root="dateBinBCD" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" + roundTrip="true"> + + <tdml:document> + <tdml:documentPart type="bits">0001 0010 0010 0111 1001 1001</tdml:documentPart> + </tdml:document> + <tdml:infoset> + <tdml:dfdlInfoset> + <dateBinBCD>1999-12-27</dateBinBCD> + </tdml:dfdlInfoset> + </tdml:infoset> + </tdml:parserTestCase> + + <tdml:parserTestCase name="dateBinBCD7" root="dateBinBCD5" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > + + <tdml:document> + <tdml:documentPart type="byte">08 17 48</tdml:documentPart> + </tdml:document> + <tdml:errors> + <tdml:error>Schema Definition Error</tdml:error> + <tdml:error>Character 'E' not allowed in dfdl:calendarPattern for xs:date with a binaryCalendarRep of 'bcd'</tdml:error> + </tdml:errors> + </tdml:parserTestCase> + + <tdml:parserTestCase name="dateBinBCD8" root="dateBinBCD6" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > + + <tdml:document> + <tdml:documentPart type="byte">08 17 48</tdml:documentPart> + </tdml:document> + <tdml:errors> + <tdml:error>Schema Definition Error</tdml:error> + <tdml:error>dfdl:calendarPattern must only contain characters that result in the presentation of digits for xs:date with a binaryCalendarRep of 'bcd'</tdml:error> + </tdml:errors> + </tdml:parserTestCase> + + <tdml:parserTestCase name="dateBinBCD9" root="dateBinBCD7" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > + + <tdml:document> + <tdml:documentPart type="byte">38 18</tdml:documentPart> + </tdml:document> + <tdml:infoset> + <tdml:dfdlInfoset> + <dateBinBCD7>2018-08-07</dateBinBCD7> + </tdml:dfdlInfoset> + </tdml:infoset> + </tdml:parserTestCase> + + <tdml:parserTestCase name="timeBinBCD" root="timeBinBCD" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" + roundTrip="true"> + + <tdml:document> + <tdml:documentPart type="byte">18 56 03</tdml:documentPart> + </tdml:document> + <tdml:infoset> + <tdml:dfdlInfoset> + <timeBinBCD>18:56:03.000000</timeBinBCD> + </tdml:dfdlInfoset> + </tdml:infoset> + </tdml:parserTestCase> + + <tdml:parserTestCase name="timeBinBCD2" root="timeBinBCD2" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" + roundTrip="twoPass"> + + <tdml:document> + <tdml:documentPart type="byte">01 45 00 99 87</tdml:documentPart> + </tdml:document> + <tdml:infoset> + <tdml:dfdlInfoset> + <timeBinBCD2>01:45:00.998000</timeBinBCD2> + </tdml:dfdlInfoset> + </tdml:infoset> + </tdml:parserTestCase> + + <tdml:parserTestCase name="timeBinBCD3" root="timeBinBCD3" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > + + <tdml:document> + <tdml:documentPart type="byte">01 45 00 99 87</tdml:documentPart> + </tdml:document> + <tdml:errors> + <tdml:error>Schema Definition Error</tdml:error> + <tdml:error>calendarPatternKind must be 'explicit' when binaryCalendarRep='bcd'</tdml:error> + </tdml:errors> + </tdml:parserTestCase> + + <tdml:parserTestCase name="timeBinBCD4" root="timeBinBCD4" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > + + <tdml:document> + <tdml:documentPart type="byte">18 56 03</tdml:documentPart> + </tdml:document> + <tdml:errors> + <tdml:error>Schema Definition Error</tdml:error> + <tdml:error>Length of binary data 'Time' cannot be determined implicitly</tdml:error> + </tdml:errors> + </tdml:parserTestCase> + + <tdml:parserTestCase name="timeBinBCD5" root="timeBinBCD5" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" + roundTrip="true"> + + <tdml:document> + <tdml:documentPart type="byte">18 56 03 3B</tdml:documentPart> + </tdml:document> + <tdml:infoset> + <tdml:dfdlInfoset> + <timeBinBCD5>18:56:03.000000</timeBinBCD5> + </tdml:dfdlInfoset> + </tdml:infoset> + </tdml:parserTestCase> + + <tdml:parserTestCase name="timeBinBCD6" root="timeBinBCD6" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" + roundTrip="true"> + + <tdml:document> + <tdml:documentPart type="byte">03 18 56 03</tdml:documentPart> + </tdml:document> + <tdml:infoset> + <tdml:dfdlInfoset> + <timeBinBCD6> + <length>3</length> + <time>18:56:03.000000</time> + </timeBinBCD6> + </tdml:dfdlInfoset> + </tdml:infoset> + </tdml:parserTestCase> + + <tdml:parserTestCase name="dateTimeBinBCD" root="dateTimeBinBCD" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" + roundTrip="true"> + + <tdml:document> + <tdml:documentPart type="byte">06 14 20 04 18 56 03</tdml:documentPart> + </tdml:document> + <tdml:infoset> + <tdml:dfdlInfoset> + <dateTimeBinBCD>2004-06-14T18:56:03.000000</dateTimeBinBCD> + </tdml:dfdlInfoset> + </tdml:infoset> + </tdml:parserTestCase> + + <tdml:parserTestCase name="dateTimeBinBCD2" root="dateTimeBinBCD2" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > + + <tdml:document> + <tdml:documentPart type="byte">01 45 00 99 87</tdml:documentPart> + </tdml:document> + <tdml:errors> + <tdml:error>Schema Definition Error</tdml:error> + <tdml:error>Length of binary data 'DateTime' with binaryCalendarRep='bcd' cannot be determined implicitly</tdml:error> + </tdml:errors> + </tdml:parserTestCase> + + <tdml:parserTestCase name="dateTimeBinBCD3" root="dateTimeBinBCD3" model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" roundTrip="false"> + <tdml:document> + <tdml:documentPart type="byte">06 14 20 04 18 56 03</tdml:documentPart> + </tdml:document> + <tdml:infoset> + <tdml:dfdlInfoset> + <dateTimeBinBCD3>2004-06-14T18:56:03.000000</dateTimeBinBCD3> + </tdml:dfdlInfoset> + </tdml:infoset> + </tdml:parserTestCase> + + <tdml:parserTestCase name="dateTimeBinBCD4" root="dateTimeBinBCD4" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" + roundTrip="true"> + + <tdml:document> + <tdml:documentPart type="byte">03 3B 06 14 20 04 18 56 03 3B 19 3B</tdml:documentPart> + </tdml:document> + <tdml:infoset> + <tdml:dfdlInfoset> + <dateTimeBinBCD4> + <num1>3</num1> + <datetime>2004-06-14T18:56:03.000000</datetime> + <num2>19</num2> + </dateTimeBinBCD4> + </tdml:dfdlInfoset> + </tdml:infoset> + </tdml:parserTestCase> + + <tdml:parserTestCase name="dateBinInvalid" root="dateBinInvalid" + model="SimpleTypes-binary" description="Section 5 Schema types-dateTime - DFDL-5-016R" > + <tdml:document> <tdml:documentPart type="bits">0000 0000 0011 1101</tdml:documentPart> </tdml:document> @@ -2427,7 +2745,7 @@ <tdml:documentPart type="byte">00 00 00 01</tdml:documentPart> </tdml:document> <tdml:errors> - <tdml:error>Schema Definition Error: Size of binary data 'decimal' cannot be determined implicitly.</tdml:error> + <tdml:error>Schema Definition Error: Length of binary data 'decimal' cannot be determined implicitly.</tdml:error> </tdml:errors> </tdml:parserTestCase> @@ -3282,7 +3600,7 @@ </tdml:document> <tdml:errors> <tdml:error>Schema Definition Error</tdml:error> - <tdml:error>Size of binary data 'integer' cannot be determined implicitly</tdml:error> + <tdml:error>Length of binary data 'integer' cannot be determined implicitly</tdml:error> </tdml:errors> </tdml:parserTestCase> @@ -3299,7 +3617,7 @@ </tdml:document> <tdml:errors> <tdml:error>Schema Definition Error</tdml:error> - <tdml:error>Size of binary data 'integer' cannot be determined implicitly</tdml:error> + <tdml:error>Length of binary data 'integer' cannot be determined implicitly</tdml:error> </tdml:errors> </tdml:parserTestCase> diff --git a/daffodil-test/src/test/resources/org/apache/daffodil/section12/lengthKind/DelimitedTests.tdml b/daffodil-test/src/test/resources/org/apache/daffodil/section12/lengthKind/DelimitedTests.tdml index 6b5019ec5..682646bd5 100644 --- a/daffodil-test/src/test/resources/org/apache/daffodil/section12/lengthKind/DelimitedTests.tdml +++ b/daffodil-test/src/test/resources/org/apache/daffodil/section12/lengthKind/DelimitedTests.tdml @@ -1098,7 +1098,7 @@ C</MessageHeaders> </tdml:document> <tdml:errors> <tdml:error>Schema Definition Error</tdml:error> - <tdml:error>Subset lengthKind='delimited' only supported for packed binary formats.</tdml:error> + <tdml:error>lengthKind='delimited' only supported for packed binary formats.</tdml:error> </tdml:errors> </tdml:parserTestCase> diff --git a/daffodil-test/src/test/scala/org/apache/daffodil/section05/simple_types/TestSimpleTypes.scala b/daffodil-test/src/test/scala/org/apache/daffodil/section05/simple_types/TestSimpleTypes.scala index a87831393..c5a0ed44b 100644 --- a/daffodil-test/src/test/scala/org/apache/daffodil/section05/simple_types/TestSimpleTypes.scala +++ b/daffodil-test/src/test/scala/org/apache/daffodil/section05/simple_types/TestSimpleTypes.scala @@ -189,7 +189,27 @@ class TestSimpleTypes { @Test def test_dateTimeBin17() { runner.runOneTest("dateTimeBin17") } @Test def test_dateTimeBin18() { runner.runOneTest("dateTimeBin18") } @Test def test_dateTimeBin19() { runner.runOneTest("dateTimeBin19") } - @Test def test_dateBin2() { runner.runOneTest("dateBin2") } + @Test def test_dateTimeBin20() { runner.runOneTest("dateTimeBin20") } + @Test def test_dateBinBCD() { runner.runOneTest("dateBinBCD") } + @Test def test_dateBinBCD2() { runner.runOneTest("dateBinBCD2") } + @Test def test_dateBinBCD3() { runner.runOneTest("dateBinBCD3") } + @Test def test_dateBinBCD4() { runner.runOneTest("dateBinBCD4") } + @Test def test_dateBinBCD5() { runner.runOneTest("dateBinBCD5") } + @Test def test_dateBinBCD6() { runner.runOneTest("dateBinBCD6") } + @Test def test_dateBinBCD7() { runner.runOneTest("dateBinBCD7") } + @Test def test_dateBinBCD8() { runner.runOneTest("dateBinBCD8") } + @Test def test_dateBinBCD9() { runner.runOneTest("dateBinBCD9") } + @Test def test_timeBinBCD() { runner.runOneTest("timeBinBCD") } + @Test def test_timeBinBCD2() { runner.runOneTest("timeBinBCD2") } + @Test def test_timeBinBCD3() { runner.runOneTest("timeBinBCD3") } + @Test def test_timeBinBCD4() { runner.runOneTest("timeBinBCD4") } + @Test def test_timeBinBCD5() { runner.runOneTest("timeBinBCD5") } + @Test def test_timeBinBCD6() { runner.runOneTest("timeBinBCD6") } + @Test def test_dateTimeBinBCD() { runner.runOneTest("dateTimeBinBCD") } + @Test def test_dateTimeBinBCD2() { runner.runOneTest("dateTimeBinBCD2") } + @Test def test_dateTimeBinBCD3() { runner.runOneTest("dateTimeBinBCD3") } + @Test def test_dateTimeBinBCD4() { runner.runOneTest("dateTimeBinBCD4") } + @Test def test_dateBinInvalid() { runner.runOneTest("dateBinInvalid") } @Test def test_dateTimeImplicitPattern() { runner.runOneTest("dateTimeImplicitPattern") } @Test def test_dateTimeImplicitPatternFail() { runner.runOneTest("dateTimeImplicitPatternFail") } ---------------------------------------------------------------- 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: us...@infra.apache.org With regards, Apache Git Services