blob: 61340e1bdda19248280747d951238bf86111a0aa [file] [log] [blame]
/*
* 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.servlets.resolver.internal;
import org.apache.sling.api.SlingException;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceUtil;
import org.apache.sling.api.scripting.SlingScript;
import org.apache.sling.api.scripting.SlingScriptResolver;
import org.apache.sling.api.servlets.ServletResolver;
import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
/**
* The <code>SlingServletResolver</code> has two functions: It resolves scripts
* by implementing the {@link SlingScriptResolver} interface and it resolves a
* servlet for a request by implementing the {@link ServletResolver} interface.
*
* The resolver uses an own session to find the scripts.
* @deprecated The API is deprecated
*/
@Deprecated
@Component(service = { SlingScriptResolver.class },
configurationPid = ResolverConfig.PID,
property = {
Constants.SERVICE_DESCRIPTION + "=Apache Sling Script Resolver",
Constants.SERVICE_VENDOR + "=The Apache Software Foundation"
})
public class SlingScriptResolverImpl
implements SlingScriptResolver {
/**
* The allowed execution paths.
*/
private String[] executionPaths;
@Activate
private void activate(final ResolverConfig config) {
this.executionPaths = SlingServletResolver.getExecutionPaths(config.servletresolver_paths());
}
/**
* @see org.apache.sling.api.scripting.SlingScriptResolver#findScript(org.apache.sling.api.resource.ResourceResolver, java.lang.String)
*/
@Override
public SlingScript findScript(final ResourceResolver resourceResolver, final String name)
throws SlingException {
// is the path absolute
SlingScript script = null;
if (name.startsWith("/")) {
final String path = ResourceUtil.normalize(name);
if ( SlingServletResolver.isPathAllowed(path, this.executionPaths) ) {
final Resource resource = resourceResolver.getResource(path);
if ( resource != null ) {
script = resource.adaptTo(SlingScript.class);
}
}
} else {
// relative script resolution against search path
final String[] path = resourceResolver.getSearchPath();
for (int i = 0; script == null && i < path.length; i++) {
final String scriptPath = ResourceUtil.normalize(path[i] + name);
if ( SlingServletResolver.isPathAllowed(scriptPath, this.executionPaths) ) {
final Resource resource = resourceResolver.getResource(scriptPath);
if (resource != null) {
script = resource.adaptTo(SlingScript.class);
}
}
}
}
// log result
if (script != null) {
SlingServletResolver.LOGGER.debug("findScript: Using script {} for {}", script.getScriptResource().getPath(), name);
} else {
SlingServletResolver.LOGGER.info("findScript: No script {} found in path", name);
}
// and finally return the script (or null)
return script;
}
}