Author: cziegeler
Date: Tue Jul 21 09:56:08 2009
New Revision: 796226

URL: http://svn.apache.org/viewvc?rev=796226&view=rev
Log:
SLING-1056 : Add static field to synthetic resource which can be set by adapter 
manager implementations and set this from our adapter manager.

Added:
    
sling/trunk/bundles/api/src/main/java/org/apache/sling/api/adapter/AdapterSupport.java
   (with props)
Modified:
    
sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/SyntheticResource.java
    
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterManagerImpl.java

Added: 
sling/trunk/bundles/api/src/main/java/org/apache/sling/api/adapter/AdapterSupport.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/main/java/org/apache/sling/api/adapter/AdapterSupport.java?rev=796226&view=auto
==============================================================================
--- 
sling/trunk/bundles/api/src/main/java/org/apache/sling/api/adapter/AdapterSupport.java
 (added)
+++ 
sling/trunk/bundles/api/src/main/java/org/apache/sling/api/adapter/AdapterSupport.java
 Tue Jul 21 09:56:08 2009
@@ -0,0 +1,5 @@
+package org.apache.sling.api.adapter;
+
+public class AdapterSupport {
+
+}

Propchange: 
sling/trunk/bundles/api/src/main/java/org/apache/sling/api/adapter/AdapterSupport.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
sling/trunk/bundles/api/src/main/java/org/apache/sling/api/adapter/AdapterSupport.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Propchange: 
sling/trunk/bundles/api/src/main/java/org/apache/sling/api/adapter/AdapterSupport.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/SyntheticResource.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/SyntheticResource.java?rev=796226&r1=796225&r2=796226&view=diff
==============================================================================
--- 
sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/SyntheticResource.java
 (original)
+++ 
sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/SyntheticResource.java
 Tue Jul 21 09:56:08 2009
@@ -18,6 +18,8 @@
  */
 package org.apache.sling.api.resource;
 
+import org.apache.sling.api.adapter.AdapterManager;
+
 /**
  * The <code>SyntheticResource</code> class is a simple implementation of the
  * <code>Resource</code> interface which may be used to provide a resource
@@ -25,6 +27,30 @@
  */
 public class SyntheticResource implements Resource {
 
+    /** The adapter manager used for adapting the synthetic resource. */
+    private static volatile AdapterManager ADAPTER_MANAGER;
+
+    /**
+     * Set the adapter manager to be used by a synthetic resource.
+     * A bundle implementing the adapter manager can set the manager through 
this method.
+     * The set adapter manager will be used in the {...@link #adaptTo(Class)} 
method
+     * of a synthetic resource.
+     * @param adapterMgr The adapter manager.
+     */
+    public static void setAdapterManager(final AdapterManager adapterMgr) {
+        ADAPTER_MANAGER = adapterMgr;
+    }
+
+    /**
+     * Unset an adapter manager previously set with {...@link 
#setAdapterManager(AdapterManager)}
+     * @param adapterMgr The adapter manager
+     */
+    public static void unsetAdapterManager(final AdapterManager adapterMgr) {
+        if ( ADAPTER_MANAGER == adapterMgr ) {
+            ADAPTER_MANAGER = null;
+        }
+    }
+
     /** The resoure resolver to which this resource is related */
     private final ResourceResolver resourceResolver;
 
@@ -115,10 +141,15 @@
     }
 
     /**
-     * Returns <code>null</code> because synthetic resources have no actual
-     * data and thus may not adapt to anything else.
+     * If a adapter manager has been set through {...@link 
#setAdapterManager(AdapterManager)}
+     * this adapter manager is used to adapt the resource to the given class.
+     * Otherwise this method returns <code>null</code>.
      */
     public <Type> Type adaptTo(Class<Type> type) {
+        final AdapterManager adapterMgr = ADAPTER_MANAGER;
+        if ( adapterMgr != null ) {
+            return adapterMgr.getAdapter(this, type);
+        }
         return null;
     }
 

Modified: 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterManagerImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterManagerImpl.java?rev=796226&r1=796225&r2=796226&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterManagerImpl.java
 (original)
+++ 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterManagerImpl.java
 Tue Jul 21 09:56:08 2009
@@ -31,6 +31,7 @@
 import org.apache.sling.api.SlingConstants;
 import org.apache.sling.api.adapter.AdapterFactory;
 import org.apache.sling.api.adapter.AdapterManager;
+import org.apache.sling.api.resource.SyntheticResource;
 import org.apache.sling.commons.osgi.OsgiUtil;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.ComponentContext;
@@ -172,12 +173,14 @@
                 "Not setting Instance field: Set to another manager "
                     + AdapterManagerImpl.INSTANCE, null);
         }
+        SyntheticResource.setAdapterManager(this);
     }
 
     /**
      * @param context Not used
      */
     protected synchronized void deactivate(ComponentContext context) {
+        SyntheticResource.unsetAdapterManager(this);
         // "disable" the manager by clearing the instance
         // do not clear the field if not set to this instance
         if (AdapterManagerImpl.INSTANCE == this) {


Reply via email to