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;
+    }
 }