diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2022-11-26 22:20:42 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2022-11-28 14:58:12 +0100 |
commit | b77764ece2967120e2c3db22261372cdc0a08842 (patch) | |
tree | 8b67c30622c705e372289faeb93a673bfdfdc083 /config-model/src | |
parent | b36cb57248dfc02bae9dfe7b2cca0ddd551881c6 (diff) |
Use a simple tokenizer and replace the larger than container-search biz.aQute.bndlib
Diffstat (limited to 'config-model/src')
4 files changed, 82 insertions, 23 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/AbstractBundleValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/AbstractBundleValidator.java index 9c0e7be452a..c6b8ca981e7 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/AbstractBundleValidator.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/AbstractBundleValidator.java @@ -1,9 +1,6 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.application.validation; -import aQute.bnd.header.Parameters; -import aQute.bnd.osgi.Domain; -import aQute.bnd.version.VersionRange; import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.config.application.api.ComponentInfo; import com.yahoo.config.application.api.DeployLogger; @@ -22,8 +19,8 @@ import javax.xml.xpath.XPathFactory; import java.io.IOException; import java.io.StringReader; import java.nio.file.Paths; +import java.util.List; import java.util.Optional; -import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.jar.JarFile; import java.util.jar.Manifest; @@ -79,14 +76,17 @@ public abstract class AbstractBundleValidator extends Validator { } } - protected final void forEachImportPackage(Manifest mf, BiConsumer<String, VersionRange> consumer) { - Parameters importPackage = Domain.domain(mf).getImportPackage(); - importPackage.forEach((packageName, attrs) -> { - VersionRange versionRange = attrs.getVersion() != null - ? VersionRange.parseOSGiVersionRange(attrs.getVersion()) - : null; - consumer.accept(packageName, versionRange); - }); + protected final void forEachImportPackage(Manifest mf, Consumer<String> consumer) { + String importPackage = mf.getMainAttributes().getValue("Import-Package"); + List<String> tokens = new TokenizeAndDeQuote(";,=", "\"'").tokenize(importPackage); + if (tokens.size() % 3 != 0) { + throw new IllegalArgumentException("Number of tokens " + tokens.size() + " must be divisible by 3.\n" + + "Import-Package = '" + importPackage + "'\n" + + "Token = " + tokens); + } + for (int packageNum = 0; packageNum < tokens.size()/3; packageNum++) { + consumer.accept(tokens.get(packageNum*3)); + } } protected final void log(DeployState state, Level level, String fmt, Object... args) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/BundleValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/BundleValidator.java index 1e3b27bc2fa..299e91f8ea2 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/BundleValidator.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/BundleValidator.java @@ -1,7 +1,6 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.application.validation; -import aQute.bnd.version.VersionRange; import com.yahoo.config.model.deploy.DeployState; import org.w3c.dom.Document; @@ -63,11 +62,10 @@ public class BundleValidator extends AbstractBundleValidator { private void validateImportedPackages(DeployState state, JarFile jar, Manifest manifest) { Map<DeprecatedProvidedBundle, List<String>> deprecatedPackagesInUse = new HashMap<>(); - forEachImportPackage(manifest, (packageName, versionRange) -> { + forEachImportPackage(manifest, (packageName) -> { for (DeprecatedProvidedBundle deprecatedBundle : DeprecatedProvidedBundle.values()) { for (Predicate<String> matcher : deprecatedBundle.javaPackageMatchers) { - if (matcher.test(packageName) - && (versionRange == null || deprecatedBundle.versionDiscriminator.test(versionRange))) { + if (matcher.test(packageName)) { deprecatedPackagesInUse.computeIfAbsent(deprecatedBundle, __ -> new ArrayList<>()) .add(packageName); } @@ -91,22 +89,15 @@ public class BundleValidator extends AbstractBundleValidator { final String name; final Collection<Predicate<String>> javaPackageMatchers; - final Predicate<VersionRange> versionDiscriminator; final String description; - DeprecatedProvidedBundle(String name, String description, Collection<String> javaPackagePatterns) { - this(name, description, __ -> true, javaPackagePatterns); - } - DeprecatedProvidedBundle(String name, String description, - Predicate<VersionRange> versionDiscriminator, Collection<String> javaPackagePatterns) { this.name = name; this.javaPackageMatchers = javaPackagePatterns.stream() .map(s -> Pattern.compile(s).asMatchPredicate()) .collect(Collectors.toList()); - this.versionDiscriminator = versionDiscriminator; this.description = description; } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/TokenizeAndDeQuote.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/TokenizeAndDeQuote.java new file mode 100644 index 00000000000..40d5e7a757c --- /dev/null +++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/TokenizeAndDeQuote.java @@ -0,0 +1,53 @@ +package com.yahoo.vespa.model.application.validation; + +import java.util.ArrayList; +import java.util.List; + +/** + * Will tokenize based on the delimiters while dequoting any qouted text. + * @author baldersheim + */ +public class TokenizeAndDeQuote { + private static final char ESCAPE = '\\'; + private final String delims; + private final String quotes; + + public TokenizeAndDeQuote(String delims,String quotes) { + this.delims = delims; + this.quotes = quotes; + } + + public List<String> tokenize(String string) { + StringBuilder current = new StringBuilder(); + List<String> tokens = new ArrayList<>(); + char quote = 0; + + for (int i = 0; i < string.length(); i++) { + char c = string.charAt(i); + + if ((c == ESCAPE) && (i + 1 < string.length())) { + // Escaped, append next char + current.append(string.charAt(++i)); + } else if ((quote == 0) && (delims.indexOf(c) >=0 )) { + // Delimiter found outside quoted section, add token and start next + tokens.add(current.toString()); + current.setLength(0); + } else if ((quote == 0) && (quotes.indexOf(c) >= 0)) { + // Start of quote + quote = c; + } else if (quote == c) { + // End of quote + quote = 0; + } else { + current.append(c); + } + } + + if ( ! current.isEmpty()) { + // And then the last token if any + tokens.add(current.toString()); + } + + return tokens; + } +} diff --git a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/BundleValidatorTest.java b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/BundleValidatorTest.java index e26a8e8bac6..5cd7880e22d 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/BundleValidatorTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/BundleValidatorTest.java @@ -11,6 +11,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarOutputStream; @@ -98,4 +99,18 @@ public class BundleValidatorTest { return new JarFile(jarFile.toFile()); } + private void verifyParsing(String text, List<String> expected) { + TokenizeAndDeQuote tokenizer = new TokenizeAndDeQuote(";,=", "\"'"); + var words = tokenizer.tokenize(text); + assertEquals(expected, words); + } + + @Test + void testImportPackagesParsing() { + verifyParsing("org.json;version=\"[0.0.0,1)\",org.eclipse.jetty.client.api;version=\"[9.4.46,10)\"", + List.of("org.json", "version", "[0.0.0,1)", "org.eclipse.jetty.client.api", "version", "[9.4.46,10)")); + verifyParsing("org.json;version='[0.0.0,1)',org.eclipse.jetty.client.api;version='[9.4.46,10)'", + List.of("org.json", "version", "[0.0.0,1)", "org.eclipse.jetty.client.api", "version", "[9.4.46,10)")); + } + } |