in src/main/java/org/apache/sling/scriptingbundle/plugin/processor/FileProcessor.java [165:233]
public void processScriptFile(@NotNull Path resourceTypeDirectory, @NotNull Path scriptPath,
@NotNull ResourceType resourceType, @NotNull Set<ProvidedResourceTypeCapability> providedCapabilities,
boolean inContentPackage) {
String filePath = scriptPath.toString();
String extension = FilenameUtils.getExtension(filePath);
if (StringUtils.isNotEmpty(extension)) {
Path scriptFile = scriptPath.getFileName();
if (scriptFile != null) {
Path relativeResourceTypeFolder = resourceTypeDirectory.relativize(scriptPath);
int pathSegments = relativeResourceTypeFolder.getNameCount();
List<String> selectors = new ArrayList<>();
if (pathSegments > 1) {
for (int i = 0; i < pathSegments - 1; i++) {
selectors.add(inContentPackage ?
PlatformNameFormat.getRepositoryName(relativeResourceTypeFolder.getName(i).toString()) :
relativeResourceTypeFolder.getName(i).toString()
);
}
}
String scriptFileName = scriptFile.toString();
Script script = Script.parseScript(inContentPackage ? PlatformNameFormat.getRepositoryPath(scriptFileName) : scriptFileName);
if (script != null) {
String scriptEngine = scriptEngineMappings.get(script.getScriptExtension());
if (scriptEngine != null) {
String scriptName = script.getName();
Set<String> searchPathProcessesResourceTypes = processSearchPathResourceTypes(resourceType);
if (scriptName != null) {
if (!resourceType.getResourceLabel().equals(scriptName)
|| script.getRequestMethod() != null) {
selectors.add(script.getName());
}
}
Optional<ProvidedResourceTypeCapability> extendsCapability = Optional.empty();
if (selectors.isEmpty() && StringUtils.isEmpty(script.getRequestExtension()) &&
StringUtils.isEmpty(script.getRequestMethod())) {
extendsCapability =
providedCapabilities.stream()
.filter(capability -> StringUtils.isNotEmpty(capability.getExtendsResourceType()) &&
capability.getResourceTypes().equals(searchPathProcessesResourceTypes) &&
capability.getSelectors().isEmpty() &&
StringUtils.isEmpty(capability.getRequestExtension()) &&
StringUtils.isEmpty(capability.getRequestMethod())).findAny();
}
ProvidedResourceTypeCapability.Builder builder = ProvidedResourceTypeCapability.builder()
.withResourceTypes(searchPathProcessesResourceTypes)
.withVersion(resourceType.getVersion())
.withSelectors(selectors)
.withRequestExtension(script.getRequestExtension())
.withRequestMethod(script.getRequestMethod())
.withScriptEngine(scriptEngine)
.withScriptExtension(script.getScriptExtension());
extendsCapability.ifPresent(capability -> {
builder.withExtendsResourceType(capability.getExtendsResourceType());
providedCapabilities.remove(capability);
}
);
providedCapabilities.add(builder.build());
} else {
log.debug(String.format("Cannot find a script engine mapping for script %s.", scriptPath));
}
} else {
log.debug(String.format("Skipping file %s not denoting a script as it does not follow the filename patterns outlined " +
"at https://sling.apache.org/documentation/the-sling-engine/url-to-script-resolution.html#script-naming-conventions", scriptPath));
}
} else {
throw new IllegalArgumentException(String.format("Invalid path given: '%s'.", scriptPath));
}
}
}