| /* |
| * 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 javax.script.Bindings; |
| import javax.script.ScriptEngine; |
| import javax.script.ScriptEngineFactory; |
| |
| import java.util.Arrays; |
| import java.util.Collection; |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| 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 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, Bindings 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); |
| } |
| } |
| } |
| } |