You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ra...@apache.org on 2020/09/01 12:51:24 UTC
[sling-org-apache-sling-scripting-sightly] branch master updated:
SLING-9715 - The JavaUseProvider does not properly handle the adaptable
argument for Sling Model classes
This is an automated email from the ASF dual-hosted git repository.
radu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-sightly.git
The following commit(s) were added to refs/heads/master by this push:
new 960d9cd SLING-9715 - The JavaUseProvider does not properly handle the adaptable argument for Sling Model classes
960d9cd is described below
commit 960d9cdb2fe200155bf8c129f1bfa419fcae44cb
Author: Paul Bjorkstrand <pa...@perficient.com>
AuthorDate: Sun Aug 30 10:33:41 2020 -0500
SLING-9715 - The JavaUseProvider does not properly handle the adaptable argument for Sling Model classes
* treat the `adaptable` option in a unitary way for both Use-API POJOs and
Sling Models
---
.../impl/engine/extension/use/JavaUseProvider.java | 55 ++++++++++++++--------
1 file changed, 36 insertions(+), 19 deletions(-)
diff --git a/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/use/JavaUseProvider.java b/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/use/JavaUseProvider.java
index ea6bcfe..28560d6 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/use/JavaUseProvider.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/use/JavaUseProvider.java
@@ -152,29 +152,37 @@ public class JavaUseProvider implements UseProvider {
throws NoSuchMethodException, IllegalAccessException, InvocationTargetException,
InstantiationException {
// OSGi service
- Object result = serviceLoader.getService(cls);
- if (result != null) {
- return ProviderOutcome.success(result);
+ Object serviceResult = serviceLoader.getService(cls);
+ if (serviceResult != null) {
+ return ProviderOutcome.success(serviceResult);
}
// adaptable
Object adaptableCandidate = arguments.get(ADAPTABLE);
+ Adaptable adaptable = null;
+
if (adaptableCandidate instanceof Adaptable) {
- Adaptable adaptable = (Adaptable) adaptableCandidate;
- result = adaptable.adaptTo(cls);
- if (result != null) {
- return ProviderOutcome.success(result);
- }
+ adaptable = (Adaptable) adaptableCandidate;
+ } else {
+ LOG.debug("The provided adaptable argument value, was not of type Adaptable");
}
+
SlingHttpServletRequest request = BindingsUtils.getRequest(globalBindings);
Resource resource = BindingsUtils.getResource(globalBindings);
// Sling Model
if (modelFactory != null && modelFactory.isModelClass(cls)) {
try {
- // try to instantiate class via Sling Models (first via request, then via resource)
+ // Attempt to instantiate via sling models
+ // first, try to use the provided adaptable
+ if (adaptable != null && modelFactory.canCreateFromAdaptable(adaptable, cls)) {
+ LOG.debug("Trying to instantiate class {} as Sling Model from provided adaptable.", cls);
+ return ProviderOutcome.notNullOrFailure(modelFactory.createModel(adaptable, cls));
+ }
+ // then, try to use the request
if (request != null && modelFactory.canCreateFromAdaptable(request, cls)) {
LOG.debug("Trying to instantiate class {} as Sling Model from request.", cls);
return ProviderOutcome.notNullOrFailure(modelFactory.createModel(request, cls));
}
+ // finally, try to use the resource
if (resource != null && modelFactory.canCreateFromAdaptable(resource, cls)) {
LOG.debug("Trying to instantiate class {} as Sling Model from resource.", cls);
return ProviderOutcome.notNullOrFailure(modelFactory.createModel(resource, cls));
@@ -185,14 +193,23 @@ public class JavaUseProvider implements UseProvider {
return ProviderOutcome.failure(e);
}
}
- if (request != null) {
- result = request.adaptTo(cls);
+
+ Object adaptableResult = null;
+ if (adaptable != null) {
+ LOG.debug("Trying to instantiate class {} as sling adapter via adaptable.adaptTo().", cls);
+ adaptableResult = adaptable.adaptTo(cls);
}
- if (result == null && resource != null) {
- result = resource.adaptTo(cls);
+ if (adaptableResult == null && request != null) {
+ LOG.debug("Trying to instantiate class {} as sling adapter via request.adaptTo().", cls);
+ adaptableResult = request.adaptTo(cls);
}
- if (result != null) {
- return ProviderOutcome.success(result);
+ if (adaptableResult == null && resource != null) {
+ LOG.debug("Trying to instantiate class {} as sling adapter via resource.adaptTo().", cls);
+ adaptableResult = resource.adaptTo(cls);
+ }
+
+ if (adaptableResult != null) {
+ return ProviderOutcome.success(adaptableResult);
} else if (cls.isInterface() || Modifier.isAbstract(cls.getModifiers())) {
LOG.debug("Won't attempt to instantiate an interface or abstract class {}", cls.getName());
return ProviderOutcome.failure(new IllegalArgumentException(String.format(" %s represents an interface or an abstract " +
@@ -202,11 +219,11 @@ public class JavaUseProvider implements UseProvider {
* the object was cached by the class loader but it's not adaptable from {@link Resource} or {@link
* SlingHttpServletRequest}; attempt to load it like a regular POJO that optionally could implement {@link Use}
*/
- result = cls.getDeclaredConstructor().newInstance();
- if (result instanceof Use) {
- ((Use) result).init(BindingsUtils.merge(globalBindings, arguments));
+ Object javaUseResult = cls.getDeclaredConstructor().newInstance();
+ if (javaUseResult instanceof Use) {
+ ((Use) javaUseResult).init(BindingsUtils.merge(globalBindings, arguments));
}
- return ProviderOutcome.notNullOrFailure(result);
+ return ProviderOutcome.notNullOrFailure(javaUseResult);
}
}