summaryrefslogtreecommitdiffstats
path: root/bundle-plugin/src/main/java/com/yahoo/container/plugin/bundle
diff options
context:
space:
mode:
authorOlli Virtanen <olli.virtanen@oath.com>2018-06-13 13:38:26 +0200
committerOlli Virtanen <olli.virtanen@oath.com>2018-06-13 13:38:26 +0200
commitd5836f186c269986cb9d86374b54b540bf600930 (patch)
treee95e2ec309835ef1d285630e87bae5d177e9934b /bundle-plugin/src/main/java/com/yahoo/container/plugin/bundle
parenteb80fb0d3a6004431ff13e36e9f480ccb32ec31f (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.java94
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/bundle/TransformExportPackages.java62
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 + "\"";
+ }
+}