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]

Reply via email to