Author: justin
Date: Thu Jul 20 15:14:15 2017
New Revision: 1802505

URL: http://svn.apache.org/viewvc?rev=1802505&view=rev
Log:
Merge branch 'SLING-7015'

Added:
    
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ResourceOverridingRequestWrapper.java
    
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/SlingModelsScriptEngineFactory.java
    
sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/RequestWrapperTest.java
Removed:
    
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ExporterScriptEngineFactory.java
Modified:
    
sling/trunk/bundles/extensions/models/api/src/main/java/org/apache/sling/models/factory/ModelFactory.java
    
sling/trunk/bundles/extensions/models/api/src/main/java/org/apache/sling/models/factory/package-info.java
    sling/trunk/bundles/extensions/models/impl/pom.xml
    
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ExportServlet.java
    
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
    
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java
    
sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/StaticInjectionAPFLoadOrderTest.java

Modified: 
sling/trunk/bundles/extensions/models/api/src/main/java/org/apache/sling/models/factory/ModelFactory.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/api/src/main/java/org/apache/sling/models/factory/ModelFactory.java?rev=1802505&r1=1802504&r2=1802505&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/models/api/src/main/java/org/apache/sling/models/factory/ModelFactory.java
 (original)
+++ 
sling/trunk/bundles/extensions/models/api/src/main/java/org/apache/sling/models/factory/ModelFactory.java
 Thu Jul 20 15:14:15 2017
@@ -186,4 +186,16 @@ public interface ModelFactory {
             InvalidAdaptableException, ModelClassException, 
PostConstructException, ValidationException, InvalidModelException,
             ExportException, MissingExporterException;
 
+
+    /**
+     * Create a wrapped request object with the specified resource and (try 
to) adapt the request object into the specified class. The wrapped request
+     * object will have a fresh set of script bindings so that any injected 
bindings references have the correct context.
+     *
+     * @param request the current request
+     * @param resource the resource to set as the wrapped request's resource
+     * @param targetClass the target adapter class
+     * @param <T> the target adapter class
+     * @return an instance of the target class or null if the adaptation could 
not be done
+     */
+    public <T> T getModelFromWrappedRequest(@Nonnull SlingHttpServletRequest 
request, @Nonnull Resource resource, @Nonnull Class<T> targetClass);
 }

Modified: 
sling/trunk/bundles/extensions/models/api/src/main/java/org/apache/sling/models/factory/package-info.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/api/src/main/java/org/apache/sling/models/factory/package-info.java?rev=1802505&r1=1802504&r2=1802505&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/models/api/src/main/java/org/apache/sling/models/factory/package-info.java
 (original)
+++ 
sling/trunk/bundles/extensions/models/api/src/main/java/org/apache/sling/models/factory/package-info.java
 Thu Jul 20 15:14:15 2017
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@Version("1.3.1")
+@Version("1.4.0")
 package org.apache.sling.models.factory;
 
 import aQute.bnd.annotation.Version;
\ No newline at end of file

Modified: sling/trunk/bundles/extensions/models/impl/pom.xml
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/pom.xml?rev=1802505&r1=1802504&r2=1802505&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/models/impl/pom.xml (original)
+++ sling/trunk/bundles/extensions/models/impl/pom.xml Thu Jul 20 15:14:15 2017
@@ -132,7 +132,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.models.api</artifactId>
-            <version>1.3.4</version>
+            <version>1.3.5-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>

Modified: 
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ExportServlet.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ExportServlet.java?rev=1802505&r1=1802504&r2=1802505&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ExportServlet.java
 (original)
+++ 
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ExportServlet.java
 Thu Jul 20 15:14:15 2017
@@ -54,27 +54,17 @@ class ExportServlet extends SlingSafeMet
 
     private final Logger logger;
 
-    /** The context string to use to select BindingsValuesProviders */
-    private static final String BINDINGS_CONTEXT = 
BindingsValuesProvider.DEFAULT_CONTEXT;
-
-    /** embed this value so as to avoid a dependency on a newer Sling API than 
otherwise necessary. */
-    private static final String RESOLVER = "resolver";
-
-    /** The set of protected keys. */
-    private static final Set<String> PROTECTED_KEYS =
-            new HashSet<String>(Arrays.asList(REQUEST, RESPONSE, READER, 
SLING, RESOURCE, RESOLVER, OUT, LOG));
-
     private final String exporterName;
     private final String registeredSelector;
     private final BundleContext bundleContext;
     private final ModelFactory modelFactory;
     private final BindingsValuesProvidersByContext 
