FINERACT-1734-Create-Custom-Business-Event
This commit is contained in:
committed by
Arnold Gálovics
parent
0f41eb2c42
commit
d3dcc760e2
@@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
description = 'ACME Corp.: Fineract external events'
|
||||||
|
|
||||||
|
group = 'com.acme.fineract.event'
|
||||||
|
|
||||||
|
archivesBaseName = 'acme-fineract-event-externalevent'
|
||||||
|
|
||||||
|
apply from: 'dependencies.gradle'
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(project(':fineract-provider'))
|
||||||
|
implementation('org.springframework.boot:spring-boot-starter-data-jpa')
|
||||||
|
}
|
||||||
+35
@@ -0,0 +1,35 @@
|
|||||||
|
/**
|
||||||
|
* 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 com.acme.fineract.event.externalevent;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import org.apache.fineract.infrastructure.event.external.service.validation.ExternalEventSourceData;
|
||||||
|
import org.apache.fineract.infrastructure.event.external.service.validation.ExternalEventSourceProvider;
|
||||||
|
import org.apache.fineract.infrastructure.event.external.service.validation.SimpleExternalEventSourceProvider;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class AcmeExternalEventSourceProviderConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ExternalEventSourceProvider acmeEventSourceProvider() {
|
||||||
|
return new SimpleExternalEventSourceProvider(List.of(new ExternalEventSourceData("com.acme.fineract.event.externalevent")));
|
||||||
|
}
|
||||||
|
}
|
||||||
+36
@@ -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 com.acme.fineract.event.externalevent;
|
||||||
|
|
||||||
|
import org.apache.fineract.infrastructure.event.business.domain.loan.LoanBusinessEvent;
|
||||||
|
import org.apache.fineract.portfolio.loanaccount.domain.Loan;
|
||||||
|
|
||||||
|
public class AcmeLoanExternalEvent extends LoanBusinessEvent {
|
||||||
|
|
||||||
|
private static final String TYPE = "AcmeLoanExternalEvent";
|
||||||
|
|
||||||
|
public AcmeLoanExternalEvent(Loan value) {
|
||||||
|
super(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
}
|
||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.1.xsd">
|
||||||
|
<changeSet author="acme" id="1">
|
||||||
|
<insert tableName="m_external_event_configuration">
|
||||||
|
<column name="type" value="AcmeLoanExternalEvent"/>
|
||||||
|
<column name="enabled" valueBoolean="false"/>
|
||||||
|
</insert>
|
||||||
|
</changeSet>
|
||||||
|
</databaseChangeLog>
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
description = 'ACME Corp.: Fineract Event Starter'
|
||||||
|
|
||||||
|
group = 'com.acme.fineract.event'
|
||||||
|
|
||||||
|
archivesBaseName = 'acme-fineract-event-starter'
|
||||||
|
|
||||||
|
apply from: 'dependencies.gradle'
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(project(':fineract-provider'))
|
||||||
|
implementation('org.springframework.boot:spring-boot-starter')
|
||||||
|
}
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
/**
|
||||||
|
* 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 com.acme.fineract.event.starter;
|
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||||
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
|
import org.springframework.context.annotation.ComponentScans;
|
||||||
|
|
||||||
|
@AutoConfiguration
|
||||||
|
@ComponentScans({ @ComponentScan("com.acme.fineract.event.externalevent") })
|
||||||
|
public class AcmeEventAutoConfiguration {}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
|
||||||
|
com.acme.fineract.event.starter.AcmeEventAutoConfiguration
|
||||||
+24
-22
@@ -25,11 +25,10 @@ import java.util.function.Function;
|
|||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
import liquibase.exception.LiquibaseException;
|
import liquibase.exception.LiquibaseException;
|
||||||
import liquibase.integration.spring.SpringLiquibase;
|
import liquibase.integration.spring.SpringLiquibase;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.fineract.infrastructure.core.config.FineractProperties;
|
import org.apache.fineract.infrastructure.core.config.FineractProperties;
|
||||||
import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant;
|
import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant;
|
||||||
import org.apache.fineract.infrastructure.security.service.TenantDetailsService;
|
import org.apache.fineract.infrastructure.security.service.TenantDetailsService;
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
@@ -39,12 +38,13 @@ import org.springframework.stereotype.Service;
|
|||||||
* A service that picks up on tenants that are configured to auto-update their specific schema on application startup.
|
* A service that picks up on tenants that are configured to auto-update their specific schema on application startup.
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
|
@Slf4j
|
||||||
public class TenantDatabaseUpgradeService implements InitializingBean {
|
public class TenantDatabaseUpgradeService implements InitializingBean {
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(TenantDatabaseUpgradeService.class);
|
|
||||||
private static final String TENANT_STORE_DB_CONTEXT = "tenant_store_db";
|
private static final String TENANT_STORE_DB_CONTEXT = "tenant_store_db";
|
||||||
private static final String INITIAL_SWITCH_CONTEXT = "initial_switch";
|
private static final String INITIAL_SWITCH_CONTEXT = "initial_switch";
|
||||||
private static final String TENANT_DB_CONTEXT = "tenant_db";
|
private static final String TENANT_DB_CONTEXT = "tenant_db";
|
||||||
|
private static final String CUSTOM_CHANGELOG_CONTEXT = "custom_changelog";
|
||||||
|
|
||||||
private final TenantDetailsService tenantDetailsService;
|
private final TenantDetailsService tenantDetailsService;
|
||||||
private final DataSource tenantDataSource;
|
private final DataSource tenantDataSource;
|
||||||
@@ -69,9 +69,9 @@ public class TenantDatabaseUpgradeService implements InitializingBean {
|
|||||||
@Override
|
@Override
|
||||||
public void afterPropertiesSet() throws Exception {
|
public void afterPropertiesSet() throws Exception {
|
||||||
if (databaseStateVerifier.isLiquibaseDisabled() || !fineractProperties.getMode().isWriteEnabled()) {
|
if (databaseStateVerifier.isLiquibaseDisabled() || !fineractProperties.getMode().isWriteEnabled()) {
|
||||||
LOG.warn("Liquibase is disabled. Not upgrading any database.");
|
log.warn("Liquibase is disabled. Not upgrading any database.");
|
||||||
if (!fineractProperties.getMode().isWriteEnabled()) {
|
if (!fineractProperties.getMode().isWriteEnabled()) {
|
||||||
LOG.warn("Liquibase is disabled because the current instance is configured as a non-write Fineract instance");
|
log.warn("Liquibase is disabled because the current instance is configured as a non-write Fineract instance");
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -84,7 +84,7 @@ public class TenantDatabaseUpgradeService implements InitializingBean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void upgradeTenantStore() throws LiquibaseException {
|
private void upgradeTenantStore() throws LiquibaseException {
|
||||||
LOG.warn("Upgrading tenant store DB at {}:{}", fineractProperties.getTenant().getHost(), fineractProperties.getTenant().getPort());
|
log.warn("Upgrading tenant store DB at {}:{}", fineractProperties.getTenant().getHost(), fineractProperties.getTenant().getPort());
|
||||||
logTenantStoreDetails();
|
logTenantStoreDetails();
|
||||||
if (databaseStateVerifier.isFirstLiquibaseMigration(tenantDataSource)) {
|
if (databaseStateVerifier.isFirstLiquibaseMigration(tenantDataSource)) {
|
||||||
ExtendedSpringLiquibase liquibase = liquibaseFactory.create(tenantDataSource, TENANT_STORE_DB_CONTEXT, INITIAL_SWITCH_CONTEXT);
|
ExtendedSpringLiquibase liquibase = liquibaseFactory.create(tenantDataSource, TENANT_STORE_DB_CONTEXT, INITIAL_SWITCH_CONTEXT);
|
||||||
@@ -93,32 +93,32 @@ public class TenantDatabaseUpgradeService implements InitializingBean {
|
|||||||
}
|
}
|
||||||
SpringLiquibase liquibase = liquibaseFactory.create(tenantDataSource, TENANT_STORE_DB_CONTEXT);
|
SpringLiquibase liquibase = liquibaseFactory.create(tenantDataSource, TENANT_STORE_DB_CONTEXT);
|
||||||
liquibase.afterPropertiesSet();
|
liquibase.afterPropertiesSet();
|
||||||
LOG.warn("Tenant store upgrade finished");
|
log.warn("Tenant store upgrade finished");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void logTenantStoreDetails() {
|
private void logTenantStoreDetails() {
|
||||||
LOG.info("- fineract.tenant.username: {}", fineractProperties.getTenant().getUsername());
|
log.info("- fineract.tenant.username: {}", fineractProperties.getTenant().getUsername());
|
||||||
LOG.info("- fineract.tenant.password: ****");
|
log.info("- fineract.tenant.password: ****");
|
||||||
LOG.info("- fineract.tenant.parameters: {}", fineractProperties.getTenant().getParameters());
|
log.info("- fineract.tenant.parameters: {}", fineractProperties.getTenant().getParameters());
|
||||||
LOG.info("- fineract.tenant.timezone: {}", fineractProperties.getTenant().getTimezone());
|
log.info("- fineract.tenant.timezone: {}", fineractProperties.getTenant().getTimezone());
|
||||||
LOG.info("- fineract.tenant.description: {}", fineractProperties.getTenant().getDescription());
|
log.info("- fineract.tenant.description: {}", fineractProperties.getTenant().getDescription());
|
||||||
LOG.info("- fineract.tenant.identifier: {}", fineractProperties.getTenant().getIdentifier());
|
log.info("- fineract.tenant.identifier: {}", fineractProperties.getTenant().getIdentifier());
|
||||||
LOG.info("- fineract.tenant.name: {}", fineractProperties.getTenant().getName());
|
log.info("- fineract.tenant.name: {}", fineractProperties.getTenant().getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void upgradeIndividualTenants() throws LiquibaseException {
|
private void upgradeIndividualTenants() throws LiquibaseException {
|
||||||
LOG.warn("Upgrading all tenants");
|
log.warn("Upgrading all tenants");
|
||||||
List<FineractPlatformTenant> tenants = tenantDetailsService.findAllTenants();
|
List<FineractPlatformTenant> tenants = tenantDetailsService.findAllTenants();
|
||||||
if (isNotEmpty(tenants)) {
|
if (isNotEmpty(tenants)) {
|
||||||
for (FineractPlatformTenant tenant : tenants) {
|
for (FineractPlatformTenant tenant : tenants) {
|
||||||
upgradeIndividualTenant(tenant);
|
upgradeIndividualTenant(tenant);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LOG.warn("Tenant upgrades have finished");
|
log.warn("Tenant upgrades have finished");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void upgradeIndividualTenant(FineractPlatformTenant tenant) throws LiquibaseException {
|
private void upgradeIndividualTenant(FineractPlatformTenant tenant) throws LiquibaseException {
|
||||||
LOG.info("Upgrade for tenant {} has started", tenant.getTenantIdentifier());
|
log.info("Upgrade for tenant {} has started", tenant.getTenantIdentifier());
|
||||||
DataSource tenantDataSource = tenantDataSourceFactory.create(tenant);
|
DataSource tenantDataSource = tenantDataSourceFactory.create(tenant);
|
||||||
if (databaseStateVerifier.isFirstLiquibaseMigration(tenantDataSource)) {
|
if (databaseStateVerifier.isFirstLiquibaseMigration(tenantDataSource)) {
|
||||||
ExtendedSpringLiquibase liquibase = liquibaseFactory.create(tenantDataSource, TENANT_DB_CONTEXT, INITIAL_SWITCH_CONTEXT);
|
ExtendedSpringLiquibase liquibase = liquibaseFactory.create(tenantDataSource, TENANT_DB_CONTEXT, INITIAL_SWITCH_CONTEXT);
|
||||||
@@ -127,20 +127,22 @@ public class TenantDatabaseUpgradeService implements InitializingBean {
|
|||||||
}
|
}
|
||||||
SpringLiquibase tenantLiquibase = liquibaseFactory.create(tenantDataSource, TENANT_DB_CONTEXT);
|
SpringLiquibase tenantLiquibase = liquibaseFactory.create(tenantDataSource, TENANT_DB_CONTEXT);
|
||||||
tenantLiquibase.afterPropertiesSet();
|
tenantLiquibase.afterPropertiesSet();
|
||||||
LOG.info("Upgrade for tenant {} has finished", tenant.getTenantIdentifier());
|
SpringLiquibase customChangelogLiquibase = liquibaseFactory.create(tenantDataSource, TENANT_DB_CONTEXT, CUSTOM_CHANGELOG_CONTEXT);
|
||||||
|
customChangelogLiquibase.afterPropertiesSet();
|
||||||
|
log.info("Upgrade for tenant {} has finished", tenant.getTenantIdentifier());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void applyInitialLiquibase(DataSource dataSource, ExtendedSpringLiquibase liquibase, String id,
|
private void applyInitialLiquibase(DataSource dataSource, ExtendedSpringLiquibase liquibase, String id,
|
||||||
Function<DataSource, Boolean> isUpgradableFn) throws LiquibaseException {
|
Function<DataSource, Boolean> isUpgradableFn) throws LiquibaseException {
|
||||||
if (databaseStateVerifier.isFlywayPresent(dataSource)) {
|
if (databaseStateVerifier.isFlywayPresent(dataSource)) {
|
||||||
if (isUpgradableFn.apply(dataSource)) {
|
if (isUpgradableFn.apply(dataSource)) {
|
||||||
LOG.warn("Cannot proceed with upgrading database {}", id);
|
log.warn("Cannot proceed with upgrading database {}", id);
|
||||||
LOG.warn("It seems the database doesn't have the latest schema changes applied until the 1.6 release");
|
log.warn("It seems the database doesn't have the latest schema changes applied until the 1.6 release");
|
||||||
throw new SchemaUpgradeNeededException("Make sure to upgrade to Fineract 1.6 first and then to a newer version");
|
throw new SchemaUpgradeNeededException("Make sure to upgrade to Fineract 1.6 first and then to a newer version");
|
||||||
}
|
}
|
||||||
LOG.warn("This is the first Liquibase migration for {}. We'll sync the changelog for you and then apply everything else", id);
|
log.warn("This is the first Liquibase migration for {}. We'll sync the changelog for you and then apply everything else", id);
|
||||||
liquibase.changeLogSync();
|
liquibase.changeLogSync();
|
||||||
LOG.warn("Liquibase changelog sync is complete");
|
log.warn("Liquibase changelog sync is complete");
|
||||||
} else {
|
} else {
|
||||||
liquibase.afterPropertiesSet();
|
liquibase.afterPropertiesSet();
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-2
@@ -27,10 +27,12 @@ import java.util.List;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant;
|
import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant;
|
||||||
import org.apache.fineract.infrastructure.event.business.domain.BulkBusinessEvent;
|
import org.apache.fineract.infrastructure.event.business.domain.BulkBusinessEvent;
|
||||||
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
|
import org.apache.fineract.infrastructure.event.business.domain.BusinessEvent;
|
||||||
import org.apache.fineract.infrastructure.event.external.exception.ExternalEventConfigurationNotFoundException;
|
import org.apache.fineract.infrastructure.event.external.exception.ExternalEventConfigurationNotFoundException;
|
||||||
|
import org.apache.fineract.infrastructure.event.external.service.validation.ExternalEventSourceService;
|
||||||
import org.apache.fineract.infrastructure.security.service.TenantDetailsService;
|
import org.apache.fineract.infrastructure.security.service.TenantDetailsService;
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
import org.springframework.jdbc.core.JdbcTemplate;
|
import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
@@ -41,11 +43,11 @@ import org.springframework.stereotype.Service;
|
|||||||
@Service
|
@Service
|
||||||
public class ExternalEventConfigurationValidationService implements InitializingBean {
|
public class ExternalEventConfigurationValidationService implements InitializingBean {
|
||||||
|
|
||||||
private static final String EXTERNAL_EVENT_CLASSES_BASE_PACKAGE = "org.apache.fineract.infrastructure.event.business.domain";
|
|
||||||
private static final String EXTERNAL_EVENT_BUSINESS_INTERFACE = BusinessEvent.class.getName();
|
private static final String EXTERNAL_EVENT_BUSINESS_INTERFACE = BusinessEvent.class.getName();
|
||||||
private static final String BULK_BUSINESS_EVENT = BulkBusinessEvent.class.getName();
|
private static final String BULK_BUSINESS_EVENT = BulkBusinessEvent.class.getName();
|
||||||
private final TenantDetailsService tenantDetailsService;
|
private final TenantDetailsService tenantDetailsService;
|
||||||
private final JdbcTemplateFactory jdbcTemplateFactory;
|
private final JdbcTemplateFactory jdbcTemplateFactory;
|
||||||
|
private final ExternalEventSourceService externalEventSourceService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterPropertiesSet() throws Exception {
|
public void afterPropertiesSet() throws Exception {
|
||||||
@@ -67,6 +69,10 @@ public class ExternalEventConfigurationValidationService implements Initializing
|
|||||||
throws ExternalEventConfigurationNotFoundException {
|
throws ExternalEventConfigurationNotFoundException {
|
||||||
log.info("Validating external event configuration for {}", tenant.getTenantIdentifier());
|
log.info("Validating external event configuration for {}", tenant.getTenantIdentifier());
|
||||||
List<String> eventConfigurations = getExternalEventConfigurationsForTenant(tenant);
|
List<String> eventConfigurations = getExternalEventConfigurationsForTenant(tenant);
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Missing from eventClasses: {}", CollectionUtils.subtract(eventClasses, eventConfigurations));
|
||||||
|
log.debug("Missing from eventConfigurations: {}", CollectionUtils.subtract(eventConfigurations, eventClasses));
|
||||||
|
}
|
||||||
|
|
||||||
if (eventClasses.size() != eventConfigurations.size()) {
|
if (eventClasses.size() != eventConfigurations.size()) {
|
||||||
throw new ExternalEventConfigurationNotFoundException();
|
throw new ExternalEventConfigurationNotFoundException();
|
||||||
@@ -88,7 +94,13 @@ public class ExternalEventConfigurationValidationService implements Initializing
|
|||||||
}
|
}
|
||||||
|
|
||||||
private List<String> getAllEventClasses() {
|
private List<String> getAllEventClasses() {
|
||||||
try (ScanResult scanResult = new ClassGraph().enableAllInfo().acceptPackages(EXTERNAL_EVENT_CLASSES_BASE_PACKAGE).scan()) {
|
List<String> sourcePackages = externalEventSourceService.getSourcePackages();
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Packages {}", sourcePackages);
|
||||||
|
}
|
||||||
|
String[] sourcePackagesForScan = new String[sourcePackages.size()];
|
||||||
|
try (ScanResult scanResult = new ClassGraph().enableAllInfo().acceptPackages(sourcePackages.toArray(sourcePackagesForScan))
|
||||||
|
.scan()) {
|
||||||
ClassInfoList businessEventClasses = scanResult.getClassesImplementing(EXTERNAL_EVENT_BUSINESS_INTERFACE)
|
ClassInfoList businessEventClasses = scanResult.getClassesImplementing(EXTERNAL_EVENT_BUSINESS_INTERFACE)
|
||||||
.filter(classInfo -> (!classInfo.isInterface() && !classInfo.isAbstract()
|
.filter(classInfo -> (!classInfo.isInterface() && !classInfo.isAbstract()
|
||||||
&& !classInfo.getName().equalsIgnoreCase(BULK_BUSINESS_EVENT)));
|
&& !classInfo.getName().equalsIgnoreCase(BULK_BUSINESS_EVENT)));
|
||||||
|
|||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* 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.event.external.service.validation;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class ExternalEventSourceData {
|
||||||
|
|
||||||
|
private final String sourcePackage;
|
||||||
|
}
|
||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
/**
|
||||||
|
* 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.event.external.service.validation;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public interface ExternalEventSourceProvider {
|
||||||
|
|
||||||
|
Set<ExternalEventSourceData> provide();
|
||||||
|
}
|
||||||
+36
@@ -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 org.apache.fineract.infrastructure.event.external.service.validation;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class ExternalEventSourceProviderConfig {
|
||||||
|
|
||||||
|
private static final String EXTERNAL_EVENT_CLASSES_BASE_PACKAGE = "org.apache.fineract.infrastructure.event.business.domain";
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ExternalEventSourceProvider fineractExternalEventSourceProvider() {
|
||||||
|
List<ExternalEventSourceData> sourcePackages = Arrays.asList(new ExternalEventSourceData(EXTERNAL_EVENT_CLASSES_BASE_PACKAGE));
|
||||||
|
return new SimpleExternalEventSourceProvider(sourcePackages);
|
||||||
|
}
|
||||||
|
}
|
||||||
+39
@@ -0,0 +1,39 @@
|
|||||||
|
/**
|
||||||
|
* 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.event.external.service.validation;
|
||||||
|
|
||||||
|
import static java.util.stream.Collectors.toList;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class ExternalEventSourceService {
|
||||||
|
|
||||||
|
private final Collection<ExternalEventSourceProvider> providers;
|
||||||
|
|
||||||
|
public List<String> getSourcePackages() {
|
||||||
|
return providers.stream().map(ExternalEventSourceProvider::provide).flatMap(Collection::stream)
|
||||||
|
.map(source -> source.getSourcePackage()).collect(toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+36
@@ -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 org.apache.fineract.infrastructure.event.external.service.validation;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class SimpleExternalEventSourceProvider implements ExternalEventSourceProvider {
|
||||||
|
|
||||||
|
private final Set<ExternalEventSourceData> sourcePackages;
|
||||||
|
|
||||||
|
public SimpleExternalEventSourceProvider(Collection<ExternalEventSourceData> sourcePackages) {
|
||||||
|
this.sourcePackages = Set.copyOf(sourcePackages);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<ExternalEventSourceData> provide() {
|
||||||
|
return sourcePackages;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -31,5 +31,5 @@
|
|||||||
<include file="tenant-store/changelog-tenant-store.xml" relativeToChangelogFile="true" context="tenant_store_db AND !initial_switch"/>
|
<include file="tenant-store/changelog-tenant-store.xml" relativeToChangelogFile="true" context="tenant_store_db AND !initial_switch"/>
|
||||||
<include file="tenant/initial-switch-changelog-tenant.xml" relativeToChangelogFile="true" context="tenant_db AND initial_switch"/>
|
<include file="tenant/initial-switch-changelog-tenant.xml" relativeToChangelogFile="true" context="tenant_db AND initial_switch"/>
|
||||||
<include file="tenant/changelog-tenant.xml" relativeToChangelogFile="true" context="tenant_db AND !initial_switch"/>
|
<include file="tenant/changelog-tenant.xml" relativeToChangelogFile="true" context="tenant_db AND !initial_switch"/>
|
||||||
<includeAll path="db/custom-changelog" errorIfMissingOrEmpty="false" context="tenant_db" />
|
<includeAll path="db/custom-changelog" errorIfMissingOrEmpty="false" context="tenant_db AND custom_changelog" />
|
||||||
</databaseChangeLog>
|
</databaseChangeLog>
|
||||||
|
|||||||
+3
@@ -54,6 +54,7 @@ public class LiquibaseStepDefinitions implements En {
|
|||||||
private ExtendedSpringLiquibase tenantStoreLiquibase;
|
private ExtendedSpringLiquibase tenantStoreLiquibase;
|
||||||
private ExtendedSpringLiquibase initialTenantLiquibase;
|
private ExtendedSpringLiquibase initialTenantLiquibase;
|
||||||
private ExtendedSpringLiquibase tenantLiquibase;
|
private ExtendedSpringLiquibase tenantLiquibase;
|
||||||
|
private ExtendedSpringLiquibase customChangeLogLiquibase;
|
||||||
private FineractPlatformTenant defaultTenant;
|
private FineractPlatformTenant defaultTenant;
|
||||||
private DataSource tenantStoreDataSource;
|
private DataSource tenantStoreDataSource;
|
||||||
private TenantDatabaseUpgradeService tenantDatabaseUpgradeService;
|
private TenantDatabaseUpgradeService tenantDatabaseUpgradeService;
|
||||||
@@ -158,6 +159,7 @@ public class LiquibaseStepDefinitions implements En {
|
|||||||
|
|
||||||
initialTenantLiquibase = mock(ExtendedSpringLiquibase.class);
|
initialTenantLiquibase = mock(ExtendedSpringLiquibase.class);
|
||||||
tenantLiquibase = mock(ExtendedSpringLiquibase.class);
|
tenantLiquibase = mock(ExtendedSpringLiquibase.class);
|
||||||
|
customChangeLogLiquibase = mock(ExtendedSpringLiquibase.class);
|
||||||
initialTenantStoreLiquibase = mock(ExtendedSpringLiquibase.class);
|
initialTenantStoreLiquibase = mock(ExtendedSpringLiquibase.class);
|
||||||
tenantStoreLiquibase = mock(ExtendedSpringLiquibase.class);
|
tenantStoreLiquibase = mock(ExtendedSpringLiquibase.class);
|
||||||
|
|
||||||
@@ -171,6 +173,7 @@ public class LiquibaseStepDefinitions implements En {
|
|||||||
given(tenantDataSourceFactory.create(defaultTenant)).willReturn(defaultTenantDataSource);
|
given(tenantDataSourceFactory.create(defaultTenant)).willReturn(defaultTenantDataSource);
|
||||||
given(liquibaseFactory.create(defaultTenantDataSource, "tenant_db", "initial_switch")).willReturn(initialTenantLiquibase);
|
given(liquibaseFactory.create(defaultTenantDataSource, "tenant_db", "initial_switch")).willReturn(initialTenantLiquibase);
|
||||||
given(liquibaseFactory.create(defaultTenantDataSource, "tenant_db")).willReturn(tenantLiquibase);
|
given(liquibaseFactory.create(defaultTenantDataSource, "tenant_db")).willReturn(tenantLiquibase);
|
||||||
|
given(liquibaseFactory.create(defaultTenantDataSource, "tenant_db", "custom_changelog")).willReturn(customChangeLogLiquibase);
|
||||||
|
|
||||||
tenantDatabaseUpgradeService = new TenantDatabaseUpgradeService(tenantDetailsService, tenantStoreDataSource, fineractProperties,
|
tenantDatabaseUpgradeService = new TenantDatabaseUpgradeService(tenantDetailsService, tenantStoreDataSource, fineractProperties,
|
||||||
databaseStateVerifier, liquibaseFactory, tenantDataSourceFactory);
|
databaseStateVerifier, liquibaseFactory, tenantDataSourceFactory);
|
||||||
|
|||||||
+11
-4
@@ -32,6 +32,7 @@ import java.util.Arrays;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant;
|
import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant;
|
||||||
import org.apache.fineract.infrastructure.event.external.exception.ExternalEventConfigurationNotFoundException;
|
import org.apache.fineract.infrastructure.event.external.exception.ExternalEventConfigurationNotFoundException;
|
||||||
|
import org.apache.fineract.infrastructure.event.external.service.validation.ExternalEventSourceService;
|
||||||
import org.apache.fineract.infrastructure.security.service.TenantDetailsService;
|
import org.apache.fineract.infrastructure.security.service.TenantDetailsService;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
@@ -50,11 +51,14 @@ public class ExternalEventConfigurationValidationServiceTest {
|
|||||||
@Mock
|
@Mock
|
||||||
private TenantDetailsService tenantDetailsService;
|
private TenantDetailsService tenantDetailsService;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private ExternalEventSourceService externalEventSourceService;
|
||||||
|
|
||||||
private ExternalEventConfigurationValidationService underTest;
|
private ExternalEventConfigurationValidationService underTest;
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
underTest = new ExternalEventConfigurationValidationService(tenantDetailsService, jdbcTemplateFactory);
|
underTest = new ExternalEventConfigurationValidationService(tenantDetailsService, jdbcTemplateFactory, externalEventSourceService);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -98,7 +102,8 @@ public class ExternalEventConfigurationValidationServiceTest {
|
|||||||
when(tenantDetailsService.findAllTenants()).thenReturn(tenants);
|
when(tenantDetailsService.findAllTenants()).thenReturn(tenants);
|
||||||
when(jdbcTemplateFactory.create(any())).thenReturn(jdbcTemplate);
|
when(jdbcTemplateFactory.create(any())).thenReturn(jdbcTemplate);
|
||||||
when(jdbcTemplate.queryForList(anyString(), eq(String.class))).thenReturn(configurations);
|
when(jdbcTemplate.queryForList(anyString(), eq(String.class))).thenReturn(configurations);
|
||||||
|
List<String> sourcePackage = Arrays.asList("org.apache.fineract.infrastructure.event.business.domain");
|
||||||
|
when(externalEventSourceService.getSourcePackages()).thenReturn(sourcePackage);
|
||||||
// when
|
// when
|
||||||
underTest.afterPropertiesSet();
|
underTest.afterPropertiesSet();
|
||||||
|
|
||||||
@@ -117,7 +122,8 @@ public class ExternalEventConfigurationValidationServiceTest {
|
|||||||
when(tenantDetailsService.findAllTenants()).thenReturn(tenants);
|
when(tenantDetailsService.findAllTenants()).thenReturn(tenants);
|
||||||
when(jdbcTemplateFactory.create(any())).thenReturn(jdbcTemplate);
|
when(jdbcTemplateFactory.create(any())).thenReturn(jdbcTemplate);
|
||||||
when(jdbcTemplate.queryForList(anyString(), eq(String.class))).thenReturn(new ArrayList<>());
|
when(jdbcTemplate.queryForList(anyString(), eq(String.class))).thenReturn(new ArrayList<>());
|
||||||
|
List<String> sourcePackage = Arrays.asList("org.apache.fineract.infrastructure.event.business.domain");
|
||||||
|
when(externalEventSourceService.getSourcePackages()).thenReturn(sourcePackage);
|
||||||
// when
|
// when
|
||||||
ExternalEventConfigurationNotFoundException exceptionThrown = assertThrows(ExternalEventConfigurationNotFoundException.class,
|
ExternalEventConfigurationNotFoundException exceptionThrown = assertThrows(ExternalEventConfigurationNotFoundException.class,
|
||||||
() -> underTest.afterPropertiesSet());
|
() -> underTest.afterPropertiesSet());
|
||||||
@@ -171,7 +177,8 @@ public class ExternalEventConfigurationValidationServiceTest {
|
|||||||
when(tenantDetailsService.findAllTenants()).thenReturn(tenants);
|
when(tenantDetailsService.findAllTenants()).thenReturn(tenants);
|
||||||
when(jdbcTemplateFactory.create(any())).thenReturn(jdbcTemplate);
|
when(jdbcTemplateFactory.create(any())).thenReturn(jdbcTemplate);
|
||||||
when(jdbcTemplate.queryForList(anyString(), eq(String.class))).thenReturn(configurationWithMissingCentersCreateBusinessEvent);
|
when(jdbcTemplate.queryForList(anyString(), eq(String.class))).thenReturn(configurationWithMissingCentersCreateBusinessEvent);
|
||||||
|
List<String> sourcePackage = Arrays.asList("org.apache.fineract.infrastructure.event.business.domain");
|
||||||
|
when(externalEventSourceService.getSourcePackages()).thenReturn(sourcePackage);
|
||||||
// when
|
// when
|
||||||
ExternalEventConfigurationNotFoundException exceptionThrown = assertThrows(ExternalEventConfigurationNotFoundException.class,
|
ExternalEventConfigurationNotFoundException exceptionThrown = assertThrows(ExternalEventConfigurationNotFoundException.class,
|
||||||
() -> underTest.afterPropertiesSet());
|
() -> underTest.afterPropertiesSet());
|
||||||
|
|||||||
Reference in New Issue
Block a user