diff --git a/src/main/java/com/github/packageurl/PackageURLBuilder.java b/src/main/java/com/github/packageurl/PackageURLBuilder.java index 81cd525..3f54b44 100644 --- a/src/main/java/com/github/packageurl/PackageURLBuilder.java +++ b/src/main/java/com/github/packageurl/PackageURLBuilder.java @@ -21,6 +21,8 @@ */ package com.github.packageurl; +import java.util.Map; +import java.util.Set; import java.util.Collections; import java.util.Map; import java.util.TreeMap; @@ -37,7 +39,7 @@ public final class PackageURLBuilder { private TreeMap qualifiers = null; private PackageURLBuilder() { - //empty constructor for utility class + // empty constructor for utility class } /** @@ -126,6 +128,26 @@ public PackageURLBuilder withQualifier(final String key, final String value) { return this; } + /** + * Adds the package qualifiers. + * + * @param qualifiers the package qualifiers + * @return a reference to the builder + * @see PackageURL#getQualifiers() + */ + public PackageURLBuilder withQualifiers(final Map qualifiers) { + if (qualifiers == null) { + this.qualifiers = null; + } else { + if (this.qualifiers == null) { + this.qualifiers = new TreeMap<>(qualifiers); + } else { + this.qualifiers.putAll(qualifiers); + } + } + return this; + } + /** * Removes a package qualifier. This is a no-op if the qualifier is not present. * @param key the package qualifier key to remove @@ -141,6 +163,31 @@ public PackageURLBuilder withoutQualifier(final String key) { return this; } + /** + * Removes a package qualifier. This is a no-op if the qualifier is not present. + * @param keys the package qualifier keys to remove + * @return a reference to the builder + */ + public PackageURLBuilder withoutQualifiers(final Set keys) { + if (this.qualifiers != null) { + keys.forEach(k -> this.qualifiers.remove(k)); + if (this.qualifiers.isEmpty()) { + this.qualifiers = null; + } + } + return this; + } + + + /** + * Removes all qualifiers, if any. + * @return a reference to this builder. + */ + public PackageURLBuilder withoutQualifiers() { + qualifiers = null; + return this; + } + /** * Removes all qualifiers, if any. * @return a reference to this builder. diff --git a/src/test/java/com/github/packageurl/PackageURLBuilderTest.java b/src/test/java/com/github/packageurl/PackageURLBuilderTest.java index 3398dba..826fb1f 100644 --- a/src/test/java/com/github/packageurl/PackageURLBuilderTest.java +++ b/src/test/java/com/github/packageurl/PackageURLBuilderTest.java @@ -26,6 +26,8 @@ import org.junit.Test; import org.junit.rules.ExpectedException; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import static org.junit.Assert.*; @@ -189,6 +191,29 @@ public void testEditBuilder1() throws MalformedPackageURLException { } + @Test + public void testQualifiers() throws MalformedPackageURLException { + Map qualifiers = new HashMap<>(); + qualifiers.put("key2", "value2"); + Map qualifiers2 = new HashMap<>(); + qualifiers.put("key3", "value3"); + PackageURL purl = PackageURLBuilder.aPackageURL() + .withType(PackageURL.StandardTypes.GENERIC) + .withNamespace("") + .withName("name") + .withVersion("version") + .withQualifier("key", "value") + .withQualifier("next", "value") + .withQualifiers(qualifiers) + .withQualifier("key4", "value4") + .withQualifiers(qualifiers2) + .withSubpath("") + .withoutQualifiers(Collections.singleton("key4")) + .build(); + + assertEquals("pkg:generic/name@version?key=value&key2=value2&key3=value3&next=value", purl.toString()); + } + private void assertBuilderMatch(PackageURL expected, PackageURLBuilder actual) throws MalformedPackageURLException { Assert.assertEquals(expected.toString(), actual.build().toString());