summaryrefslogtreecommitdiffstats
path: root/container-core/src/main/java/com/yahoo/container/core/config/ApplicationBundleLoader.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-core/src/main/java/com/yahoo/container/core/config/ApplicationBundleLoader.java')
-rw-r--r--container-core/src/main/java/com/yahoo/container/core/config/ApplicationBundleLoader.java142
1 files changed, 0 insertions, 142 deletions
diff --git a/container-core/src/main/java/com/yahoo/container/core/config/ApplicationBundleLoader.java b/container-core/src/main/java/com/yahoo/container/core/config/ApplicationBundleLoader.java
deleted file mode 100644
index 5236daf0302..00000000000
--- a/container-core/src/main/java/com/yahoo/container/core/config/ApplicationBundleLoader.java
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright 2020 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.container.core.config;
-
-import com.yahoo.config.FileReference;
-import com.yahoo.container.Container;
-import com.yahoo.filedistribution.fileacquirer.FileAcquirer;
-import com.yahoo.osgi.Osgi;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.wiring.BundleRevision;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Logger;
-import java.util.stream.Collectors;
-
-/**
- * Manages the set of installed and active/inactive bundles.
- *
- * @author gjoranv
- * @author Tony Vaagenes
- */
-public class ApplicationBundleLoader {
-
- /* Map of file refs of active bundles (not scheduled for uninstall) to the installed bundle.
- *
- * Used to:
- * 1. Avoid installing already installed bundles. Just an optimization, installing the same bundle location is a NOP
- * 2. Start bundles (all are started every time)
- * 3. Calculate the set of bundles to uninstall
- */
- private final Map<FileReference, Bundle> reference2Bundle = new LinkedHashMap<>();
-
- private final Logger log = Logger.getLogger(ApplicationBundleLoader.class.getName());
- private final Osgi osgi;
-
- // A custom bundle installer for non-disk bundles, to be used for testing
- private BundleInstaller customBundleInstaller = null;
-
- public ApplicationBundleLoader(Osgi osgi) {
- this.osgi = osgi;
- }
-
- /**
- * Installs the given set of bundles and returns the set of bundles that is no longer used
- * by the application, and should therefore be scheduled for uninstall.
- */
- public synchronized Set<Bundle> useBundles(List<FileReference> newFileReferences) {
-
- Set<FileReference> obsoleteReferences = getObsoleteFileReferences(newFileReferences);
- Set<Bundle> bundlesToUninstall = getObsoleteBundles(obsoleteReferences);
- log.info("Bundles to schedule for uninstall: " + bundlesToUninstall);
-
- osgi.allowDuplicateBundles(bundlesToUninstall);
- removeInactiveFileReferences(obsoleteReferences);
-
- installBundles(newFileReferences);
- BundleStarter.startBundles(reference2Bundle.values());
- log.info(installedBundlesMessage());
-
- return bundlesToUninstall;
- }
-
- private Set<FileReference> getObsoleteFileReferences(List<FileReference> newReferences) {
- Set<FileReference> obsoleteReferences = new HashSet<>(reference2Bundle.keySet());
- obsoleteReferences.removeAll(newReferences);
- return obsoleteReferences;
- }
-
-
- /**
- * Returns the bundles that will not be retained by the new application generation.
- */
- private Set<Bundle> getObsoleteBundles(Set<FileReference> obsoleteReferences) {
- return obsoleteReferences.stream().map(reference2Bundle::get).collect(Collectors.toSet());
- }
-
- private void removeInactiveFileReferences(Set<FileReference> fileReferencesToRemove) {
- fileReferencesToRemove.forEach(reference2Bundle::remove);
- }
-
- private void installBundles(List<FileReference> references) {
- Set<FileReference> bundlesToInstall = new HashSet<>(references);
-
- // This is just an optimization, as installing a bundle with the same location id returns the already installed bundle.
- bundlesToInstall.removeAll(reference2Bundle.keySet());
-
- if (!bundlesToInstall.isEmpty()) {
- FileAcquirer fileAcquirer = Container.get().getFileAcquirer();
- boolean hasFileDistribution = (fileAcquirer != null);
- if (hasFileDistribution) {
- installWithFileDistribution(bundlesToInstall, new FileAcquirerBundleInstaller(fileAcquirer));
- } else if (customBundleInstaller != null) {
- installWithFileDistribution(bundlesToInstall, customBundleInstaller);
- } else {
- log.warning("Can't retrieve bundles since file distribution is disabled.");
- }
- }
- }
-
- private void installWithFileDistribution(Set<FileReference> bundlesToInstall, BundleInstaller bundleInstaller) {
- for (FileReference reference : bundlesToInstall) {
- try {
- log.info("Installing bundle with reference '" + reference.value() + "'");
- List<Bundle> bundles = bundleInstaller.installBundles(reference, osgi);
-
- // Throw if more than one bundle was installed, which means that the X-JDisc-Preinstall-Bundle header was used.
- // However, if the OSGi framework is only a test framework, this rule does not apply.
- if (bundles.size() > 1 && osgi.hasFelixFramework()) {
- throw new RuntimeException("Bundle '" + bundles.get(0).getSymbolicName() + "' tried to pre-install other bundles.");
- }
- reference2Bundle.put(reference, bundles.get(0));
- }
- catch(Exception e) {
- throw new RuntimeException("Could not install bundle with reference '" + reference + "'", e);
- }
- }
- }
-
- private String installedBundlesMessage() {
- StringBuilder sb = new StringBuilder("Installed bundles: {" );
- for (Bundle b : osgi.getBundles())
- sb.append("[" + b.getBundleId() + "]" + b.getSymbolicName() + ":" + b.getVersion() + ", ");
- sb.setLength(sb.length() - 2);
- sb.append("}");
- return sb.toString();
- }
-
- // Only for testing
- void useCustomBundleInstaller(BundleInstaller bundleInstaller) {
- customBundleInstaller = bundleInstaller;
- }
-
- // Only for testing
- List<FileReference> getActiveFileReferences() {
- return new ArrayList<>(reference2Bundle.keySet());
- }
-
-}