diff options
Diffstat (limited to 'bundle-plugin/src/main/java/com')
7 files changed, 56 insertions, 49 deletions
diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/bundle/AnalyzeBundle.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/bundle/AnalyzeBundle.java index af6c82023ab..8b32c6c0d0d 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/bundle/AnalyzeBundle.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/bundle/AnalyzeBundle.java @@ -12,9 +12,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Optional; -import java.util.Set; import java.util.jar.Manifest; -import java.util.stream.Collectors; /** * Static utilities for analyzing jar files. @@ -45,18 +43,18 @@ public class AnalyzeBundle { } } - public static List<String> publicApiPackagesAggregated(Collection<File> jarFiles) { + public static List<String> nonPublicApiPackagesAggregated(Collection<File> jarFiles) { return jarFiles.stream() - .map(AnalyzeBundle::publicApiPackages) + .map(AnalyzeBundle::nonPublicApiPackages) .flatMap(List::stream) .distinct() .toList(); } - static List<String> publicApiPackages(File jarFile) { + private static List<String> nonPublicApiPackages(File jarFile) { var manifest = getOsgiManifest(jarFile); if (manifest == null) return Collections.emptyList(); - return getMainAttributeValue(manifest, "X-JDisc-PublicApi-Package") + return getMainAttributeValue(manifest, "X-JDisc-Non-PublicApi-Export-Package") .map(s -> Arrays.asList(s.split(","))) .orElseGet(ArrayList::new); } diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java index a93f8cb87d5..4fd8e936f3d 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java @@ -21,7 +21,7 @@ import java.util.Optional; */ public class Analyze { - public static ClassFileMetaData analyzeClass(File classFile) { + static ClassFileMetaData analyzeClass(File classFile) { return analyzeClass(classFile, null); } @@ -52,16 +52,12 @@ public class Analyze { } static Optional<String> getClassName(Type aType) { - switch (aType.getSort()) { - case Type.ARRAY: - return getClassName(aType.getElementType()); - case Type.OBJECT: - return Optional.of(aType.getClassName()); - case Type.METHOD: - return getClassName(aType.getReturnType()); - default: - return Optional.empty(); - } + return switch (aType.getSort()) { + case Type.ARRAY -> getClassName(aType.getElementType()); + case Type.OBJECT -> Optional.of(aType.getClassName()); + case Type.METHOD -> getClassName(aType.getReturnType()); + default -> Optional.empty(); + }; } static AnnotationVisitor visitAnnotationDefault(ImportCollector collector) { diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java index e57af606b3a..310527e9254 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java @@ -120,18 +120,10 @@ class AnalyzeClassVisitor extends ClassVisitor implements ImportCollector { public void visit(String name, Object value) { if (name != null) { switch (name) { - case "major": - major = (int) value; - break; - case "minor": - minor = (int) value; - break; - case "micro": - micro = (int) value; - break; - case "qualifier": - qualifier = (String) value; - break; + case "major" -> major = (int) value; + case "minor" -> minor = (int) value; + case "micro" -> micro = (int) value; + case "qualifier" -> qualifier = (String) value; } } } diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/PackageInfo.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/PackageInfo.java index c19320b8e98..7b665d67931 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/PackageInfo.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/PackageInfo.java @@ -3,12 +3,16 @@ package com.yahoo.container.plugin.classanalysis; import java.util.Optional; /** - * The package + * Info about a Java package deduced from class analysis. * * @author gjoranv */ record PackageInfo(String name, Optional<ExportPackageAnnotation> exportPackage, boolean isPublicApi) { + /** + * Returns this if it has an ExportPackage annotation, otherwise returns the other. + * Used to combine objects, where this should take precedence over the other. + */ PackageInfo hasExportPackageOrElse(PackageInfo other) { return exportPackage().isPresent() ? this : other; } diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/PackageTally.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/PackageTally.java index 51fba228b41..699736195cf 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/PackageTally.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/PackageTally.java @@ -8,7 +8,6 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -49,6 +48,14 @@ public class PackageTally { .collect(Collectors.toSet()); } + public Set<String> nonPublicApiExportedPackages() { + return definedPackages.values().stream() + .filter(pkgInfo -> pkgInfo.exportPackage().isPresent()) + .filter(pkgInfo -> ! pkgInfo.isPublicApi()) + .map(PackageInfo::name) + .collect(Collectors.toSet()); + } + /** * Returns the set of packages that is referenced from this tally, but not included in the given set of available packages. * diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Packages.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Packages.java index 48a128c2f0d..a9f95f2b2f2 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Packages.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Packages.java @@ -7,7 +7,6 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; /** * Utility methods related to packages. @@ -37,19 +36,17 @@ public class Packages { } /** - * Returns the imported Vespa packages that don't exist in the given set of allowed packages. + * Returns the imported packages that exist in the given set of disallowed packages. */ - public static List<String> disallowedVespaImports(Map<String, ImportPackages.Import> imports, List<String> allowed) { + public static List<String> disallowedImports(Map<String, ImportPackages.Import> imports, List<String> disallowed) { if (imports == null || imports.isEmpty()) return List.of(); - var publicApi = allowed == null ? Set.of() : new HashSet<>(allowed); + var importedSet = new HashSet<>(imports.keySet()); + var disallowedSet = disallowed == null ? Set.of() : new HashSet<>(disallowed); - Set<String> yahooImports = imports.keySet().stream() - .filter(pkg -> pkg.startsWith("com.yahoo") || pkg.startsWith("ai.vespa.")) - .collect(Collectors.toSet()); - - List<String> disallowedImports = yahooImports.stream().collect(Collectors.groupingBy(publicApi::contains)).get(false); - return disallowedImports == null ? List.of() : disallowedImports; + return importedSet.stream() + .filter(disallowedSet::contains) + .toList(); } public static PackageMetaData analyzePackages(Set<ClassFileMetaData> allClasses) { diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateOsgiManifestMojo.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateOsgiManifestMojo.java index d217273e42b..ff802668427 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateOsgiManifestMojo.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateOsgiManifestMojo.java @@ -26,8 +26,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import static com.yahoo.container.plugin.bundle.AnalyzeBundle.exportedPackagesAggregated; -import static com.yahoo.container.plugin.bundle.AnalyzeBundle.publicApiPackagesAggregated; -import static com.yahoo.container.plugin.classanalysis.Packages.disallowedVespaImports; +import static com.yahoo.container.plugin.bundle.AnalyzeBundle.nonPublicApiPackagesAggregated; +import static com.yahoo.container.plugin.classanalysis.Packages.disallowedImports; import static com.yahoo.container.plugin.osgi.ExportPackages.exportsByPackageName; import static com.yahoo.container.plugin.osgi.ImportPackages.calculateImports; import static com.yahoo.container.plugin.util.Files.allDescendantFiles; @@ -95,7 +95,7 @@ public class GenerateOsgiManifestMojo extends AbstractGenerateOsgiManifestMojo { List<Artifact> providedJarArtifacts = artifactSet.getJarArtifactsProvided(); List<File> providedJarFiles = providedJarArtifacts.stream().map(Artifact::getFile).toList(); List<Export> exportedPackagesFromProvidedJars = exportedPackagesAggregated(providedJarFiles); - List<String> publicApiPackagesFromProvidedJars = publicApiPackagesAggregated(providedJarFiles); + List<String> nonPublicApiPackagesFromProvidedJars = nonPublicApiPackagesAggregated(providedJarFiles); // Packages from Export-Package/PublicApi headers in provided scoped jars Set<String> exportedPackagesFromProvidedDeps = ExportPackages.packageNames(exportedPackagesFromProvidedJars); @@ -125,14 +125,15 @@ public class GenerateOsgiManifestMojo extends AbstractGenerateOsgiManifestMojo { includedPackages.definedPackages(), exportsByPackageName(exportedPackagesFromProvidedJars)); - List<String> nonPublicApiUsed = disallowedVespaImports(calculatedImports, publicApiPackagesFromProvidedJars); + List<String> nonPublicApiUsed = disallowedImports(calculatedImports, nonPublicApiPackagesFromProvidedJars); logNonPublicApiUsage(nonPublicApiUsed); Map<String, String> manifestContent = generateManifestContent(artifactSet.getJarArtifactsToInclude(), calculatedImports, includedPackages); - addAdditionalManifestProperties(manifestContent, includedPackages); + addAdditionalManifestProperties(manifestContent); + addManifestPropertiesForInternalBundles(manifestContent, includedPackages); addManifestPropertiesForUserBundles(manifestContent, nonPublicApiUsed); - createManifestFile(Paths.get(project.getBuild().getOutputDirectory()), manifestContent); + createManifestFile(Paths.get(project.getBuild().getOutputDirectory()), manifestContent); } catch (Exception e) { throw new MojoExecutionException("Failed generating osgi manifest", e); } @@ -151,8 +152,7 @@ public class GenerateOsgiManifestMojo extends AbstractGenerateOsgiManifestMojo { return isVespaInternalGroupId(project.getGroupId()) ? BundleType.INTERNAL : BundleType.USER; } - private void addAdditionalManifestProperties(Map<String, String> manifestContent, PackageTally includedPackages) { - addIfNotEmpty(manifestContent, "X-JDisc-PublicApi-Package", publicApi(includedPackages)); + private void addAdditionalManifestProperties(Map<String, String> manifestContent) { addIfNotEmpty(manifestContent, "Bundle-Activator", bundleActivator); addIfNotEmpty(manifestContent, "X-JDisc-Privileged-Activator", jdiscPrivilegedActivator); addIfNotEmpty(manifestContent, "Main-Class", mainClass); @@ -161,6 +161,15 @@ public class GenerateOsgiManifestMojo extends AbstractGenerateOsgiManifestMojo { addIfNotEmpty(manifestContent, "WebInfUrl", webInfUrl); } + private void addManifestPropertiesForInternalBundles(Map<String, String> manifestContent, PackageTally includedPackages) { + if (effectiveBundleType() == BundleType.USER) return; + + // TODO: this attribute is not necessary, remove? + addIfNotEmpty(manifestContent, "X-JDisc-PublicApi-Package", publicApi(includedPackages)); + + addIfNotEmpty(manifestContent, "X-JDisc-Non-PublicApi-Export-Package", nonPublicApi(includedPackages)); + } + private void addManifestPropertiesForUserBundles(Map<String, String> manifestContent, List<String> nonPublicApiUsed) { if (effectiveBundleType() != BundleType.USER) return; addIfNotEmpty(manifestContent, "X-JDisc-Non-PublicApi-Import-Package", String.join(",", nonPublicApiUsed)); @@ -175,6 +184,10 @@ public class GenerateOsgiManifestMojo extends AbstractGenerateOsgiManifestMojo { return tally.publicApiPackages().stream().sorted().collect(Collectors.joining(",")); } + private static String nonPublicApi(PackageTally tally) { + return tally.nonPublicApiExportedPackages().stream().sorted().collect(Collectors.joining(",")); + } + private void logDebugPackageSets(List<Export> exportedPackagesFromProvidedJars, PackageTally includedPackages) { if (getLog().isDebugEnabled()) { getLog().debug("Referenced packages = " + includedPackages.referencedPackages()); |