This is an automated email from the ASF dual-hosted git repository. pauls pushed a commit to branch issues/SLING-9406 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-api.git
commit 15abb52c153bf33ba9942d36782796e2b65676ef Author: Karl Pauls <[email protected]> AuthorDate: Thu Apr 30 17:08:20 2020 +0200 SLING-9406: Add bundled script support to the servlets resolver --- pom.xml | 20 ++++ .../scripting/api/bundled/BundledRenderUnit.java | 105 +++++++++++++++++++++ .../sling/scripting/api/bundled/package-info.java | 20 ++++ 3 files changed, 145 insertions(+) diff --git a/pom.xml b/pom.xml index 1d125c8..26f8774 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,9 @@ <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-api.git</developerConnection> <url>https://gitbox.apache.org/repos/asf?p=sling-org-apache-sling-scripting-api.git</url> </scm> + <properties> + <sling.java.version>8</sling.java.version> + </properties> <build> <plugins> @@ -58,6 +61,23 @@ <version>2.16.0</version> <scope>provided</scope> </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.servlets.resolver</artifactId> + <version>2.6.5-SNAPSHOT</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>osgi.core</artifactId> + <version>6.0.0</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.jetbrains</groupId> + <artifactId>annotations</artifactId> + <version>16.0.3</version> + </dependency> </dependencies> </project> diff --git a/src/main/java/org/apache/sling/scripting/api/bundled/BundledRenderUnit.java b/src/main/java/org/apache/sling/scripting/api/bundled/BundledRenderUnit.java new file mode 100644 index 0000000..c7d6d11 --- /dev/null +++ b/src/main/java/org/apache/sling/scripting/api/bundled/BundledRenderUnit.java @@ -0,0 +1,105 @@ +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~ Licensed to the Apache Software Foundation (ASF) under one + ~ or more contributor license agreements. See the NOTICE file + ~ distributed with this work for additional information + ~ regarding copyright ownership. The ASF licenses this file + ~ to you under the Apache License, Version 2.0 (the + ~ "License"); you may not use this file except in compliance + ~ with the License. You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, + ~ software distributed under the License is distributed on an + ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ~ KIND, either express or implied. See the License for the + ~ specific language governing permissions and limitations + ~ under the License. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +package org.apache.sling.scripting.api.bundled; + +import java.util.Set; + +import org.apache.sling.servlets.resolver.bundle.tracker.TypeProvider; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.osgi.annotation.versioning.ProviderType; +import org.osgi.framework.Bundle; + +/** + * <p> + * A {@code BundledRenderUnit} represents a pre-packaged script or precompiled script that will be executed in order to render a + * {@link org.apache.sling.api.SlingHttpServletRequest}. + * </p> + * <p> + * If the current {@link org.apache.sling.api.SlingHttpServletRequest} is served by a {@code BundledRenderUnit}, the + * {@code org.apache.sling.scripting.bundle.tracker} will set the {@code BundledRenderUnit} in the {@link javax.script.Bindings} map associated to the request, + * under the {@link #VARIABLE} key. + * </p> + */ +@ProviderType +public interface BundledRenderUnit { + + /** + * The variable available in the {@link javax.script.Bindings} associated to a {@link org.apache.sling.api.SlingHttpServletRequest} + * if that request is served by a {@code BundledRenderUnit}. + */ + String VARIABLE = BundledRenderUnit.class.getName(); + + /** + * In case this {@code BundledRenderUnit} wraps a precompiled script, this method will return an instance of that object. + * + * @return a precompiled unit, if {@code this} unit wraps a precompiled script; {@code null} otherwise + */ + @Nullable + default Object getUnit() { + return null; + } + + /** + * Returns the name of {@code this BundledRenderUnit}. This can be the name of the wrapped script or precompiled script. + * + * @return the name {@code this BundledRenderUnit} + */ + @NotNull String getName(); + + /** + * Returns the {@link Bundle} in which the script or precompiled script is packaged. This method can be useful for getting an + * instance of the bundle's classloader, when needed to load dependencies at run time. To do so the following code example can help: + * + * <pre> + * Bundle bundle = bundledRenderUnit.getBundle(); + * Classloader bundleClassloader = bundle.adapt(BundleWiring.class).getClassLoader(); + * </pre> + */ + @NotNull Bundle getBundle(); + + /** + * 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 + * TypeProvider} + */ + @NotNull Set<TypeProvider> getTypeProviders(); + + /** + * Retrieves an OSGi runtime dependency of the wrapped script identified by the passed {@code className} parameter. + * + * @param className the fully qualified class name + * @param <T> the expected service type + * @return an instance of the {@link T} or {@code null} + */ + @Nullable <T> T getService(@NotNull String className); + + /** + * Retrieves multiple instances of an OSGi runtime dependency of the wrapped script identified by the passed {@code className} + * parameter, filtered according to the passed {@code filter}. + * + * @param className the fully qualified class name + * @param filter a filter expression or {@code null} if all the instances should be returned; for more details about the {@code + * filter}'s syntax check {@link org.osgi.framework.BundleContext#getServiceReferences(String, String)} + * @param <T> the expected service type + * @return an instance of the {@link T} or {@code null} + */ + @Nullable <T> T[] getServices(@NotNull String className, @Nullable String filter); +} diff --git a/src/main/java/org/apache/sling/scripting/api/bundled/package-info.java b/src/main/java/org/apache/sling/scripting/api/bundled/package-info.java new file mode 100644 index 0000000..1259aa7 --- /dev/null +++ b/src/main/java/org/apache/sling/scripting/api/bundled/package-info.java @@ -0,0 +1,20 @@ +/******************************************************************************* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ +@Version("0.1.0") +package org.apache.sling.scripting.api.bundled; + +import org.osgi.annotation.versioning.Version; \ No newline at end of file
