Author: justin Date: Thu Dec 1 20:59:38 2016 New Revision: 1772273 URL: http://svn.apache.org/viewvc?rev=1772273&view=rev Log: SLING-6354 - fix support for SlingBindings injections in ExportServlet
Added: sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ExporterScriptEngineFactory.java sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/services/TestBindingsValuesProvider.java Modified: 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/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/StaticInjectionAPFLoadOrderTest.java sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/BaseRequestComponent.java sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/ExporterTest.java sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/FakeRequest.java Modified: sling/trunk/bundles/extensions/models/impl/pom.xml URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/pom.xml?rev=1772273&r1=1772272&r2=1772273&view=diff ============================================================================== --- sling/trunk/bundles/extensions/models/impl/pom.xml (original) +++ sling/trunk/bundles/extensions/models/impl/pom.xml Thu Dec 1 20:59:38 2016 @@ -50,9 +50,9 @@ <instructions> <Embed-Dependency> *;scope=compile, - org.osgi.compendium;inline="org/osgi/util/tracker/*"</Embed-Dependency> - <!-- embed the commons.osgi bundle as described in http://njbartlett.name/2014/05/26/static-linking.html --> - <Conditional-Package>org.apache.sling.commons.osgi</Conditional-Package> + org.apache.sling.commons.osgi;inline=true, + org.apache.sling.scripting.core;inline="org/apache/sling/scripting/core/impl/helper/ProtectedBindings.class" + </Embed-Dependency> </instructions> </configuration> </plugin> @@ -88,6 +88,18 @@ <scope>provided</scope> </dependency> <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.scripting.api</artifactId> + <version>2.1.6</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.scripting.core</artifactId> + <version>2.0.20</version> + <scope>provided</scope> + </dependency> + <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <scope>provided</scope> 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=1772273&r1=1772272&r2=1772273&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 Dec 1 20:59:38 2016 @@ -19,39 +19,75 @@ package org.apache.sling.models.impl; import java.io.IOException; +import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; +import javax.script.ScriptEngineFactory; +import javax.script.SimpleBindings; import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; +import org.apache.sling.api.scripting.SlingBindings; +import org.apache.sling.api.scripting.SlingScriptHelper; import org.apache.sling.api.servlets.SlingSafeMethodsServlet; import org.apache.sling.models.factory.ExportException; import org.apache.sling.models.factory.MissingExporterException; import org.apache.sling.models.factory.ModelFactory; +import org.apache.sling.scripting.api.BindingsValuesProvider; +import org.apache.sling.scripting.api.BindingsValuesProvidersByContext; +import org.apache.sling.scripting.core.ScriptHelper; +import org.apache.sling.scripting.core.impl.helper.ProtectedBindings; +import org.osgi.framework.BundleContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static org.apache.sling.api.scripting.SlingBindings.*; + @SuppressWarnings("serial") class ExportServlet extends SlingSafeMethodsServlet { - private static final Logger logger = LoggerFactory.getLogger(ExportServlet.class); + 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 ExportedObjectAccessor accessor; private final Map<String, String> baseOptions; - public ExportServlet(ModelFactory modelFactory, String registeredSelector, String exporterName, ExportedObjectAccessor accessor, + public ExportServlet(BundleContext bundleContext, ModelFactory modelFactory, + BindingsValuesProvidersByContext bindingsValuesProvidersByContext, ScriptEngineFactory scriptFactory, + Class<?> annotatedClass, String registeredSelector, String exporterName, ExportedObjectAccessor accessor, Map<String, String> baseOptions) { + this.bundleContext = bundleContext; this.modelFactory = modelFactory; + this.bindingsValuesProvidersByContext = bindingsValuesProvidersByContext; + this.scriptEngineFactory = scriptFactory; this.registeredSelector = registeredSelector; this.exporterName = exporterName; this.accessor = accessor; this.baseOptions = baseOptions; + + String loggerName = ExportServlet.class.getName() + "." + annotatedClass.getName(); + this.logger = LoggerFactory.getLogger(loggerName); } @Override @@ -59,24 +95,65 @@ class ExportServlet extends SlingSafeMet throws ServletException, IOException { Map<String, String> options = createOptionMap(request); - String exported; + ScriptHelper scriptHelper = new ScriptHelper(bundleContext, null, request, response); + try { - exported = accessor.getExportedString(request, options, modelFactory, exporterName); - } catch (ExportException e) { - logger.error("Could not perform export with " + exporterName + " requested by model.", e); - response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); - return; - } catch (MissingExporterException e) { - logger.error("Could not get exporter " + exporterName + " requested by model.", e); - response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); - return; + addScriptBindings(scriptHelper, request, response); + String exported; + try { + exported = accessor.getExportedString(request, options, modelFactory, exporterName); + } catch (ExportException e) { + logger.error("Could not perform export with " + exporterName + " requested by model.", e); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + return; + } catch (MissingExporterException e) { + logger.error("Could not get exporter " + exporterName + " requested by model.", e); + response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + return; + } + if (exported == null) { + response.setStatus(HttpServletResponse.SC_NOT_FOUND); + return; + } + response.setContentType(request.getResponseContentType()); + response.getWriter().write(exported); + + } finally { + scriptHelper.cleanup(); } - if (exported == null) { - response.setStatus(HttpServletResponse.SC_NOT_FOUND); - return; + } + + private void addScriptBindings(SlingScriptHelper scriptHelper, SlingHttpServletRequest request, SlingHttpServletResponse response) + throws IOException { + SimpleBindings bindings = new SimpleBindings(); + bindings.put(SLING, scriptHelper); + bindings.put(RESOURCE, request.getResource()); + bindings.put(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); + } + } - response.setContentType(request.getResponseContentType()); - response.getWriter().write(exported); + + SlingBindings slingBindings = new SlingBindings(); + slingBindings.putAll(bindings); + + request.setAttribute(SlingBindings.class.getName(), slingBindings); + } private Map<String, String> createOptionMap(SlingHttpServletRequest request) { @@ -104,14 +181,14 @@ class ExportServlet extends SlingSafeMet String getExportedString(SlingHttpServletRequest request, Map<String, String> options, ModelFactory modelFactory, String exporterName) throws ExportException, MissingExporterException; } - public static final ExportedObjectAccessor RESOURCE = new ExportedObjectAccessor() { + public static final ExportedObjectAccessor RESOURCE_ACCESSOR = new ExportedObjectAccessor() { @Override public String getExportedString(SlingHttpServletRequest request, Map<String, String> options, ModelFactory modelFactory, String exporterName) throws ExportException, MissingExporterException { return modelFactory.exportModelForResource(request.getResource(), exporterName, String.class, options); } }; - public static final ExportedObjectAccessor REQUEST = new ExportedObjectAccessor() { + public static final ExportedObjectAccessor REQUEST_ACCESSOR = new ExportedObjectAccessor() { @Override public String getExportedString(SlingHttpServletRequest request, Map<String, String> options, ModelFactory modelFactory, String exporterName) throws ExportException, MissingExporterException { return modelFactory.exportModelForRequest(request, exporterName, String.class, options); Added: sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ExporterScriptEngineFactory.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ExporterScriptEngineFactory.java?rev=1772273&view=auto ============================================================================== --- sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ExporterScriptEngineFactory.java (added) +++ sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ExporterScriptEngineFactory.java Thu Dec 1 20:59:38 2016 @@ -0,0 +1,55 @@ +/* + * 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.osgi.framework.Bundle; +import org.osgi.framework.Constants; + +import javax.script.ScriptEngine; +import javax.script.ScriptEngineFactory; + +/** + * Essentially fake ScriptEngineFactory needed for accessing BindingsValuesProviders in the ExportServlet + */ +class ExporterScriptEngineFactory extends AbstractScriptEngineFactory implements ScriptEngineFactory { + + ExporterScriptEngineFactory(Bundle bundle) { + super(); + setEngineName("Apache Sling Models Exporter"); + // 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"); + } + + @Override + public String getLanguageName() { + return null; + } + + @Override + public String getLanguageVersion() { + return null; + } + + @Override + public ScriptEngine getScriptEngine() { + return null; + } +} 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=1772273&r1=1772272&r2=1772273&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 Dec 1 20:59:38 2016 @@ -43,7 +43,6 @@ import javax.annotation.Nonnull; import javax.annotation.PostConstruct; import org.apache.commons.beanutils.PropertyUtils; -import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; import org.apache.felix.scr.annotations.Activate; import org.apache.felix.scr.annotations.Component; @@ -91,6 +90,7 @@ import org.apache.sling.models.spi.injec import org.apache.sling.models.spi.injectorspecific.InjectAnnotationProcessorFactory; import org.apache.sling.models.spi.injectorspecific.InjectAnnotationProcessorFactory2; import org.apache.sling.models.spi.injectorspecific.StaticInjectAnnotationProcessorFactory; +import org.apache.sling.scripting.api.BindingsValuesProvidersByContext; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.framework.ServiceRegistration; @@ -193,6 +193,9 @@ public class ModelAdapterFactory impleme referenceInterface = ModelExporter.class) private final @Nonnull RankedServices<ModelExporter> modelExporters = new RankedServices<ModelExporter>(); + @Reference + private BindingsValuesProvidersByContext bindingsValuesProvidersByContext; + ModelPackageBundleListener listener; final AdapterImplementations adapterImplementations = new AdapterImplementations(); @@ -962,7 +965,7 @@ public class ModelAdapterFactory impleme this.jobRegistration = bundleContext.registerService(Runnable.class.getName(), this, properties); - this.listener = new ModelPackageBundleListener(ctx.getBundleContext(), this, this.adapterImplementations); + this.listener = new ModelPackageBundleListener(ctx.getBundleContext(), this, this.adapterImplementations, bindingsValuesProvidersByContext); Hashtable<Object, Object> printerProps = new Hashtable<Object, Object>(); printerProps.put(Constants.SERVICE_VENDOR, "Apache Software Foundation"); 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=1772273&r1=1772272&r2=1772273&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 Dec 1 20:59:38 2016 @@ -35,6 +35,7 @@ import org.apache.sling.models.annotatio import org.apache.sling.models.annotations.ExporterOption; import org.apache.sling.models.annotations.Exporters; import org.apache.sling.models.annotations.Model; +import org.apache.sling.scripting.api.BindingsValuesProvidersByContext; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleEvent; @@ -45,6 +46,7 @@ import org.osgi.util.tracker.BundleTrack import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.script.ScriptEngineFactory; import javax.servlet.Servlet; public class ModelPackageBundleListener implements BundleTrackerCustomizer { @@ -71,13 +73,20 @@ public class ModelPackageBundleListener private final ModelAdapterFactory factory; private final AdapterImplementations adapterImplementations; + + private final BindingsValuesProvidersByContext bindingsValuesProvidersByContext; + + private final ScriptEngineFactory scriptEngineFactory; public ModelPackageBundleListener(BundleContext bundleContext, - ModelAdapterFactory factory, - AdapterImplementations adapterImplementations) { + ModelAdapterFactory factory, + AdapterImplementations adapterImplementations, + BindingsValuesProvidersByContext bindingsValuesProvidersByContext) { this.bundleContext = bundleContext; this.factory = factory; this.adapterImplementations = adapterImplementations; + this.bindingsValuesProvidersByContext = bindingsValuesProvidersByContext; + this.scriptEngineFactory = new ExporterScriptEngineFactory(bundleContext.getBundle()); this.bundleTracker = new BundleTracker(bundleContext, Bundle.ACTIVE, this); this.bundleTracker.open(); } @@ -147,9 +156,9 @@ public class ModelPackageBundleListener adapterImplementations.registerModelToResourceType(bundle, resourceType, adaptable, adapterTypes[0]); ExportServlet.ExportedObjectAccessor accessor = null; if (adaptable == Resource.class) { - accessor = ExportServlet.RESOURCE; + accessor = ExportServlet.RESOURCE_ACCESSOR; } else if (adaptable == SlingHttpServletRequest.class) { - accessor = ExportServlet.REQUEST; + accessor = ExportServlet.REQUEST_ACCESSOR; } Exporter exporterAnnotation = implType.getAnnotation(Exporter.class); if (exporterAnnotation != null) { @@ -255,11 +264,12 @@ public class ModelPackageBundleListener } - private void registerExporter(Bundle bundle, Class<?> implType, String resourceType, Exporter exporterAnnotation, List<ServiceRegistration> regs, - ExportServlet.ExportedObjectAccessor accessor) { + private void registerExporter(Bundle bundle, Class<?> annotatedClass, String resourceType, Exporter exporterAnnotation, + List<ServiceRegistration> regs, ExportServlet.ExportedObjectAccessor accessor) { if (accessor != null) { Map<String, String> baseOptions = getOptions(exporterAnnotation); - ExportServlet servlet = new ExportServlet(factory, exporterAnnotation.selector(), exporterAnnotation.name(), accessor, baseOptions); + ExportServlet servlet = new ExportServlet(bundle.getBundleContext(), factory, bindingsValuesProvidersByContext, + scriptEngineFactory, annotatedClass, exporterAnnotation.selector(), exporterAnnotation.name(), accessor, baseOptions); Dictionary<String, Object> registrationProps = new Hashtable<String, Object>(); registrationProps.put("sling.servlet.resourceTypes", resourceType); registrationProps.put("sling.servlet.selectors", exporterAnnotation.selector()); Modified: sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java?rev=1772273&r1=1772272&r2=1772273&view=diff ============================================================================== --- sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java (original) +++ sling/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/injectors/BindingsInjector.java Thu Dec 1 20:59:38 2016 @@ -59,12 +59,7 @@ public class BindingsInjector implements if (bindings == null) { return null; } - if (type instanceof Class<?>) { - return bindings.get(name); - } else { - log.debug("BindingsInjector doesn't support non-class type {}", type); - return null; - } + return bindings.get(name); } private SlingBindings getBindings(Object adaptable) { Modified: sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java?rev=1772273&r1=1772272&r2=1772273&view=diff ============================================================================== --- sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java (original) +++ sling/trunk/bundles/extensions/models/impl/src/test/java/org/apache/sling/models/impl/OSGiInjectionTest.java Thu Dec 1 20:59:38 2016 @@ -220,6 +220,7 @@ public class OSGiInjectionTest { verify(bundleContext).addBundleListener(any(BundleListener.class)); verify(bundleContext).registerService(eq(Object.class.getName()), any(Object.class), any(Dictionary.class)); verify(bundleContext).getBundles(); + verify(bundleContext).getBundle(); verifyNoMoreInteractions(res, bundleContext); } 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=1772273&r1=1772272&r2=1772273&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 Dec 1 20:59:38 2016 @@ -29,6 +29,7 @@ import org.apache.sling.models.annotatio import org.apache.sling.models.annotations.injectorspecific.SlingObject; import org.apache.sling.models.impl.injectors.SlingObjectInjector; import org.apache.sling.models.testutil.ModelAdapterFactoryUtil; +import org.apache.sling.scripting.api.BindingsValuesProvidersByContext; import org.apache.sling.testing.mock.osgi.junit.OsgiContext; import org.junit.Before; import org.junit.Rule; @@ -50,12 +51,15 @@ public class StaticInjectionAPFLoadOrder private SlingHttpServletRequest request; @Mock private ResourceResolver resourceResolver; + + @Mock + private BindingsValuesProvidersByContext bindingsValuesProvidersByContext; private ModelAdapterFactory factory; @Before public void setUp() { - registerModelAdapterFactory(); + registerServices(); } /** @@ -112,7 +116,8 @@ public class StaticInjectionAPFLoadOrder assertTrue(createModel().hasResourceResolver()); } - private void registerModelAdapterFactory() { + private void registerServices() { + context.registerService(BindingsValuesProvidersByContext.class, bindingsValuesProvidersByContext); factory = context.registerInjectActivateService(new ModelAdapterFactory()); } Modified: sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/BaseRequestComponent.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/BaseRequestComponent.java?rev=1772273&r1=1772272&r2=1772273&view=diff ============================================================================== --- sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/BaseRequestComponent.java (original) +++ sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/BaseRequestComponent.java Thu Dec 1 20:59:38 2016 @@ -27,6 +27,7 @@ import org.apache.sling.models.annotatio import javax.inject.Inject; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; +import java.util.Map; @Model(adaptables = { SlingHttpServletRequest.class }, resourceType = "sling/exp-request/base") @Exporter(name = "jackson", extensions = "json") @@ -38,6 +39,9 @@ public class BaseRequestComponent { @Inject @Via("resource") private String sampleValue; + @Inject + private Map<String, Object> testBindingsObject; + private final SlingHttpServletRequest request; public BaseRequestComponent(SlingHttpServletRequest request) { @@ -61,6 +65,10 @@ public class BaseRequestComponent { return resource; } + public Map<String, Object> getTestBindingsObject() { + return testBindingsObject; + } + public SlingHttpServletRequest getSlingHttpServletRequest() { return request; } Modified: sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/ExporterTest.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/ExporterTest.java?rev=1772273&r1=1772272&r2=1772273&view=diff ============================================================================== --- sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/ExporterTest.java (original) +++ sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/ExporterTest.java Thu Dec 1 20:59:38 2016 @@ -211,6 +211,9 @@ public class ExporterTest { JSONObject obj = new JSONObject(response.getStringWriter().toString()); Assert.assertEquals("application/json", response.getContentType()); Assert.assertEquals("BASETESTVALUE", obj.getString("UPPER")); + Assert.assertTrue(obj.has("testBindingsObject")); + JSONObject testBindingsObject = obj.getJSONObject("testBindingsObject"); + Assert.assertEquals("value", testBindingsObject.getString("name")); Assert.assertEquals(baseRequestComponentPath, obj.getString("id")); response = new FakeResponse(); Modified: sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/FakeRequest.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/FakeRequest.java?rev=1772273&r1=1772272&r2=1772273&view=diff ============================================================================== --- sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/FakeRequest.java (original) +++ sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/exporter/FakeRequest.java Thu Dec 1 20:59:38 2016 @@ -25,7 +25,9 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.Principal; +import java.util.Collections; import java.util.Enumeration; +import java.util.HashMap; import java.util.Locale; import java.util.Map; @@ -33,6 +35,8 @@ class FakeRequest implements HttpServlet private final String path; + private final Map<String, Object> attributes = new HashMap<String, Object>(); + FakeRequest(String path) { this.path = path; } @@ -164,7 +168,7 @@ class FakeRequest implements HttpServlet @Override public Object getAttribute(String name) { - return null; + return attributes.get(name); } @Override @@ -214,7 +218,7 @@ class FakeRequest implements HttpServlet @Override public Map getParameterMap() { - return null; + return Collections.EMPTY_MAP; } @Override @@ -254,12 +258,12 @@ class FakeRequest implements HttpServlet @Override public void setAttribute(String name, Object o) { - + attributes.put(name, o); } @Override public void removeAttribute(String name) { - + attributes.remove(name); } @Override Added: sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/services/TestBindingsValuesProvider.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/services/TestBindingsValuesProvider.java?rev=1772273&view=auto ============================================================================== --- sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/services/TestBindingsValuesProvider.java (added) +++ sling/trunk/bundles/extensions/models/integration-tests/src/main/java/org/apache/sling/models/it/services/TestBindingsValuesProvider.java Thu Dec 1 20:59:38 2016 @@ -0,0 +1,35 @@ +/* + * 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.it.services; + +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.Property; +import org.apache.felix.scr.annotations.Service; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +@Component +@Service(value = Map.class) +@Property(name = "javax.script.name", value = "*") +public class TestBindingsValuesProvider extends HashMap<String, Object> { + + public TestBindingsValuesProvider() { + super.put("testBindingsObject", Collections.singletonMap("name", "value")); + } +}