in hertzbeat-manager/src/main/java/org/apache/hertzbeat/manager/service/impl/PluginServiceImpl.java [222:273]
public PluginMetadata validateJarFile(File jarFile) {
PluginMetadata metadata = new PluginMetadata();
List<PluginItem> pluginItems = new ArrayList<>();
AtomicInteger pluginImplementationCount = new AtomicInteger(0);
try {
URL jarUrl = new URL("file:" + jarFile.getAbsolutePath());
try (URLClassLoader classLoader = new URLClassLoader(new URL[]{jarUrl}, this.getClass().getClassLoader());
JarFile jar = new JarFile(jarFile)) {
Enumeration<JarEntry> entries = jar.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (entry.getName().endsWith(".class")) {
String className = entry.getName().replace("/", ".").replace(".class", "");
try {
Class<?> cls = classLoader.loadClass(className);
if (cls.isInterface()) {
continue;
}
if (pluginImplementationCount.get() >= 1) {
throw new CommonException("A plugin package can only contain one plugin implementation class");
}
PLUGIN_TYPE_MAPPING.forEach((clazz, type) -> {
if (clazz.isAssignableFrom(cls)) {
pluginItems.add(new PluginItem(className, type));
pluginImplementationCount.incrementAndGet();
}
});
} catch (ClassNotFoundException e) {
System.err.println("Failed to load class: " + className);
}
}
if ((entry.getName().contains("define")) && (entry.getName().endsWith(".yml") || entry.getName().endsWith(".yaml"))) {
PluginConfig config = readPluginConfig(jar, entry);
metadata.setParamCount(CollectionUtils.size(config.getParams()));
}
}
if (pluginItems.isEmpty()) {
throw new CommonException("Illegal plug-ins, please refer to https://hertzbeat.apache.org/docs/help/plugin/");
}
} catch (IOException e) {
log.error("Error reading JAR file:{}", jarFile.getAbsoluteFile(), e);
throw new CommonException("Error reading JAR file: " + jarFile.getAbsolutePath());
}
} catch (MalformedURLException e) {
log.error("Invalid JAR file URL: {}", jarFile.getAbsoluteFile(), e);
throw new CommonException("Invalid JAR file URL: " + jarFile.getAbsolutePath());
} catch (YAMLException e) {
throw new CommonException("YAML the file format is incorrect");
}
metadata.setItems(pluginItems);
return metadata;
}