This is an automated email from the ASF dual-hosted git repository.
pefernan pushed a commit to branch main
in repository
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git
The following commit(s) were added to refs/heads/main by this push:
new 3bce97e3d2 [Incubator-kie-issues-1790] Enhancing business calendar
flexibility (#3850)
3bce97e3d2 is described below
commit 3bce97e3d2af9ee45681bbfdd3412bfa01cc5e81
Author: Abhiram Gundala <[email protected]>
AuthorDate: Thu Feb 27 15:41:51 2025 -0500
[Incubator-kie-issues-1790] Enhancing business calendar flexibility (#3850)
* Custom_Calendar
* Custom_Calendar
* Custom_Calendar
* Custom_Calendar
* Custom_Calendar
* Custom_Calendar
* Custom_Calendar
* Custom_Calendar
* Custom_Calendar
* - Adding Unit Test
- Small adjustments
* - Cleanup
* - Cleanup 2
* - Extra check in ProcessCodegen.java to avoid ambiguities when we have
calendar.properties and kogito.processes.businessCalendar at same time
- Small cleanup
* - Fix test according to previous change, if the build fails compilation
unit should stay untouched.
---------
Co-authored-by: Pere Fernández <[email protected]>
---
.../kie/kogito/codegen/process/ProcessCodegen.java | 61 ++++++---
.../codegen/process/util/BusinessCalendarUtil.java | 106 +++++++++++++++
.../BusinessCalendarProducerQuarkusTemplate.java | 7 +-
.../BusinessCalendarProducerSpringTemplate.java | 10 +-
.../process/util/BusinessCalendarUtilTest.java | 149 +++++++++++++++++++++
.../DefaultAccessorCustomBusinessCalendar.java} | 24 ++--
.../calendars/AbstractCustomBusinessCalendar.java} | 19 +--
.../util/calendars/CustomBusinessCalendar.java} | 24 ++--
.../CustomBusinessCalendarInterface.java} | 19 +--
9 files changed, 339 insertions(+), 80 deletions(-)
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessCodegen.java
b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessCodegen.java
index 20c7189198..fdbb2541c3 100644
---
a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessCodegen.java
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/ProcessCodegen.java
@@ -21,16 +21,7 @@ package org.kie.kogito.codegen.process;
import java.io.File;
import java.io.IOException;
import java.io.Reader;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
import java.util.stream.Stream;
import org.drools.codegen.common.GeneratedFile;
@@ -39,11 +30,7 @@ import org.drools.io.InternalResource;
import org.jbpm.bpmn2.xml.BPMNDISemanticModule;
import org.jbpm.bpmn2.xml.BPMNExtensionsSemanticModule;
import org.jbpm.bpmn2.xml.BPMNSemanticModule;
-import org.jbpm.compiler.canonical.ModelMetaData;
-import org.jbpm.compiler.canonical.ProcessMetaData;
-import org.jbpm.compiler.canonical.ProcessToExecModelGenerator;
-import org.jbpm.compiler.canonical.TriggerMetaData;
-import org.jbpm.compiler.canonical.WorkItemModelMetaData;
+import org.jbpm.compiler.canonical.*;
import org.jbpm.compiler.xml.XmlProcessReader;
import org.jbpm.compiler.xml.core.SemanticModules;
import org.jbpm.process.core.impl.ProcessImpl;
@@ -84,6 +71,8 @@ import
com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import static java.lang.String.format;
import static java.util.stream.Collectors.toList;
import static
org.jbpm.process.core.constants.CalendarConstants.BUSINESS_CALENDAR_PATH;
+import static
org.kie.kogito.codegen.process.util.BusinessCalendarUtil.conditionallyAddCustomBusinessCalendar;
+import static
org.kie.kogito.codegen.process.util.CodegenUtil.generatorProperty;
import static
org.kie.kogito.codegen.process.util.CodegenUtil.isTransactionEnabled;
import static
org.kie.kogito.grafana.GrafanaConfigurationWriter.buildDashboardName;
import static
org.kie.kogito.grafana.GrafanaConfigurationWriter.generateOperationalDashboard;
@@ -105,11 +94,13 @@ public class ProcessCodegen extends AbstractGenerator {
private static final GeneratedFileType PRODUCER_TYPE =
GeneratedFileType.of("PRODUCER", GeneratedFileType.Category.SOURCE);
private static final SemanticModules BPMN_SEMANTIC_MODULES = new
SemanticModules();
public static final String SVG_EXPORT_NAME_EXPRESION = "%s-svg.svg";
+ public static final String CUSTOM_BUSINESS_CALENDAR_PROPERTY =
"businessCalendar";
private static final String GLOBAL_OPERATIONAL_DASHBOARD_TEMPLATE =
"/grafana-dashboard-template/processes/global-operational-dashboard-template.json";
private static final String PROCESS_OPERATIONAL_DASHBOARD_TEMPLATE =
"/grafana-dashboard-template/processes/process-operational-dashboard-template.json";
public static final String BUSINESS_CALENDAR_PRODUCER_TEMPLATE =
"BusinessCalendarProducer";
private static final String IS_BUSINESS_CALENDAR_PRESENT =
"isBusinessCalendarPresent";
+
static {
ProcessValidatorRegistry.getInstance().registerAdditonalValidator(JavaRuleFlowProcessValidator.getInstance());
BPMN_SEMANTIC_MODULES.addSemanticModule(new BPMNSemanticModule());
@@ -459,11 +450,8 @@ public class ProcessCodegen extends AbstractGenerator {
staticDependencyInjectionProducerGenerator.generate()
.entrySet()
.forEach(entry -> storeFile(PRODUCER_TYPE, entry.getKey(),
entry.getValue()));
- Boolean isBusinessCalendarPresent =
context().getContextAttribute(IS_BUSINESS_CALENDAR_PRESENT, Boolean.class);
- if (Objects.nonNull(isBusinessCalendarPresent) &&
isBusinessCalendarPresent) {
-
staticDependencyInjectionProducerGenerator.generate(List.of(BUSINESS_CALENDAR_PRODUCER_TEMPLATE))
- .forEach((key, value) -> storeFile(PRODUCER_TYPE, key,
value));
- }
+
+ generateBusinessCalendarProducer();
if (CodegenUtil.isTransactionEnabled(this, context()) &&
!isServerless) {
String template = "ExceptionHandlerTransaction";
@@ -548,7 +536,7 @@ public class ProcessCodegen extends AbstractGenerator {
private void storeFile(GeneratedFileType type, String path, String source)
{
if (generatedFiles.stream().anyMatch(f ->
path.equals(f.relativePath()))) {
- LOGGER.warn("There's already a generated file named {} to be
compiled. Ignoring.", path);
+ LOGGER.warn("There is already a generated file named {} to be
compiled. Ignoring.", path);
} else {
generatedFiles.add(new GeneratedFile(type, path, source));
}
@@ -556,7 +544,7 @@ public class ProcessCodegen extends AbstractGenerator {
private void storeFile(GeneratedFileType type, String path, byte[] source)
{
if (generatedFiles.stream().anyMatch(f ->
path.equals(f.relativePath()))) {
- LOGGER.warn("There's already a generated file named {} to be
compiled. Ignoring.", path);
+ LOGGER.warn("There is already a generated file named {} to be
compiled. Ignoring.", path);
} else {
generatedFiles.add(new GeneratedFile(type, path, source));
}
@@ -582,4 +570,33 @@ public class ProcessCodegen extends AbstractGenerator {
public int priority() {
return 10;
}
+
+ private void generateBusinessCalendarProducer() {
+
+ boolean isBusinessCalendarPresent =
Optional.ofNullable(context().getContextAttribute(IS_BUSINESS_CALENDAR_PRESENT,
Boolean.class)).orElse(false);
+ String businessCalendarClassName = CodegenUtil.getProperty(this,
context(), CUSTOM_BUSINESS_CALENDAR_PROPERTY, String::valueOf, null);
+
+ if (isBusinessCalendarPresent && businessCalendarClassName != null) {
+ String message = String.format("Project could not provide both
'%s' file and '%s' property.", BUSINESS_CALENDAR_PATH, generatorProperty(this,
CUSTOM_BUSINESS_CALENDAR_PROPERTY));
+ throw new ProcessCodegenException(message);
+ }
+
+ if (!isBusinessCalendarPresent && businessCalendarClassName == null) {
+ return;
+ }
+
+ TemplatedGenerator generator = TemplatedGenerator.builder()
+ .withTemplateBasePath("/class-templates/producer/")
+ .withFallbackContext(JavaKogitoBuildContext.CONTEXT_NAME)
+ .withTargetTypeName(BUSINESS_CALENDAR_PRODUCER_TEMPLATE)
+ .build(context(), BUSINESS_CALENDAR_PRODUCER_TEMPLATE);
+
+ CompilationUnit compilationUnit = generator.compilationUnitOrThrow();
+
+ if (businessCalendarClassName != null) {
+ conditionallyAddCustomBusinessCalendar(compilationUnit, context(),
businessCalendarClassName);
+ }
+
+ storeFile(PRODUCER_TYPE, generator.generatedFilePath(),
compilationUnit.toString());
+ }
}
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/util/BusinessCalendarUtil.java
b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/util/BusinessCalendarUtil.java
new file mode 100644
index 0000000000..e93b6eb5f3
--- /dev/null
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/util/BusinessCalendarUtil.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+package org.kie.kogito.codegen.process.util;
+
+import java.lang.reflect.Modifier;
+
+import org.kie.kogito.calendar.BusinessCalendar;
+import org.kie.kogito.codegen.api.context.KogitoBuildContext;
+import org.kie.kogito.codegen.process.ProcessCodegenException;
+
+import com.github.javaparser.StaticJavaParser;
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.Node;
+import com.github.javaparser.ast.NodeList;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.expr.AssignExpr;
+import com.github.javaparser.ast.expr.Expression;
+import com.github.javaparser.ast.expr.ObjectCreationExpr;
+import com.github.javaparser.ast.stmt.BlockStmt;
+import com.github.javaparser.ast.stmt.Statement;
+
+public class BusinessCalendarUtil {
+
+ public static final String BUSINESS_CALENDAR_FIELD_NAME =
"businessCalendar";
+
+ private BusinessCalendarUtil() {
+ // This is a utility class and shouldn't be instantiated.
+ }
+
+ public static void conditionallyAddCustomBusinessCalendar(CompilationUnit
compilationUnit, KogitoBuildContext context, String businessCalendarClassName) {
+ validateBusinessCalendarClass(businessCalendarClassName, context);
+
+ Expression expression =
getBusinessCalendarCreationExpression(businessCalendarClassName);
+
+ BlockStmt constructorBody =
compilationUnit.findFirst(ClassOrInterfaceDeclaration.class)
+ .orElseThrow(() -> new
ProcessCodegenException("BusinessCalendarProducer template does not contain a
class declaration"))
+ .getDefaultConstructor()
+ .orElseThrow(() -> new
ProcessCodegenException("BusinessCalendarProducer template does not contain a
default constructor"))
+ .getBody();
+
+ AssignExpr calendarAssignment = getAssignExpression(constructorBody);
+
+ calendarAssignment.setValue(expression);
+ }
+
+ static void validateBusinessCalendarClass(String className,
KogitoBuildContext context) {
+ try {
+ if (className == null) {
+ throw new ProcessCodegenException("Custom Business Calendar
class cannot be null");
+ }
+
+ Class<? extends BusinessCalendar> businessCalendarClass =
context.getClassLoader().loadClass(className).asSubclass(BusinessCalendar.class);
+
+ int mod = businessCalendarClass.getModifiers();
+
+ if (Modifier.isAbstract(mod) || Modifier.isInterface(mod)) {
+ throw new ProcessCodegenException(String.format("Custom
Business Calendar class '%s' must be a concrete class", className));
+ }
+
+ if (!Modifier.isPublic(mod)) {
+ throw new ProcessCodegenException(String.format("Custom
Business Calendar class '%s' must be a public class", className));
+ }
+ } catch (ClassNotFoundException e) {
+ String message = String.format("Custom Business Calendar class
'%s' not found or it is not an instance of '%s'", className,
BusinessCalendar.class.getCanonicalName());
+ throw new ProcessCodegenException(message);
+ }
+ }
+
+ static ObjectCreationExpr getBusinessCalendarCreationExpression(String
businessCalendarClassName) {
+ return new ObjectCreationExpr(null,
StaticJavaParser.parseClassOrInterfaceType(businessCalendarClassName),
NodeList.nodeList());
+ }
+
+ static AssignExpr getAssignExpression(BlockStmt constructorBody) {
+ Statement calendarFieldInitStatement = constructorBody.getStatements()
+ .getFirst()
+ .orElseThrow(() -> new
ProcessCodegenException("BusinessCalendarProducer constructor does not contain
any statements"));
+
+ Node firstNode = calendarFieldInitStatement.getChildNodes().get(0);
+
+ if (!(firstNode instanceof AssignExpr toReturn)) {
+ throw new ProcessCodegenException("BusinessCalendarProducer
template does not contain an assign expression");
+ }
+ if (!(toReturn.getTarget().isFieldAccessExpr() &&
BUSINESS_CALENDAR_FIELD_NAME.equals(toReturn.getTarget().asFieldAccessExpr().getNameAsString())))
{
+ throw new ProcessCodegenException("BusinessCalendarProducer
template does not contain a assign expression for businessCalendar field");
+ }
+
+ return toReturn;
+ }
+}
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java
b/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java
index ff375187a2..5fcaae8e25 100644
---
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java
@@ -28,9 +28,14 @@ import jakarta.enterprise.inject.Produces;
public class BusinessCalendarProducer {
private static final Logger logger =
LoggerFactory.getLogger(BusinessCalendarProducer.class);
+ private BusinessCalendar businessCalendar;
+
+ public BusinessCalendarProducer() {
+ this.businessCalendar = BusinessCalendarImpl.builder().build();
+ }
@Produces
public BusinessCalendar createBusinessCalendar() {
- return BusinessCalendarImpl.builder().build();
+ return this.businessCalendar;
}
}
\ No newline at end of file
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerSpringTemplate.java
b/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerSpringTemplate.java
index 2f0ca351f8..c945771617 100644
---
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerSpringTemplate.java
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerSpringTemplate.java
@@ -18,8 +18,8 @@
*/
package $Package$;
-import org.kie.kogito.calendar.BusinessCalendar;
import org.jbpm.process.core.timer.BusinessCalendarImpl;
+import org.kie.kogito.calendar.BusinessCalendar;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
@@ -29,10 +29,14 @@ import org.springframework.context.annotation.Configuration;
public class BusinessCalendarProducer {
private static final Logger logger =
LoggerFactory.getLogger(BusinessCalendarProducer.class);
+ private BusinessCalendar businessCalendar;
+
+ public BusinessCalendarProducer() {
+ this.businessCalendar = BusinessCalendarImpl.builder().build();
+ }
@Bean
public BusinessCalendar createBusinessCalendar() {
-
- return BusinessCalendarImpl.builder().build();
+ return this.businessCalendar;
}
}
\ No newline at end of file
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/util/BusinessCalendarUtilTest.java
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/util/BusinessCalendarUtilTest.java
new file mode 100644
index 0000000000..59d2f88991
--- /dev/null
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/util/BusinessCalendarUtilTest.java
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+package org.kie.kogito.codegen.process.util;
+
+import java.util.List;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.kie.kogito.codegen.api.context.KogitoBuildContext;
+import org.kie.kogito.codegen.api.context.impl.JavaKogitoBuildContext;
+import org.kie.kogito.codegen.api.context.impl.QuarkusKogitoBuildContext;
+import org.kie.kogito.codegen.api.template.TemplatedGenerator;
+import org.kie.kogito.codegen.process.ProcessCodegenException;
+import
org.kie.kogito.codegen.process.util.calendars.AbstractCustomBusinessCalendar;
+import org.kie.kogito.codegen.process.util.calendars.CustomBusinessCalendar;
+import
org.kie.kogito.codegen.process.util.calendars.CustomBusinessCalendarInterface;
+
+import com.github.javaparser.ast.CompilationUnit;
+import com.github.javaparser.ast.Node;
+import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.expr.*;
+import com.github.javaparser.ast.stmt.BlockStmt;
+
+import static org.assertj.core.api.Assertions.*;
+import static
org.kie.kogito.codegen.process.ProcessCodegen.BUSINESS_CALENDAR_PRODUCER_TEMPLATE;
+import static org.kie.kogito.codegen.process.util.BusinessCalendarUtil.*;
+
+public class BusinessCalendarUtilTest {
+
+ private KogitoBuildContext context;
+
+ @BeforeEach
+ public void setup() {
+ this.context = QuarkusKogitoBuildContext.builder().build();
+ }
+
+ @Test
+ public void testValidateBusinessCalendarClass() {
+ assertThatThrownBy(() ->
validateBusinessCalendarClass(CustomBusinessCalendarInterface.class.getCanonicalName(),
context))
+ .isExactlyInstanceOf(ProcessCodegenException.class)
+ .hasMessage("Custom Business Calendar class
'org.kie.kogito.codegen.process.util.calendars.CustomBusinessCalendarInterface'
must be a concrete class");
+
+ assertThatThrownBy(() ->
validateBusinessCalendarClass(AbstractCustomBusinessCalendar.class.getCanonicalName(),
context))
+ .isExactlyInstanceOf(ProcessCodegenException.class)
+ .hasMessage("Custom Business Calendar class
'org.kie.kogito.codegen.process.util.calendars.AbstractCustomBusinessCalendar'
must be a concrete class");
+
+ assertThatThrownBy(() -> validateBusinessCalendarClass("this is a
totally wrong value", context))
+ .isExactlyInstanceOf(ProcessCodegenException.class)
+ .hasMessage("Custom Business Calendar class 'this is a totally
wrong value' not found or it is not an instance of
'org.kie.kogito.calendar.BusinessCalendar'");
+
+ assertThatThrownBy(() -> validateBusinessCalendarClass(null, context))
+ .isExactlyInstanceOf(ProcessCodegenException.class)
+ .hasMessage("Custom Business Calendar class cannot be null");
+
+ assertThatThrownBy(() ->
validateBusinessCalendarClass(DefaultAccessorCustomBusinessCalendar.class.getCanonicalName(),
context))
+ .isExactlyInstanceOf(ProcessCodegenException.class)
+ .hasMessage("Custom Business Calendar class
'org.kie.kogito.codegen.process.util.DefaultAccessorCustomBusinessCalendar'
must be a public class");
+
+ assertThatNoException()
+ .isThrownBy(() ->
validateBusinessCalendarClass(CustomBusinessCalendar.class.getCanonicalName(),
context));
+ }
+
+ @Test
+ public void testGetBusinessCalendarCreationExpression() {
+ ObjectCreationExpr expression =
getBusinessCalendarCreationExpression(CustomBusinessCalendar.class.getCanonicalName()).asObjectCreationExpr();
+
+ assertThat(expression)
+ .isNotNull()
+ .hasFieldOrPropertyWithValue("typeAsString",
CustomBusinessCalendar.class.getCanonicalName());
+ }
+
+ @Test
+ public void
testConditionallyAddCustomBusinessCalendarWithoutCustomCalendarClassName() {
+ CompilationUnit compilationUnit = getCompilationUnit();
+
+ assertThatThrownBy(() ->
conditionallyAddCustomBusinessCalendar(compilationUnit, context, null))
+ .isExactlyInstanceOf(ProcessCodegenException.class)
+ .hasMessage("Custom Business Calendar class cannot be null");
+
+ // This is just to verify that the Compilation unit has not been
modified by BusinessCalendarUtil
+ MethodCallExpr expression = new MethodCallExpr(new MethodCallExpr(new
NameExpr("BusinessCalendarImpl"), "builder"), "build");
+ assertBusinessCalendarProducerConstructor(compilationUnit, expression);
+ }
+
+ @Test
+ public void testConditionallyAddCustomBusinessCalendar() {
+ CompilationUnit compilationUnit = getCompilationUnit();
+
+ conditionallyAddCustomBusinessCalendar(compilationUnit, context,
CustomBusinessCalendar.class.getCanonicalName());
+
+ ObjectCreationExpr expression =
getBusinessCalendarCreationExpression(CustomBusinessCalendar.class.getCanonicalName());
+
+ assertBusinessCalendarProducerConstructor(compilationUnit, expression);
+ }
+
+ void assertBusinessCalendarProducerConstructor(CompilationUnit
compilationUnit, Expression expectedInitExpression) {
+
+ ClassOrInterfaceDeclaration producerClass =
compilationUnit.findFirst(ClassOrInterfaceDeclaration.class).orElseThrow();
+
+ BlockStmt constructorBody = producerClass.getDefaultConstructor()
+ .orElseThrow()
+ .getBody();
+
+ List<Node> nodes = constructorBody.getStatements()
+ .getFirst()
+ .orElseThrow()
+ .getChildNodes();
+
+ assertThat(nodes)
+ .isNotNull()
+ .hasSize(1);
+
+ Node firstNode = nodes.get(0);
+
+ FieldAccessExpr expectedTargetExpression = new FieldAccessExpr(new
ThisExpr(), BUSINESS_CALENDAR_FIELD_NAME);
+
+ assertThat(firstNode)
+ .isNotNull()
+ .isInstanceOf(AssignExpr.class)
+ .hasFieldOrPropertyWithValue("target",
expectedTargetExpression)
+ .hasFieldOrPropertyWithValue("value", expectedInitExpression);
+ }
+
+ public CompilationUnit getCompilationUnit() {
+ TemplatedGenerator generator = TemplatedGenerator.builder()
+ .withTemplateBasePath("/class-templates/producer/")
+ .withFallbackContext(JavaKogitoBuildContext.CONTEXT_NAME)
+ .withTargetTypeName(BUSINESS_CALENDAR_PRODUCER_TEMPLATE)
+ .build(context, BUSINESS_CALENDAR_PRODUCER_TEMPLATE);
+
+ return generator.compilationUnitOrThrow();
+ }
+}
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/util/DefaultAccessorCustomBusinessCalendar.java
similarity index 66%
copy from
kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java
copy to
kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/util/DefaultAccessorCustomBusinessCalendar.java
index ff375187a2..710fdde5c1 100644
---
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/util/DefaultAccessorCustomBusinessCalendar.java
@@ -16,21 +16,21 @@
* specific language governing permissions and limitations
* under the License.
*/
-package $Package$;
-import org.jbpm.process.core.timer.BusinessCalendarImpl;
-import org.kie.kogito.calendar.BusinessCalendar;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+package org.kie.kogito.codegen.process.util;
-import jakarta.enterprise.inject.Produces;
+import java.util.Date;
-public class BusinessCalendarProducer {
+import org.kie.kogito.calendar.BusinessCalendar;
- private static final Logger logger =
LoggerFactory.getLogger(BusinessCalendarProducer.class);
+class DefaultAccessorCustomBusinessCalendar implements BusinessCalendar {
+ @Override
+ public long calculateBusinessTimeAsDuration(String timeExpression) {
+ return 0;
+ }
- @Produces
- public BusinessCalendar createBusinessCalendar() {
- return BusinessCalendarImpl.builder().build();
+ @Override
+ public Date calculateBusinessTimeAsDate(String timeExpression) {
+ return null;
}
-}
\ No newline at end of file
+}
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/util/calendars/AbstractCustomBusinessCalendar.java
similarity index 65%
copy from
kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java
copy to
kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/util/calendars/AbstractCustomBusinessCalendar.java
index ff375187a2..e4cfd34bf1 100644
---
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/util/calendars/AbstractCustomBusinessCalendar.java
@@ -16,21 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
-package $Package$;
-import org.jbpm.process.core.timer.BusinessCalendarImpl;
-import org.kie.kogito.calendar.BusinessCalendar;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import jakarta.enterprise.inject.Produces;
+package org.kie.kogito.codegen.process.util.calendars;
-public class BusinessCalendarProducer {
-
- private static final Logger logger =
LoggerFactory.getLogger(BusinessCalendarProducer.class);
+import org.kie.kogito.calendar.BusinessCalendar;
- @Produces
- public BusinessCalendar createBusinessCalendar() {
- return BusinessCalendarImpl.builder().build();
- }
-}
\ No newline at end of file
+public abstract class AbstractCustomBusinessCalendar implements
BusinessCalendar {
+}
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/util/calendars/CustomBusinessCalendar.java
similarity index 66%
copy from
kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java
copy to
kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/util/calendars/CustomBusinessCalendar.java
index ff375187a2..bb53ef8445 100644
---
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/util/calendars/CustomBusinessCalendar.java
@@ -16,21 +16,21 @@
* specific language governing permissions and limitations
* under the License.
*/
-package $Package$;
-import org.jbpm.process.core.timer.BusinessCalendarImpl;
-import org.kie.kogito.calendar.BusinessCalendar;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+package org.kie.kogito.codegen.process.util.calendars;
-import jakarta.enterprise.inject.Produces;
+import java.util.Date;
-public class BusinessCalendarProducer {
+import org.kie.kogito.calendar.BusinessCalendar;
- private static final Logger logger =
LoggerFactory.getLogger(BusinessCalendarProducer.class);
+public class CustomBusinessCalendar implements BusinessCalendar {
+ @Override
+ public long calculateBusinessTimeAsDuration(String timeExpression) {
+ return 0;
+ }
- @Produces
- public BusinessCalendar createBusinessCalendar() {
- return BusinessCalendarImpl.builder().build();
+ @Override
+ public Date calculateBusinessTimeAsDate(String timeExpression) {
+ return null;
}
-}
\ No newline at end of file
+}
diff --git
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/util/calendars/CustomBusinessCalendarInterface.java
similarity index 65%
copy from
kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java
copy to
kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/util/calendars/CustomBusinessCalendarInterface.java
index ff375187a2..0a34a360cd 100644
---
a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java
+++
b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/util/calendars/CustomBusinessCalendarInterface.java
@@ -16,21 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
-package $Package$;
-import org.jbpm.process.core.timer.BusinessCalendarImpl;
-import org.kie.kogito.calendar.BusinessCalendar;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import jakarta.enterprise.inject.Produces;
+package org.kie.kogito.codegen.process.util.calendars;
-public class BusinessCalendarProducer {
-
- private static final Logger logger =
LoggerFactory.getLogger(BusinessCalendarProducer.class);
+import org.kie.kogito.calendar.BusinessCalendar;
- @Produces
- public BusinessCalendar createBusinessCalendar() {
- return BusinessCalendarImpl.builder().build();
- }
-}
\ No newline at end of file
+public interface CustomBusinessCalendarInterface extends BusinessCalendar {
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]