bindingsValuesProvidersByContext;
-    private final ScriptEngineFactory scriptEngineFactory;
+    private final SlingModelsScriptEngineFactory scriptEngineFactory;
     private final ExportedObjectAccessor accessor;
     private final Map<String, String> baseOptions;
 
     public ExportServlet(BundleContext bundleContext, ModelFactory 
modelFactory,
-                         BindingsValuesProvidersByContext 
bindingsValuesProvidersByContext, ScriptEngineFactory scriptFactory,
+                         BindingsValuesProvidersByContext 
bindingsValuesProvidersByContext, SlingModelsScriptEngineFactory scriptFactory,
                          Class<?> annotatedClass, String registeredSelector, 
String exporterName, ExportedObjectAccessor accessor,
                          Map<String, String> baseOptions) {
         this.bundleContext = bundleContext;
@@ -128,26 +118,14 @@ class ExportServlet extends SlingSafeMet
         SimpleBindings bindings = new SimpleBindings();
         bindings.put(SLING, scriptHelper);
         bindings.put(RESOURCE, request.getResource());
-        bindings.put(RESOLVER, request.getResource().getResourceResolver());
+        bindings.put(SlingModelsScriptEngineFactory.RESOLVER, 
request.getResource().getResourceResolver());
         bindings.put(REQUEST, request);
         bindings.put(RESPONSE, response);
         bindings.put(READER, request.getReader());
         bindings.put(OUT, response.getWriter());
         bindings.put(LOG, logger);
 
-        final Collection<BindingsValuesProvider> bindingsValuesProviders =
-                
bindingsValuesProvidersByContext.getBindingsValuesProviders(scriptEngineFactory,
 BINDINGS_CONTEXT);
-
-        if (!bindingsValuesProviders.isEmpty()) {
-            Set<String> protectedKeys = new HashSet<String>();
-            protectedKeys.addAll(PROTECTED_KEYS);
-
-            ProtectedBindings protectedBindings = new 
ProtectedBindings(bindings, protectedKeys);
-            for (BindingsValuesProvider provider : bindingsValuesProviders) {
-                provider.addBindings(protectedBindings);
-            }
-
-        }
+        
scriptEngineFactory.invokeBindingsValuesProviders(bindingsValuesProvidersByContext,
 bindings);
 
         SlingBindings slingBindings = new SlingBindings();
         slingBindings.putAll(bindings);

Modified: 
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java?rev=1802505&r1=1802504&r2=1802505&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
 (original)
+++ 
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java
 Thu Jul 20 15:14:15 2017
@@ -56,6 +56,7 @@ import org.apache.felix.scr.annotations.
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.api.adapter.Adaptable;
 import org.apache.sling.api.adapter.AdapterFactory;
+import org.apache.sling.api.adapter.AdapterManager;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.commons.osgi.RankedServices;
@@ -204,6 +205,9 @@ public class ModelAdapterFactory impleme
     @Reference
     private BindingsValuesProvidersByContext bindingsValuesProvidersByContext;
 
+    @Reference
+    private AdapterManager adapterManager;
+
     ModelPackageBundleListener listener;
 
     final AdapterImplementations adapterImplementations = new 
AdapterImplementations();
@@ -217,6 +221,8 @@ public class ModelAdapterFactory impleme
 
     private Map<Object, Map<Class, Object>> adapterCache;
 
+    private SlingModelsScriptEngineFactory scriptEngineFactory;
+
     // use a smaller initial capacity than the default as we expect a 
relatively small number of
     // adapters per adaptable
     private final int INNER_CACHE_INITIAL_CAPACITY = 4;
@@ -1022,7 +1028,8 @@ public class ModelAdapterFactory impleme
 
         this.jobRegistration = 
bundleContext.registerService(Runnable.class.getName(), this, properties);
 
-        this.listener = new ModelPackageBundleListener(ctx.getBundleContext(), 
this, this.adapterImplementations, bindingsValuesProvidersByContext);
+        this.scriptEngineFactory = new 
SlingModelsScriptEngineFactory(bundleContext.getBundle());
+        this.listener = new ModelPackageBundleListener(ctx.getBundleContext(), 
this, this.adapterImplementations, bindingsValuesProvidersByContext, 
scriptEngineFactory);
 
         Hashtable<Object, Object> printerProps = new Hashtable<Object, 
Object>();
         printerProps.put(Constants.SERVICE_VENDOR, "Apache Software 
Foundation");
@@ -1247,4 +1254,10 @@ public class ModelAdapterFactory impleme
         }
     }
 
