You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ju...@apache.org on 2014/01/07 21:03:59 UTC

svn commit: r1556338 - in /sling/whiteboard/justin/yamf: org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/ org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/ org.apache.sling.yamf.impl/src/main/java/org/apache/sling/y...

Author: justin
Date: Tue Jan  7 20:03:59 2014
New Revision: 1556338

URL: http://svn.apache.org/r1556338
Log:
using reference queue / phantom references to track disposal

Added:
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/DisposalCallback.java
      - copied, changed from r1556337, sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/Injector.java
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/DisposalCallbackRegistry.java
      - copied, changed from r1556337, sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/Injector.java
Modified:
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/Injector.java
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/YamfAdapterFactory.java
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/BindingsInjector.java
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/ChildResourceInjector.java
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/OSGiServiceInjector.java
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/RequestAttributeInjector.java
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/ValueMapInjector.java
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/DefaultTest.java
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/MultipleInjectorTest.java
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/OSGiInjectionTest.java
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/PostConstructTest.java
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/RequestInjectionTest.java
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/ResourceModelClassesTest.java
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/ResourceModelInterfacesTest.java
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/ViaTest.java
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.server-side-tests/src/main/java/org/apache/sling/yamf/it/SimpleTest.java
    sling/whiteboard/justin/yamf/org.apache.sling.yamf.server-side-tests/src/main/java/org/apache/sling/yamf/it/models/TestModel.java

Copied: sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/DisposalCallback.java (from r1556337, sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/Injector.java)
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/DisposalCallback.java?p2=sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/DisposalCallback.java&p1=sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/Injector.java&r1=1556337&r2=1556338&rev=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/Injector.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/DisposalCallback.java Tue Jan  7 20:03:59 2014
@@ -16,12 +16,15 @@
  */
 package org.apache.sling.yamf.spi;
 
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Type;
-
-public interface Injector {
+/**
+ * Callback interface which can be implemented by Injectors to perform some action
+ * when a created object is destroyed.
+ */
+public interface DisposalCallback {
 
-    String getName();
+    /**
+     * Callback method for when an object is destroyed.
+     */
+    void onDisposed();
 
-    Object getValue(Object adaptable, String name, Type declaredType, AnnotatedElement element);
-}
\ No newline at end of file
+}

Copied: sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/DisposalCallbackRegistry.java (from r1556337, sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/Injector.java)
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/DisposalCallbackRegistry.java?p2=sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/DisposalCallbackRegistry.java&p1=sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/Injector.java&r1=1556337&r2=1556338&rev=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/Injector.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/DisposalCallbackRegistry.java Tue Jan  7 20:03:59 2014
@@ -16,12 +16,17 @@
  */
 package org.apache.sling.yamf.spi;
 
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Type;
-
-public interface Injector {
-
-    String getName();
+/**
+ * Interface which allows for the registration of DisposalCallback listeners.
+ * This interface should not be implemnted by clients.
+ */
+public interface DisposalCallbackRegistry {
+    
+    /**
+     * Register a callback.
+     * 
+     * @param callback the callback to register
+     */
+    void addDisposalCallback(DisposalCallback callback);
 
-    Object getValue(Object adaptable, String name, Type declaredType, AnnotatedElement element);
-}
\ No newline at end of file
+}

Modified: sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/Injector.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/Injector.java?rev=1556338&r1=1556337&r2=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/Injector.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.api/src/main/java/org/apache/sling/yamf/spi/Injector.java Tue Jan  7 20:03:59 2014
@@ -23,5 +23,5 @@ public interface Injector {
 
     String getName();
 
-    Object getValue(Object adaptable, String name, Type declaredType, AnnotatedElement element);
+    Object getValue(Object adaptable, String name, Type declaredType, AnnotatedElement element, DisposalCallbackRegistry callbackRegistry);
 }
\ No newline at end of file

Modified: sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/YamfAdapterFactory.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/YamfAdapterFactory.java?rev=1556338&r1=1556337&r2=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/YamfAdapterFactory.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/YamfAdapterFactory.java Tue Jan  7 20:03:59 2014
@@ -17,6 +17,8 @@
 package org.apache.sling.yamf.impl;
 
 import java.lang.annotation.Annotation;
