[
https://issues.apache.org/jira/browse/SLING-11133?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Dirk Rudolph updated SLING-11133:
---------------------------------
Description:
Currently the ModelAdapterFactory caches a cacheable model for the requested
type only
[https://github.com/apache/sling-org-apache-sling-models-impl/blob/master/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java#L430-L432]
{code:java}
if (result.wasSuccessful() && modelAnnotation.cache() && adaptableCache !=
null) {
adaptableCache.put(requestedType, new
SoftReference<Object>(result.getValue()));
}
{code}
However, if a model is an adapter of multiple types an instance of it can also
be returned for more than just the requested type.
{code:java}
interface AdapterType1 {}
interface AdapterType2 {}
@Model(adaptables = Resource.class, adapterType={AdapterType1.class,
AdapterType2.class}, cache = true)
class Model implements AdapterType1, AdapterType2 {}
assertSame(resource.adaptTo(Model.class), resouce.adaptTo(AdapterType1.class));
assertSame(resource.adaptTo(AdapterType1.class),
resouce.adaptTo(AdapterType2.class));
{code}
While it is not save to cache the model for all of its adapter types (see
SLING-11074), it is certainly save to cache the Model for its implementation
type.
In fact, when caching the Model for the implementation type, caching it for the
requested type is redundant. This is based on the assumption that the
{{org.apache.sling.models.impl.AdapterImplementations#lookup()}} always returns
the same implementation for given adapterType and adaptable.
was:
Currently the ModelAdapterFactory caches a cacheable model for the requested
type only
https://github.com/apache/sling-org-apache-sling-models-impl/blob/master/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java#L430-L432
{code}
if (result.wasSuccessful() && modelAnnotation.cache() && adaptableCache !=
null) {
adaptableCache.put(requestedType, new
SoftReference<Object>(result.getValue()));
}
{code}
However, if a model is an adapter of multiple types an instance of it can also
be returned for more than just the requested type.
While it is not save to cache the model for all of its adapter types (see
SLING-11074), it is certainly save to cache the Model for its implementation
type additionally to the requested type.
In fact, when caching the Model for the implementation type, caching it for the
requested type is redundant. This is based on the assumption that the
{{org.apache.sling.models.impl.AdapterImplementations#lookup()}} always returns
the same implementation for given adapterType and adaptable (considering no
newly registered ImplementationPickers interfere with it)
> Cache model for its implementation type
> ---------------------------------------
>
> Key: SLING-11133
> URL: https://issues.apache.org/jira/browse/SLING-11133
> Project: Sling
> Issue Type: Improvement
> Components: Sling Models
> Reporter: Dirk Rudolph
> Assignee: Dirk Rudolph
> Priority: Major
> Fix For: Models Implementation 1.5.2
>
> Time Spent: 20m
> Remaining Estimate: 0h
>
> Currently the ModelAdapterFactory caches a cacheable model for the requested
> type only
> [https://github.com/apache/sling-org-apache-sling-models-impl/blob/master/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java#L430-L432]
> {code:java}
> if (result.wasSuccessful() && modelAnnotation.cache() && adaptableCache !=
> null) {
> adaptableCache.put(requestedType, new
> SoftReference<Object>(result.getValue()));
> }
> {code}
> However, if a model is an adapter of multiple types an instance of it can
> also be returned for more than just the requested type.
> {code:java}
> interface AdapterType1 {}
> interface AdapterType2 {}
> @Model(adaptables = Resource.class, adapterType={AdapterType1.class,
> AdapterType2.class}, cache = true)
> class Model implements AdapterType1, AdapterType2 {}
> assertSame(resource.adaptTo(Model.class),
> resouce.adaptTo(AdapterType1.class));
> assertSame(resource.adaptTo(AdapterType1.class),
> resouce.adaptTo(AdapterType2.class));
> {code}
> While it is not save to cache the model for all of its adapter types (see
> SLING-11074), it is certainly save to cache the Model for its implementation
> type.
> In fact, when caching the Model for the implementation type, caching it for
> the requested type is redundant. This is based on the assumption that the
> {{org.apache.sling.models.impl.AdapterImplementations#lookup()}} always
> returns the same implementation for given adapterType and adaptable.
--
This message was sent by Atlassian Jira
(v8.20.1#820001)