private void resolveBom(InitializrMetadata metadata, String bomId, Version requestedVersion) { if (!this.boms.containsKey(bomId)) { BillOfMaterials bom = metadata.getConfiguration().getEnv().getBoms() .get(bomId).resolve(requestedVersion); bom.getAdditionalBoms() .forEach((id) -> resolveBom(metadata, id, requestedVersion)); this.boms.put(bomId, bom); } }
@Override public void contribute(Info.Builder builder) { Map<String, Object> details = new LinkedHashMap<>(); this.metadataProvider.get().getConfiguration().getEnv().getBoms() .forEach((k, v) -> { if (v.getMappings() != null && !v.getMappings().isEmpty()) { Map<String, Object> bom = new LinkedHashMap<>(); v.getMappings().forEach((it) -> { String requirement = "Spring Boot " + it.determineVersionRangeRequirement(); bom.put(it.getVersion(), requirement); }); details.put(k, bom); } }); if (!details.isEmpty()) { builder.withDetail("bom-ranges", details); } }
/** * Update the available Spring Boot versions with the specified capabilities. * @param versionsMetadata the Spring Boot boot versions metadata to use */ public void updateSpringBootVersions(List<DefaultMetadataElement> versionsMetadata) { this.bootVersions.getContent().clear(); this.bootVersions.getContent().addAll(versionsMetadata); List<Version> bootVersions = this.bootVersions.getContent().stream() .map((it) -> Version.parse(it.getId())).collect(Collectors.toList()); VersionParser parser = new VersionParser(bootVersions); this.dependencies.updateVersionRange(parser); this.configuration.getEnv().getBoms().values() .forEach((it) -> it.updateVersionRange(parser)); this.configuration.getEnv().getKotlin().updateVersionRange(parser); }
@Override public void contribute(Info.Builder builder) { Map<String, Object> details = new LinkedHashMap<>(); this.metadataProvider.get().getConfiguration().getEnv().getBoms() .forEach((k, v) -> { if (v.getMappings() != null && !v.getMappings().isEmpty()) { Map<String, Object> bom = new LinkedHashMap<>(); v.getMappings().forEach((it) -> { String requirement = "Spring Boot " + it.determineVersionRangeRequirement(); bom.put(it.getVersion(), requirement); }); details.put(k, bom); } }); if (!details.isEmpty()) { builder.withDetail("bom-ranges", details); } }
Map<String, BillOfMaterials> boms = this.configuration.getEnv().getBoms(); for (Dependency dependency : this.dependencies.getAll()) { if (dependency.getBom() != null && !boms.containsKey(dependency.getBom())) {
if (dependency.getBom() != null) { boms.put(dependency.getBom(), metadata.getConfiguration().getEnv() .getBoms().get(dependency.getBom()).resolve(bootVersion));
metadata.getConfiguration().getEnv().getBoms().put("foo-bom", bom); Kotlin kotlin = metadata.getConfiguration().getEnv().getKotlin(); kotlin.setDefaultVersion("1.3"); DefaultMetadataElement.create("1.3.7.BUILD-SNAPSHOT", "1.3.7", false)); metadata.updateSpringBootVersions(bootVersions); assertThat(metadata.getConfiguration().getEnv().getBoms().get("foo-bom") .resolve(Version.parse("1.3.6.RELEASE")).getVersion()).isEqualTo("1.0.0"); assertThat(metadata.getConfiguration().getEnv().getBoms().get("foo-bom") .resolve(Version.parse("1.3.7.BUILD-SNAPSHOT")).getVersion()) .isEqualTo("1.1.0-BUILD-SNAPSHOT");
@Test void mergeMetadataWithBom() { InitializrMetadata metadata = InitializrMetadataBuilder.create() .withInitializrMetadata( new ClassPathResource("metadata/config/test-bom.json")) .build(); Map<String, BillOfMaterials> boms = metadata.getConfiguration().getEnv() .getBoms(); assertThat(boms).hasSize(2); BillOfMaterials myBom = boms.get("my-bom"); assertThat(myBom).isNotNull(); assertThat(myBom.getGroupId()).isEqualTo("org.acme"); assertThat(myBom.getArtifactId()).isEqualTo("my-bom"); assertThat(myBom.getVersion()).isEqualTo("2.1.1.RELEASE"); BillOfMaterials anotherBom = boms.get("another-bom"); assertThat(anotherBom).isNotNull(); assertThat(anotherBom.getGroupId()).isEqualTo("org.acme"); assertThat(anotherBom.getArtifactId()).isEqualTo("another-bom"); assertThat(anotherBom.getVersion()).isEqualTo("4.5.6.RELEASE"); }
@Test void invalidBomUnknownAdditionalBom() { InitializrMetadata metadata = initializeMetadata(); BillOfMaterials bom = BillOfMaterials.create("org.acme", "foo-bom", "1.0.0.RELEASE"); bom.getAdditionalBoms().addAll(Arrays.asList("bar-bom", "biz-bom")); BillOfMaterials barBom = BillOfMaterials.create("org.acme", "bar-bom", "1.0.0.RELEASE"); metadata.getConfiguration().getEnv().getBoms().put("foo-bom", bom); metadata.getConfiguration().getEnv().getBoms().put("bar-bom", barBom); assertThatExceptionOfType(InvalidInitializrMetadataException.class) .isThrownBy(metadata::validate) .withMessageContaining("invalid additional bom") .withMessageContaining("biz-bom"); }
@Test void invalidBomVersionRangeMappingUnknownAdditionalBom() { InitializrMetadata metadata = initializeMetadata(); BillOfMaterials bom = BillOfMaterials.create("org.acme", "foo-bom"); bom.getMappings().add(Mapping.create("[1.0.0.RELEASE,1.3.0.M1)", "1.0.0")); Mapping mapping = Mapping.create("1.3.0.M2", "1.2.0"); mapping.getAdditionalBoms().add("bar-bom"); bom.getMappings().add(mapping); metadata.getConfiguration().getEnv().getBoms().put("foo-bom", bom); assertThatExceptionOfType(InvalidInitializrMetadataException.class) .isThrownBy(metadata::validate) .withMessageContaining("invalid additional bom") .withMessageContaining("1.3.0.M2").withMessageContaining("bar-bom"); }
@Test void invalidBomVersionRangeMappingUnknownRepo() { InitializrMetadata metadata = initializeMetadata(); BillOfMaterials bom = BillOfMaterials.create("org.acme", "foo-bom"); bom.getMappings().add(Mapping.create("[1.0.0.RELEASE,1.3.0.M1)", "1.0.0")); Mapping mapping = Mapping.create("1.3.0.M2", "1.2.0"); mapping.getRepositories().add("foo-repo"); bom.getMappings().add(mapping); metadata.getConfiguration().getEnv().getBoms().put("foo-bom", bom); assertThatExceptionOfType(InvalidInitializrMetadataException.class) .isThrownBy(metadata::validate) .withMessageContaining("invalid repository id foo-repo") .withMessageContaining("1.3.0.M2").withMessageContaining("foo-bom"); }
public InitializrMetadataTestBuilder addBom(String id, BillOfMaterials bom) { this.builder.withCustomizer( (it) -> it.getConfiguration().getEnv().getBoms().put(id, bom)); return this; }
@Test void invalidBomVersionRangeMapping() { InitializrMetadata metadata = initializeMetadata(); BillOfMaterials bom = BillOfMaterials.create("org.acme", "foo-bom"); bom.getMappings().add(Mapping.create("[1.2.0.RELEASE,1.3.0.M1)", "1.0.0")); bom.getMappings().add(Mapping.create("FOO_BAR", "1.2.0")); metadata.getConfiguration().getEnv().getBoms().put("foo-bom", bom); assertThatExceptionOfType(InvalidInitializrMetadataException.class) .isThrownBy(metadata::validate).withMessageContaining("FOO_BAR") .withMessageContaining("foo-bom"); }
@Test void invalidBomNoVersion() { InitializrMetadata metadata = initializeMetadata(); metadata.getConfiguration().getEnv().getBoms().put("foo-bom", BillOfMaterials.create("org.acme", "foo-bom")); assertThatExceptionOfType(InvalidInitializrMetadataException.class) .isThrownBy(metadata::validate).withMessageContaining("No version") .withMessageContaining("foo-bom"); }
@Test void invalidBom() { InitializrMetadata metadata = initializeMetadata(); Dependency foo = Dependency.withId("foo", "org.acme", "foo"); foo.setBom("foo-bom"); addTestDependencyGroup(metadata, foo); metadata.getConfiguration().getEnv().getBoms().put("my-bom", BillOfMaterials.create("org.acme", "foo", "1.2.3")); assertThatExceptionOfType(InvalidInitializrMetadataException.class) .isThrownBy(metadata::validate).withMessageContaining("foo-bom") .withMessageContaining("my-bom"); }
@Test void invalidBomUnknownRepository() { InitializrMetadata metadata = initializeMetadata(); BillOfMaterials bom = BillOfMaterials.create("org.acme", "foo-bom", "1.0.0.RELEASE"); bom.getRepositories().add("foo-repo"); metadata.getConfiguration().getEnv().getBoms().put("foo-bom", bom); assertThatExceptionOfType(InvalidInitializrMetadataException.class) .isThrownBy(metadata::validate) .withMessageContaining("invalid repository id foo-repo") .withMessageContaining("foo-bom"); }