blob: dfdad886098c75c3b15474381d426713f5088c3b [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.atlas.plugin.classloader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.net.URI;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
/**
* AtlasPluginClassLoaderUtil used by AtlasPluginClassLoader.
*/
final class AtlasPluginClassLoaderUtil {
private static final Logger LOG = LoggerFactory.getLogger(AtlasPluginClassLoaderUtil.class);
private static final String ATLAS_PLUGIN_LIBDIR = "atlas-%-plugin-impl";
private AtlasPluginClassLoaderUtil(){ }
public static URL[] getFilesInDirectories(String[] libDirs) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> AtlasPluginClassLoaderUtil.getFilesInDirectories()");
}
List<URL> ret = new ArrayList<>();
for (String libDir : libDirs) {
getFilesInDirectory(libDir, ret);
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== AtlasPluginClassLoaderUtil.getFilesInDirectories(): {} files", ret.size());
}
return ret.toArray(new URL[]{});
}
private static void getFilesInDirectory(String dirPath, List<URL> files) {
if (LOG.isDebugEnabled()) {
LOG.debug("==> AtlasPluginClassLoaderUtil.getPluginFiles()");
}
if (dirPath != null) {
try {
File[] dirFiles = new File(dirPath).listFiles();
if (dirFiles != null) {
for (File dirFile : dirFiles) {
try {
URL jarPath = dirFile.toURI().toURL();
if (LOG.isDebugEnabled()) {
LOG.debug("getFilesInDirectory('{}'): adding {}", dirPath, dirFile.getAbsolutePath());
}
files.add(jarPath);
} catch (Exception excp) {
LOG.warn("getFilesInDirectory('{}'): failed to get URI for file {}", dirPath, dirFile
.getAbsolutePath(), excp);
}
}
}
} catch (Exception excp) {
LOG.warn("getFilesInDirectory('{}'): error", dirPath, excp);
}
} else {
LOG.warn("getFilesInDirectory('{}'): could not find directory in path {}", dirPath, dirPath);
}
if (LOG.isDebugEnabled()) {
LOG.debug("<== AtlasPluginClassLoaderUtil.getFilesInDirectory({})", dirPath);
}
}
public static String getPluginImplLibPath(String pluginType, Class<?> pluginClass) throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("==> AtlasPluginClassLoaderUtil.getPluginImplLibPath for Class ({})", pluginClass.getName());
}
URI uri = pluginClass.getProtectionDomain().getCodeSource().getLocation().toURI();
Path path = Paths.get(URI.create(uri.toString()));
String ret = path.getParent().toString() + File.separatorChar + ATLAS_PLUGIN_LIBDIR.replaceAll("%", pluginType);
if (LOG.isDebugEnabled()) {
LOG.debug("<== AtlasPluginClassLoaderUtil.getPluginImplLibPath for Class {}): {})", pluginClass.getName(), ret);
}
return ret;
}
}