Skip to content

Commit

Permalink
review changes
Browse files Browse the repository at this point in the history
Signed-off-by: tvallin <thibault.vallin@oracle.com>
  • Loading branch information
tvallin committed Nov 8, 2023
1 parent 453263c commit c594fb3
Show file tree
Hide file tree
Showing 13 changed files with 288 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,13 @@ public VisitResult visitCondition(Condition cond, Script script) {

@Override
public VisitResult visitConditionBlock(ConditionBlock condition, JsonObjectBuilder arg) {
return evaluate(condition.expression());
VisitResult result = evaluate(condition.expression());
BuilderContext builder = stack.peek();
if (builder != null) {
builder.block.add("if", exprId);
}
exprId = null;
return result;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,17 @@ void testFiltering2() throws IOException {
assertThat(jsonDiff(archetypeJson, readJson(expected)), is(EMPTY_JSON_ARRAY));
}

@Test
void testFiltering3() throws IOException {
Path targetDir = targetDir(this.getClass());
Path sourceDir = targetDir.resolve("test-classes/filtering3");
Path expected = targetDir.resolve("test-classes/expected/filtering3.json");
FileSystem fs = VirtualFileSystem.create(sourceDir);

JsonObject archetypeJson = ScriptSerializer.serialize(fs);
assertThat(jsonDiff(archetypeJson, readJson(expected)), is(EMPTY_JSON_ARRAY));
}

@Test
void testConvertExpression() throws IOException {
int id = 1;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
{
"expressions": {
"1": [
{
"kind": "literal",
"value": true
}
],
"2": [
{
"kind": "literal",
"value": false
},
{
"kind": "operator",
"value": "!"
},
{
"kind": "literal",
"value": true
},
{
"kind": "operator",
"value": "&&"
}
]
},
"methods": {},
"children": [
{
"kind": "if",
"if": "1",
"children": [
{
"kind": "step",
"name": "Step1",
"id": "1",
"children": [
{
"kind": "elseif",
"if": "2",
"children": [
{
"kind": "inputs",
"children": [
{
"kind": "boolean",
"name": "Boolean1",
"id": "boolean1",
"default": false
}
]
}
]
}
]
}
]
}
]
}
49 changes: 49 additions & 0 deletions archetype/engine-v2-json/src/test/resources/filtering3/main.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2023 Oracle and/or its affiliates.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<archetype-script xmlns="https://helidon.io/archetype/2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://helidon.io/archetype/2.0 file:/archetype.xsd">
<if expr="true">
<step name="Step1">
<if expr="false"/>
<else-if expr="true">
<inputs>
<boolean id="boolean1" name="Boolean1">
<output>
<file source="foo.txt" target="foo.txt"/>
</output>
</boolean>
</inputs>
<if expr="true">
<output></output>
</if>
<if expr="true">
<output>
<model>
<value key="foo">bar</value>
</model>
</output>
</if>
</else-if>
<else>
<inputs></inputs>
</else>
</step>
</if>
</archetype-script>
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@
*/
public final class ConditionBlock extends Block {
private final Expression expression;
private final String rawExpression;

private ConditionBlock(Builder builder) {
super(builder);
this.expression = builder.expression;
this.rawExpression = builder.rawExpression;
}

/**
Expand All @@ -47,6 +49,15 @@ public Expression expression() {
return expression;
}

/**
* Get the raw expression.
*
* @return raw expression
*/
public String rawExpression() {
return rawExpression;
}

@Override
public <A> VisitResult accept(Block.Visitor<A> visitor, A arg) {
return visitor.visitConditionBlock(this, arg);
Expand All @@ -62,6 +73,7 @@ public <A> VisitResult acceptAfter(Visitor<A> visitor, A arg) {
*/
public static final class Builder extends Block.Builder {
private Expression expression;
private String rawExpression;

private Builder(BuilderInfo info, Kind kind) {
super(info, kind);
Expand All @@ -74,6 +86,7 @@ private Builder(BuilderInfo info, Kind kind) {
* @return this builder
*/
public Builder expression(String expression) {
this.rawExpression = expression;
this.expression = Expression.create(expression);
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import io.helidon.build.archetype.engine.v2.ScriptLoader;
import io.helidon.build.archetype.engine.v2.ast.Block;
import io.helidon.build.archetype.engine.v2.ast.Condition;
import io.helidon.build.archetype.engine.v2.ast.ConditionBlock;
import io.helidon.build.archetype.engine.v2.ast.DeclaredBlock;
import io.helidon.build.archetype.engine.v2.ast.DeclaredValue;
import io.helidon.build.archetype.engine.v2.ast.Input;
Expand Down Expand Up @@ -137,6 +138,9 @@ public Node.VisitResult visitBlock(Block block, Script script) {
builder = Step.builder(builderInfo(block));
} else if (block instanceof Input) {
builder = Input.builder(builderInfo, kind);
} else if (block instanceof ConditionBlock) {
builder = ConditionBlock.builder(builderInfo(block), kind)
.expression(((ConditionBlock) block).rawExpression());
} else {
builder = Block.builder(builderInfo, kind);
}
Expand All @@ -159,6 +163,9 @@ public Node.VisitResult postVisitBlock(Block block, Script arg) {
case VARIABLES:
case INVOKE:
case INVOKE_DIR:
case IF:
case ELSEIF:
case ELSE:
Node.Builder<?, ?> parentBuilder = stack.peek();
if (parentBuilder != null) {
parentBuilder.nestedBuilders().remove(builder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package io.helidon.build.archetype.engine.v2.util;

import io.helidon.build.archetype.engine.v2.ast.Block;
import io.helidon.build.archetype.engine.v2.ast.ConditionBlock;
import io.helidon.build.archetype.engine.v2.ast.Node;
import io.helidon.build.archetype.engine.v2.ast.Variable;

Expand Down Expand Up @@ -52,4 +53,19 @@ public Node.VisitResult visitVariable(Variable variable, Void arg) {
}
return Node.VisitResult.CONTINUE;
}

@Override
public Node.VisitResult visitConditionBlock(ConditionBlock condition, Void arg) {
if (condition.children().isEmpty()) {
return Node.VisitResult.SKIP_SUBTREE;
}
for (Node node : condition.children()) {
if (node instanceof Block) {
if (((Block) node).kind() != Block.Kind.OUTPUT) {
return Node.VisitResult.CONTINUE;
}
}
}
return Node.VisitResult.SKIP_SUBTREE;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ protected void onVisitStep(Step step, Context context) {
}
}, script, context);

assertThat(steps, contains("step", "my-step"));
assertThat(steps, contains("step1", "step2"));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -846,10 +846,7 @@ public VisitResult visitList(Input.List input, Void arg) {
}, arg);
}
private VisitResult evaluate(Expression expression) {
if (expression.eval()) {
return VisitResult.CONTINUE;
}
return VisitResult.SKIP_SUBTREE;
return expression.eval() ? VisitResult.CONTINUE : VisitResult.SKIP_SUBTREE;
}
}, script);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@
package io.helidon.build.archetype.engine.v2.util;

import io.helidon.build.archetype.engine.v2.ast.Block;
import io.helidon.build.archetype.engine.v2.ast.ConditionBlock;
import io.helidon.build.archetype.engine.v2.ast.Input;
import io.helidon.build.archetype.engine.v2.ast.Node;
import io.helidon.build.archetype.engine.v2.ast.Node.VisitResult;
import io.helidon.build.archetype.engine.v2.ast.Preset;
import io.helidon.build.archetype.engine.v2.ast.Script;
import io.helidon.build.archetype.engine.v2.ast.Step;

Expand Down Expand Up @@ -618,4 +620,63 @@ public VisitResult visitAny(Input input, Void arg) {
}, compiledScript);
assertThat(index[0], is(12));
}

@Test
void testCondition() {
Script script = load("compiler/conditions/condition.xml");
Script compiledScript = ClientCompiler.compile(script, false);
int[] index = new int[]{0};
walk(new Node.Visitor<>() {
@Override
public VisitResult visitBlock(Block block, Void arg) {
return block.accept(new Block.Visitor<>() {
@Override
public VisitResult visitStep(Step step, Void arg) {
assertThat(++index[0], is(1));
return VisitResult.CONTINUE;
}

@Override
public VisitResult visitAny(Block block, Void arg) {
switch (block.kind()) {
case SCRIPT:
break;
case INPUTS:
assertThat(++index[0], is(3));
break;
default:
fail(String.format("Unexpected block: %s, index=%d", block, index[0]));
}
return VisitResult.CONTINUE;
}

@Override
public VisitResult visitInput(Input input, Void arg) {
return input.accept(new Input.Visitor<>() {
@Override
public VisitResult visitBoolean(Input.Boolean input, Void arg) {
assertThat(++index[0], is(4));
assertThat(input.id(), is("boolean1"));
assertThat(input.name(), is("Boolean1"));
return VisitResult.CONTINUE;
}

@Override
public VisitResult visitAny(Input input, Void arg) {
fail(String.format("Unexpected input: %s, index=%d", block, index[0]));
return VisitResult.CONTINUE;
}
}, arg);
}

@Override
public VisitResult visitConditionBlock(ConditionBlock condition, Void arg) {
assertThat(++index[0], is(2));
return VisitResult.CONTINUE;
}
}, arg);
}
}, compiledScript);
assertThat(index[0], is(4));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2023 Oracle and/or its affiliates.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<archetype-script xmlns="https://helidon.io/archetype/2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://helidon.io/archetype/2.0 file:/archetype.xsd">

<variables>
<boolean path="foo" transient="true">true</boolean>
</variables>
<step name="step1">
<if expr="true"/>
<else-if expr="true">
<output>
<model>
<value key="foo">bar</value>
</model>
</output>
</else-if>
<if expr="true">
<inputs>
<boolean id="boolean1" name="Boolean1">
<output>
<file source="foo.txt" target="foo.txt"/>
</output>
</boolean>
</inputs>
</if>
</step>
</archetype-script>
Loading

0 comments on commit c594fb3

Please sign in to comment.