+    @Override
+    public <T> T getModelFromWrappedRequest(@Nonnull SlingHttpServletRequest 
request, @Nonnull Resource resource, @Nonnull Class<T> targetClass) {
+        return new ResourceOverridingRequestWrapper(request, resource, 
adapterManager,
+                scriptEngineFactory, 
bindingsValuesProvidersByContext).adaptTo(targetClass);
+    }
+
 }

Modified: 
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java?rev=1802505&r1=1802504&r2=1802505&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java
 (original)
+++ 
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelPackageBundleListener.java
 Thu Jul 20 15:14:15 2017
@@ -85,17 +85,18 @@ public class ModelPackageBundleListener
 
     private final BindingsValuesProvidersByContext 
bindingsValuesProvidersByContext;
 
-    private final ScriptEngineFactory scriptEngineFactory;
+    private final SlingModelsScriptEngineFactory scriptEngineFactory;
     
     public ModelPackageBundleListener(BundleContext bundleContext,
                                       ModelAdapterFactory factory,
                                       AdapterImplementations 
adapterImplementations,
-                                      BindingsValuesProvidersByContext 
bindingsValuesProvidersByContext) {
+                                      BindingsValuesProvidersByContext 
bindingsValuesProvidersByContext,
+                                      SlingModelsScriptEngineFactory 
scriptEngineFactory) {
         this.bundleContext = bundleContext;
         this.factory = factory;
         this.adapterImplementations = adapterImplementations;
         this.bindingsValuesProvidersByContext = 
bindingsValuesProvidersByContext;
-        this.scriptEngineFactory = new 
ExporterScriptEngineFactory(bundleContext.getBundle());
+        this.scriptEngineFactory = scriptEngineFactory;
         this.bundleTracker = new BundleTracker(bundleContext, Bundle.ACTIVE, 
this);
         this.bundleTracker.open();
     }

Added: 
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ResourceOverridingRequestWrapper.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ResourceOverridingRequestWrapper.java?rev=1802505&view=auto
==============================================================================
--- 
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ResourceOverridingRequestWrapper.java
 (added)
+++ 
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ResourceOverridingRequestWrapper.java
 Thu Jul 20 15:14:15 2017
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.impl;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.adapter.AdapterManager;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.scripting.SlingBindings;
+import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
+import org.apache.sling.scripting.api.BindingsValuesProvider;
+import org.apache.sling.scripting.api.BindingsValuesProvidersByContext;
+import org.apache.sling.scripting.core.impl.helper.ProtectedBindings;
+
+import javax.script.ScriptEngineFactory;
+import javax.script.SimpleBindings;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.apache.sling.api.scripting.SlingBindings.*;
+
+/**
+ * This request wrapper allows to adapt the given resource and request to a 
Sling Model
+ */
+class ResourceOverridingRequestWrapper extends SlingHttpServletRequestWrapper {
+
+    private final Resource resource;
+    private final AdapterManager adapterManager;
+    private final SlingBindings bindings;
+
+    ResourceOverridingRequestWrapper(SlingHttpServletRequest wrappedRequest, 
Resource resource,
+                                            AdapterManager adapterManager, 
SlingModelsScriptEngineFactory scriptEngineFactory,
+                                            BindingsValuesProvidersByContext 
bindingsValuesProvidersByContext) {
+        super(wrappedRequest);
+        this.resource = resource;
+        this.adapterManager = adapterManager;
+
+        SlingBindings existingBindings = (SlingBindings) 
wrappedRequest.getAttribute(SlingBindings.class.getName());
+
+        SimpleBindings bindings = new SimpleBindings();
+        if (existingBindings != null) {
+            bindings.put(SLING, existingBindings.getSling());
+            bindings.put(RESPONSE, existingBindings.getResponse());
+            bindings.put(READER, existingBindings.getReader());
+            bindings.put(OUT, existingBindings.getOut());
+            bindings.put(LOG, existingBindings.getLog());
+        }
+        bindings.put(REQUEST, this);
+        bindings.put(RESOURCE, resource);
+        bindings.put(SlingModelsScriptEngineFactory.RESOLVER, 
resource.getResourceResolver());
+
+        
scriptEngineFactory.invokeBindingsValuesProviders(bindingsValuesProvidersByContext,
 bindings);
+
+        SlingBindings slingBindings = new SlingBindings();
+        slingBindings.putAll(bindings);
+
+        this.bindings = slingBindings;
+
+    }
+
+    @Override
+    public Object getAttribute(String name) {
+        if (SlingBindings.class.getName().equals(name)) {
+            return bindings;
+        } else {
+            return super.getAttribute(name);
+        }
+    }
+    @Override
+    public Resource getResource() {
+        return resource;
+    }
+
+    @Override
+    public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
+        return adapterManager.getAdapter(this, type);
+    }
+}
\ No newline at end of file

