]> source.dussan.org Git - pf4j.git/commitdiff
Add support for reading plugin descriptor from zip
authordsuiu <dsuiu@modernsystems.com>
Sat, 27 Nov 2021 20:00:59 +0000 (22:00 +0200)
committerdsuiu <dsuiu@modernsystems.com>
Sat, 27 Nov 2021 20:00:59 +0000 (22:00 +0200)
pf4j/src/main/java/org/pf4j/ManifestPluginDescriptorFinder.java
pf4j/src/main/java/org/pf4j/PropertiesPluginDescriptorFinder.java
pf4j/src/main/java/org/pf4j/util/FileUtils.java

index 650b2d712b436787e2a785e61510911e0a9af9c9..7425b9d5a93355bfd88c21ef2fd4eb039279d3f0 100644 (file)
@@ -27,6 +27,8 @@ import java.nio.file.Path;
 import java.util.jar.Attributes;
 import java.util.jar.JarFile;
 import java.util.jar.Manifest;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
 
 /**
  * Read the plugin descriptor from the manifest file.
@@ -48,7 +50,7 @@ public class ManifestPluginDescriptorFinder implements PluginDescriptorFinder {
 
     @Override
     public boolean isApplicable(Path pluginPath) {
-        return Files.exists(pluginPath) && (Files.isDirectory(pluginPath) || FileUtils.isJarFile(pluginPath));
+        return Files.exists(pluginPath) && (Files.isDirectory(pluginPath) || FileUtils.isZipOrJarFile(pluginPath));
     }
 
     @Override
@@ -60,40 +62,14 @@ public class ManifestPluginDescriptorFinder implements PluginDescriptorFinder {
 
     protected Manifest readManifest(Path pluginPath) {
         if (FileUtils.isJarFile(pluginPath)) {
-            try (JarFile jar = new JarFile(pluginPath.toFile())) {
-                Manifest manifest = jar.getManifest();
-                if (manifest != null) {
-                    return manifest;
-                }
-            } catch (IOException e) {
-                throw new PluginRuntimeException(e);
-            }
-        }
-
-        Path manifestPath = getManifestPath(pluginPath);
-        if (manifestPath == null) {
-            throw new PluginRuntimeException("Cannot find the manifest path");
-        }
-
-        log.debug("Lookup plugin descriptor in '{}'", manifestPath);
-        if (Files.notExists(manifestPath)) {
-            throw new PluginRuntimeException("Cannot find '{}' path", manifestPath);
+            return readManifestFromJar(pluginPath);
         }
 
-        try (InputStream input = Files.newInputStream(manifestPath)) {
-            return new Manifest(input);
-        } catch (IOException e) {
-            throw new PluginRuntimeException(e);
-        }
-    }
-
-    protected Path getManifestPath(Path pluginPath) {
-        if (Files.isDirectory(pluginPath)) {
-            // legacy (the path is something like "classes/META-INF/MANIFEST.MF")
-            return FileUtils.findFile(pluginPath,"MANIFEST.MF");
+        if (FileUtils.isZipFile(pluginPath)) {
+            return readManifestFromZip(pluginPath);
         }
 
-        return null;
+        return readManifestFromDirectory(pluginPath);
     }
 
     protected PluginDescriptor createPluginDescriptor(Manifest manifest) {
@@ -140,4 +116,42 @@ public class ManifestPluginDescriptorFinder implements PluginDescriptorFinder {
         return new DefaultPluginDescriptor();
     }
 
+    protected Manifest readManifestFromJar(Path jarPath) {
+        try (JarFile jar = new JarFile(jarPath.toFile())) {
+            return jar.getManifest();
+        } catch (IOException e) {
+            throw new PluginRuntimeException(e, "Cannot read manifest from {}", jarPath);
+        }
+    }
+
+    protected Manifest readManifestFromZip(Path zipPath) {
+        try (ZipFile zip = new ZipFile(zipPath.toFile())) {
+            ZipEntry manifestEntry = zip.getEntry("classes/META-INF/MANIFEST.MF");
+            try (InputStream manifestInput = zip.getInputStream(manifestEntry)) {
+                return new Manifest(manifestInput);
+            }
+        } catch (IOException e) {
+            throw new PluginRuntimeException(e, "Cannot read manifest from {}", zipPath);
+        }
+    }
+
+    protected Manifest readManifestFromDirectory(Path pluginPath) {
+        // legacy (the path is something like "classes/META-INF/MANIFEST.MF")
+        Path manifestPath = FileUtils.findFile(pluginPath,"MANIFEST.MF");
+        if (manifestPath == null) {
+            throw new PluginRuntimeException("Cannot find the manifest path");
+        }
+
+        log.debug("Lookup plugin descriptor in '{}'", manifestPath);
+        if (Files.notExists(manifestPath)) {
+            throw new PluginRuntimeException("Cannot find '{}' path", manifestPath);
+        }
+
+        try (InputStream input = Files.newInputStream(manifestPath)) {
+            return new Manifest(input);
+        } catch (IOException e) {
+            throw new PluginRuntimeException(e, "Cannot read manifest from {}", pluginPath);
+        }
+    }
+
 }
index 303b662c7c577d366c1c8b48055249e61131447a..a04d2683e8ca5103aca17af813711741e6febafa 100644 (file)
@@ -59,7 +59,7 @@ public class PropertiesPluginDescriptorFinder implements PluginDescriptorFinder
 
     @Override
     public boolean isApplicable(Path pluginPath) {
-        return Files.exists(pluginPath) && (Files.isDirectory(pluginPath) || FileUtils.isJarFile(pluginPath));
+        return Files.exists(pluginPath) && (Files.isDirectory(pluginPath) || FileUtils.isZipOrJarFile(pluginPath));
     }
 
     @Override
@@ -97,13 +97,13 @@ public class PropertiesPluginDescriptorFinder implements PluginDescriptorFinder
     protected Path getPropertiesPath(Path pluginPath, String propertiesFileName) {
         if (Files.isDirectory(pluginPath)) {
             return pluginPath.resolve(Paths.get(propertiesFileName));
-        } else {
-            // it's a jar file
-            try {
-                return FileUtils.getPath(pluginPath, propertiesFileName);
-            } catch (IOException e) {
-                throw new PluginRuntimeException(e);
-            }
+        }
+
+        // it's a zip or jar file
+        try {
+            return FileUtils.getPath(pluginPath, propertiesFileName);
+        } catch (IOException e) {
+            throw new PluginRuntimeException(e);
         }
     }
 
index 0edcf97a71162a87c9f60685b950556eb6c2c7af..285a280cf79d8e39405a0c5ec3a23ef378f7cc1b 100644 (file)
@@ -217,9 +217,19 @@ public final class FileUtils {
         return Files.isRegularFile(path) && path.toString().toLowerCase().endsWith(".jar");
     }
 
+    /**
+     * Return true only if path is a jar or zip file.
+     *
+     * @param path to a file/dir
+     * @return true if file ending in {@code .zip} or {@code .jar}
+     */
+    public static boolean isZipOrJarFile(Path path) {
+        return isZipFile(path) || isJarFile(path);
+    }
+
     public static Path getPath(Path path, String first, String... more) throws IOException {
         URI uri = path.toUri();
-        if (isJarFile(path)) {
+        if (isZipOrJarFile(path)) {
             String pathString = path.toAbsolutePath().toString();
             // transformation for Windows OS
             pathString = StringUtils.addStart(pathString.replace("\\", "/"), "/");