1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package com.rapiddweller.benerator.engine.parser.xml;
28
29 import com.rapiddweller.benerator.engine.Statement;
30 import com.rapiddweller.benerator.engine.statement.IfStatement;
31 import com.rapiddweller.benerator.engine.statement.SequentialStatement;
32 import com.rapiddweller.common.CollectionUtil;
33 import com.rapiddweller.common.xml.XMLUtil;
34 import com.rapiddweller.script.Expression;
35 import org.w3c.dom.Element;
36
37 import java.util.List;
38 import java.util.Objects;
39 import java.util.Set;
40
41 import static com.rapiddweller.benerator.engine.DescriptorConstants.ATT_TEST;
42 import static com.rapiddweller.benerator.engine.DescriptorConstants.EL_COMMENT;
43 import static com.rapiddweller.benerator.engine.DescriptorConstants.EL_ELSE;
44 import static com.rapiddweller.benerator.engine.DescriptorConstants.EL_IF;
45 import static com.rapiddweller.benerator.engine.DescriptorConstants.EL_THEN;
46 import static com.rapiddweller.benerator.engine.parser.xml.DescriptorParserUtil.parseBooleanExpressionAttribute;
47
48
49
50
51
52
53
54
55 public class IfParser extends AbstractBeneratorDescriptorParser {
56
57 private static final Set<String> STRICT_CHILDREN = CollectionUtil.toSet(
58 EL_THEN, EL_ELSE, EL_COMMENT);
59
60
61
62
63 public IfParser() {
64 super(EL_IF, CollectionUtil.toSet(ATT_TEST), null);
65 }
66
67 @Override
68 public Statementm/rapiddweller/benerator/engine/Statement.html#Statement">Statement doParse(Element ifElement, Statement[] parentPath, BeneratorParseContext context) {
69 Expression<Boolean> condition = parseBooleanExpressionAttribute(ATT_TEST, ifElement);
70 Element[] thenElements = XMLUtil.getChildElements(ifElement, false, "then");
71 if (thenElements.length > 1) {
72 syntaxError("Multiple <then> elements", ifElement);
73 }
74 Element thenElement = (thenElements.length == 1 ? thenElements[0] : null);
75 Element[] elseElements = XMLUtil.getChildElements(ifElement, false, "else");
76 if (elseElements.length > 1) {
77 syntaxError("Multiple <else> elements", ifElement);
78 }
79 Element elseElement = (elseElements.length == 1 ? elseElements[0] : null);
80 List<Statement> thenStatements = null;
81 List<Statement> elseStatements = null;
82 IfStatemente/statement/IfStatement.html#IfStatement">IfStatement ifStatement = new IfStatement(condition);
83 Statement[] ifPath = context.createSubPath(parentPath, ifStatement);
84 if (elseElement != null) {
85
86 if (thenElement == null) {
87 syntaxError("'else' without 'then'", elseElement);
88 }
89 thenStatements = context.parseChildElementsOf(thenElement, ifPath);
90 elseStatements = context.parseChildElementsOf(elseElement, ifPath);
91
92 assertThenElseChildren(ifElement);
93 } else {
94 thenStatements = context.parseChildElementsOf(Objects.requireNonNullElse(thenElement, ifElement), ifPath);
95 }
96 ifStatement.setThenStatement(new SequentialStatement(thenStatements));
97 ifStatement.setElseStatement(new SequentialStatement(elseStatements));
98 return ifStatement;
99 }
100
101 private static void assertThenElseChildren(Element ifElement) {
102 for (Element child : XMLUtil.getChildElements(ifElement)) {
103 if (!STRICT_CHILDREN.contains(child.getNodeName())) {
104 syntaxError("Illegal child element: ", child);
105 }
106 }
107 }
108
109 }