diff --git a/src/main/java/org/fairdatapoint/config/BootstrapConfig.java b/src/main/java/org/fairdatapoint/config/BootstrapConfig.java index 9c8eab99..8ea83bce 100644 --- a/src/main/java/org/fairdatapoint/config/BootstrapConfig.java +++ b/src/main/java/org/fairdatapoint/config/BootstrapConfig.java @@ -24,10 +24,9 @@ import jakarta.validation.constraints.NotNull; import lombok.extern.slf4j.Slf4j; +import org.fairdatapoint.config.properties.BootstrapProperties; import org.fairdatapoint.database.db.repository.FixtureHistoryRepository; import org.fairdatapoint.entity.bootstrap.FixtureHistory; - -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -63,30 +62,30 @@ @Slf4j public class BootstrapConfig { private final ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver(); + private final BootstrapProperties bootstrap; private final FixtureHistoryRepository fixtureHistoryRepository; - private final boolean bootstrapEnabled; - private final Path dbFixturesPath; private final List resources = new ArrayList<>(); - public BootstrapConfig( - FixtureHistoryRepository fixtureHistoryRepository, - @Value("${bootstrap.enabled:false}") boolean bootstrapEnabled, - @Value("${bootstrap.db-fixtures-dir}") String dbFixturesDir - ) { - this.bootstrapEnabled = bootstrapEnabled; - this.dbFixturesPath = Path.of(dbFixturesDir); + public BootstrapConfig(BootstrapProperties bootstrapProperties, FixtureHistoryRepository fixtureHistoryRepository) { + this.bootstrap = bootstrapProperties; this.fixtureHistoryRepository = fixtureHistoryRepository; } @Bean public Jackson2RepositoryPopulatorFactoryBean repositoryPopulator() { final Jackson2RepositoryPopulatorFactoryBean factory = new Jackson2RepositoryPopulatorFactoryBean(); - if (bootstrapEnabled) { + if (this.bootstrap.isEnabled()) { log.info("Bootstrap repository populator enabled"); try { // collect fixture resources - final Path fixturesPath = dbFixturesPath.resolve("*.json"); - resources.addAll(List.of(resourceResolver.getResources("file:" + fixturesPath))); + log.info("Looking for db fixtures in the following directories: {}", + String.join(", ", this.bootstrap.getDbFixturesDirs())); + for (String fixturesDir : this.bootstrap.getDbFixturesDirs()) { + // Path.of() removes trailing slashes, so it is safe to concatenate "/*.json". + // Note that Path.of(fixturesDir).resolve("*.json") could work on unix but fails on windows. + final String locationPattern = "file:" + Path.of(fixturesDir) + "/*.json"; + resources.addAll(List.of(resourceResolver.getResources(locationPattern))); + } // remove resources that have been applied already final List appliedFixtures = fixtureHistoryRepository.findAll().stream() .map(FixtureHistory::getFilename).toList(); @@ -127,5 +126,4 @@ public void onApplicationEvent(@NotNull RepositoriesPopulatedEvent event) { } } } - } diff --git a/src/main/java/org/fairdatapoint/config/properties/BootstrapProperties.java b/src/main/java/org/fairdatapoint/config/properties/BootstrapProperties.java index efe2d084..a7dd4810 100644 --- a/src/main/java/org/fairdatapoint/config/properties/BootstrapProperties.java +++ b/src/main/java/org/fairdatapoint/config/properties/BootstrapProperties.java @@ -28,13 +28,16 @@ import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; +import java.util.List; + @NoArgsConstructor @AllArgsConstructor @Getter @Setter @ConfigurationProperties(prefix = "bootstrap") public class BootstrapProperties { + // boolean defaults to false private boolean enabled; // directories relative to project root - private String dbFixturesDir; + private List dbFixturesDirs; } diff --git a/src/main/resources/application-development.yml b/src/main/resources/application-development.yml index 171b6470..0a3be3bc 100644 --- a/src/main/resources/application-development.yml +++ b/src/main/resources/application-development.yml @@ -15,6 +15,3 @@ spring: locations: classpath:db/migration fail-on-missing-locations: true clean-disabled: false - -bootstrap: - enabled: true diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 7e3d89ec..c58e969c 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -113,4 +113,6 @@ server: forward-headers-strategy: framework bootstrap: - db-fixtures-dir: "fixtures" + enabled: true + db-fixtures-dirs: + - "fixtures" diff --git a/src/test/java/org/fairdatapoint/database/db/repository/bootstrap/FixtureHistoryRepositoryTests.java b/src/test/java/org/fairdatapoint/database/db/repository/bootstrap/FixtureHistoryRepositoryTests.java index 08b16056..7bfc3a58 100644 --- a/src/test/java/org/fairdatapoint/database/db/repository/bootstrap/FixtureHistoryRepositoryTests.java +++ b/src/test/java/org/fairdatapoint/database/db/repository/bootstrap/FixtureHistoryRepositoryTests.java @@ -30,6 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.AutoConfigureTestEntityManager; import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.test.context.TestPropertySource; import java.util.Optional; @@ -38,6 +39,7 @@ @AutoConfigureTestEntityManager @Transactional +@TestPropertySource(properties = "bootstrap.enabled=false") public class FixtureHistoryRepositoryTests extends BaseIntegrationTest { @Autowired FixtureHistoryRepository repository;