This is an automated email from the ASF dual-hosted git repository.
enorman pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-models-api.git
The following commit(s) were added to refs/heads/master by this push:
new 23f0a9a SLING-12874 migrate ModelFactory to Sling API 3.x and Jakarta
Servlet (#16)
23f0a9a is described below
commit 23f0a9ad8e23f970a9879b8e2b66b88682c44bad
Author: Eric Norman <[email protected]>
AuthorDate: Thu Aug 21 14:02:02 2025 -0700
SLING-12874 migrate ModelFactory to Sling API 3.x and Jakarta Servlet (#16)
---
pom.xml | 12 ++-
.../apache/sling/models/factory/ModelFactory.java | 115 +++++++++++++++++++--
.../apache/sling/models/factory/package-info.java | 2 +-
3 files changed, 118 insertions(+), 11 deletions(-)
diff --git a/pom.xml b/pom.xml
index 86bb646..e0f0f6d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@
</parent>
<artifactId>org.apache.sling.models.api</artifactId>
- <version>1.5.5-SNAPSHOT</version>
+ <version>2.0.0-SNAPSHOT</version>
<name>Apache Sling Models API</name>
<description>Apache Sling Models API</description>
@@ -40,7 +40,7 @@
</scm>
<properties>
- <sling.java.version>8</sling.java.version>
+ <sling.java.version>17</sling.java.version>
<project.build.outputTimestamp>2024-07-01T12:25:41Z</project.build.outputTimestamp>
</properties>
@@ -63,7 +63,7 @@
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.api</artifactId>
- <version>2.25.4</version>
+ <version>3.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -71,6 +71,12 @@
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>jakarta.servlet</groupId>
+ <artifactId>jakarta.servlet-api</artifactId>
+ <version>6.0.0</version>
+ <scope>provided</scope>
+ </dependency>
<!-- testing dependencies -->
<dependency>
<groupId>junit</groupId>
diff --git a/src/main/java/org/apache/sling/models/factory/ModelFactory.java
b/src/main/java/org/apache/sling/models/factory/ModelFactory.java
index 05a32f4..1a3918d 100644
--- a/src/main/java/org/apache/sling/models/factory/ModelFactory.java
+++ b/src/main/java/org/apache/sling/models/factory/ModelFactory.java
@@ -20,7 +20,7 @@ package org.apache.sling.models.factory;
import java.util.Map;
-import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.SlingJakartaHttpServletRequest;
import org.apache.sling.api.resource.Resource;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -67,9 +67,34 @@ public interface ModelFactory {
* @throws InvalidModelException in case the given model type could not be
validated through the model validation
* @since 1.5.0 (Models API Bundle 1.4.4)
* @see #getModelFromWrappedRequest(SlingHttpServletRequest, Resource,
Class)
+ * @deprecated use {@link
#createModelFromWrappedRequest(SlingJakartaHttpServletRequest, Resource,
Class)} instead
*/
+ @Deprecated(since = "1.6.0")
public @NotNull <T> T createModelFromWrappedRequest(
- @NotNull SlingHttpServletRequest request, @NotNull Resource
resource, @NotNull Class<T> targetClass);
+ @NotNull org.apache.sling.api.SlingHttpServletRequest request,
+ @NotNull Resource resource,
+ @NotNull Class<T> targetClass);
+
+ /**
+ * Create a wrapped request object with the specified resource and
instantiates the given Sling Model class from that wrapped request. The wrapped
request
+ * object will have a fresh set of script bindings so that any injected
bindings references have the correct context.
+ *
+ * @param request the current request
+ * @param resource the resource to set as the wrapped request's resource
+ * @param targetClass the class to instantiate
+ * @param <T> Model type
+ * @return a new instance for the required model (never {@code null})
+ * @throws MissingElementsException in case no injector was able to inject
some required values with the given types
+ * @throws InvalidAdaptableException in case the given class cannot be
instantiated from the given adaptable (different adaptable on the model
annotation)
+ * @throws ModelClassException in case the model could not be instantiated
because model annotation was missing, reflection failed, no valid constructor
was found, model was not registered as adapter factory yet, or post-construct
could not be called
+ * @throws PostConstructException in case the post-construct method has
thrown an exception itself
+ * @throws ValidationException in case validation could not be performed
for some reason (e.g. no validation information available)
+ * @throws InvalidModelException in case the given model type could not be
validated through the model validation
+ * @since 1.5.0 (Models API Bundle 1.4.4)
+ * @see #getModelFromWrappedRequest(SlingJakartaHttpServletRequest,
Resource, Class)
+ */
+ public @NotNull <T> T createModelFromWrappedRequest(
+ @NotNull SlingJakartaHttpServletRequest request, @NotNull Resource
resource, @NotNull Class<T> targetClass);
/**
*
@@ -88,7 +113,7 @@ public interface ModelFactory {
* @see org.apache.sling.models.annotations.Model
* @deprecated Use {@link #isModelClass(Class)} instead!
*/
- @Deprecated
+ @Deprecated(since = "1.1.0")
public boolean isModelClass(@NotNull Object adaptable, @NotNull Class<?>
type);
/**
@@ -112,13 +137,23 @@ public interface ModelFactory {
*/
public boolean isModelAvailableForResource(@NotNull Resource resource);
+ /**
+ * Determine is a model class is available for the request's resource's
resource type.
+ *
+ * @param request a request
+ * @return {@code true} if a model class is mapped to the resource type
+ * @deprecated use {@link
#isModelAvailableForRequest(SlingJakartaHttpServletRequest)} instead
+ */
+ @Deprecated(since = "1.6.0")
+ public boolean isModelAvailableForRequest(@NotNull
org.apache.sling.api.SlingHttpServletRequest request);
+
/**
* Determine is a model class is available for the request's resource's
resource type.
*
* @param request a request
* @return {@code true} if a model class is mapped to the resource type
*/
- public boolean isModelAvailableForRequest(@NotNull SlingHttpServletRequest
request);
+ public boolean isModelAvailableForRequest(@NotNull
SlingJakartaHttpServletRequest request);
/**
* Obtain an adapted model class based on the resource type of the
provided resource.
@@ -136,6 +171,24 @@ public interface ModelFactory {
throws MissingElementsException, InvalidAdaptableException,
ModelClassException, PostConstructException,
ValidationException, InvalidModelException;
+ /**
+ * Obtain an adapted model class based on the resource type of the
request's resource.
+ *
+ * @param request a request
+ * @return an adapted model object
+ * @throws MissingElementsException in case no injector was able to inject
some required values with the given types
+ * @throws InvalidAdaptableException in case the given class cannot be
instantiated from the given adaptable (different adaptable on the model
annotation)
+ * @throws ModelClassException in case the model could not be instantiated
because model annotation was missing, reflection failed, no valid constructor
was found, model was not registered as adapter factory yet, or post-construct
could not be called
+ * @throws PostConstructException in case the post-construct method has
thrown an exception itself
+ * @throws ValidationException in case validation could not be performed
for some reason (e.g. no validation information available)
+ * @throws InvalidModelException in case the given model type could not be
validated through the model validation
+ * @deprecated use {@link
#getModelFromRequest(SlingJakartaHttpServletRequest)} instead
+ */
+ @Deprecated(since = "1.6.0")
+ public @NotNull Object getModelFromRequest(@NotNull
org.apache.sling.api.SlingHttpServletRequest request)
+ throws MissingElementsException, InvalidAdaptableException,
ModelClassException, PostConstructException,
+ ValidationException, InvalidModelException;
+
/**
* Obtain an adapted model class based on the resource type of the
request's resource.
*
@@ -148,7 +201,7 @@ public interface ModelFactory {
* @throws ValidationException in case validation could not be performed
for some reason (e.g. no validation information available)
* @throws InvalidModelException in case the given model type could not be
validated through the model validation
*/
- public @NotNull Object getModelFromRequest(@NotNull
SlingHttpServletRequest request)
+ public @NotNull Object getModelFromRequest(@NotNull
SlingJakartaHttpServletRequest request)
throws MissingElementsException, InvalidAdaptableException,
ModelClassException, PostConstructException,
ValidationException, InvalidModelException;
@@ -214,15 +267,62 @@ public interface ModelFactory {
* @throws InvalidModelException in case the given model type could not be
validated through the model validation
* @throws ExportException if the export fails
* @throws MissingExporterException if the named exporter can't be found
+ * @deprecated use {@link
#exportModelForRequest(SlingJakartaHttpServletRequest, String, Class, Map)}
instead
*/
+ @Deprecated(since = "1.6.0")
public @NotNull <T> T exportModelForRequest(
- @NotNull SlingHttpServletRequest request,
+ @NotNull org.apache.sling.api.SlingHttpServletRequest request,
@NotNull String exporterName,
@NotNull Class<T> targetClass,
@NotNull Map<String, String> options)
throws MissingElementsException, InvalidAdaptableException,
ModelClassException, PostConstructException,
ValidationException, InvalidModelException,
ExportException, MissingExporterException;
+ /**
+ * Export the model object registered to the request's resource's type
using the defined target class using the named exporter.
+ *
+ * @param request the request
+ * @param exporterName the exporter name
+ * @param targetClass the target class
+ * @param options any exporter options
+ * @param <T> the target class
+ * @return an instance of the target class
+ * @throws MissingElementsException in case no injector was able to inject
some required values with the given types
+ * @throws InvalidAdaptableException in case the given class cannot be
instantiated from the given adaptable (different adaptable on the model
annotation)
+ * @throws ModelClassException in case the model could not be instantiated
because model annotation was missing, reflection failed, no valid constructor
was found, model was not registered as adapter factory yet, or post-construct
could not be called
+ * @throws PostConstructException in case the post-construct method has
thrown an exception itself
+ * @throws ValidationException in case validation could not be performed
for some reason (e.g. no validation information available)
+ * @throws InvalidModelException in case the given model type could not be
validated through the model validation
+ * @throws ExportException if the export fails
+ * @throws MissingExporterException if the named exporter can't be found
+ */
+ public @NotNull <T> T exportModelForRequest(
+ @NotNull SlingJakartaHttpServletRequest request,
+ @NotNull String exporterName,
+ @NotNull Class<T> targetClass,
+ @NotNull Map<String, String> options)
+ throws MissingElementsException, InvalidAdaptableException,
ModelClassException, PostConstructException,
+ ValidationException, InvalidModelException,
ExportException, MissingExporterException;
+
+ /**
+ * Create a wrapped request object with the specified resource and (try
to) adapt the request object into the specified class. The wrapped request
+ * object will have a fresh set of script bindings so that any injected
bindings references have the correct context.
+ * Consider using {@link
#createModelFromWrappedRequest(SlingHttpServletRequest, Resource, Class)}
instead to get exceptions propagated which may occur when trying to create the
model.
+ *
+ * @param request the current request
+ * @param resource the resource to set as the wrapped request's resource
+ * @param targetClass the target adapter class
+ * @param <T> the target adapter class
+ * @return an instance of the target class or null if the adaptation could
not be done
+ * @since 1.4.0 (Models API Bundle 1.3.6)
+ * @deprecated use {@link
#getModelFromWrappedRequest(SlingJakartaHttpServletRequest, Resource, Class)}
instead
+ */
+ @Deprecated(since = "1.6.0")
+ public @Nullable <T> T getModelFromWrappedRequest(
+ @NotNull org.apache.sling.api.SlingHttpServletRequest request,
+ @NotNull Resource resource,
+ @NotNull Class<T> targetClass);
+
/**
* Create a wrapped request object with the specified resource and (try
to) adapt the request object into the specified class. The wrapped request
* object will have a fresh set of script bindings so that any injected
bindings references have the correct context.
@@ -234,7 +334,8 @@ public interface ModelFactory {
* @param <T> the target adapter class
* @return an instance of the target class or null if the adaptation could
not be done
* @since 1.4.0 (Models API Bundle 1.3.6)
+ *
*/
public @Nullable <T> T getModelFromWrappedRequest(
- @NotNull SlingHttpServletRequest request, @NotNull Resource
resource, @NotNull Class<T> targetClass);
+ @NotNull SlingJakartaHttpServletRequest request, @NotNull Resource
resource, @NotNull Class<T> targetClass);
}
diff --git a/src/main/java/org/apache/sling/models/factory/package-info.java
b/src/main/java/org/apache/sling/models/factory/package-info.java
index d81fc2d..29a87e9 100644
--- a/src/main/java/org/apache/sling/models/factory/package-info.java
+++ b/src/main/java/org/apache/sling/models/factory/package-info.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-@Version("1.5.0")
+@Version("1.6.0")
package org.apache.sling.models.factory;
import org.osgi.annotation.versioning.Version;