blob: 2285b1f529e32a86789c548587f9c2c7f5ac2eb7 [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.nifi.script.impl;
import org.apache.nifi.logging.ComponentLog;
import org.apache.nifi.processors.script.ScriptEngineConfigurator;
import java.io.File;
import java.io.FilenameFilter;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedList;
import java.util.List;
/**
* This base class provides a common implementation for the getModuleURLsForClasspath method of the
* ScriptEngineConfigurator interface
*/
public abstract class AbstractModuleClassloaderConfigurator implements ScriptEngineConfigurator {
/**
* Scans the given module paths for JARs. The path itself (whether a directory or file) will be added to the list
* of returned module URLs, and if a directory is specified, it is scanned for JAR files (files ending with .jar).
* Any JAR files found are added to the list of module URLs. This is a convenience method for adding directories
* full of JAR files to an ExecuteScript or InvokeScriptedProcessor instance, rather than having to enumerate each
* JAR's URL.
* @param modulePaths An array of module paths to scan/add
* @param log A logger for the calling component, to provide feedback for missing files, e.g.
* @return An array of URLs corresponding to all modules determined from the input set of module paths.
*/
@Override
public URL[] getModuleURLsForClasspath(String[] modulePaths, ComponentLog log) {
List<URL> additionalClasspath = new LinkedList<>();
if (modulePaths != null) {
for (String modulePathString : modulePaths) {
File modulePath = new File(modulePathString);
if (modulePath.exists()) {
// Add the URL of this path
try {
additionalClasspath.add(modulePath.toURI().toURL());
} catch (MalformedURLException mue) {
log.warn("{} is not a valid file/folder, ignoring", new Object[]{modulePath.getAbsolutePath()}, mue);
}
// If the path is a directory, we need to scan for JARs and add them to the classpath
if (modulePath.isDirectory()) {
File[] jarFiles = modulePath.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return (name != null && name.endsWith(".jar"));
}
});
if (jarFiles != null) {
// Add each to the classpath
for (File jarFile : jarFiles) {
try {
additionalClasspath.add(jarFile.toURI().toURL());
} catch (MalformedURLException mue) {
log.warn("{} is not a valid file/folder, ignoring", new Object[]{modulePath.getAbsolutePath()}, mue);
}
}
}
}
} else {
log.warn("{} does not exist, ignoring", new Object[]{modulePath.getAbsolutePath()});
}
}
}
return additionalClasspath.toArray(new URL[additionalClasspath.size()]);
}
}