diff options
author | Olli Virtanen <olli.virtanen@oath.com> | 2018-06-13 13:38:26 +0200 |
---|---|---|
committer | Olli Virtanen <olli.virtanen@oath.com> | 2018-06-13 13:38:26 +0200 |
commit | d5836f186c269986cb9d86374b54b540bf600930 (patch) | |
tree | e95e2ec309835ef1d285630e87bae5d177e9934b /bundle-plugin/src/main/java/com/yahoo/container/plugin/bundle | |
parent | eb80fb0d3a6004431ff13e36e9f480ccb32ec31f (diff) |
Bundle-plugin Scala code converted to Java
Diffstat (limited to 'bundle-plugin/src/main/java/com/yahoo/container/plugin/bundle')
-rw-r--r-- | bundle-plugin/src/main/java/com/yahoo/container/plugin/bundle/AnalyzeBundle.java | 94 | ||||
-rw-r--r-- | bundle-plugin/src/main/java/com/yahoo/container/plugin/bundle/TransformExportPackages.java | 62 |
2 files changed, 156 insertions, 0 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 new file mode 100644 index 00000000000..798fea2644e --- /dev/null +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/bundle/AnalyzeBundle.java @@ -0,0 +1,94 @@ +// 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.bundle; + +import com.yahoo.container.plugin.osgi.ExportPackageParser; +import com.yahoo.container.plugin.osgi.ExportPackages.Export; +import com.yahoo.container.plugin.util.JarFiles; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.jar.Manifest; +import java.util.stream.Collectors; + +/** + * @author Tony Vaagenes + * @author ollivir + */ +public class AnalyzeBundle { + public static class PublicPackages { + public final List<Export> exports; + public final List<String> globals; + + public PublicPackages(List<Export> exports, List<String> globals) { + this.exports = exports; + this.globals = globals; + } + } + + public static PublicPackages publicPackagesAggregated(Collection<File> jarFiles) { + List<Export> exports = new ArrayList<>(); + List<String> globals = new ArrayList<>(); + + for (File jarFile : jarFiles) { + PublicPackages pp = publicPackages(jarFile); + exports.addAll(pp.exports); + globals.addAll(pp.globals); + } + return new PublicPackages(exports, globals); + } + + public static PublicPackages publicPackages(File jarFile) { + try { + Optional<Manifest> jarManifest = JarFiles.getManifest(jarFile); + if (jarManifest.isPresent()) { + Manifest manifest = jarManifest.get(); + if (isOsgiManifest(manifest)) { + return new PublicPackages(parseExports(manifest), parseGlobals(manifest)); + } + } + return new PublicPackages(Collections.emptyList(), Collections.emptyList()); + } catch (Exception e) { + throw new RuntimeException(String.format("Invalid manifest in bundle '%s'", jarFile.getPath()), e); + } + } + + public static Optional<String> bundleSymbolicName(File jarFile) { + return JarFiles.getManifest(jarFile).flatMap(AnalyzeBundle::getBundleSymbolicName); + } + + private static List<Export> parseExportsFromAttribute(Manifest manifest, String attributeName) { + return getMainAttributeValue(manifest, attributeName).map(ExportPackageParser::parseExports).orElseGet(() -> new ArrayList<>()); + } + + private static List<Export> parseExports(Manifest jarManifest) { + return parseExportsFromAttribute(jarManifest, "Export-Package"); + } + + private static List<String> parseGlobals(Manifest manifest) { + List<Export> globals = parseExportsFromAttribute(manifest, "Global-Package"); + + for (Export export : globals) { + if (export.getParameters().isEmpty() == false) { + throw new RuntimeException("Parameters not valid for Global-Package."); + } + } + + return globals.stream().flatMap(g -> g.getPackageNames().stream()).collect(Collectors.toList()); + } + + private static Optional<String> getMainAttributeValue(Manifest manifest, String attributeName) { + return Optional.ofNullable(manifest.getMainAttributes().getValue(attributeName)); + } + + private static boolean isOsgiManifest(Manifest mf) { + return getBundleSymbolicName(mf).isPresent(); + } + + private static Optional<String> getBundleSymbolicName(Manifest mf) { + return getMainAttributeValue(mf, "Bundle-SymbolicName"); + } +} diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/bundle/TransformExportPackages.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/bundle/TransformExportPackages.java new file mode 100644 index 00000000000..8686fef0a55 --- /dev/null +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/bundle/TransformExportPackages.java @@ -0,0 +1,62 @@ +// 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.bundle; + +import com.yahoo.container.plugin.osgi.ExportPackages.Export; +import com.yahoo.container.plugin.osgi.ExportPackages.Parameter; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author Tony Vaagenes + * @author ollivir + */ +public class TransformExportPackages { + public static List<Export> replaceVersions(List<Export> exports, String newVersion) { + List<Export> ret = new ArrayList<>(); + + for (Export export : exports) { + List<Parameter> newParams = new ArrayList<>(); + for (Parameter param : export.getParameters()) { + if ("version".equals(param.getName())) { + newParams.add(new Parameter("version", newVersion)); + } else { + newParams.add(param); + } + } + ret.add(new Export(export.getPackageNames(), newParams)); + } + return ret; + } + + public static List<Export> removeUses(List<Export> exports) { + List<Export> ret = new ArrayList<>(); + + for (Export export : exports) { + List<Parameter> newParams = new ArrayList<>(); + for (Parameter param : export.getParameters()) { + if ("uses".equals(param.getName()) == false) { + newParams.add(param); + } + } + ret.add(new Export(export.getPackageNames(), newParams)); + } + return ret; + } + + public static String toExportPackageProperty(List<Export> exports) { + return exports.stream().map(exp -> { + String oneExport = String.join(";", exp.getPackageNames()); + if (exp.getParameters().size() > 0) { + String paramString = exp.getParameters().stream().map(param -> param.getName() + "=" + quote(param.getValue())).collect(Collectors.joining(";")); + oneExport += ";" + paramString; + } + return oneExport; + }).collect(Collectors.joining(",")); + } + + public static String quote(String s) { + return "\"" + s + "\""; + } +} |