+import java.lang.ref.PhantomReference;
+import java.lang.ref.ReferenceQueue;
 import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationHandler;
@@ -27,11 +29,14 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
@@ -52,14 +57,43 @@ import org.apache.sling.yamf.annotations
 import org.apache.sling.yamf.annotations.Optional;
 import org.apache.sling.yamf.annotations.Via;
 import org.apache.sling.yamf.annotations.Source;
+import org.apache.sling.yamf.spi.DisposalCallback;
+import org.apache.sling.yamf.spi.DisposalCallbackRegistry;
 import org.apache.sling.yamf.spi.Injector;
 import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Component
-public class YamfAdapterFactory implements AdapterFactory {
+public class YamfAdapterFactory implements AdapterFactory, Runnable {
+
+    public static class DisposalCallbackRegistryImpl implements DisposalCallbackRegistry {
+
+        private List<DisposalCallback> callbacks = new ArrayList<DisposalCallback>();
+
+        @Override
+        public void addDisposalCallback(DisposalCallback callback) {
+            callbacks.add(callback);
+        }
+
+        private void lock() {
+            callbacks = Collections.unmodifiableList(callbacks);
+        }
+
+        private void onDisposed() {
+            for (DisposalCallback callback : callbacks) {
+                callback.onDisposed();
+            }
+        }
+
+    }
+
+    private ReferenceQueue<Object> queue;
+
+    private ConcurrentMap<java.lang.ref.Reference<Object>, DisposalCallbackRegistryImpl> disposalCallbacks;
 
     public static class MapBackedInvocationHandler implements InvocationHandler {
 
@@ -75,6 +109,16 @@ public class YamfAdapterFactory implemen
 
     }
 
+    @Override
+    public void run() {
+        java.lang.ref.Reference<? extends Object> ref = queue.poll();
+        if (ref != null) {
+            log.info("calling disposal for " + ref.toString());
+            DisposalCallbackRegistryImpl registry = disposalCallbacks.remove(ref);
+            registry.onDisposed();
+        }
+    }
+
     private static final Logger log = LoggerFactory.getLogger(YamfAdapterFactory.class);
 
     @Reference(name = "injector", referenceInterface = Injector.class,
@@ -85,6 +129,8 @@ public class YamfAdapterFactory implemen
 
     private ModelPackageBundleListener listener;
 
+    private ServiceRegistration jobRegistration;
+
     @SuppressWarnings("unchecked")
     public <AdapterType> AdapterType getAdapter(Object adaptable, Class<AdapterType> type) {
         Model modelAnnotation = type.getAnnotation(Model.class);
@@ -154,6 +200,9 @@ public class YamfAdapterFactory implemen
     private InvocationHandler createInvocationHandler(final Object adaptable, final Class<?> type) {
         Set<Method> injectableMethods = collectInjectableMethods(type);
         Map<Method, Object> methods = new HashMap<Method, Object>();
+        MapBackedInvocationHandler handler = new MapBackedInvocationHandler(methods);
+
+        DisposalCallbackRegistryImpl registry = createAndRegisterCallbackRegistry(handler);
 
         for (Injector injector : sortedInjectors) {
             Iterator<Method> it = injectableMethods.iterator();
@@ -165,7 +214,7 @@ public class YamfAdapterFactory implemen
                     Type returnType = mapPrimitiveClasses(method.getGenericReturnType());
                     Object injectionAdaptable = getAdaptable(adaptable, method);
                     if (injectionAdaptable != null) {
-                        Object value = injector.getValue(injectionAdaptable, name, returnType, method);
+                        Object value = injector.getValue(injectionAdaptable, name, returnType, method, registry);
                         if (setMethod(method, methods, value)) {
                             it.remove();
                         }
@@ -188,7 +237,7 @@ public class YamfAdapterFactory implemen
         }
 
         if (injectableMethods.isEmpty()) {
-            return new MapBackedInvocationHandler(methods);
+            return handler;
         } else {
             Set<Method> requiredMethods = new HashSet<Method>();
             for (Method method : injectableMethods) {
@@ -202,11 +251,18 @@ public class YamfAdapterFactory implemen
                         type);
                 return null;
             } else {
-                return new MapBackedInvocationHandler(methods);
+                return handler;
             }
         }
     }
 
+    private DisposalCallbackRegistryImpl createAndRegisterCallbackRegistry(Object object) {
+        PhantomReference<Object> reference = new PhantomReference<Object>(object, queue);
+        DisposalCallbackRegistryImpl registry = new DisposalCallbackRegistryImpl();
+        disposalCallbacks.put(reference, registry);
+        return registry;
+    }
+
     private String getSource(AnnotatedElement element) {
         Source source = element.getAnnotation(Source.class);
         if (source != null) {
@@ -228,6 +284,8 @@ public class YamfAdapterFactory implemen
 
         AdapterType object = type.newInstance();
 
+        DisposalCallbackRegistryImpl registry = createAndRegisterCallbackRegistry(object);
+
         for (Injector injector : sortedInjectors) {
             Iterator<Field> it = injectableFields.iterator();
             while (it.hasNext()) {
@@ -238,7 +296,7 @@ public class YamfAdapterFactory implemen
                     Type fieldType = mapPrimitiveClasses(field.getGenericType());
                     Object injectionAdaptable = getAdaptable(adaptable, field);
                     if (injectionAdaptable != null) {
-                        Object value = injector.getValue(injectionAdaptable, name, fieldType, field);
+                        Object value = injector.getValue(injectionAdaptable, name, fieldType, field, registry);
                         if (setField(field, object, value)) {
                             it.remove();
                         }
@@ -447,7 +505,7 @@ public class YamfAdapterFactory implemen
     private boolean setField(Field field, Object createdObject, Object value) {
         if (value != null) {
             if (!isAcceptableType(field.getClass(), value) && value instanceof Adaptable) {
-                value = ((Adaptable)value).adaptTo(field.getClass());
+                value = ((Adaptable) value).adaptTo(field.getClass());
                 if (value == null) {
                     return false;
                 }
@@ -475,7 +533,7 @@ public class YamfAdapterFactory implemen
     private boolean setMethod(Method method, Map<Method, Object> methods, Object value) {
         if (value != null) {
             if (!isAcceptableType(method.getReturnType(), value) && value instanceof Adaptable) {
-                value = ((Adaptable)value).adaptTo(method.getReturnType());
+                value = ((Adaptable) value).adaptTo(method.getReturnType());
                 if (value == null) {
                     return false;
                 }
@@ -518,13 +576,26 @@ public class YamfAdapterFactory implemen
     }
 
     @Activate
-    protected void activate(final ComponentContext ctx) throws InvalidSyntaxException {
+    protected void activate(final ComponentContext ctx) {
+        this.queue = new ReferenceQueue<Object>();
+        this.disposalCallbacks = new ConcurrentHashMap<java.lang.ref.Reference<Object>, DisposalCallbackRegistryImpl>();
+        Hashtable<Object, Object> properties = new Hashtable<Object, Object>();
+        properties.put("scheduler.concurrent", false);
+        properties.put("scheduler.period", Long.valueOf(30));
+
+        this.jobRegistration = ctx.getBundleContext().registerService(Runnable.class.getName(), this,
+                properties);
+
         this.listener = new ModelPackageBundleListener(ctx.getBundleContext(), this);
     }
 
     @Deactivate
     protected void deactivate() {
         this.listener.unregisterAll();
+        if (jobRegistration != null) {
+            jobRegistration.unregister();
+            jobRegistration = null;
+        }
     }
 
     protected void bindInjector(final Injector injector, final Map<String, Object> props) {

Modified: sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/BindingsInjector.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/BindingsInjector.java?rev=1556338&r1=1556337&r2=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/BindingsInjector.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/BindingsInjector.java Tue Jan  7 20:03:59 2014
@@ -24,6 +24,7 @@ import javax.servlet.ServletRequest;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.scripting.SlingBindings;
+import org.apache.sling.yamf.spi.DisposalCallbackRegistry;
 import org.apache.sling.yamf.spi.Injector;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,7 +49,7 @@ public class BindingsInjector implements
         }
     }
 
-    public Object getValue(Object adaptable, String name, Type type, AnnotatedElement element) {
+    public Object getValue(Object adaptable, String name, Type type, AnnotatedElement element, DisposalCallbackRegistry callbackRegistry) {
         SlingBindings bindings = getBindings(adaptable);
         if (bindings == null) {
             return null;
@@ -56,7 +57,7 @@ public class BindingsInjector implements
         if (type instanceof Class<?>) {
             return getValue(bindings, name, (Class<?>) type);
         } else {
-            log.warn("BindingsInjector doesn't support non-class types");
+            log.debug("BindingsInjector doesn't support non-class type {}", type);
             return null;
         }
 

Modified: sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/ChildResourceInjector.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/ChildResourceInjector.java?rev=1556338&r1=1556337&r2=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/ChildResourceInjector.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/ChildResourceInjector.java Tue Jan  7 20:03:59 2014
@@ -22,6 +22,7 @@ import java.lang.reflect.Type;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.yamf.spi.DisposalCallbackRegistry;
 import org.apache.sling.yamf.spi.Injector;
 
 @Component
@@ -34,7 +35,7 @@ public class ChildResourceInjector imple
     }
 
     @Override
-    public Object getValue(Object adaptable, String name, Type declaredType, AnnotatedElement element) {
+    public Object getValue(Object adaptable, String name, Type declaredType, AnnotatedElement element, DisposalCallbackRegistry callbackRegistry) {
         if (adaptable instanceof Resource) {
             return ((Resource) adaptable).getChild(name);
         } else {

Modified: sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/OSGiServiceInjector.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/OSGiServiceInjector.java?rev=1556338&r1=1556337&r2=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/OSGiServiceInjector.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/OSGiServiceInjector.java Tue Jan  7 20:03:59 2014
@@ -30,10 +30,11 @@ import javax.servlet.ServletRequest;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Service;
-import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.scripting.SlingBindings;
 import org.apache.sling.api.scripting.SlingScriptHelper;
 import org.apache.sling.yamf.annotations.Filter;
+import org.apache.sling.yamf.spi.DisposalCallback;
+import org.apache.sling.yamf.spi.DisposalCallbackRegistry;
 import org.apache.sling.yamf.spi.Injector;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.InvalidSyntaxException;
@@ -49,7 +50,7 @@ public class OSGiServiceInjector impleme
     private static final Logger log = LoggerFactory.getLogger(OSGiServiceInjector.class);
 
     private BundleContext bundleContext;
-    
+
     @Override
     public String getName() {
         return "osgi-services";
@@ -60,17 +61,17 @@ public class OSGiServiceInjector impleme
         this.bundleContext = ctx.getBundleContext();
     }
 
-    public Object getValue(Object adaptable, String name, Type type, AnnotatedElement element) {
+    public Object getValue(Object adaptable, String name, Type type, AnnotatedElement element, DisposalCallbackRegistry callbackRegistry) {
         Filter filter = element.getAnnotation(Filter.class);
         String filterString = null;
         if (filter != null) {
             filterString = filter.value();
         }
 
-        return getValue(adaptable, type, filterString);
+        return getValue(adaptable, type, filterString, callbackRegistry);
     }
 
-    private <T> Object getService(Object adaptable, Class<T> type, String filter) {
+    private <T> Object getService(Object adaptable, Class<T> type, String filter, DisposalCallbackRegistry callbackRegistry) {
         SlingScriptHelper helper = getScriptHelper(adaptable);
 
         if (helper != null) {
@@ -86,6 +87,7 @@ public class OSGiServiceInjector impleme
                 if (refs == null || refs.length == 0) {
                     return null;
                 } else {
+                    callbackRegistry.addDisposalCallback(new Callback(refs, bundleContext));
                     return bundleContext.getService(refs[0]);
                 }
             } catch (InvalidSyntaxException e) {
@@ -95,7 +97,7 @@ public class OSGiServiceInjector impleme
         }
     }
 
-    private <T> Object[] getServices(Object adaptable, Class<T> type, String filter) {
+    private <T> Object[] getServices(Object adaptable, Class<T> type, String filter, DisposalCallbackRegistry callbackRegistry) {
         SlingScriptHelper helper = getScriptHelper(adaptable);
 
         if (helper != null) {
@@ -107,6 +109,7 @@ public class OSGiServiceInjector impleme
                 if (refs == null || refs.length == 0) {
                     return null;
                 } else {
+                    callbackRegistry.addDisposalCallback(new Callback(refs, bundleContext));
                     List<Object> services = new ArrayList<Object>();
                     for (ServiceReference ref : refs) {
                         Object service = bundleContext.getService(ref);
@@ -126,7 +129,7 @@ public class OSGiServiceInjector impleme
     private SlingScriptHelper getScriptHelper(Object adaptable) {
         if (adaptable instanceof ServletRequest) {
             ServletRequest request = (ServletRequest) adaptable;
-            SlingBindings bindings =  (SlingBindings) request.getAttribute(SlingBindings.class.getName());
+            SlingBindings bindings = (SlingBindings) request.getAttribute(SlingBindings.class.getName());
             if (bindings != null) {
                 return bindings.getSling();
             } else {
@@ -137,18 +140,18 @@ public class OSGiServiceInjector impleme
         }
     }
 
-    private Object getValue(Object adaptable, Type type, String filterString) {
+    private Object getValue(Object adaptable, Type type, String filterString, DisposalCallbackRegistry callbackRegistry) {
         if (type instanceof Class) {
             Class<?> injectedClass = (Class<?>) type;
             if (injectedClass.isArray()) {
-                Object[] services = getServices(adaptable, injectedClass.getComponentType(), filterString);
+                Object[] services = getServices(adaptable, injectedClass.getComponentType(), filterString, callbackRegistry);
                 Object arr = Array.newInstance(injectedClass.getComponentType(), services.length);
                 for (int i = 0; i < services.length; i++) {
                     Array.set(arr, i, services[i]);
                 }
                 return arr;
             } else {
-                return getService(adaptable, injectedClass, filterString);
+                return getService(adaptable, injectedClass, filterString, callbackRegistry);
             }
         } else if (type instanceof ParameterizedType) {
             ParameterizedType ptype = (ParameterizedType) type;
@@ -161,12 +164,31 @@ public class OSGiServiceInjector impleme
             }
 
             Class<?> serviceType = (Class<?>) ptype.getActualTypeArguments()[0];
-            Object[] services = getServices(adaptable, serviceType, filterString);
+            Object[] services = getServices(adaptable, serviceType, filterString, callbackRegistry);
             return Arrays.asList(services);
         } else {
             log.warn("Cannot handle type {}", type);
             return null;
         }
     }
+    
+    private static class Callback implements DisposalCallback {
+        private final ServiceReference[] refs;
+        private final BundleContext context;
+        
+        public Callback(ServiceReference[] refs, BundleContext context) {
+            this.refs = refs;
+            this.context = context;
+        }
+        
+        @Override
+        public void onDisposed() {
+            if (refs != null) {
+                for (ServiceReference ref : refs) {
+                    context.ungetService(ref);
+                }
+            }
+        }
+    }
 
 }

Modified: sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/RequestAttributeInjector.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/RequestAttributeInjector.java?rev=1556338&r1=1556337&r2=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/RequestAttributeInjector.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/RequestAttributeInjector.java Tue Jan  7 20:03:59 2014
@@ -23,6 +23,7 @@ import javax.servlet.ServletRequest;
 
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.yamf.spi.DisposalCallbackRegistry;
 import org.apache.sling.yamf.spi.Injector;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -39,7 +40,7 @@ public class RequestAttributeInjector im
     }
 
     @Override
-    public Object getValue(Object adaptable, String name, Type declaredType, AnnotatedElement element) {
+    public Object getValue(Object adaptable, String name, Type declaredType, AnnotatedElement element, DisposalCallbackRegistry callbackRegistry) {
         if (!(adaptable instanceof ServletRequest)) {
             return null;
         } else if (declaredType instanceof Class<?>) {
@@ -51,7 +52,7 @@ public class RequestAttributeInjector im
                 return null;
             }
         } else {
-            log.warn("BindingsInjector doesn't support non-class types");
+            log.debug("BindingsInjector doesn't support non-class type {}", declaredType);
             return null;
         }
     }

Modified: sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/ValueMapInjector.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/ValueMapInjector.java?rev=1556338&r1=1556337&r2=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/ValueMapInjector.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/main/java/org/apache/sling/yamf/impl/injectors/ValueMapInjector.java Tue Jan  7 20:03:59 2014
@@ -23,6 +23,7 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.adapter.Adaptable;
 import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.yamf.spi.DisposalCallbackRegistry;
 import org.apache.sling.yamf.spi.Injector;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,14 +39,14 @@ public class ValueMapInjector implements
         return "valuemap";
     }
 
-    public Object getValue(Object adaptable, String name, Type type, AnnotatedElement element) {
+    public Object getValue(Object adaptable, String name, Type type, AnnotatedElement element, DisposalCallbackRegistry callbackRegistry) {
         ValueMap map = getMap(adaptable);
         if (map == null) {
             return null;
         } else if (type instanceof Class<?>) {
             return map.get(name, (Class<?>) type);
         } else {
-            log.warn("ValueMapInjector doesn't support non-class types");
+            log.debug("ValueMapInjector doesn't support non-class types {}", type);
             return null;
         }
     }

Modified: sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/DefaultTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/DefaultTest.java?rev=1556338&r1=1556337&r2=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/DefaultTest.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/DefaultTest.java Tue Jan  7 20:03:59 2014
@@ -23,20 +23,35 @@ import java.util.Collections;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ValueMap;
+import org.apache.sling.api.scripting.SlingBindings;
 import org.apache.sling.api.wrappers.ValueMapDecorator;
 import org.apache.sling.yamf.impl.injectors.ValueMapInjector;
 import org.apache.sling.yamf.testmodels.classes.DefaultStringModel;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.service.component.ComponentContext;
 
+@RunWith(MockitoJUnitRunner.class)
 public class DefaultTest {
 
+    @Mock
+    private ComponentContext componentCtx;
+
+    @Mock
+    private BundleContext bundleContext;
+
     private YamfAdapterFactory factory;
 
     @Before
     public void setup() {
+        when(componentCtx.getBundleContext()).thenReturn(bundleContext);
         factory = new YamfAdapterFactory();
+        factory.activate(componentCtx);
         factory.bindInjector(new ValueMapInjector(),
                 Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 0L));
     }

Modified: sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/MultipleInjectorTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/MultipleInjectorTest.java?rev=1556338&r1=1556337&r2=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/MultipleInjectorTest.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/MultipleInjectorTest.java Tue Jan  7 20:03:59 2014
@@ -35,7 +35,9 @@ import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.Spy;
 import org.mockito.runners.MockitoJUnitRunner;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.service.component.ComponentContext;
 
 @RunWith(MockitoJUnitRunner.class)
 public class MultipleInjectorTest {
@@ -49,15 +51,23 @@ public class MultipleInjectorTest {
     @Mock
     private SlingHttpServletRequest request;
 
+    @Mock
+    private ComponentContext componentCtx;
+
+    @Mock
+    private BundleContext bundleContext;
+
     private YamfAdapterFactory factory;
 
     private SlingBindings bindings;
 
     @Before
     public void setup() {
+        when(componentCtx.getBundleContext()).thenReturn(bundleContext);
         bindings = new SlingBindings();
 
         factory = new YamfAdapterFactory();
+        factory.activate(componentCtx);
         factory.bindInjector(bindingsInjector, Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 2L));
         factory.bindInjector(attributesInjector,
                 Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 1L));

Modified: sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/OSGiInjectionTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/OSGiInjectionTest.java?rev=1556338&r1=1556337&r2=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/OSGiInjectionTest.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/OSGiInjectionTest.java Tue Jan  7 20:03:59 2014
@@ -20,6 +20,7 @@ import static org.junit.Assert.*;
 import static org.mockito.Mockito.*;
 
 import java.util.Collections;
+import java.util.Dictionary;
 
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.resource.Resource;
@@ -36,10 +37,10 @@ import org.apache.sling.yamf.testmodels.
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleListener;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.ComponentContext;
@@ -61,8 +62,9 @@ public class OSGiInjectionTest {
 
     @Before
     public void setup() {
-        factory = new YamfAdapterFactory();
         when(componentCtx.getBundleContext()).thenReturn(bundleContext);
+        factory = new YamfAdapterFactory();
+        factory.activate(componentCtx);
 
         OSGiServiceInjector injectorFactory = new OSGiServiceInjector();
         injectorFactory.activate(componentCtx);
@@ -103,6 +105,9 @@ public class OSGiInjectionTest {
         assertNotNull(model.getService());
         assertEquals(service, model.getService());
 
+        verify(bundleContext).registerService(eq(Runnable.class.getName()), eq(factory), any(Dictionary.class));
+        verify(bundleContext).addBundleListener(any(BundleListener.class));
+        verify(bundleContext).getBundles();
         verifyNoMoreInteractions(bundleContext);
     }
 
@@ -196,6 +201,9 @@ public class OSGiInjectionTest {
         SetOSGiModel model = factory.getAdapter(res, SetOSGiModel.class);
         assertNull(model);
 
+        verify(bundleContext).registerService(eq(Runnable.class.getName()), eq(factory), any(Dictionary.class));
+        verify(bundleContext).addBundleListener(any(BundleListener.class));
+        verify(bundleContext).getBundles();
         verifyNoMoreInteractions(res, bundleContext);
     }
 }

Modified: sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/PostConstructTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/PostConstructTest.java?rev=1556338&r1=1556337&r2=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/PostConstructTest.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/PostConstructTest.java Tue Jan  7 20:03:59 2014
@@ -16,19 +16,38 @@
  */
 package org.apache.sling.yamf.impl;
 
-import static org.mockito.Mockito.*;
 import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.yamf.testmodels.classes.SubClass;
+import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.component.ComponentContext;
 
+@RunWith(MockitoJUnitRunner.class)
 public class PostConstructTest {
 
+    @Mock
+    private ComponentContext componentCtx;
+
+    @Mock
+    private BundleContext bundleContext;
+
+    @Before
+    public void setup() {
+        when(componentCtx.getBundleContext()).thenReturn(bundleContext);
+    }
+
     @Test
     public void testClassOrder() {
         Resource r = mock(Resource.class);
         YamfAdapterFactory factory = new YamfAdapterFactory();
+        factory.activate(componentCtx);
         // no injectors are necessary
         
         SubClass sc = factory.getAdapter(r, SubClass.class);

Modified: sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/RequestInjectionTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/RequestInjectionTest.java?rev=1556338&r1=1556337&r2=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/RequestInjectionTest.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/RequestInjectionTest.java Tue Jan  7 20:03:59 2014
@@ -31,11 +31,19 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.service.component.ComponentContext;
 
 @RunWith(MockitoJUnitRunner.class)
 public class RequestInjectionTest {
 
+    @Mock
+    private ComponentContext componentCtx;
+
+    @Mock
+    private BundleContext bundleContext;
+
     private YamfAdapterFactory factory;
 
     @Mock
@@ -46,12 +54,16 @@ public class RequestInjectionTest {
 
     @Before
     public void setup() {
+        when(componentCtx.getBundleContext()).thenReturn(bundleContext);
+
         SlingBindings bindings = new SlingBindings();
         bindings.setSling(sling);
         when(request.getAttribute(SlingBindings.class.getName())).thenReturn(bindings);
-        
+
         factory = new YamfAdapterFactory();
-        factory.bindInjector(new BindingsInjector(), Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 0L));
+        factory.activate(componentCtx);
+        factory.bindInjector(new BindingsInjector(),
+                Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 0L));
     }
 
     @Test

Modified: sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/ResourceModelClassesTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/ResourceModelClassesTest.java?rev=1556338&r1=1556337&r2=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/ResourceModelClassesTest.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/ResourceModelClassesTest.java Tue Jan  7 20:03:59 2014
@@ -37,17 +37,32 @@ import org.apache.sling.yamf.testmodels.
 import org.apache.sling.yamf.testmodels.interfaces.ParentModel;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
 import org.mockito.invocation.InvocationOnMock;
+import org.mockito.runners.MockitoJUnitRunner;
 import org.mockito.stubbing.Answer;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.service.component.ComponentContext;
 
+@RunWith(MockitoJUnitRunner.class)
 public class ResourceModelClassesTest {
 
+    @Mock
+    private ComponentContext componentCtx;
+
+    @Mock
+    private BundleContext bundleContext;
+
     private YamfAdapterFactory factory;
 
     @Before
     public void setup() {
+        when(componentCtx.getBundleContext()).thenReturn(bundleContext);
+
         factory = new YamfAdapterFactory();
+        factory.activate(componentCtx);
         factory.bindInjector(new ValueMapInjector(),
                 Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 1L));
         factory.bindInjector(new ChildResourceInjector(),

Modified: sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/ResourceModelInterfacesTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/ResourceModelInterfacesTest.java?rev=1556338&r1=1556337&r2=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/ResourceModelInterfacesTest.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/ResourceModelInterfacesTest.java Tue Jan  7 20:03:59 2014
@@ -31,15 +31,29 @@ import org.apache.sling.yamf.testmodels.
 import org.apache.sling.yamf.testmodels.interfaces.SimplePropertyModel;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.service.component.ComponentContext;
 
+@RunWith(MockitoJUnitRunner.class)
 public class ResourceModelInterfacesTest {
 
+    @Mock
+    private ComponentContext componentCtx;
+
+    @Mock
+    private BundleContext bundleContext;
+
     private YamfAdapterFactory factory;
 
     @Before
     public void setup() {
+        when(componentCtx.getBundleContext()).thenReturn(bundleContext);
         factory = new YamfAdapterFactory();
+        factory.activate(componentCtx);
         factory.bindInjector(new ValueMapInjector(),
                 Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 0L));
     }

Modified: sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/ViaTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/ViaTest.java?rev=1556338&r1=1556337&r2=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/ViaTest.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.impl/src/test/java/org/apache/sling/yamf/impl/ViaTest.java Tue Jan  7 20:03:59 2014
@@ -33,7 +33,9 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.service.component.ComponentContext;
 
 @RunWith(MockitoJUnitRunner.class)
 public class ViaTest {
@@ -43,13 +45,21 @@ public class ViaTest {
 
     @Mock
     private SlingHttpServletRequest request;
+
+    @Mock
+    private ComponentContext componentCtx;
+
+    @Mock
+    private BundleContext bundleContext;
     
     private YamfAdapterFactory factory;
 
     @Before
     public void setup() {
+        when(componentCtx.getBundleContext()).thenReturn(bundleContext);
         when(request.getResource()).thenReturn(resource);
         factory = new YamfAdapterFactory();
+        factory.activate(componentCtx);
         factory.bindInjector(new ValueMapInjector(),
                 Collections.<String, Object> singletonMap(Constants.SERVICE_ID, 0L));
     }

Modified: sling/whiteboard/justin/yamf/org.apache.sling.yamf.server-side-tests/src/main/java/org/apache/sling/yamf/it/SimpleTest.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.server-side-tests/src/main/java/org/apache/sling/yamf/it/SimpleTest.java?rev=1556338&r1=1556337&r2=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.server-side-tests/src/main/java/org/apache/sling/yamf/it/SimpleTest.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.server-side-tests/src/main/java/org/apache/sling/yamf/it/SimpleTest.java Tue Jan  7 20:03:59 2014
@@ -42,6 +42,7 @@ public class SimpleTest {
 
             assertNotNull("Model is null", model);
             assertEquals("Test Property is not set correctly", value, model.getTestProperty());
+            assertNotNull("Filters is null", model.getFilters());
         } finally {
             if (resolver != null) {
                 resolver.close();

Modified: sling/whiteboard/justin/yamf/org.apache.sling.yamf.server-side-tests/src/main/java/org/apache/sling/yamf/it/models/TestModel.java
URL: http://svn.apache.org/viewvc/sling/whiteboard/justin/yamf/org.apache.sling.yamf.server-side-tests/src/main/java/org/apache/sling/yamf/it/models/TestModel.java?rev=1556338&r1=1556337&r2=1556338&view=diff
==============================================================================
--- sling/whiteboard/justin/yamf/org.apache.sling.yamf.server-side-tests/src/main/java/org/apache/sling/yamf/it/models/TestModel.java (original)
+++ sling/whiteboard/justin/yamf/org.apache.sling.yamf.server-side-tests/src/main/java/org/apache/sling/yamf/it/models/TestModel.java Tue Jan  7 20:03:59 2014
@@ -1,6 +1,9 @@
 package org.apache.sling.yamf.it.models;
 
+import java.util.List;
+
 import javax.inject.Inject;
+import javax.servlet.Filter;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.yamf.annotations.Model;
@@ -11,7 +14,14 @@ public class TestModel {
     @Inject
     private String testProperty;
     
+    @Inject
+    private List<Filter> filters;
+    
     public String getTestProperty() {
         return testProperty;
     }
+    
+    public List<Filter> getFilters() {
+        return filters;
+    }
 }