Skip to content

Commit 05b0a51

Browse files
Merge pull request #101 from OP-TED/release/2.0.0-alpha.3
Release/2.0.0 alpha.3
2 parents 80b40c2 + de77851 commit 05b0a51

5 files changed

Lines changed: 57 additions & 20 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,13 @@
1-
# EFX Toolkit 2.0.0-alpha.2 Release Notes
1+
# EFX Toolkit 2.0.0-alpha.3 Release Notes
22

33
_The EFX Toolkit for Java developers is a library that enables the transpilation of [EFX](https://docs.ted.europa.eu/eforms/latest/efx) expressions and templates to different target languages. It also includes an implementation of an EFX-to-XPath transpiler._
44

55
---
66

77
## In this release
88

9-
This release improves translation of EFX-1 templates as follows:
10-
11-
- Renders sequences of labels when a sequence expression is used to provide asset-ids.
12-
- Renders distinct labels from sequences.
13-
- Improves date and time formatting.
14-
15-
This release also includes a refactoring that moved XPath processing classes to the eForms Core Library 1.2.0 to improve reusability.
16-
17-
There are no changes in EFX-2 translation included in this release.
18-
9+
This release fixes an a bug that caused an exception to be thrown by XSLT processors when trying to format sequences of dates or times.
10+
This bug was reported by a user in [eForms Notice Viewer issue #88](https://github.com/OP-TED/eforms-notice-viewer/issues/88).
1911

2012
## EFX-1 Support
2113

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
<groupId>eu.europa.ted.eforms</groupId>
55
<artifactId>efx-toolkit-java</artifactId>
6-
<version>2.0.0-alpha.2</version>
6+
<version>2.0.0-alpha.3</version>
77
<packaging>jar</packaging>
88

99
<name>EFX Toolkit for Java</name>

src/main/java/eu/europa/ted/efx/sdk1/EfxTemplateTranslatorV1.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,11 @@
2929
import eu.europa.ted.efx.model.expressions.TypedExpression;
3030
import eu.europa.ted.efx.model.expressions.path.PathExpression;
3131
import eu.europa.ted.efx.model.expressions.path.StringPathExpression;
32+
import eu.europa.ted.efx.model.expressions.scalar.DateExpression;
3233
import eu.europa.ted.efx.model.expressions.scalar.StringExpression;
34+
import eu.europa.ted.efx.model.expressions.sequence.DateSequenceExpression;
3335
import eu.europa.ted.efx.model.expressions.sequence.StringSequenceExpression;
36+
import eu.europa.ted.efx.model.expressions.sequence.TimeSequenceExpression;
3437
import eu.europa.ted.efx.model.templates.ContentBlock;
3538
import eu.europa.ted.efx.model.templates.ContentBlockStack;
3639
import eu.europa.ted.efx.model.templates.Markup;
@@ -496,9 +499,29 @@ public void exitStandardExpressionBlock(StandardExpressionBlockContext ctx) {
496499
// functions.
497500
if (TypedExpression.class.isAssignableFrom(expression.getClass())) {
498501
if (EfxDataType.Date.class.isAssignableFrom(((TypedExpression) expression).getDataType())) {
499-
expression = new StringExpression("format-date(" + expression.getScript() + ", '[D01]/[M01]/[Y0001]')");
502+
503+
var loopVariable = new Variable("item",
504+
this.script.composeVariableDeclaration("item", DateExpression.class), DateExpression.empty(),
505+
this.script.composeVariableReference("item", DateExpression.class));
506+
507+
expression = this.script.composeForExpression(
508+
this.script.composeIteratorList(
509+
List.of(this.script.composeIteratorExpression(loopVariable.declarationExpression,
510+
new DateSequenceExpression(expression.getScript())))),
511+
new StringExpression("format-date($item, '[D01]/[M01]/[Y0001]')"),
512+
StringSequenceExpression.class);
500513
} else if (EfxDataType.Time.class.isAssignableFrom(((TypedExpression) expression).getDataType())) {
501-
expression = new StringExpression("format-time(" + expression.getScript() + ", '[H01]:[m01] [Z]')");
514+
515+
var loopVariable = new Variable("item",
516+
this.script.composeVariableDeclaration("item", DateExpression.class), DateExpression.empty(),
517+
this.script.composeVariableReference("item", DateExpression.class));
518+
519+
expression = this.script.composeForExpression(
520+
this.script.composeIteratorList(
521+
List.of(this.script.composeIteratorExpression(loopVariable.declarationExpression,
522+
new TimeSequenceExpression(expression.getScript())))),
523+
new StringExpression("format-time($item, '[H01]:[m01] [Z]')"),
524+
StringSequenceExpression.class);
502525
}
503526
}
504527

src/main/java/eu/europa/ted/efx/sdk2/EfxTemplateTranslatorV2.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@
3838
import eu.europa.ted.efx.model.expressions.scalar.ScalarExpression;
3939
import eu.europa.ted.efx.model.expressions.scalar.StringExpression;
4040
import eu.europa.ted.efx.model.expressions.scalar.TimeExpression;
41+
import eu.europa.ted.efx.model.expressions.sequence.DateSequenceExpression;
4142
import eu.europa.ted.efx.model.expressions.sequence.StringSequenceExpression;
43+
import eu.europa.ted.efx.model.expressions.sequence.TimeSequenceExpression;
4244
import eu.europa.ted.efx.model.templates.ContentBlock;
4345
import eu.europa.ted.efx.model.templates.ContentBlockStack;
4446
import eu.europa.ted.efx.model.templates.Markup;
@@ -559,9 +561,29 @@ public void exitStandardExpressionBlock(StandardExpressionBlockContext ctx) {
559561
// functions.
560562
if (TypedExpression.class.isAssignableFrom(expression.getClass())) {
561563
if (EfxDataType.Date.class.isAssignableFrom(((TypedExpression) expression).getDataType())) {
562-
expression = new StringExpression("format-date(" + expression.getScript() + ", '[D01]/[M01]/[Y0001]')");
564+
565+
var loopVariable = new Variable("item",
566+
this.script.composeVariableDeclaration("item", DateExpression.class), DateExpression.empty(),
567+
this.script.composeVariableReference("item", DateExpression.class));
568+
569+
expression = this.script.composeForExpression(
570+
this.script.composeIteratorList(
571+
List.of(this.script.composeIteratorExpression(loopVariable.declarationExpression,
572+
new DateSequenceExpression(expression.getScript())))),
573+
new StringExpression("format-date($item, '[D01]/[M01]/[Y0001]')"),
574+
StringSequenceExpression.class);
563575
} else if (EfxDataType.Time.class.isAssignableFrom(((TypedExpression) expression).getDataType())) {
564-
expression = new StringExpression("format-time(" + expression.getScript() + ", '[H01]:[m01] [Z]')");
576+
577+
var loopVariable = new Variable("item",
578+
this.script.composeVariableDeclaration("item", DateExpression.class), DateExpression.empty(),
579+
this.script.composeVariableReference("item", DateExpression.class));
580+
581+
expression = this.script.composeForExpression(
582+
this.script.composeIteratorList(
583+
List.of(this.script.composeIteratorExpression(loopVariable.declarationExpression,
584+
new TimeSequenceExpression(expression.getScript())))),
585+
new StringExpression("format-time($item, '[H01]:[m01] [Z]')"),
586+
StringSequenceExpression.class);
565587
}
566588
}
567589

src/test/java/eu/europa/ted/efx/sdk1/EfxTemplateTranslatorV1Test.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -353,11 +353,11 @@ void testEndOfLineComments() {
353353

354354
@Test
355355
void testImplicitFormatting_Dates() {
356-
assertEquals("let block01() -> { eval(format-date(PathNode/StartDateField/xs:date(text()), '[D01]/[M01]/[Y0001]')) }\nfor-each(/*).call(block01())", translateTemplate("{ND-Root} ${BT-00-StartDate}"));
357-
}
356+
assertEquals("let block01() -> { eval(for $item in PathNode/StartDateField/xs:date(text()) return format-date($item, '[D01]/[M01]/[Y0001]')) }\nfor-each(/*).call(block01())", translateTemplate("{ND-Root} ${BT-00-StartDate}"));
357+
}
358358

359359
@Test
360360
void testImplicitFormatting_Times() {
361-
assertEquals("let block01() -> { eval(format-time(PathNode/StartTimeField/xs:time(text()), '[H01]:[m01] [Z]')) }\nfor-each(/*).call(block01())", translateTemplate("{ND-Root} ${BT-00-StartTime}"));
362-
}
361+
assertEquals("let block01() -> { eval(for $item in PathNode/StartTimeField/xs:time(text()) return format-time($item, '[H01]:[m01] [Z]')) }\nfor-each(/*).call(block01())", translateTemplate("{ND-Root} ${BT-00-StartTime}"));
362+
}
363363
}

0 commit comments

Comments
 (0)