You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by ar...@apache.org on 2023/01/10 11:44:00 UTC

[fineract] branch develop updated: FINERACT-1724: Added the possibility to use username and password for JMS for remote jobs + the ability to disable remote jobs completely for non-batch instances

This is an automated email from the ASF dual-hosted git repository.

arnold pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new 61ca7bb0e FINERACT-1724: Added the possibility to use username and password for JMS for remote jobs + the ability to disable remote jobs completely for non-batch instances
61ca7bb0e is described below

commit 61ca7bb0e033ded643c8e23fa11e0ac770131a2b
Author: Arnold Galovics <ga...@gmail.com>
AuthorDate: Mon Jan 9 19:24:58 2023 +0100

    FINERACT-1724: Added the possibility to use username and password for JMS for remote jobs + the ability to disable remote jobs completely for non-batch instances
---
 .../FineractRemoteJobMessageHandlerCondition.java  |  59 ++++----
 .../core/config/FineractProperties.java            |   6 +
 .../messagehandler/JmsBrokerConfiguration.java     |   5 +
 .../src/main/resources/application.properties      |   2 +
 ...neractRemoteJobMessageHandlerConditionTest.java | 157 +++++++++++++++++++++
 5 files changed, 204 insertions(+), 25 deletions(-)

diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/condition/FineractRemoteJobMessageHandlerCondition.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/condition/FineractRemoteJobMessageHandlerCondition.java
index e4e8840b1..95d55a28d 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/condition/FineractRemoteJobMessageHandlerCondition.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/condition/FineractRemoteJobMessageHandlerCondition.java
@@ -18,41 +18,50 @@
  */
 package org.apache.fineract.infrastructure.core.condition;
 
-import java.util.Optional;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.context.annotation.Condition;
-import org.springframework.context.annotation.ConditionContext;
-import org.springframework.core.type.AnnotatedTypeMetadata;
+import org.apache.fineract.infrastructure.core.config.FineractProperties;
 
 @Slf4j