Added: 
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/SlingModelsScriptEngineFactory.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/SlingModelsScriptEngineFactory.java?rev=1802505&view=auto
==============================================================================
--- 
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/SlingModelsScriptEngineFactory.java
 (added)
+++ 
sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/SlingModelsScriptEngineFactory.java
 Thu Jul 20 15:14:15 2017
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.impl;
+
+import org.apache.sling.scripting.api.AbstractScriptEngineFactory;
+import org.apache.sling.scripting.api.BindingsValuesProvider;
+import org.apache.sling.scripting.api.BindingsValuesProvidersByContext;
+import org.apache.sling.scripting.core.impl.helper.ProtectedBindings;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineFactory;
+import javax.script.SimpleBindings;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.apache.sling.api.scripting.SlingBindings.*;
+
+/**
+ * Essentially fake ScriptEngineFactory needed for accessing 
BindingsValuesProviders in the ExportServlet
+ */
+class SlingModelsScriptEngineFactory extends AbstractScriptEngineFactory 
implements ScriptEngineFactory {
+
+    /** The context string to use to select BindingsValuesProviders */
+    private static final String BINDINGS_CONTEXT = 
BindingsValuesProvider.DEFAULT_CONTEXT;
+
+    /** embed this value so as to avoid a dependency on a newer Sling API than 
otherwise necessary. */
+    static final String RESOLVER = "resolver";
+
+    /** The set of protected keys. */
+    private static final Set<String> PROTECTED_KEYS =
+            new HashSet<String>(Arrays.asList(REQUEST, RESPONSE, READER, 
SLING, RESOURCE, RESOLVER, OUT, LOG));
+
+    SlingModelsScriptEngineFactory(Bundle bundle) {
+        super();
+        setEngineName("Apache Sling Models");
+        // really the only time this is null is during testing
+        if (bundle != null && bundle.getHeaders() != null && 
bundle.getHeaders().get(Constants.BUNDLE_VERSION) != null) {
+            
setEngineVersion(bundle.getHeaders().get(Constants.BUNDLE_VERSION).toString());
+        }
+        setNames("sling-models-exporter", "sling-models");
+    }
+
+    @Override
+    public String getLanguageName() {
+        return null;
+    }
+
+    @Override
+    public String getLanguageVersion() {
+        return null;
+    }
+
+    @Override
+    public ScriptEngine getScriptEngine() {
+        return null;
+    }
+
+    void invokeBindingsValuesProviders(BindingsValuesProvidersByContext 
bindingsValuesProvidersByContext, SimpleBindings bindings) {
+        final Collection<BindingsValuesProvider> bindingsValuesProviders =
+                
bindingsValuesProvidersByContext.getBindingsValuesProviders(this, 
SlingModelsScriptEngineFactory.BINDINGS_CONTEXT);
+
+        if (!bindingsValuesProviders.isEmpty()) {
+            Set<String> protectedKeys = new HashSet<String>();
+            
protectedKeys.addAll(SlingModelsScriptEngineFactory.PROTECTED_KEYS);
+
+            ProtectedBindings protectedBindings = new 
ProtectedBindings(bindings, protectedKeys);
+            for (BindingsValuesProvider provider : bindingsValuesProviders) {
+                provider.addBindings(protectedBindings);
+            }
+
+        }
+    }
+}

Added: 
sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/RequestWrapperTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/RequestWrapperTest.java?rev=1802505&view=auto
==============================================================================
--- 
sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/RequestWrapperTest.java
 (added)
