From 43383af739e522ef69cc7fd1b0b0115e454e8e4f Mon Sep 17 00:00:00 2001 From: gjoranv Date: Fri, 18 Oct 2019 19:41:18 +0200 Subject: Add option to use artifact version as ExportPackage version --- .../container/plugin/classanalysis/Analyze.java | 15 ++++--- .../plugin/classanalysis/AnalyzeClassVisitor.java | 17 +++++-- .../plugin/mojo/GenerateOsgiManifestMojo.java | 52 ++++++++++++++++------ .../java/com/yahoo/container/plugin/util/IO.java | 7 --- 4 files changed, 62 insertions(+), 29 deletions(-) (limited to 'bundle-plugin') 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 13a306a0c1c..d586f324f77 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 @@ -1,17 +1,18 @@ // Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.container.plugin.classanalysis; +import org.apache.maven.artifact.versioning.ArtifactVersion; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.ClassReader; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Optional; -import static com.yahoo.container.plugin.util.IO.withFileInputStream; /** * Main entry point for class analysis @@ -21,16 +22,20 @@ import static com.yahoo.container.plugin.util.IO.withFileInputStream; */ public class Analyze { public static ClassFileMetaData analyzeClass(File classFile) { + return analyzeClass(classFile, null); + } + + public static ClassFileMetaData analyzeClass(File classFile, ArtifactVersion artifactVersion) { try { - return withFileInputStream(classFile, Analyze::analyzeClass); - } catch (RuntimeException e) { + return analyzeClass(new FileInputStream(classFile), artifactVersion); + } catch (Exception e) { throw new RuntimeException("An error occurred when analyzing " + classFile.getPath(), e); } } - public static ClassFileMetaData analyzeClass(InputStream inputStream) { + public static ClassFileMetaData analyzeClass(InputStream inputStream, ArtifactVersion artifactVersion) { try { - AnalyzeClassVisitor visitor = new AnalyzeClassVisitor(); + AnalyzeClassVisitor visitor = new AnalyzeClassVisitor(artifactVersion); new ClassReader(inputStream).accept(visitor, ClassReader.SKIP_DEBUG); return visitor.result(); } catch (IOException e) { 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 0225c43e4b8..e37a9caa7cc 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 @@ -3,6 +3,7 @@ package com.yahoo.container.plugin.classanalysis; import com.yahoo.osgi.annotation.ExportPackage; import com.yahoo.osgi.annotation.Version; +import org.apache.maven.artifact.versioning.ArtifactVersion; import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.Attribute; import org.objectweb.asm.ClassVisitor; @@ -27,8 +28,11 @@ class AnalyzeClassVisitor extends ClassVisitor implements ImportCollector { private Set imports = new HashSet<>(); private Optional exportPackageAnnotation = Optional.empty(); - AnalyzeClassVisitor() { + private final Optional defaultExportPackageVersion; + + AnalyzeClassVisitor(ArtifactVersion defaultExportPackageVersion) { super(Opcodes.ASM7); + this.defaultExportPackageVersion = Optional.ofNullable(defaultExportPackageVersion); } @Override @@ -99,9 +103,14 @@ class AnalyzeClassVisitor extends ClassVisitor implements ImportCollector { private AnnotationVisitor visitExportPackage() { return new AnnotationVisitor(Opcodes.ASM7) { - private int major = defaultVersionValue("major"); - private int minor = defaultVersionValue("minor"); - private int micro = defaultVersionValue("micro"); + private int major = defaultExportPackageVersion.map(ArtifactVersion::getMajorVersion) + .orElse(defaultVersionValue("major")); + private int minor = defaultExportPackageVersion.map(ArtifactVersion::getMinorVersion) + .orElse(defaultVersionValue("minor")); + private int micro = defaultExportPackageVersion.map(ArtifactVersion::getIncrementalVersion) + .orElse(defaultVersionValue("micro")); + + // Default qualifier is the empty string. private String qualifier = defaultVersionValue("qualifier"); @Override 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 c23e55a9eec..11a82ab7443 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 @@ -14,6 +14,8 @@ import com.yahoo.container.plugin.osgi.ImportPackages.Import; import com.yahoo.container.plugin.util.Strings; import org.apache.commons.lang3.tuple.Pair; import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.versioning.ArtifactVersion; +import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.Mojo; @@ -44,8 +46,7 @@ import static com.yahoo.container.plugin.osgi.ExportPackages.exportsByPackageNam import static com.yahoo.container.plugin.osgi.ImportPackages.calculateImports; import static com.yahoo.container.plugin.util.Files.allDescendantFiles; import static com.yahoo.container.plugin.util.IO.withFileOutputStream; -import static com.yahoo.container.plugin.util.JarFiles.withInputStream; -import static com.yahoo.container.plugin.util.JarFiles.withJarFile; + /** * @author Tony Vaagenes @@ -57,6 +58,15 @@ public class GenerateOsgiManifestMojo extends AbstractMojo { @Parameter(defaultValue = "${project}") private MavenProject project = null; + /** + * If set to true, the artifact's version is used as default package version for ExportPackages. + * Packages from included (compile scoped) artifacts will use the version for their own artifact. + * If the package is exported with an explicit version in package-info.java, that version will be + * used regardless of this parameter. + */ + @Parameter(alias = "UseArtifactVersionForExportPackages", defaultValue = "false") + private boolean useArtifactVersionForExportPackages; + @Parameter private String discApplicationClass = null; @@ -215,8 +225,11 @@ public class GenerateOsgiManifestMojo extends AbstractMojo { Map> manualImports, Collection imports, PackageTally pluginPackageTally) { Map ret = new HashMap<>(); String importPackage = Stream.concat(manualImports.entrySet().stream().map(e -> asOsgiImport(e.getKey(), e.getValue())), - imports.stream().map(Import::asOsgiImport)).sorted().collect(Collectors.joining(",")); - String exportPackage = osgiExportPackages(pluginPackageTally.exportedPackages()).stream().sorted().collect(Collectors.joining(",")); + imports.stream().map(Import::asOsgiImport)).sorted() + .collect(Collectors.joining(",")); + + String exportPackage = osgiExportPackages(pluginPackageTally.exportedPackages()).stream().sorted() + .collect(Collectors.joining(",")); for (Pair element : Arrays.asList(// Pair.of("Created-By", "vespa container maven plugin"), // @@ -301,34 +314,47 @@ public class GenerateOsgiManifestMojo extends AbstractMojo { artifact.getId(), artifact.getType()))); } + private ArtifactVersion artifactVersionOrNull(String version) { + return useArtifactVersionForExportPackages ? new DefaultArtifactVersion(version) : null; + } + private PackageTally getProjectClassesTally() { File outputDirectory = new File(project.getBuild().getOutputDirectory()); - List analyzedClasses = allDescendantFiles(outputDirectory).filter(file -> file.getName().endsWith(".class")) - .map(Analyze::analyzeClass).collect(Collectors.toList()); + List analyzedClasses = allDescendantFiles(outputDirectory) + .filter(file -> file.getName().endsWith(".class")) + .map(classFile -> Analyze.analyzeClass(classFile, artifactVersionOrNull(bundleVersion))) + .collect(Collectors.toList()); return PackageTally.fromAnalyzedClassFiles(analyzedClasses); } - private static PackageTally definedPackages(Collection jarArtifacts) { - return PackageTally.combine(jarArtifacts.stream().map(ja -> withJarFile(ja.getFile(), GenerateOsgiManifestMojo::definedPackages)) - .collect(Collectors.toList())); + private PackageTally definedPackages(Collection jarArtifacts) { + List tallies = new ArrayList<>(); + for (var artifact : jarArtifacts) { + try { + tallies.add(definedPackages(new JarFile(artifact.getFile()), artifactVersionOrNull(artifact.getVersion()))); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + return PackageTally.combine(tallies); } - private static PackageTally definedPackages(JarFile jarFile) throws MojoExecutionException { + private static PackageTally definedPackages(JarFile jarFile, ArtifactVersion version) throws MojoExecutionException { List analyzedClasses = new ArrayList<>(); for (Enumeration entries = jarFile.entries(); entries.hasMoreElements();) { JarEntry entry = entries.nextElement(); if (! entry.isDirectory() && entry.getName().endsWith(".class")) { - analyzedClasses.add(analyzeClass(jarFile, entry)); + analyzedClasses.add(analyzeClass(jarFile, entry, version)); } } return PackageTally.fromAnalyzedClassFiles(analyzedClasses); } - private static ClassFileMetaData analyzeClass(JarFile jarFile, JarEntry entry) throws MojoExecutionException { + private static ClassFileMetaData analyzeClass(JarFile jarFile, JarEntry entry, ArtifactVersion version) throws MojoExecutionException { try { - return withInputStream(jarFile, entry, Analyze::analyzeClass); + return Analyze.analyzeClass(jarFile.getInputStream(entry), version); } catch (Exception e) { throw new MojoExecutionException( String.format("While analyzing the class '%s' in jar file '%s'", entry.getName(), jarFile.getName()), e); diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/util/IO.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/util/IO.java index a1e313b920b..654fb700a43 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/util/IO.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/util/IO.java @@ -13,13 +13,6 @@ import java.io.OutputStream; * @author ollivir */ public class IO { - public static T withFileInputStream(File file, ThrowingFunction f) { - try (FileInputStream fis = new FileInputStream(file)) { - return f.apply(fis); - } catch (Exception e) { - throw new RuntimeException(e); - } - } /** * Creates a new file and all its parent directories, and provides a file output stream to the file. -- cgit v1.2.3