This is an automated email from the ASF dual-hosted git repository.
mariofusco pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git
The following commit(s) were added to refs/heads/main by this push:
new 3354987b0d [KIE-734] support yaml format in quarkus extension (#5607)
3354987b0d is described below
commit 3354987b0d504f4a7a7cbb219eae3fff49500ae0
Author: Mario Fusco <[email protected]>
AuthorDate: Fri Dec 1 12:47:12 2023 +0100
[KIE-734] support yaml format in quarkus extension (#5607)
---
.../model/codegen/project/DroolsModelBuilder.java | 72 ++++++++++++----------
.../deployment/DroolsCompilationProvider.java | 1 +
.../drools-quarkus-integration-test/pom.xml | 4 ++
.../org/drools/quarkus/test/TestableResource.java | 21 ++++---
.../src/main/resources/META-INF/kmodule.xml | 3 +
.../resources/org/drools/yaml/CanDrink.drl.yaml | 25 ++++++++
.../java/org/drools/quarkus/test/RuntimeTest.java | 14 +++--
7 files changed, 95 insertions(+), 45 deletions(-)
diff --git
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/project/DroolsModelBuilder.java
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/project/DroolsModelBuilder.java
index 1564064528..0ab40f9c5c 100644
---
a/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/project/DroolsModelBuilder.java
+++
b/drools-model/drools-model-codegen/src/main/java/org/drools/model/codegen/project/DroolsModelBuilder.java
@@ -18,6 +18,16 @@
*/
package org.drools.model.codegen.project;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
import org.drools.codegen.common.DroolsModelBuildContext;
import org.drools.codegen.common.GeneratedFile;
import org.drools.codegen.common.GeneratedFileType;
@@ -26,6 +36,8 @@ import org.drools.compiler.builder.impl.BuildResultCollector;
import org.drools.compiler.builder.impl.KnowledgeBuilderConfigurationImpl;
import org.drools.compiler.builder.impl.resources.DecisionTableResourceHandler;
import org.drools.compiler.builder.impl.resources.DrlResourceHandler;
+import org.drools.compiler.builder.impl.resources.ResourceHandler;
+import org.drools.compiler.builder.impl.resources.YamlResourceHandler;
import org.drools.compiler.kie.builder.impl.DecisionTableConfigurationDelegate;
import org.drools.compiler.lang.descr.CompositePackageDescr;
import org.drools.drl.ast.descr.PackageDescr;
@@ -42,16 +54,6 @@ import org.kie.util.maven.support.ReleaseIdImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
import static
org.drools.compiler.kie.builder.impl.AbstractKieModule.loadResourceConfiguration;
import static
org.kie.internal.builder.KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration;
@@ -68,7 +70,9 @@ public class DroolsModelBuilder {
private final boolean decisionTableSupported;
private final KnowledgeBuilderConfigurationImpl
knowledgeBuilderConfiguration;
private final DroolsModelBuildContext context;
- private Function<PackageModel, PackageModelWriter>
packageModelWriterProvider;
+ private final Function<PackageModel, PackageModelWriter>
packageModelWriterProvider;
+
+ private final Map<ResourceType, ResourceHandler> handlersMap = new
HashMap<>();
public DroolsModelBuilder(
DroolsModelBuildContext context,
@@ -95,20 +99,14 @@ public class DroolsModelBuilder {
}
public void build() {
-
- DrlResourceHandler drlResourceHandler =
- new DrlResourceHandler(knowledgeBuilderConfiguration);
- DecisionTableResourceHandler decisionTableHandler =
- new
DecisionTableResourceHandler(knowledgeBuilderConfiguration, DUMMY_RELEASE_ID);
-
Map<String, CompositePackageDescr> packages = new HashMap<>();
-
for (Resource resource : resources) {
try {
- if (resource.getResourceType() == ResourceType.DRL) {
- handleDrl(drlResourceHandler, packages, resource);
+ ResourceType resourceType = resource.getResourceType();
+ if (resourceType == ResourceType.DRL || resourceType ==
ResourceType.YAML) {
+ handleResource(getHandlerForType(resourceType), packages,
resource, null);
} else if (resource.getResourceType() == ResourceType.DTABLE) {
- handleDtable(decisionTableHandler, packages, resource);
+ handleDtable(getHandlerForType(resourceType), packages,
resource);
}
} catch (DroolsParserException | IOException e) {
throw new RuntimeException(e);
@@ -136,23 +134,31 @@ public class DroolsModelBuilder {
this.packageModels = compiler.getPackageModels();
}
- public boolean hasRuleUnits() {
- return codegenPackageSources.stream().anyMatch(pkg ->
!pkg.getRuleUnits().isEmpty());
+ private ResourceHandler getHandlerForType(ResourceType type) {
+ return handlersMap.computeIfAbsent(type, this::createHandlerForType);
+ }
+
+ private ResourceHandler createHandlerForType(ResourceType type) {
+ if (type == ResourceType.DRL) {
+ return new DrlResourceHandler(knowledgeBuilderConfiguration);
+ } else if (type == ResourceType.YAML) {
+ return new YamlResourceHandler(knowledgeBuilderConfiguration);
+ } else if (type == ResourceType.DTABLE) {
+ return new
DecisionTableResourceHandler(knowledgeBuilderConfiguration, DUMMY_RELEASE_ID);
+ }
+ throw new IllegalArgumentException("No registered ResourceHandler for
type " + type);
}
- private void handleDtable(DecisionTableResourceHandler
decisionTableHandler, Map<String, CompositePackageDescr> packages, Resource
resource) throws DroolsParserException {
+ private void handleDtable(ResourceHandler decisionTableHandler,
Map<String, CompositePackageDescr> packages, Resource resource) throws
DroolsParserException, IOException {
Collection<ResourceConfiguration> resourceConfigurations =
loadDtableResourceConfiguration(resource);
for (ResourceConfiguration cfg : resourceConfigurations) {
- PackageDescr packageDescr = decisionTableHandler.process(resource,
cfg);
- CompositePackageDescr compositePackageDescr =
- packages.computeIfAbsent(packageDescr.getNamespace(),
CompositePackageDescr::new);
- compositePackageDescr.addPackageDescr(resource, packageDescr);
+ handleResource(decisionTableHandler, packages, resource, cfg);
}
}
- private void handleDrl(DrlResourceHandler drlResourceHandler, Map<String,
CompositePackageDescr> packages, Resource resource) throws
DroolsParserException, IOException {
- PackageDescr packageDescr = drlResourceHandler.process(resource);
- Collection<KnowledgeBuilderResult> results =
drlResourceHandler.getResults();
+ private void handleResource(ResourceHandler resourceHandler, Map<String,
CompositePackageDescr> packages, Resource resource, ResourceConfiguration cfg)
throws DroolsParserException, IOException {
+ PackageDescr packageDescr = resourceHandler.process(resource, cfg);
+ Collection<KnowledgeBuilderResult> results =
resourceHandler.getResults();
if (!results.isEmpty()) {
throw new DroolsParserException(
results.stream()
@@ -164,6 +170,10 @@ public class DroolsModelBuilder {
compositePackageDescr.addPackageDescr(resource, packageDescr);
}
+ public boolean hasRuleUnits() {
+ return codegenPackageSources.stream().anyMatch(pkg ->
!pkg.getRuleUnits().isEmpty());
+ }
+
public Collection<GeneratedFile> generateCanonicalModelSources() {
List<GeneratedFile> modelFiles = new ArrayList<>();
List<GeneratedFile> legacyModelFiles = new ArrayList<>();
diff --git
a/drools-quarkus-extension/drools-quarkus-deployment/src/main/java/org/drools/quarkus/deployment/DroolsCompilationProvider.java
b/drools-quarkus-extension/drools-quarkus-deployment/src/main/java/org/drools/quarkus/deployment/DroolsCompilationProvider.java
index bf4829fd6c..885900c3af 100644
---
a/drools-quarkus-extension/drools-quarkus-deployment/src/main/java/org/drools/quarkus/deployment/DroolsCompilationProvider.java
+++
b/drools-quarkus-extension/drools-quarkus-deployment/src/main/java/org/drools/quarkus/deployment/DroolsCompilationProvider.java
@@ -32,6 +32,7 @@ public class DroolsCompilationProvider extends
AbstractCompilationProvider {
Set<String> extensions = new HashSet<>();
extensions.addAll(ResourceType.DRL.getAllExtensions());
extensions.addAll(ResourceType.DTABLE.getAllExtensions());
+ extensions.addAll(ResourceType.YAML.getAllExtensions());
return Collections.unmodifiableSet(extensions);
}
diff --git a/drools-quarkus-extension/drools-quarkus-integration-test/pom.xml
b/drools-quarkus-extension/drools-quarkus-integration-test/pom.xml
index ad4c2de0ab..335fd59465 100644
--- a/drools-quarkus-extension/drools-quarkus-integration-test/pom.xml
+++ b/drools-quarkus-extension/drools-quarkus-integration-test/pom.xml
@@ -45,6 +45,10 @@
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-drlonyaml-todrl</artifactId>
+ </dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-core</artifactId>
diff --git
a/drools-quarkus-extension/drools-quarkus-integration-test/src/main/java/org/drools/quarkus/test/TestableResource.java
b/drools-quarkus-extension/drools-quarkus-integration-test/src/main/java/org/drools/quarkus/test/TestableResource.java
index cc47c1a1e3..9cb7dd190f 100644
---
a/drools-quarkus-extension/drools-quarkus-integration-test/src/main/java/org/drools/quarkus/test/TestableResource.java
+++
b/drools-quarkus-extension/drools-quarkus-integration-test/src/main/java/org/drools/quarkus/test/TestableResource.java
@@ -18,6 +18,16 @@
*/
package org.drools.quarkus.test;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+import javax.inject.Inject;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Response;
+
import org.kie.api.KieBase;
import org.kie.api.definition.KiePackage;
import org.kie.api.runtime.KieRuntimeBuilder;
@@ -25,15 +35,6 @@ import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.rule.FactHandle;
import org.kie.api.time.SessionPseudoClock;
-import javax.inject.Inject;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.core.Response;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
@@ -100,7 +101,7 @@ public class TestableResource {
List<String> pkgNames =
kBase.getKiePackages().stream().map(KiePackage::getName).collect(Collectors.toList());
assertThat(pkgNames)
-
.containsExactlyInAnyOrder("org.drools.quarkus.test","org.drools.drl","org.drools.dtable","org.drools.cep","org.drools.tms","org.drools.probe");
+
.containsExactlyInAnyOrder("org.drools.quarkus.test","org.drools.drl","org.drools.dtable","org.drools.cep","org.drools.tms","org.drools.probe","org.drools.yaml");
return Response.ok().build();
}
diff --git
a/drools-quarkus-extension/drools-quarkus-integration-test/src/main/resources/META-INF/kmodule.xml
b/drools-quarkus-extension/drools-quarkus-integration-test/src/main/resources/META-INF/kmodule.xml
index cb43d34c56..a090bae9e0 100644
---
a/drools-quarkus-extension/drools-quarkus-integration-test/src/main/resources/META-INF/kmodule.xml
+++
b/drools-quarkus-extension/drools-quarkus-integration-test/src/main/resources/META-INF/kmodule.xml
@@ -26,6 +26,9 @@
<kbase name="canDrinkKBDTable" packages="org.drools.dtable">
<ksession name="canDrinkKSDTable" />
</kbase>
+ <kbase name="canDrinkKBDYaml" packages="org.drools.yaml">
+ <ksession name="canDrinkKSDYaml" />
+ </kbase>
<kbase name="cepKB" packages="org.drools.cep" eventProcessingMode="stream">
<ksession name="cepKS" clockType="pseudo"/>
</kbase>
diff --git
a/drools-quarkus-extension/drools-quarkus-integration-test/src/main/resources/org/drools/yaml/CanDrink.drl.yaml
b/drools-quarkus-extension/drools-quarkus-integration-test/src/main/resources/org/drools/yaml/CanDrink.drl.yaml
new file mode 100755
index 0000000000..9e96ede9f5
--- /dev/null
+++
b/drools-quarkus-extension/drools-quarkus-integration-test/src/main/resources/org/drools/yaml/CanDrink.drl.yaml
@@ -0,0 +1,25 @@
+name: org.drools.yaml
+imports:
+ - org.drools.quarkus.test.Person
+ - org.drools.quarkus.test.Result
+rules:
+ - name: R1
+ when:
+ - given: Result
+ as: $r
+ - given: Person
+ as: $p
+ having:
+ - age >= 18
+ then: |
+ $r.setValue( $p.getName() + " can drink");
+ - name: R2
+ when:
+ - given: Result
+ as: $r
+ - given: Person
+ as: $p
+ having:
+ - age < 18
+ then: |
+ $r.setValue( $p.getName() + " can NOT drink");
diff --git
a/drools-quarkus-extension/drools-quarkus-integration-test/src/test/java/org/drools/quarkus/test/RuntimeTest.java
b/drools-quarkus-extension/drools-quarkus-integration-test/src/test/java/org/drools/quarkus/test/RuntimeTest.java
index 76cedc9fb6..602a4064d0 100644
---
a/drools-quarkus-extension/drools-quarkus-integration-test/src/test/java/org/drools/quarkus/test/RuntimeTest.java
+++
b/drools-quarkus-extension/drools-quarkus-integration-test/src/test/java/org/drools/quarkus/test/RuntimeTest.java
@@ -18,16 +18,17 @@
*/
package org.drools.quarkus.test;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import javax.inject.Inject;
+
import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;
import org.kie.api.definition.KiePackage;
import org.kie.api.runtime.KieRuntimeBuilder;
import org.kie.api.runtime.KieSession;
-import javax.inject.Inject;
-import java.util.List;
-import java.util.stream.Collectors;
-
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -48,6 +49,11 @@ public class RuntimeTest {
testSimpleDrl(runtimeBuilder.newKieSession("canDrinkKSDTable"),
"org.drools.dtable");
}
+ @Test
+ public void testYamlEvaluation() {
+ testSimpleDrl(runtimeBuilder.newKieSession("canDrinkKSDYaml"),
"org.drools.yaml");
+ }
+
private void testSimpleDrl(KieSession ksession, String assetPackage) {
List<String> pkgNames =
ksession.getKieBase().getKiePackages().stream().map(KiePackage::getName).collect(Collectors.toList());
assertEquals(2, pkgNames.size());
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]