SLING-9406: Add bundled script support to the servlets resolver
* provide the BundleContext of the active bundle to the BundledRenderUnitFinder
diff --git a/src/main/java/org/apache/sling/servlets/resolver/bundle/tracker/BundledRenderUnit.java b/src/main/java/org/apache/sling/servlets/resolver/bundle/tracker/BundledRenderUnit.java
index 14aba65..238ebcd 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/bundle/tracker/BundledRenderUnit.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/bundle/tracker/BundledRenderUnit.java
@@ -28,6 +28,7 @@
import org.jetbrains.annotations.Nullable;
import org.osgi.annotation.versioning.ConsumerType;
import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
/**
* <p>
@@ -78,6 +79,12 @@
@NotNull Bundle getBundle();
/**
+ * Returns the {@link BundleContext} to use for this script or precompiled script. This method can be useful for getting an
+ * instance of the publishing bundle's context, when needed to load dependencies at run time.
+ */
+ @NotNull BundleContext getBundleContext();
+
+ /**
* Returns the {@code Set} of {@link TypeProvider}s which are related to this unit.
*
* @return the set of providers; if the unit doesn't have any inheritance chains, then the set will contain only one {@link
diff --git a/src/main/java/org/apache/sling/servlets/resolver/bundle/tracker/BundledRenderUnitFinder.java b/src/main/java/org/apache/sling/servlets/resolver/bundle/tracker/BundledRenderUnitFinder.java
index 22bd437..66a2fb6 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/bundle/tracker/BundledRenderUnitFinder.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/bundle/tracker/BundledRenderUnitFinder.java
@@ -25,6 +25,7 @@
import org.osgi.annotation.versioning.ConsumerType;
import org.osgi.annotation.versioning.ProviderType;
import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
/**
* The {@code BundledScriptFinder} finds the {@link BundledRenderUnit} corresponding to a certain chain of {@link TypeProvider}s or
@@ -37,6 +38,7 @@
* Retrieves the best matching {@link BundledRenderUnit} for the provided {@code inheritanceChain}, by scanning all {@link TypeProvider}
* bundles for the class or script capable of providing a rendering for resource type chain.
*
+ * @param context the bundle context to use.
* @param inheritanceChain the resource type chain; the set is ordered from the most specific resource type to the most generic one
* @param allRelatedProviders this is a super set, containing both the {@code inheritanceChain} but also all the required providers; a
* required provider is a provider that's needed by a {@link ResourceType} in order to delegate rendering to
@@ -44,11 +46,12 @@
* @return a {@link BundledRenderUnit} if one was found, {@code null} otherwise
*/
@Nullable
- BundledRenderUnit findUnit(@NotNull Set<TypeProvider> inheritanceChain, @NotNull Set<TypeProvider> allRelatedProviders);
+ BundledRenderUnit findUnit(@NotNull BundleContext context, @NotNull Set<TypeProvider> inheritanceChain, @NotNull Set<TypeProvider> allRelatedProviders);
/**
* Retrieves a path-based {@link BundledRenderUnit} from the passed {@code provider}.
*
+ * @param context the bundle context to use.
* @param provider the provider from which to retrieve the unit
* @param allRelatedProviders this is a super set, containing both the providers connected through an inheritance relationship but also
* all the required providers; a required provider is a provider that's needed by a {@link ResourceType} in
@@ -57,5 +60,5 @@
* @see BundledRenderUnitCapability#getPath()
*/
@Nullable
- BundledRenderUnit findUnit(@NotNull TypeProvider provider, @NotNull Set<TypeProvider> allRelatedProviders);
+ BundledRenderUnit findUnit(@NotNull BundleContext context, @NotNull TypeProvider provider, @NotNull Set<TypeProvider> allRelatedProviders);
}
diff --git a/src/main/java/org/apache/sling/servlets/resolver/bundle/tracker/internal/BundledScriptTracker.java b/src/main/java/org/apache/sling/servlets/resolver/bundle/tracker/internal/BundledScriptTracker.java
index 1954eef..a68f857 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/bundle/tracker/internal/BundledScriptTracker.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/bundle/tracker/internal/BundledScriptTracker.java
@@ -176,12 +176,12 @@
}
Set<TypeProvider> aggregate =
Stream.concat(inheritanceChain.stream(), requiresChain.stream()).collect(Collectors.toCollection(LinkedHashSet::new));
- executable = bundledRenderUnitFinder.findUnit(inheritanceChain, aggregate);
+ executable = bundledRenderUnitFinder.findUnit(bundle.getBundleContext(), inheritanceChain, aggregate);
} else if (StringUtils.isNotEmpty(bundledRenderUnitCapability.getPath()) && StringUtils.isNotEmpty(
bundledRenderUnitCapability.getScriptEngineName())) {
Set<TypeProvider> aggregate =
Stream.concat(inheritanceChain.stream(), requiresChain.stream()).collect(Collectors.toCollection(LinkedHashSet::new));
- executable = bundledRenderUnitFinder.findUnit(baseTypeProvider, aggregate);
+ executable = bundledRenderUnitFinder.findUnit(bundle.getBundleContext(), baseTypeProvider, aggregate);
}
List<ServiceRegistration<Servlet>> regs = new ArrayList<>();