diff --git a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/core/timer/BusinessCalendar.java b/api/kogito-api/src/main/java/org/kie/kogito/calendar/BusinessCalendar.java old mode 100755 new mode 100644 similarity index 97% rename from jbpm/jbpm-flow/src/main/java/org/jbpm/process/core/timer/BusinessCalendar.java rename to api/kogito-api/src/main/java/org/kie/kogito/calendar/BusinessCalendar.java index 544fbcb6ef3..6e15a6cc0e6 --- a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/core/timer/BusinessCalendar.java +++ b/api/kogito-api/src/main/java/org/kie/kogito/calendar/BusinessCalendar.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.jbpm.process.core.timer; +package org.kie.kogito.calendar; import java.util.Date; diff --git a/api/kogito-api/src/main/java/org/kie/kogito/process/ProcessConfig.java b/api/kogito-api/src/main/java/org/kie/kogito/process/ProcessConfig.java index 40549bbcd90..b365c3d7647 100644 --- a/api/kogito-api/src/main/java/org/kie/kogito/process/ProcessConfig.java +++ b/api/kogito-api/src/main/java/org/kie/kogito/process/ProcessConfig.java @@ -20,6 +20,7 @@ import org.kie.kogito.KogitoConfig; import org.kie.kogito.auth.IdentityProvider; +import org.kie.kogito.calendar.BusinessCalendar; import org.kie.kogito.jobs.JobsService; import org.kie.kogito.signal.SignalManagerHub; import org.kie.kogito.uow.UnitOfWorkManager; @@ -38,4 +39,6 @@ public interface ProcessConfig extends KogitoConfig { ProcessVersionResolver versionResolver(); IdentityProvider identityProvider(); + + BusinessCalendar getBusinessCalendar(); } diff --git a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/core/constants/CalendarConstants.java b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/core/constants/CalendarConstants.java new file mode 100644 index 00000000000..036902eabb9 --- /dev/null +++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/core/constants/CalendarConstants.java @@ -0,0 +1,24 @@ +/* + * 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.jbpm.process.core.constants; + +public class CalendarConstants { + public static final String BUSINESS_CALENDAR_PATH = "calendar.properties"; + public static final String BUSINESS_CALENDAR_ENVIRONMENT_KEY = "jbpm.business.calendar"; +} diff --git a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/core/timer/BusinessCalendarImpl.java b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/core/timer/BusinessCalendarImpl.java index 29017a62307..49d2ac41854 100755 --- a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/core/timer/BusinessCalendarImpl.java +++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/core/timer/BusinessCalendarImpl.java @@ -18,7 +18,6 @@ */ package org.jbpm.process.core.timer; -import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.time.Duration; @@ -35,10 +34,13 @@ import java.util.regex.Matcher; import org.jbpm.util.PatternConstants; +import org.kie.kogito.calendar.BusinessCalendar; import org.kie.kogito.timer.SessionClock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static org.jbpm.process.core.constants.CalendarConstants.BUSINESS_CALENDAR_PATH; + /** * Default implementation of BusinessCalendar interface that is configured with properties. * Following are supported properties: @@ -103,38 +105,26 @@ public class BusinessCalendarImpl implements BusinessCalendar { public static final String WEEKEND_DAYS = "business.weekend.days"; public static final String TIMEZONE = "business.cal.timezone"; - private static final String DEFAULT_PROPERTIES_NAME = "/jbpm.business.calendar.properties"; - public BusinessCalendarImpl() { - String propertiesLocation = System.getProperty("jbpm.business.calendar.properties"); - - if (propertiesLocation == null) { - propertiesLocation = DEFAULT_PROPERTIES_NAME; - } - businessCalendarConfiguration = new Properties(); - - InputStream in = this.getClass().getResourceAsStream(propertiesLocation); - if (in != null) { - - try { - businessCalendarConfiguration.load(in); - } catch (IOException e) { - logger.error("Error while loading properties for business calendar", e); - - } - } - init(); - + this(null); } public BusinessCalendarImpl(Properties configuration) { - this.businessCalendarConfiguration = configuration; - init(); + this(configuration, null); } public BusinessCalendarImpl(Properties configuration, SessionClock clock) { - this.businessCalendarConfiguration = configuration; this.clock = clock; + if (configuration == null) { + try (InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(BUSINESS_CALENDAR_PATH)) { + businessCalendarConfiguration = new Properties(); + businessCalendarConfiguration.load(is); + } catch (Exception e) { + logger.error("Error while loading properties for business calendar", e); + } + } else { + this.businessCalendarConfiguration = configuration; + } init(); } diff --git a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/DummyKnowledgeRuntime.java b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/DummyKnowledgeRuntime.java index 2f7da3c086c..1ae292bbd33 100644 --- a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/DummyKnowledgeRuntime.java +++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/DummyKnowledgeRuntime.java @@ -21,6 +21,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Map; +import java.util.Objects; import org.drools.core.common.EndOperationListener; import org.drools.core.common.InternalAgenda; @@ -53,11 +54,15 @@ import org.kie.api.runtime.rule.ViewChangedEventListener; import org.kie.api.time.SessionClock; import org.kie.kogito.Application; +import org.kie.kogito.calendar.BusinessCalendar; import org.kie.kogito.internal.process.event.KogitoProcessEventSupport; import org.kie.kogito.internal.process.runtime.KogitoProcessInstance; import org.kie.kogito.internal.process.runtime.KogitoProcessRuntime; import org.kie.kogito.internal.process.workitem.KogitoWorkItemManager; import org.kie.kogito.jobs.JobsService; +import org.kie.kogito.process.ProcessConfig; + +import static org.jbpm.process.core.constants.CalendarConstants.BUSINESS_CALENDAR_ENVIRONMENT_KEY; /** * A severely limited implementation of the WorkingMemory interface. @@ -72,6 +77,10 @@ class DummyKnowledgeRuntime implements InternalKnowledgeRuntime, KogitoProcessRu this.processRuntime = processRuntime; this.environment = new EnvironmentImpl(); // register codegen-based node instances factories + BusinessCalendar calendar = processRuntime.getApplication().config().get(ProcessConfig.class).getBusinessCalendar(); + if (Objects.nonNull(calendar)) { + environment.set(BUSINESS_CALENDAR_ENVIRONMENT_KEY, calendar); + } environment.set("NodeInstanceFactoryRegistry", new CodegenNodeInstanceFactoryRegistry()); } diff --git a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/LightProcessRuntime.java b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/LightProcessRuntime.java index df1b7c5ba69..75d7709a00b 100755 --- a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/LightProcessRuntime.java +++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/LightProcessRuntime.java @@ -31,7 +31,6 @@ import org.drools.core.phreak.PropagationEntry; import org.jbpm.process.core.event.EventFilter; import org.jbpm.process.core.event.EventTypeFilter; -import org.jbpm.process.core.timer.BusinessCalendar; import org.jbpm.process.core.timer.DateTimeUtils; import org.jbpm.process.core.timer.Timer; import org.jbpm.ruleflow.core.RuleFlowProcess; @@ -52,6 +51,7 @@ import org.kie.internal.process.CorrelationKey; import org.kie.internal.runtime.StatefulKnowledgeSession; import org.kie.kogito.Application; +import org.kie.kogito.calendar.BusinessCalendar; import org.kie.kogito.internal.process.runtime.KogitoProcessInstance; import org.kie.kogito.internal.process.workitem.KogitoWorkItemManager; import org.kie.kogito.jobs.DurationExpirationTime; @@ -64,6 +64,7 @@ import org.kie.kogito.signal.SignalManager; import org.kie.kogito.uow.UnitOfWorkManager; +import static org.jbpm.process.core.constants.CalendarConstants.BUSINESS_CALENDAR_ENVIRONMENT_KEY; import static org.jbpm.ruleflow.core.Metadata.TRIGGER_MAPPING_INPUT; public class LightProcessRuntime extends AbstractProcessRuntime { @@ -426,8 +427,8 @@ public boolean isActive() { protected ExpirationTime createTimerInstance(Timer timer, InternalKnowledgeRuntime kruntime) { - if (kruntime != null && kruntime.getEnvironment().get("jbpm.business.calendar") != null) { - BusinessCalendar businessCalendar = (BusinessCalendar) kruntime.getEnvironment().get("jbpm.business.calendar"); + if (kruntime != null && kruntime.getEnvironment().get(BUSINESS_CALENDAR_ENVIRONMENT_KEY) != null) { + BusinessCalendar businessCalendar = (BusinessCalendar) kruntime.getEnvironment().get(BUSINESS_CALENDAR_ENVIRONMENT_KEY); long delay = businessCalendar.calculateBusinessTimeAsDuration(timer.getDelay()); diff --git a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/ProcessRuntimeImpl.java b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/ProcessRuntimeImpl.java index 3eaec2fce36..a0f376a0573 100755 --- a/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/ProcessRuntimeImpl.java +++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/process/instance/ProcessRuntimeImpl.java @@ -35,7 +35,6 @@ import org.drools.core.time.impl.ThreadSafeTrackableTimeJobFactoryManager; import org.jbpm.process.core.event.EventFilter; import org.jbpm.process.core.event.EventTypeFilter; -import org.jbpm.process.core.timer.BusinessCalendar; import org.jbpm.process.core.timer.DateTimeUtils; import org.jbpm.process.core.timer.Timer; import org.jbpm.process.instance.event.DefaultSignalManagerFactory; @@ -64,6 +63,7 @@ import org.kie.internal.process.CorrelationKey; import org.kie.internal.runtime.StatefulKnowledgeSession; import org.kie.kogito.Application; +import org.kie.kogito.calendar.BusinessCalendar; import org.kie.kogito.internal.process.runtime.KogitoProcessInstance; import org.kie.kogito.internal.process.runtime.KogitoProcessRuntime; import org.kie.kogito.jobs.DurationExpirationTime; @@ -78,6 +78,7 @@ import org.kie.kogito.signal.SignalManager; import org.kie.kogito.uow.UnitOfWorkManager; +import static org.jbpm.process.core.constants.CalendarConstants.BUSINESS_CALENDAR_ENVIRONMENT_KEY; import static org.jbpm.ruleflow.core.Metadata.TRIGGER_MAPPING_INPUT; public class ProcessRuntimeImpl extends AbstractProcessRuntime { @@ -409,8 +410,8 @@ public boolean isActive() { } protected ExpirationTime createTimerInstance(Timer timer, InternalKnowledgeRuntime kruntime) { - if (kruntime != null && kruntime.getEnvironment().get("jbpm.business.calendar") != null) { - BusinessCalendar businessCalendar = (BusinessCalendar) kruntime.getEnvironment().get("jbpm.business.calendar"); + if (kruntime != null && kruntime.getEnvironment().get(BUSINESS_CALENDAR_ENVIRONMENT_KEY) != null) { + BusinessCalendar businessCalendar = (BusinessCalendar) kruntime.getEnvironment().get(BUSINESS_CALENDAR_ENVIRONMENT_KEY); long delay = businessCalendar.calculateBusinessTimeAsDuration(timer.getDelay()); diff --git a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/WorkflowProcessInstanceImpl.java b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/WorkflowProcessInstanceImpl.java index 93554930fa8..25a0cd0467f 100755 --- a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/WorkflowProcessInstanceImpl.java +++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/impl/WorkflowProcessInstanceImpl.java @@ -44,7 +44,6 @@ import org.jbpm.process.core.ContextResolver; import org.jbpm.process.core.context.variable.Variable; import org.jbpm.process.core.context.variable.VariableScope; -import org.jbpm.process.core.timer.BusinessCalendar; import org.jbpm.process.core.timer.DateTimeUtils; import org.jbpm.process.core.timer.Timer; import org.jbpm.process.instance.ContextInstance; @@ -81,6 +80,7 @@ import org.kie.api.definition.process.WorkflowElementIdentifier; import org.kie.api.runtime.rule.AgendaFilter; import org.kie.internal.process.CorrelationKey; +import org.kie.kogito.calendar.BusinessCalendar; import org.kie.kogito.internal.process.event.KogitoEventListener; import org.kie.kogito.internal.process.runtime.KogitoNodeInstance; import org.kie.kogito.internal.process.runtime.KogitoNodeInstanceContainer; @@ -102,6 +102,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static org.jbpm.process.core.constants.CalendarConstants.BUSINESS_CALENDAR_ENVIRONMENT_KEY; import static org.jbpm.ruleflow.core.Metadata.COMPENSATION; import static org.jbpm.ruleflow.core.Metadata.CONDITION; import static org.jbpm.ruleflow.core.Metadata.CORRELATION_KEY; @@ -565,8 +566,8 @@ public TimerInstance configureSLATimer(String slaDueDateExpression) { logger.debug("SLA due date is set to {}", slaDueDateExpression); InternalKnowledgeRuntime kruntime = getKnowledgeRuntime(); long duration; - if (kruntime.getEnvironment().get("jbpm.business.calendar") != null) { - BusinessCalendar businessCalendar = (BusinessCalendar) kruntime.getEnvironment().get("jbpm.business.calendar"); + if (kruntime.getEnvironment().get(BUSINESS_CALENDAR_ENVIRONMENT_KEY) != null) { + BusinessCalendar businessCalendar = (BusinessCalendar) kruntime.getEnvironment().get(BUSINESS_CALENDAR_ENVIRONMENT_KEY); duration = businessCalendar.calculateBusinessTimeAsDuration(slaDueDateExpression); } else { duration = DateTimeUtils.parseDuration(slaDueDateExpression); diff --git a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/node/StateBasedNodeInstance.java b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/node/StateBasedNodeInstance.java index 554da5acc51..c8a27f27d89 100755 --- a/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/node/StateBasedNodeInstance.java +++ b/jbpm/jbpm-flow/src/main/java/org/jbpm/workflow/instance/node/StateBasedNodeInstance.java @@ -29,7 +29,6 @@ import org.drools.core.common.InternalAgenda; import org.drools.core.common.ReteEvaluator; import org.drools.core.rule.consequence.InternalMatch; -import org.jbpm.process.core.timer.BusinessCalendar; import org.jbpm.process.core.timer.DateTimeUtils; import org.jbpm.process.core.timer.Timer; import org.jbpm.process.instance.InternalProcessRuntime; @@ -44,6 +43,7 @@ import org.jbpm.workflow.instance.impl.WorkflowProcessInstanceImpl; import org.kie.api.event.rule.MatchCreatedEvent; import org.kie.api.runtime.KieRuntime; +import org.kie.kogito.calendar.BusinessCalendar; import org.kie.kogito.internal.process.event.KogitoEventListener; import org.kie.kogito.internal.process.runtime.KogitoNodeInstance; import org.kie.kogito.internal.process.runtime.KogitoProcessContext; @@ -60,6 +60,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static org.jbpm.process.core.constants.CalendarConstants.BUSINESS_CALENDAR_ENVIRONMENT_KEY; import static org.jbpm.workflow.core.Node.CONNECTION_DEFAULT_TYPE; import static org.jbpm.workflow.instance.node.TimerNodeInstance.TIMER_TRIGGERED_EVENT; @@ -145,8 +146,8 @@ protected void configureSla() { protected ExpirationTime createTimerInstance(Timer timer) { KieRuntime kruntime = getProcessInstance().getKnowledgeRuntime(); - if (kruntime != null && kruntime.getEnvironment().get("jbpm.business.calendar") != null) { - BusinessCalendar businessCalendar = (BusinessCalendar) kruntime.getEnvironment().get("jbpm.business.calendar"); + if (kruntime != null && kruntime.getEnvironment().get(BUSINESS_CALENDAR_ENVIRONMENT_KEY) != null) { + BusinessCalendar businessCalendar = (BusinessCalendar) kruntime.getEnvironment().get(BUSINESS_CALENDAR_ENVIRONMENT_KEY); String delay = null; switch (timer.getTimeType()) { case Timer.TIME_CYCLE: diff --git a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcessConfig.java b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcessConfig.java index 25d278f628c..ac13e659424 100644 --- a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcessConfig.java +++ b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/AbstractProcessConfig.java @@ -28,6 +28,7 @@ import org.kie.api.event.process.ProcessEventListener; import org.kie.kogito.Addons; import org.kie.kogito.auth.IdentityProvider; +import org.kie.kogito.calendar.BusinessCalendar; import org.kie.kogito.event.EventPublisher; import org.kie.kogito.jobs.JobsService; import org.kie.kogito.process.ProcessConfig; @@ -51,6 +52,7 @@ public abstract class AbstractProcessConfig implements ProcessConfig { private final JobsService jobsService; private final ProcessVersionResolver versionResolver; private final IdentityProvider identityProvider; + private final BusinessCalendar businessCalendar; protected AbstractProcessConfig( Iterable workItemHandlerConfig, @@ -62,7 +64,8 @@ protected AbstractProcessConfig( String kogitoService, Iterable unitOfWorkListeners, Iterable versionResolver, - Iterable identityProvider) { + Iterable identityProvider, + Iterable businessCalendar) { this.workItemHandlerConfig = mergeWorkItemHandler(workItemHandlerConfig, DefaultWorkItemHandlerConfig::new); this.processEventListenerConfig = merge(processEventListenerConfigs, processEventListeners); @@ -72,6 +75,7 @@ protected AbstractProcessConfig( this.jobsService = orDefault(jobsService, () -> null); this.versionResolver = orDefault(versionResolver, () -> null); this.identityProvider = orDefault(identityProvider, NoOpIdentityProvider::new); + this.businessCalendar = orDefault(businessCalendar, () -> null); eventPublishers.forEach(publisher -> unitOfWorkManager().eventManager().addPublisher(publisher)); unitOfWorkListeners.forEach(listener -> unitOfWorkManager().register(listener)); @@ -124,6 +128,11 @@ public IdentityProvider identityProvider() { return identityProvider; } + @Override + public BusinessCalendar getBusinessCalendar() { + return this.businessCalendar; + } + public org.kie.kogito.Addons addons() { return Addons.EMTPY; } diff --git a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/StaticProcessConfig.java b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/StaticProcessConfig.java index c540407c4f9..343f232a042 100644 --- a/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/StaticProcessConfig.java +++ b/jbpm/jbpm-flow/src/main/java/org/kie/kogito/process/impl/StaticProcessConfig.java @@ -19,6 +19,7 @@ package org.kie.kogito.process.impl; import org.kie.kogito.auth.IdentityProvider; +import org.kie.kogito.calendar.BusinessCalendar; import org.kie.kogito.jobs.JobsService; import org.kie.kogito.process.ProcessConfig; import org.kie.kogito.process.ProcessEventListenerConfig; @@ -41,12 +42,13 @@ public class StaticProcessConfig implements ProcessConfig { private final ProcessVersionResolver versionResolver; private final IdentityProvider identityProvider; + private final BusinessCalendar businessCalendar; public StaticProcessConfig( WorkItemHandlerConfig workItemHandlerConfig, ProcessEventListenerConfig processEventListenerConfig, UnitOfWorkManager unitOfWorkManager) { - this(workItemHandlerConfig, processEventListenerConfig, unitOfWorkManager, null, null, new NoOpIdentityProvider()); + this(workItemHandlerConfig, processEventListenerConfig, unitOfWorkManager, null, null, new NoOpIdentityProvider(), null); } public StaticProcessConfig( @@ -55,7 +57,8 @@ public StaticProcessConfig( UnitOfWorkManager unitOfWorkManager, JobsService jobsService, ProcessVersionResolver versionResolver, - IdentityProvider identityProvider) { + IdentityProvider identityProvider, + BusinessCalendar calendar) { this.unitOfWorkManager = unitOfWorkManager; this.workItemHandlerConfig = workItemHandlerConfig; this.processEventListenerConfig = processEventListenerConfig; @@ -63,6 +66,7 @@ public StaticProcessConfig( this.jobsService = jobsService; this.versionResolver = versionResolver; this.identityProvider = identityProvider; + this.businessCalendar = calendar; } public StaticProcessConfig() { @@ -71,7 +75,8 @@ public StaticProcessConfig() { new DefaultUnitOfWorkManager(new CollectingUnitOfWorkFactory()), null, null, - new NoOpIdentityProvider()); + new NoOpIdentityProvider(), + null); } @Override @@ -108,4 +113,9 @@ public ProcessVersionResolver versionResolver() { public IdentityProvider identityProvider() { return identityProvider; } + + @Override + public BusinessCalendar getBusinessCalendar() { + return this.businessCalendar; + } } diff --git a/jbpm/jbpm-flow/src/test/java/org/jbpm/process/core/timer/BusinessCalendarImplTest.java b/jbpm/jbpm-flow/src/test/java/org/jbpm/process/core/timer/BusinessCalendarImplTest.java index 1fc0852da9b..bf85ec8dd7c 100755 --- a/jbpm/jbpm-flow/src/test/java/org/jbpm/process/core/timer/BusinessCalendarImplTest.java +++ b/jbpm/jbpm-flow/src/test/java/org/jbpm/process/core/timer/BusinessCalendarImplTest.java @@ -326,17 +326,6 @@ public void testCalculateMinutesPassingAfterHour() { assertThat(formatDate("yyyy-MM-dd HH:mm:ss", result)).isEqualTo(expectedDate); } - @Test - public void testMissingConfigurationDualArgConstructor() { - SessionPseudoClock clock = new StaticPseudoClock(parseToDateWithTime("2012-05-04 13:45").getTime()); - assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> new BusinessCalendarImpl(null, clock)); - } - - @Test - public void testMissingConfigurationSingleArgConstructor() { - assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> new BusinessCalendarImpl(null)); - } - @Test public void testCalculateMinutesPassingHoliday() { Properties config = new Properties(); diff --git a/jbpm/jbpm-flow/src/test/java/org/jbpm/ruleflow/instance/RuleFlowProcessInstanceTest.java b/jbpm/jbpm-flow/src/test/java/org/jbpm/ruleflow/instance/RuleFlowProcessInstanceTest.java index d0b8ced9e98..68d2e177e4d 100755 --- a/jbpm/jbpm-flow/src/test/java/org/jbpm/ruleflow/instance/RuleFlowProcessInstanceTest.java +++ b/jbpm/jbpm-flow/src/test/java/org/jbpm/ruleflow/instance/RuleFlowProcessInstanceTest.java @@ -27,7 +27,8 @@ import org.kie.kogito.internal.process.runtime.KogitoProcessRuntime; import org.slf4j.LoggerFactory; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class RuleFlowProcessInstanceTest extends AbstractBaseTest { diff --git a/jbpm/jbpm-flow/src/test/java/org/kie/kogito/process/impl/AbstractProcessConfigTest.java b/jbpm/jbpm-flow/src/test/java/org/kie/kogito/process/impl/AbstractProcessConfigTest.java index 2f0b75255dd..6a3f26da38b 100644 --- a/jbpm/jbpm-flow/src/test/java/org/kie/kogito/process/impl/AbstractProcessConfigTest.java +++ b/jbpm/jbpm-flow/src/test/java/org/kie/kogito/process/impl/AbstractProcessConfigTest.java @@ -34,7 +34,7 @@ public class AbstractProcessConfigTest { private static class MockProcessConfig extends AbstractProcessConfig { protected MockProcessConfig(Iterable workItemHandlerConfig) { super(workItemHandlerConfig, Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), - Collections.emptyList(), null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); + Collections.emptyList(), null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); } } diff --git a/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/calendar/BPMN2-BusinessCalendarEscalation.bpmn2 b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/calendar/BPMN2-BusinessCalendarEscalation.bpmn2 new file mode 100644 index 00000000000..53c3e4b8c80 --- /dev/null +++ b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/calendar/BPMN2-BusinessCalendarEscalation.bpmn2 @@ -0,0 +1,148 @@ + + + + + _69A77931-24FC-4700-BF3B-D3AC5B2AC280 + + + _69A77931-24FC-4700-BF3B-D3AC5B2AC280 + _2A6AA015-CCC6-4B46-94B0-6BBB03D334D0 + + + + + + + _0262A5D1-7A50-40BC-BB00-30F3B2E74744_LocaleInputX + _0262A5D1-7A50-40BC-BB00-30F3B2E74744_NotCompletedReassignInputX + _0262A5D1-7A50-40BC-BB00-30F3B2E74744_NotStartedReassignInputX + + + + + _0262A5D1-7A50-40BC-BB00-30F3B2E74744_TaskNameInputX + + HumanTask + _0262A5D1-7A50-40BC-BB00-30F3B2E74744_TaskNameInputX + + + + _0262A5D1-7A50-40BC-BB00-30F3B2E74744_LocaleInputX + + + _0262A5D1-7A50-40BC-BB00-30F3B2E74744_LocaleInputX + + + + _0262A5D1-7A50-40BC-BB00-30F3B2E74744_NotCompletedReassignInputX + + + _0262A5D1-7A50-40BC-BB00-30F3B2E74744_NotCompletedReassignInputX + + + + _0262A5D1-7A50-40BC-BB00-30F3B2E74744_NotStartedReassignInputX + + + _0262A5D1-7A50-40BC-BB00-30F3B2E74744_NotStartedReassignInputX + + + + + john + + + + + + _2A6AA015-CCC6-4B46-94B0-6BBB03D334D0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _UlMNAABsEeSwDJQJw6Rb7Q + _UlMNAABsEeSwDJQJw6Rb7Q + + diff --git a/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/calendar/BPMN2-BusinessCalendarTimer.bpmn2 b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/calendar/BPMN2-BusinessCalendarTimer.bpmn2 new file mode 100644 index 00000000000..490924b1f18 --- /dev/null +++ b/jbpm/jbpm-tests/src/test/bpmn/org/jbpm/bpmn2/calendar/BPMN2-BusinessCalendarTimer.bpmn2 @@ -0,0 +1,172 @@ + + + + + _BD039EC9-BD1C-44EB-8DB7-347E412D0F7A + + + _BD039EC9-BD1C-44EB-8DB7-347E412D0F7A + _AA98E9A1-3635-40E0-8991-471E24785D03 + + + + + + + _7C1AEE0C-F9CC-46D8-BFC0-554A3046F3BF_TaskNameInputX + + HumanTask + _7C1AEE0C-F9CC-46D8-BFC0-554A3046F3BF_TaskNameInputX + + + + + john + + + + + + _AA98E9A1-3635-40E0-8991-471E24785D03 + + + + + _9C180400-8EAA-4C89-A148-AE8872CFD116 + + + + _9C180400-8EAA-4C89-A148-AE8872CFD116 + + 1s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _02EK0ABVEeSwDJQJw6Rb7Q + _02EK0ABVEeSwDJQJw6Rb7Q + + diff --git a/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/calendar/BusinessCalendarTest.java b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/calendar/BusinessCalendarTest.java new file mode 100644 index 00000000000..1cfaa3a8153 --- /dev/null +++ b/jbpm/jbpm-tests/src/test/java/org/jbpm/bpmn2/calendar/BusinessCalendarTest.java @@ -0,0 +1,151 @@ +/* + * 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.jbpm.bpmn2.calendar; + +import java.io.IOException; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Properties; +import java.util.logging.Logger; + +import org.jbpm.bpmn2.objects.TestWorkItemHandler; +import org.jbpm.process.core.timer.BusinessCalendarImpl; +import org.jbpm.test.utils.ProcessTestHelper; +import org.junit.jupiter.api.Test; +import org.kie.kogito.Application; +import org.kie.kogito.StaticApplication; +import org.kie.kogito.StaticConfig; +import org.kie.kogito.calendar.BusinessCalendar; +import org.kie.kogito.process.ProcessConfig; +import org.kie.kogito.process.ProcessInstance; +import org.kie.kogito.process.bpmn2.BpmnProcesses; +import org.kie.kogito.process.impl.AbstractProcessConfig; + +import static org.assertj.core.api.Assertions.assertThat; + +public class BusinessCalendarTest { + + @Test + public void testTimerInBusinessHours() throws InterruptedException { + BpmnProcesses bpmnProcesses = new BpmnProcesses(); + ProcessConfig config = new MockProcessConfig(configureBusinessCalendar(true)); + Application app = new StaticApplication(new StaticConfig(null, config), bpmnProcesses); + TestWorkItemHandler workItemHandler = new TestWorkItemHandler(); + ProcessTestHelper.registerHandler(app, "Human Task", workItemHandler); + org.kie.kogito.process.Process processDefinition = BusinessCalendarTimerProcess.newProcess(app); + BusinessCalendarTimerModel model = processDefinition.createModel(); + org.kie.kogito.process.ProcessInstance instance = processDefinition.createInstance(model); + instance.start(); + assertThat(ProcessInstance.STATE_ACTIVE).isEqualTo(instance.status()); + Thread.sleep(2000); + assertThat(ProcessInstance.STATE_COMPLETED).isEqualTo(instance.status()); + } + + @Test + public void testTimerInNonBusinessHours() throws InterruptedException { + BpmnProcesses bpmnProcesses = new BpmnProcesses(); + ProcessConfig config = new MockProcessConfig(configureBusinessCalendar(false)); + Application app = new StaticApplication(new StaticConfig(null, config), bpmnProcesses); + TestWorkItemHandler workItemHandler = new TestWorkItemHandler(); + ProcessTestHelper.registerHandler(app, "Human Task", workItemHandler); + org.kie.kogito.process.Process processDefinition = BusinessCalendarTimerProcess.newProcess(app); + BusinessCalendarTimerModel model = processDefinition.createModel(); + org.kie.kogito.process.ProcessInstance instance = processDefinition.createInstance(model); + instance.start(); + assertThat(ProcessInstance.STATE_ACTIVE).isEqualTo(instance.status()); + Thread.sleep(2000); + assertThat(ProcessInstance.STATE_ACTIVE).isEqualTo(instance.status()); + } + + @Test + public void testHumanTaskEscalationBusinessHour() throws InterruptedException { + BpmnProcesses bpmnProcesses = new BpmnProcesses(); + ProcessConfig config = new MockProcessConfig(configureBusinessCalendar(true)); + Application app = new StaticApplication(new StaticConfig(null, config), bpmnProcesses); + TestWorkItemHandler workItemHandler = new TestWorkItemHandler(); + ProcessTestHelper.registerHandler(app, "Human Task", workItemHandler); + org.kie.kogito.process.Process processDefinition = BusinessCalendarEscalationProcess.newProcess(app); + BusinessCalendarEscalationModel model = processDefinition.createModel(); + org.kie.kogito.process.ProcessInstance instance = processDefinition.createInstance(model); + instance.start(); + assertThat(ProcessInstance.STATE_ACTIVE).isEqualTo(instance.status()); + Thread.sleep(2000); + assertThat(ProcessInstance.STATE_ACTIVE).isEqualTo(instance.status()); + assertThat(workItemHandler.getWorkItem().getParameter("ActorId").toString().equalsIgnoreCase("John")).isTrue(); + } + + @Test + public void testHumanTaskEscalationNonBusinessHour() throws InterruptedException { + BpmnProcesses bpmnProcesses = new BpmnProcesses(); + ProcessConfig config = new MockProcessConfig(configureBusinessCalendar(false)); + Application app = new StaticApplication(new StaticConfig(null, config), bpmnProcesses); + TestWorkItemHandler workItemHandler = new TestWorkItemHandler(); + ProcessTestHelper.registerHandler(app, "Human Task", workItemHandler); + org.kie.kogito.process.Process processDefinition = BusinessCalendarEscalationProcess.newProcess(app); + BusinessCalendarEscalationModel model = processDefinition.createModel(); + org.kie.kogito.process.ProcessInstance instance = processDefinition.createInstance(model); + instance.start(); + assertThat(ProcessInstance.STATE_ACTIVE).isEqualTo(instance.status()); + Thread.sleep(2000); + assertThat(ProcessInstance.STATE_ACTIVE).isEqualTo(instance.status()); + assertThat(workItemHandler.getWorkItem().getParameter("ActorId").toString().equalsIgnoreCase("John")).isTrue(); + } + + private BusinessCalendar configureBusinessCalendar(boolean businessHours) { + Logger logger = Logger.getLogger("Business calendar"); + Properties businessCalendarConfiguration = new Properties(); + BusinessCalendar businessCalendar = null; + try (InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("calendar.properties")) { + + if (businessHours) { + businessCalendarConfiguration.load(is); + Calendar c = Calendar.getInstance(); + c.add(Calendar.DATE, -1); + int dayOfWeek = c.get(Calendar.DAY_OF_WEEK); + businessCalendarConfiguration.setProperty(BusinessCalendarImpl.WEEKEND_DAYS, Integer.toString(dayOfWeek)); + businessCalendar = new BusinessCalendarImpl(businessCalendarConfiguration); + } else { + Date today = new Date(); + Calendar c = Calendar.getInstance(); + c.add(Calendar.DATE, 1); + Date tomorrow = c.getTime(); + String dateFormat = "yyyy-MM-dd"; + SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); + businessCalendarConfiguration.setProperty(BusinessCalendarImpl.HOLIDAYS, sdf.format(today) + "," + sdf.format(tomorrow)); + businessCalendarConfiguration.setProperty(BusinessCalendarImpl.HOLIDAY_DATE_FORMAT, dateFormat); + businessCalendar = new BusinessCalendarImpl(businessCalendarConfiguration); + } + } catch (IOException e) { + logger.warning("Error while loading properties for business calendar " + e.getMessage()); + } + return businessCalendar; + } + + private static class MockProcessConfig extends AbstractProcessConfig { + private MockProcessConfig(BusinessCalendar businessCalendar) { + super(Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), + Collections.emptyList(), null, Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), List.of(businessCalendar)); + } + } +} diff --git a/jbpm/jbpm-tests/src/test/resources/calendar.properties b/jbpm/jbpm-tests/src/test/resources/calendar.properties new file mode 100644 index 00000000000..e2ab07c9f05 --- /dev/null +++ b/jbpm/jbpm-tests/src/test/resources/calendar.properties @@ -0,0 +1,6 @@ +business.end.hour=24 +business.hours.per.day=24 +business.start.hour=0 +business.holiday.date.format=yyyy-MM-dd +business.days.per.week =7 +#business.cal.timezone= system default timezone.. 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 528a9e081a0..dbb9b2b0bc5 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 @@ -28,6 +28,7 @@ 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.stream.Stream; @@ -77,6 +78,7 @@ 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.grafana.GrafanaConfigurationWriter.buildDashboardName; import static org.kie.kogito.grafana.GrafanaConfigurationWriter.generateOperationalDashboard; import static org.kie.kogito.internal.utils.ConversionUtils.sanitizeClassName; @@ -100,7 +102,8 @@ public class ProcessCodegen extends AbstractGenerator { 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"; - + private static final String BUSINESS_CALENDAR_PRODUCER_TEMPLATE = "BusinessCalendarProducer"; + private static final String BUSINESS_CALENDAR_RESOURCE_KEY = "is_business_calendar_present"; static { ProcessValidatorRegistry.getInstance().registerAdditonalValidator(JavaRuleFlowProcessValidator.getInstance()); BPMN_SEMANTIC_MODULES.addSemanticModule(new BPMNSemanticModule()); @@ -144,6 +147,7 @@ public static ProcessCodegen ofCollectedResources(KogitoBuildContext context, Co if (useSvgAddon) { context.addContextAttribute(ContextAttributesConstants.PROCESS_AUTO_SVG_MAPPING, processSVGMap); } + context.addContextAttribute(BUSINESS_CALENDAR_RESOURCE_KEY, resources.stream().anyMatch(resource -> resource.resource().getSourcePath().endsWith(BUSINESS_CALENDAR_PATH))); handleValidation(context, processesErrors); @@ -436,10 +440,16 @@ protected Collection internalGenerate() { } //Generating the Producer classes for Dependency Injection - StaticDependencyInjectionProducerGenerator.of(context()) - .generate() + StaticDependencyInjectionProducerGenerator staticDependencyInjectionProducerGenerator = StaticDependencyInjectionProducerGenerator.of(context()); + + staticDependencyInjectionProducerGenerator.generate() .entrySet() .forEach(entry -> storeFile(PRODUCER_TYPE, entry.getKey(), entry.getValue())); + Boolean businessCalendar = context().getContextAttribute(BUSINESS_CALENDAR_RESOURCE_KEY, Boolean.class); + if (Objects.nonNull(businessCalendar) && businessCalendar) { + staticDependencyInjectionProducerGenerator.generate(List.of(BUSINESS_CALENDAR_PRODUCER_TEMPLATE)) + .forEach((key, value) -> storeFile(PRODUCER_TYPE, key, value)); + } if (context().hasRESTForGenerator(this)) { for (ProcessResourceGenerator resourceGenerator : rgs) { diff --git a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/StaticDependencyInjectionProducerGenerator.java b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/StaticDependencyInjectionProducerGenerator.java index 9c147303e7f..9529b99cbc9 100644 --- a/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/StaticDependencyInjectionProducerGenerator.java +++ b/kogito-codegen-modules/kogito-codegen-processes/src/main/java/org/kie/kogito/codegen/process/StaticDependencyInjectionProducerGenerator.java @@ -49,11 +49,19 @@ public static StaticDependencyInjectionProducerGenerator of(KogitoBuildContext c * @return Map with the generated resources */ public Map generate() { + return generate(producerTemplates); + } + + /** + * Key is the FilePath, Value is the content + * + * @return Map with the generated resources + */ + public Map generate(List templates) { if (!context.hasDI()) { return Collections.emptyMap(); } - return producerTemplates.stream() - .map(this::buildProducerTemplatedGenerator) + return templates.stream().map(this::buildProducerTemplatedGenerator) .collect(Collectors.toMap(TemplatedGenerator::generatedFilePath, generator -> generator.compilationUnitOrThrow().toString())); } diff --git a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/config/ProcessConfigQuarkusTemplate.java b/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/config/ProcessConfigQuarkusTemplate.java index 19491e3b91b..98daf8fbdca 100644 --- a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/config/ProcessConfigQuarkusTemplate.java +++ b/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/config/ProcessConfigQuarkusTemplate.java @@ -18,10 +18,9 @@ */ package $Package$; -import jakarta.enterprise.inject.Instance; - import org.kie.api.event.process.ProcessEventListener; import org.kie.kogito.auth.IdentityProvider; +import org.kie.kogito.calendar.BusinessCalendar; import org.kie.kogito.event.EventPublisher; import org.kie.kogito.jobs.JobsService; import org.kie.kogito.process.ProcessEventListenerConfig; @@ -30,6 +29,8 @@ import org.kie.kogito.uow.UnitOfWorkManager; import org.kie.kogito.uow.events.UnitOfWorkEventListener; +import jakarta.enterprise.inject.Instance; + @jakarta.inject.Singleton public class ProcessConfig extends org.kie.kogito.process.impl.AbstractProcessConfig { @@ -44,7 +45,8 @@ public ProcessConfig( org.kie.kogito.config.ConfigBean configBean, Instance unitOfWorkEventListeners, Instance versionResolver, - Instance identityProvider) { + Instance identityProvider, + Instance businessCalendar) { super(workItemHandlerConfig, processEventListenerConfigs, @@ -55,7 +57,8 @@ public ProcessConfig( configBean.getServiceUrl(), unitOfWorkEventListeners, versionResolver, - identityProvider); + identityProvider, + businessCalendar); } } diff --git a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/config/ProcessConfigSpringTemplate.java b/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/config/ProcessConfigSpringTemplate.java index df77c11433b..8152091578b 100644 --- a/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/config/ProcessConfigSpringTemplate.java +++ b/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/config/ProcessConfigSpringTemplate.java @@ -22,6 +22,7 @@ import org.kie.api.event.process.ProcessEventListener; import org.kie.kogito.auth.IdentityProvider; +import org.kie.kogito.calendar.BusinessCalendar; import org.kie.kogito.event.EventPublisher; import org.kie.kogito.jobs.JobsService; import org.kie.kogito.process.ProcessEventListenerConfig; @@ -44,7 +45,8 @@ public ProcessConfig( org.kie.kogito.config.ConfigBean configBean, List unitOfWorkEventListeners, List versionResolver, - List identityProvider) { + List identityProvider, + List businessCalendar) { super(workItemHandlerConfig, processEventListenerConfigs, @@ -55,6 +57,7 @@ public ProcessConfig( configBean.getServiceUrl(), unitOfWorkEventListeners, versionResolver, - identityProvider); + identityProvider, + 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/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java new file mode 100644 index 00000000000..4504af36e14 --- /dev/null +++ b/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java @@ -0,0 +1,36 @@ +/* + * 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 $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; + +public class BusinessCalendarProducer { + + private static final Logger logger = LoggerFactory.getLogger(BusinessCalendarProducer.class); + + @Produces + public BusinessCalendar createBusinessCalendar() { + return new BusinessCalendarImpl(); + } +} \ 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 new file mode 100644 index 00000000000..8fd9f766a1f --- /dev/null +++ b/kogito-codegen-modules/kogito-codegen-processes/src/main/resources/class-templates/producer/BusinessCalendarProducerSpringTemplate.java @@ -0,0 +1,38 @@ +/* + * 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 $Package$; + +import org.kie.kogito.calendar.BusinessCalendar; +import org.jbpm.process.core.timer.BusinessCalendarImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class BusinessCalendarProducer { + + private static final Logger logger = LoggerFactory.getLogger(BusinessCalendarProducer.class); + + @Bean + public BusinessCalendar createBusinessCalendar() { + + return new BusinessCalendarImpl(); + } +} \ No newline at end of file diff --git a/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/ProcessCodegenTest.java b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/ProcessCodegenTest.java index b2472ec7580..5fb0d9fef5e 100644 --- a/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/ProcessCodegenTest.java +++ b/kogito-codegen-modules/kogito-codegen-processes/src/test/java/org/kie/kogito/codegen/process/ProcessCodegenTest.java @@ -23,13 +23,19 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.drools.codegen.common.GeneratedFile; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.kie.kogito.codegen.api.AddonsConfig; import org.kie.kogito.codegen.api.context.KogitoBuildContext; +import org.kie.kogito.codegen.api.context.impl.QuarkusKogitoBuildContext; +import org.kie.kogito.codegen.api.context.impl.SpringBootKogitoBuildContext; import org.kie.kogito.codegen.core.DashboardGeneratedFileUtils; import org.kie.kogito.codegen.core.io.CollectedResourceProducer; @@ -99,6 +105,19 @@ public void whenMonitoringAndPrometheusEnabledGrafanaDashboardsAreNotGenerated(K generateTestDashboards(codeGenerator, 0); } + @ParameterizedTest + @MethodSource("contextBuildersForBusinessCalendar") + public void whenCalendarPropertiesFoundGenerateBusinessCalendar(KogitoBuildContext.Builder contextBuilder, String dependencyAnnotation) { + KogitoBuildContext context = contextBuilder.build(); + StaticDependencyInjectionProducerGenerator staticDependencyInjectionProducerGenerator = StaticDependencyInjectionProducerGenerator.of(context); + Map businessCalendarProducer = staticDependencyInjectionProducerGenerator.generate(List.of("BusinessCalendarProducer")); + assertThat(businessCalendarProducer.size()).isEqualTo(1); + Optional generatedContent = businessCalendarProducer.values().stream().findFirst(); + assertThat(businessCalendarProducer.keySet()).containsExactly("org/kie/kogito/app/BusinessCalendarProducer.java"); + assertThat(generatedContent.isPresent()).isTrue(); + assertThat(generatedContent.get().contains(dependencyAnnotation)).isTrue(); + } + private List generateTestDashboards(ProcessCodegen codeGenerator, int expectedDashboards) { Collection generatedFiles = codeGenerator.generate(); @@ -111,4 +130,10 @@ private List generateTestDashboards(ProcessCodegen codeGenerator, return dashboards; } + + private static Stream contextBuildersForBusinessCalendar() { + return Stream.of( + Arguments.of(QuarkusKogitoBuildContext.builder(), "@Produces"), + Arguments.of(SpringBootKogitoBuildContext.builder(), "@Bean")); + } } diff --git a/kogito-codegen-modules/kogito-codegen-processes/src/test/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java b/kogito-codegen-modules/kogito-codegen-processes/src/test/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java new file mode 100644 index 00000000000..dd5e5f18ea9 --- /dev/null +++ b/kogito-codegen-modules/kogito-codegen-processes/src/test/resources/class-templates/producer/BusinessCalendarProducerQuarkusTemplate.java @@ -0,0 +1,36 @@ +/* + * 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 $Package$; + +import org.kie.kogito.calendar.BusinessCalendar; +import org.kie.kogito.calendar.BusinessCalendarImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import jakarta.enterprise.inject.Produces; + +public class BusinessCalendarProducer { + + private static final Logger logger = LoggerFactory.getLogger(BusinessCalendarProducer.class); + + @Produces + public BusinessCalendar createBusinessCalendar() { + return new BusinessCalendarImpl(); + } +} \ No newline at end of file diff --git a/kogito-codegen-modules/kogito-codegen-processes/src/test/resources/class-templates/producer/BusinessCalendarProducerSpringTemplate.java b/kogito-codegen-modules/kogito-codegen-processes/src/test/resources/class-templates/producer/BusinessCalendarProducerSpringTemplate.java new file mode 100644 index 00000000000..e80c7cb10b8 --- /dev/null +++ b/kogito-codegen-modules/kogito-codegen-processes/src/test/resources/class-templates/producer/BusinessCalendarProducerSpringTemplate.java @@ -0,0 +1,37 @@ +/* + * 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 $Package$; + +import org.kie.kogito.calendar.BusinessCalendar; +import org.kie.kogito.calendar.BusinessCalendarImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class BusinessCalendarProducer { + + private static final Logger logger = LoggerFactory.getLogger(BusinessCalendarProducer.class); + + @Bean + public BusinessCalendar createBusinessCalendar() { + return new BusinessCalendarImpl(); + } +} \ No newline at end of file