SLING-1673 : Cache results in SlingAdaptable
git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@987486 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/sling/adapter/SlingAdaptable.java b/src/main/java/org/apache/sling/adapter/SlingAdaptable.java
index c2bf3bf..1b8949b 100644
--- a/src/main/java/org/apache/sling/adapter/SlingAdaptable.java
+++ b/src/main/java/org/apache/sling/adapter/SlingAdaptable.java
@@ -18,6 +18,9 @@
*/
package org.apache.sling.adapter;
+import java.util.HashMap;
+import java.util.Map;
+
import org.apache.sling.adapter.internal.AdapterManagerImpl;
import org.apache.sling.api.adapter.Adaptable;
import org.apache.sling.api.adapter.AdapterManager;
@@ -34,9 +37,30 @@
*/
public abstract class SlingAdaptable implements Adaptable {
- public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
- final AdapterManager mgr = AdapterManagerImpl.getInstance();
- return (mgr == null ? null : mgr.getAdapter(this, type));
- }
+ /** Cache */
+ private Map<Class<?>, Object> adaptersCache;
+ /**
+ * @see org.apache.sling.api.adapter.Adaptable#adaptTo(java.lang.Class)
+ */
+ @SuppressWarnings("unchecked")
+ public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
+ AdapterType result = null;
+ synchronized ( this ) {
+ if ( adaptersCache != null ) {
+ result = (AdapterType) adaptersCache.get(type);
+ }
+ if ( result == null ) {
+ final AdapterManager mgr = AdapterManagerImpl.getInstance();
+ result = (mgr == null ? null : mgr.getAdapter(this, type));
+ if ( result != null ) {
+ if ( adaptersCache == null ) {
+ adaptersCache = new HashMap<Class<?>, Object>();
+ }
+ adaptersCache.put(type, result);
+ }
+ }
+ }
+ return result;
+ }
}