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); } }
@Test void resolveSimpleRange() { BillOfMaterials bom = BillOfMaterials.create("com.example", "bom", "1.0.0"); bom.setVersionProperty("bom.version"); bom.getRepositories().add("repo-main"); bom.getAdditionalBoms().add("bom-main"); bom.getMappings().add(Mapping.create("[1.2.0.RELEASE,1.3.0.M1)", "1.1.0")); bom.validate(); BillOfMaterials resolved = bom.resolve(Version.parse("1.2.3.RELEASE")); assertThat(resolved.getGroupId()).isEqualTo("com.example"); assertThat(resolved.getArtifactId()).isEqualTo("bom"); assertThat(resolved.getVersion()).isEqualTo("1.1.0"); assertThat(resolved.getVersionProperty().toStandardFormat()) .isEqualTo("bom.version"); assertThat(resolved.getRepositories()).hasSize(1); assertThat(resolved.getRepositories().get(0)).isEqualTo("repo-main"); assertThat(resolved.getAdditionalBoms()).hasSize(1); assertThat(resolved.getAdditionalBoms().get(0)).isEqualTo("bom-main"); }
@Test void resolveRangeOverride() { BillOfMaterials bom = BillOfMaterials.create("com.example", "bom", "1.0.0"); bom.getRepositories().add("repo-main"); bom.getAdditionalBoms().add("bom-main"); Mapping mapping = Mapping.create("[1.2.0.RELEASE,1.3.0.M1)", "1.1.0", "repo-foo"); mapping.getAdditionalBoms().add("bom-foo"); bom.getMappings().add(mapping); bom.validate(); BillOfMaterials resolved = bom.resolve(Version.parse("1.2.3.RELEASE")); assertThat(resolved.getGroupId()).isEqualTo("com.example"); assertThat(resolved.getArtifactId()).isEqualTo("bom"); assertThat(resolved.getVersion()).isEqualTo("1.1.0"); assertThat(resolved.getVersionProperty()).isNull(); assertThat(resolved.getRepositories()).hasSize(1); assertThat(resolved.getRepositories().get(0)).isEqualTo("repo-foo"); assertThat(resolved.getAdditionalBoms()).hasSize(1); assertThat(resolved.getAdditionalBoms().get(0)).isEqualTo("bom-foo"); }
@Test void resolveSimpleRangeWithGroupIdArtifactId() { BillOfMaterials bom = BillOfMaterials.create("com.example", "bom", "1.0.0"); bom.setVersionProperty("bom.version"); bom.getRepositories().add("repo-main"); bom.getAdditionalBoms().add("bom-main"); Mapping mapping = Mapping.create("[1.2.0.RELEASE,1.3.0.M1)", "1.1.0"); mapping.setGroupId("com.example.override"); mapping.setArtifactId("bom-override"); bom.getMappings().add(mapping); bom.validate(); BillOfMaterials resolved = bom.resolve(Version.parse("1.2.3.RELEASE")); assertThat(resolved.getGroupId()).isEqualTo("com.example.override"); assertThat(resolved.getArtifactId()).isEqualTo("bom-override"); assertThat(resolved.getVersion()).isEqualTo("1.1.0"); assertThat(resolved.getVersionProperty().toStandardFormat()) .isEqualTo("bom.version"); assertThat(resolved.getRepositories()).hasSize(1); assertThat(resolved.getRepositories().get(0)).isEqualTo("repo-main"); assertThat(resolved.getAdditionalBoms()).hasSize(1); assertThat(resolved.getAdditionalBoms().get(0)).isEqualTo("bom-main"); }
@Test void resolveAdditionalBomsDuplicates() { Dependency dependency = Dependency.withId("foo"); dependency.setBom("foo-bom"); Dependency anotherDependency = Dependency.withId("bar"); anotherDependency.setBom("bar-bom"); BillOfMaterials bom = BillOfMaterials.create("com.example", "foo-bom", "1.0.0"); bom.getAdditionalBoms().add("bar-bom"); BillOfMaterials additionalBom = BillOfMaterials.create("com.example", "bar-bom", "1.1.0"); this.metadata = InitializrMetadataTestBuilder.withDefaults() .addBom("foo-bom", bom).addBom("bar-bom", additionalBom) .addDependencyGroup("test", dependency, anotherDependency).build(); ProjectRequest request = initProjectRequest(); request.getStyle().addAll(Arrays.asList("foo", "bar")); request.resolve(this.metadata); assertThat(request.getResolvedDependencies()).hasSize(2); assertThat(request.getBoms()).hasSize(2); assertThat(request.getBoms().get("foo-bom")).isEqualTo(bom); assertThat(request.getBoms().get("bar-bom")).isEqualTo(additionalBom); }
@Test void resolveAdditionalBoms() { Dependency dependency = Dependency.withId("foo"); dependency.setBom("foo-bom"); BillOfMaterials bom = BillOfMaterials.create("com.example", "foo-bom", "1.0.0"); bom.getAdditionalBoms().add("bar-bom"); BillOfMaterials additionalBom = BillOfMaterials.create("com.example", "bar-bom", "1.1.0"); this.metadata = InitializrMetadataTestBuilder.withDefaults() .addBom("foo-bom", bom).addBom("bar-bom", additionalBom) .addDependencyGroup("test", dependency).build(); ProjectRequest request = initProjectRequest(); request.getStyle().add("foo"); request.resolve(this.metadata); assertThat(request.getResolvedDependencies()).hasSize(1); assertThat(request.getBoms()).hasSize(2); assertThat(request.getBoms().get("foo-bom")).isEqualTo(bom); assertThat(request.getBoms().get("bar-bom")).isEqualTo(additionalBom); }
for (String b : bom.getAdditionalBoms()) { if (!boms.containsKey(b)) { throw new InvalidInitializrMetadataException(
@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"); }
@ParameterizedTest @MethodSource("parameters") public void bomWithOrdering(String build, String fileName) { Dependency foo = Dependency.withId("foo", "org.acme", "foo"); foo.setBom("foo-bom"); BillOfMaterials barBom = BillOfMaterials.create("org.acme", "bar-bom", "1.0"); barBom.setOrder(50); BillOfMaterials bizBom = BillOfMaterials.create("org.acme", "biz-bom"); bizBom.setOrder(40); bizBom.getAdditionalBoms().add("bar-bom"); bizBom.getMappings().add(BillOfMaterials.Mapping.create("1.0.0.RELEASE", "1.0")); BillOfMaterials fooBom = BillOfMaterials.create("org.acme", "foo-bom", "1.0"); fooBom.setOrder(20); fooBom.getAdditionalBoms().add("biz-bom"); InitializrMetadata metadata = InitializrMetadataTestBuilder.withDefaults() .addDependencyGroup("foo", foo).addBom("foo-bom", fooBom) .addBom("bar-bom", barBom).addBom("biz-bom", bizBom).build(); applyMetadata(metadata); ProjectRequest request = createProjectRequestForType(build, "foo"); ProjectAssert project = generateProject(request); project.sourceCodeAssert(fileName).equalsTo(new ClassPathResource( "project/" + build + "/bom-ordering-" + getAssertFileName(fileName))); }