-public class FineractRemoteJobMessageHandlerCondition implements Condition {
+public class FineractRemoteJobMessageHandlerCondition extends PropertiesCondition {
 
     @Override
-    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
-        boolean isSpringEventsEnabled = Optional
-                .ofNullable(
-                        context.getEnvironment().getProperty("fineract.remote-job-message-handler.spring-events.enabled", Boolean.class))
-                .orElse(true);
-        boolean isJmsEnabled = Optional
-                .ofNullable(context.getEnvironment().getProperty("fineract.remote-job-message-handler.jms.enabled", Boolean.class))
-                .orElse(true);
-        boolean isBatchManagerModeEnabled = Optional
-                .ofNullable(context.getEnvironment().getProperty("fineract.mode.batch-manager-enabled", Boolean.class)).orElse(true);
-        boolean isBatchWorkerModeEnabled = Optional
-                .ofNullable(context.getEnvironment().getProperty("fineract.mode.batch-worker-enabled", Boolean.class)).orElse(true);
-        // TODO extend this expression with other message handlers in the future
+    protected boolean matches(FineractProperties properties) {
+        boolean isSpringEventsEnabled = properties.getRemoteJobMessageHandler().getSpringEvents().isEnabled();
+
         boolean conditionFails = false;
-        boolean onlyOneMessageHandlerEnabled = isSpringEventsEnabled ^ isJmsEnabled;
-        if (!onlyOneMessageHandlerEnabled) {
-            conditionFails = true;
-            log.error("For remote partitioning jobs exactly one Message Handler must be enabled.");
-        }
-        if (isSpringEventsEnabled) {
-            if (!(isBatchManagerModeEnabled && isBatchWorkerModeEnabled)) {
+        if (isAnyMessageHandlerConfigured(properties) && isBatchInstance(properties)) {
+            if (!isOnlyOneMessageHandlerEnabled(properties)) {
+                conditionFails = true;
+                log.error("For remote partitioning jobs exactly one Message Handler must be enabled.");
+            } else if (isSpringEventsEnabled && !isBatchManagerAndWorkerTogether(properties)) {
                 conditionFails = true;
                 log.error("If Spring Event Message Handler is enabled, the instance must be Batch Manager and Batch Worker too.");
             }
         }
         return conditionFails;
     }
+
+    private boolean isOnlyOneMessageHandlerEnabled(FineractProperties properties) {
+        boolean isSpringEventsEnabled = properties.getRemoteJobMessageHandler().getSpringEvents().isEnabled();
+        boolean isJmsEnabled = properties.getRemoteJobMessageHandler().getJms().isEnabled();
+        return isSpringEventsEnabled ^ isJmsEnabled;
+    }
+
+    private boolean isAnyMessageHandlerConfigured(FineractProperties properties) {
+        boolean isSpringEventsEnabled = properties.getRemoteJobMessageHandler().getSpringEvents().isEnabled();
+        boolean isJmsEnabled = properties.getRemoteJobMessageHandler().getJms().isEnabled();
+        return isSpringEventsEnabled || isJmsEnabled;
+    }
+
+    private boolean isBatchInstance(FineractProperties properties) {
+        boolean isBatchManagerModeEnabled = properties.getMode().isBatchManagerEnabled();
+        boolean isBatchWorkerModeEnabled = properties.getMode().isBatchWorkerEnabled();
+        return isBatchManagerModeEnabled || isBatchWorkerModeEnabled;
+    }
+
+    private boolean isBatchManagerAndWorkerTogether(FineractProperties properties) {
+        boolean isBatchManagerModeEnabled = properties.getMode().isBatchManagerEnabled();
+        boolean isBatchWorkerModeEnabled = properties.getMode().isBatchWorkerEnabled();
+        return isBatchManagerModeEnabled && isBatchWorkerModeEnabled;
+    }
 }
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/FineractProperties.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/FineractProperties.java
index f6e47e502..36c016da2 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/FineractProperties.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/FineractProperties.java
@@ -125,6 +125,12 @@ public class FineractProperties {
         private boolean enabled;
         private String requestQueueName;
         private String brokerUrl;
+        private String brokerUsername;
+        private String brokerPassword;
+
+        public boolean isBrokerPasswordProtected() {
+            return StringUtils.isNotBlank(brokerUsername) || StringUtils.isNotBlank(brokerPassword);
+        }
     }
 
     @Getter
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/JmsBrokerConfiguration.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/JmsBrokerConfiguration.java
index 96df69941..2e5ef2c8a 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/JmsBrokerConfiguration.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/springbatch/messagehandler/JmsBrokerConfiguration.java
@@ -37,6 +37,11 @@ public class JmsBrokerConfiguration {
         ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
         connectionFactory.setBrokerURL(fineractProperties.getRemoteJobMessageHandler().getJms().getBrokerUrl());
         connectionFactory.setTrustAllPackages(true);
+        FineractProperties.FineractRemoteJobMessageHandlerJmsProperties jmsProps = fineractProperties.getRemoteJobMessageHandler().getJms();
+        if (jmsProps.isBrokerPasswordProtected()) {
+            connectionFactory.setUserName(jmsProps.getBrokerUsername());
+            connectionFactory.setPassword(jmsProps.getBrokerPassword());
+        }
         return connectionFactory;
     }
 }
diff --git a/fineract-provider/src/main/resources/application.properties b/fineract-provider/src/main/resources/application.properties
index 21584870c..7ecc24686 100644
--- a/fineract-provider/src/main/resources/application.properties
+++ b/fineract-provider/src/main/resources/application.properties
@@ -52,6 +52,8 @@ fineract.remote-job-message-handler.spring-events.enabled=${FINERACT_REMOTE_JOB_
 fineract.remote-job-message-handler.jms.enabled=${FINERACT_REMOTE_JOB_MESSAGE_HANDLER_JMS_ENABLED:false}
 fineract.remote-job-message-handler.jms.request-queue-name=${FINERACT_REMOTE_JOB_MESSAGE_HANDLER_JMS_QUEUE_NAME:JMS-request-queue}
 fineract.remote-job-message-handler.jms.broker-url=${FINERACT_REMOTE_JOB_MESSAGE_HANDLER_JMS_BROKER_URL:tcp://127.0.0.1:61616}
+fineract.remote-job-message-handler.jms.broker-username=${FINERACT_REMOTE_JOB_MESSAGE_HANDLER_JMS_BROKER_USERNAME:}
+fineract.remote-job-message-handler.jms.broker-password=${FINERACT_REMOTE_JOB_MESSAGE_HANDLER_JMS_BROKER_PASSWORD:}
 
 fineract.events.external.enabled=${FINERACT_EXTERNAL_EVENTS_ENABLED:false}
 fineract.events.external.producer.read-batch-size=${FINERACT_EXTERNAL_EVENTS_PRODUCER_READ_BATCH_SIZE:1000}
diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/condition/FineractRemoteJobMessageHandlerConditionTest.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/condition/FineractRemoteJobMessageHandlerConditionTest.java
new file mode 100644
index 000000000..7d360b6dc
--- /dev/null
+++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/condition/FineractRemoteJobMessageHandlerConditionTest.java
@@ -0,0 +1,157 @@
+/**
+ * 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.apache.fineract.infrastructure.core.condition;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.BDDMockito.given;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+import org.springframework.mock.env.MockEnvironment;
+
+@ExtendWith(MockitoExtension.class)
+class FineractRemoteJobMessageHandlerConditionTest {
+
+    @Mock
+    private ConditionContext conditionContext;
+
+    @Mock
+    private AnnotatedTypeMetadata metadata;
+
+    private MockEnvironment environment;
+
+    @InjectMocks
+    private FineractRemoteJobMessageHandlerCondition underTest = new FineractRemoteJobMessageHandlerCondition();
+
+    @BeforeEach
+    public void setUp() {
+        environment = new MockEnvironment();
+        given(conditionContext.getEnvironment()).willReturn(environment);
+    }
+
+    @Test
+    public void testMatchesShouldReturnFalseWhenSpringEventsIsEnabledAndManagerAndWorker() {
+        // given
+        environment.withProperty("fineract.remote-job-message-handler.spring-events.enabled", "true");
+        environment.withProperty("fineract.remote-job-message-handler.jms.enabled", "false");
+        environment.withProperty("fineract.mode.batch-manager-enabled", "true");
+        environment.withProperty("fineract.mode.batch-worker-enabled", "true");
+        // when
+        boolean result = underTest.matches(conditionContext, metadata);
+        // then
+        assertThat(result).isFalse();
+    }
+
+    @Test
+    public void testMatchesShouldReturnTrueWhenSpringEventsIsEnabledAndManagerOnly() {
+        // given
+        environment.withProperty("fineract.remote-job-message-handler.spring-events.enabled", "true");
+        environment.withProperty("fineract.remote-job-message-handler.jms.enabled", "false");
+        environment.withProperty("fineract.mode.batch-manager-enabled", "true");
+        environment.withProperty("fineract.mode.batch-worker-enabled", "false");
+        // when
+        boolean result = underTest.matches(conditionContext, metadata);
+        // then
+        assertThat(result).isTrue();
+    }
+
+    @Test
+    public void testMatchesShouldReturnTrueWhenSpringEventsIsEnabledAndWorkerOnly() {
+        // given
+        environment.withProperty("fineract.remote-job-message-handler.spring-events.enabled", "true");
+        environment.withProperty("fineract.remote-job-message-handler.jms.enabled", "false");
+        environment.withProperty("fineract.mode.batch-manager-enabled", "false");
+        environment.withProperty("fineract.mode.batch-worker-enabled", "true");
+        // when
+        boolean result = underTest.matches(conditionContext, metadata);
+        // then
+        assertThat(result).isTrue();
+    }
+
+    @Test
+    public void testMatchesShouldReturnFalseWhenJmsIsEnabledAndManagerAndWorker() {
+        // given
+        environment.withProperty("fineract.remote-job-message-handler.spring-events.enabled", "false");
+        environment.withProperty("fineract.remote-job-message-handler.jms.enabled", "true");
+        environment.withProperty("fineract.mode.batch-manager-enabled", "true");
+        environment.withProperty("fineract.mode.batch-worker-enabled", "true");
+        // when
+        boolean result = underTest.matches(conditionContext, metadata);
+        // then
+        assertThat(result).isFalse();
+    }
+
+    @Test
+    public void testMatchesShouldReturnFalseWhenJmsIsEnabledAndManagerOnly() {
+        // given
+        environment.withProperty("fineract.remote-job-message-handler.spring-events.enabled", "false");
+        environment.withProperty("fineract.remote-job-message-handler.jms.enabled", "true");
+        environment.withProperty("fineract.mode.batch-manager-enabled", "true");
+        environment.withProperty("fineract.mode.batch-worker-enabled", "false");
+        // when
+        boolean result = underTest.matches(conditionContext, metadata);
+        // then
+        assertThat(result).isFalse();
+    }
+
+    @Test
+    public void testMatchesShouldReturnFalseWhenJmsIsEnabledAndWorkerOnly() {
+        // given
+        environment.withProperty("fineract.remote-job-message-handler.spring-events.enabled", "false");
+        environment.withProperty("fineract.remote-job-message-handler.jms.enabled", "true");
+        environment.withProperty("fineract.mode.batch-manager-enabled", "false");
+        environment.withProperty("fineract.mode.batch-worker-enabled", "true");
+        // when
+        boolean result = underTest.matches(conditionContext, metadata);
+        // then
+        assertThat(result).isFalse();
+    }
+
+    @Test
+    public void testMatchesShouldReturnTrueWhenSpringEventsIsEnabledAndJmsIsEnabled() {
+        // given
+        environment.withProperty("fineract.remote-job-message-handler.spring-events.enabled", "true");
+        environment.withProperty("fineract.remote-job-message-handler.jms.enabled", "true");
+        environment.withProperty("fineract.mode.batch-manager-enabled", "true");
+        environment.withProperty("fineract.mode.batch-worker-enabled", "true");
+        // when
+        boolean result = underTest.matches(conditionContext, metadata);
+        // then
+        assertThat(result).isTrue();
+    }
+
+    @Test
+    public void testMatchesShouldReturnFalseWhenNoMessagingIsConfiguredAndNotManagerOrWorker() {
+        // given
+        environment.withProperty("fineract.remote-job-message-handler.spring-events.enabled", "false");
+        environment.withProperty("fineract.remote-job-message-handler.jms.enabled", "false");
+        environment.withProperty("fineract.mode.batch-manager-enabled", "false");
+        environment.withProperty("fineract.mode.batch-worker-enabled", "false");
+        // when
+        boolean result = underTest.matches(conditionContext, metadata);
+        // then
+        assertThat(result).isFalse();
+    }
+}