From 4afbb344c7a349658c3226c88cdaaf40ee580832 Mon Sep 17 00:00:00 2001 From: Shinsuke Sugaya Date: Wed, 19 Jun 2024 10:33:54 +0900 Subject: [PATCH] #2820 Fix package name retrieval from Jar files --- .../codelibs/fess/helper/ProtocolHelper.java | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/codelibs/fess/helper/ProtocolHelper.java b/src/main/java/org/codelibs/fess/helper/ProtocolHelper.java index 39dd0e81b..96d1c1220 100644 --- a/src/main/java/org/codelibs/fess/helper/ProtocolHelper.java +++ b/src/main/java/org/codelibs/fess/helper/ProtocolHelper.java @@ -21,11 +21,14 @@ import java.io.File; import java.io.IOException; import java.lang.reflect.Field; +import java.net.JarURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.List; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -70,12 +73,33 @@ protected void loadProtocols(final String basePackage) { while (resources.hasMoreElements()) { final URL resource = resources.nextElement(); - final File directory = new File(resource.getFile()); - if (directory.exists() && directory.isDirectory()) { - final File[] files = directory.listFiles(File::isDirectory); - if (files != null) { - for (final File file : files) { - subPackages.add(file.getName()); + logger.debug("loading {}", resource); + if ("file".equals(resource.getProtocol())) { + final File directory = new File(resource.getFile()); + if (directory.exists() && directory.isDirectory()) { + final File[] files = directory.listFiles(File::isDirectory); + if (files != null) { + for (final File file : files) { + final String name = file.getName(); + subPackages.add(name); + logger.debug("found {} in {}", name, resource); + } + } + } + } else if ("jar".equals(resource.getProtocol())) { + final JarURLConnection jarURLConnection = (JarURLConnection) resource.openConnection(); + try (JarFile jarFile = jarURLConnection.getJarFile()) { + final Enumeration entries = jarFile.entries(); + while (entries.hasMoreElements()) { + final JarEntry entry = entries.nextElement(); + final String entryName = entry.getName(); + if (entryName.endsWith("/") && entryName.startsWith(path) && entryName.length() > path.length() + 1) { + final String name = entryName.substring(path.length() + 1, entryName.length() - 1); + if (name.indexOf('/') == -1) { + subPackages.add(name); + logger.debug("found {} in {}", name, resource); + } + } } } }