+++ 
sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/RequestWrapperTest.java
 Thu Jul 20 15:14:15 2017
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.models.impl;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.adapter.AdapterManager;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.scripting.SlingBindings;
+import org.apache.sling.scripting.api.BindingsValuesProvider;
+import org.apache.sling.scripting.api.BindingsValuesProvidersByContext;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeMatcher;
+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.service.component.ComponentContext;
+
+import javax.script.Bindings;
+import javax.script.ScriptEngineFactory;
+import java.util.Collections;
+import java.util.Hashtable;
+
+import static org.mockito.Matchers.*;
+import static org.mockito.Mockito.*;
+import static org.junit.Assert.*;
+
+@RunWith(MockitoJUnitRunner.class)
+public class RequestWrapperTest {
+    @Mock
+    private ComponentContext componentCtx;
+
+    @Mock
+    private BundleContext bundleContext;
+
+    @Mock
+    private AdapterManager adapterManager;
+
+    @Mock
+    private BindingsValuesProvidersByContext bindingsValuesProvidersByContext;
+
+    @Mock
+    private BindingsValuesProvider bindingsValuesProvider;
+
+    @Mock
+    private Resource resource;
+
+    @Mock
+    private SlingHttpServletRequest request;
+
+    @InjectMocks
+    private ModelAdapterFactory factory;
+
+    @Before
+    public void setup() {
+        when(componentCtx.getBundleContext()).thenReturn(bundleContext);
+        when(componentCtx.getProperties()).thenReturn(new Hashtable<String, 
Object>());
+        factory.activate(componentCtx);
+        
when(bindingsValuesProvidersByContext.getBindingsValuesProviders(any(ScriptEngineFactory.class),
 eq(BindingsValuesProvider.DEFAULT_CONTEXT))).
+                thenReturn(Collections.singleton(bindingsValuesProvider));
+    }
+
+    @Test
+    public void testWrapper() {
+        Target expected = new Target();
+        when(adapterManager.getAdapter(any(SlingHttpServletRequest.class), 
eq(Target.class))).thenReturn(expected);
+
+        Target actual = factory.getModelFromWrappedRequest(request, resource, 
Target.class);
+        assertEquals(expected, actual);
+
+        verify(adapterManager, 
times(1)).getAdapter(argThat(requestHasResource(resource)), eq(Target.class));
+        verify(bindingsValuesProvider, 
times(1)).addBindings(argThat(bindingsHasResource(resource)));
+    }
+
+    private Matcher<Bindings> bindingsHasResource(final Resource resource) {
+        return new TypeSafeMatcher<Bindings>() {
+            @Override
+            protected boolean matchesSafely(Bindings bindings) {
+                return bindings.get(SlingBindings.RESOURCE) == resource;
+            }
+
+            @Override
+            public void describeTo(Description description) {
+                description.appendText("a bindings object with the resource " 
+ resource);
+            }
+        };
+    }
+
+    private Matcher<SlingHttpServletRequest> requestHasResource(final Resource 
resource) {
+        return new TypeSafeMatcher<SlingHttpServletRequest>() {
+            @Override
+            protected boolean matchesSafely(SlingHttpServletRequest 
slingHttpServletRequest) {
+                return slingHttpServletRequest.getResource().equals(resource);
+            }
+
+            @Override
+            public void describeTo(Description description) {
+                description.appendText("a request with the resource " + 
resource);
+            }
+        };
+    }
+
+    class Target {
+
+    }
+
+}

Modified: 
sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/StaticInjectionAPFLoadOrderTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/StaticInjectionAPFLoadOrderTest.java?rev=1802505&r1=1802504&r2=1802505&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/StaticInjectionAPFLoadOrderTest.java
 (original)
+++ 
sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/StaticInjectionAPFLoadOrderTest.java
 Thu Jul 20 15:14:15 2017
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertTru
 import static org.mockito.Mockito.when;
 
 import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.adapter.AdapterManager;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.models.annotations.Model;
 import org.apache.sling.models.annotations.injectorspecific.InjectionStrategy;
@@ -54,6 +55,9 @@ public class StaticInjectionAPFLoadOrder
 
     @Mock
     private BindingsValuesProvidersByContext bindingsValuesProvidersByContext;
+
+    @Mock
+    private AdapterManager adapterManager;
     
     private ModelAdapterFactory factory;
     
@@ -118,6 +122,7 @@ public class StaticInjectionAPFLoadOrder
     
     private void registerServices() {
         context.registerService(BindingsValuesProvidersByContext.class, 
bindingsValuesProvidersByContext);
+        context.registerService(AdapterManager.class, adapterManager);
         factory = context.registerInjectActivateService(new 
ModelAdapterFactory());
     }
 


Reply via email to