]> source.dussan.org Git - pf4j.git/commitdiff
Improve VersionManager (prepare pf4j-update release)
authorDecebal Suiu <decebal.suiu@gmail.com>
Sat, 27 Jan 2018 18:22:06 +0000 (20:22 +0200)
committerDecebal Suiu <decebal.suiu@gmail.com>
Sat, 27 Jan 2018 18:22:06 +0000 (20:22 +0200)
pf4j/src/main/java/org/pf4j/AbstractPluginManager.java
pf4j/src/main/java/org/pf4j/DefaultVersionManager.java
pf4j/src/main/java/org/pf4j/DependencyResolver.java
pf4j/src/main/java/org/pf4j/VersionManager.java
pf4j/src/test/java/org/pf4j/DefaultVersionManagerTest.java
pf4j/src/test/java/org/pf4j/ManifestPluginDescriptorFinderTest.java
pf4j/src/test/java/org/pf4j/PropertiesPluginDescriptorFinderTest.java

index 9f3471e9697abee3ee27988a60e73aa9cc17d7af..f24799849086c0d32069d8ac7f4b9e1530bdddd2 100644 (file)
@@ -186,11 +186,9 @@ public abstract class AbstractPluginManager implements PluginManager {
 
         try {
             PluginWrapper pluginWrapper = loadPluginFromPath(pluginPath);
-            // TODO uninstalled plugin dependencies?
-            getUnresolvedPlugins().remove(pluginWrapper);
-            getResolvedPlugins().add(pluginWrapper);
 
-            firePluginStateEvent(new PluginStateEvent(this, pluginWrapper, null));
+            // try to resolve  the loaded plugin together with other possible plugins that depend on this plugin
+            resolvePlugins();
 
             return pluginWrapper.getDescriptor().getPluginId();
         } catch (PluginException e) {
@@ -224,7 +222,6 @@ public abstract class AbstractPluginManager implements PluginManager {
         log.debug("Found {} possible plugins: {}", pluginPaths.size(), pluginPaths);
 
         // load plugins from plugin paths
-        // TODO
         for (Path pluginPath : pluginPaths) {
             try {
                 loadPluginFromPath(pluginPath);
@@ -233,7 +230,7 @@ public abstract class AbstractPluginManager implements PluginManager {
             }
         }
 
-        // resolve 'unresolvedPlugins'
+        // resolve plugins
         try {
             resolvePlugins();
         } catch (PluginException e) {
@@ -739,7 +736,7 @@ public abstract class AbstractPluginManager implements PluginManager {
             // If exact versions are not allowed in requires, rewrite to >= expression
             requires = ">=" + requires;
         }
-        if (systemVersion.equals("0.0.0") || versionManager.satisfies(requires, systemVersion)) {
+        if (systemVersion.equals("0.0.0") || versionManager.checkVersionConstraint(systemVersion, requires)) {
             return true;
         }
 
@@ -757,9 +754,9 @@ public abstract class AbstractPluginManager implements PluginManager {
     }
 
     protected void resolvePlugins() throws PluginException {
-        // retrieves the  plugins descriptors from "unresolvedPlugins" list
+        // retrieves the  plugins descriptors
         List<PluginDescriptor> descriptors = new ArrayList<>();
-        for (PluginWrapper plugin : unresolvedPlugins) {
+        for (PluginWrapper plugin : plugins.values()) {
             descriptors.add(plugin.getDescriptor());
         }
 
@@ -784,9 +781,10 @@ public abstract class AbstractPluginManager implements PluginManager {
         // move plugins from "unresolved" to "resolved"
         for (String pluginId : sortedPlugins) {
             PluginWrapper pluginWrapper = plugins.get(pluginId);
-            unresolvedPlugins.remove(pluginWrapper);
-            resolvedPlugins.add(pluginWrapper);
-            log.info("Plugin '{}' resolved", getPluginLabel(pluginWrapper.getDescriptor()));
+            if (unresolvedPlugins.remove(pluginWrapper)) {
+                resolvedPlugins.add(pluginWrapper);
+                log.info("Plugin '{}' resolved", getPluginLabel(pluginWrapper.getDescriptor()));
+            }
         }
     }
 
@@ -918,6 +916,7 @@ public abstract class AbstractPluginManager implements PluginManager {
 
     /**
      * The plugin label is used in logging and it's a string in format {@code pluginId@pluginVersion}.
+     *
      * @param pluginDescriptor
      * @return
      */
index 96adf5639ab96c9cff77cb0713468b3cd3c0aa2f..5ce6135a7d319c12afbf200c3ce49ccf9e560b65 100644 (file)
@@ -16,6 +16,8 @@
 package org.pf4j;
 
 import com.github.zafarkhaja.semver.Version;
+import com.github.zafarkhaja.semver.expr.Expression;
+import org.pf4j.util.StringUtils;
 
 /**
  * Default implementation for {@link VersionManager}.
@@ -25,9 +27,24 @@ import com.github.zafarkhaja.semver.Version;
  */
 public class DefaultVersionManager implements VersionManager {
 
+    /**
+     * Checks if a version satisfies the specified SemVer {@link Expression} string.
+     * If the constraint is empty or null then the method returns true.
+     * Constraint examples: {@code >2.0.0} (simple), {@code ">=1.4.0 & <1.6.0"} (range).
+     * See https://github.com/zafarkhaja/jsemver#semver-expressions-api-ranges for more info.
+     *
+     * @param version
+     * @param constraint
+     * @return
+     */
     @Override
-    public boolean satisfies(String constraint, String version) {
-        return Version.valueOf(version).satisfies(constraint);
+    public boolean checkVersionConstraint(String version, String constraint) {
+        return StringUtils.isNullOrEmpty(constraint) || Version.valueOf(version).satisfies(constraint);
+    }
+
+    @Override
+    public int compareVersions(String v1, String v2) {
+        return Version.valueOf(v1).compareTo(Version.valueOf(v2));
     }
 
 }
index 05e8d1143da13db314850396c8ff336a77e15e00..215a4331b5f631f9893e22e71bd8062c3e290325 100644 (file)
@@ -133,7 +133,7 @@ public class DependencyResolver {
      * @return
      */
     protected boolean checkDependencyVersion(String requiredVersion, String existingVersion) {
-        return versionManager.satisfies(requiredVersion, existingVersion);
+        return versionManager.checkVersionConstraint(existingVersion, requiredVersion);
     }
 
     private void addPlugin(PluginDescriptor descriptor) {
index ae9187b378f2104db19c8d1c9cf5985ae43ae8e2..855afeae2287773d81e505304a4d4613d13d95fd 100644 (file)
@@ -15,6 +15,8 @@
  */
 package org.pf4j;
 
+import java.util.Comparator;
+
 /**
  * Manager responsible for versions of plugins.
  *
@@ -24,11 +26,20 @@ public interface VersionManager {
 
     /**
      * Check if a {@code constraint} and a {@code version} match.
+     * A possible constrain can be {@code >=1.0.0 & <2.0.0}.
      *
-     * @param constraint
      * @param version
+     * @param constraint
      * @return
      */
-    boolean satisfies(String constraint, String version);
+    boolean checkVersionConstraint(String version, String constraint);
+
+    /**
+     * Compare two versions. It's similar with {@link Comparator#compare(Object, Object)}.
+     *
+     * @param v1
+     * @param v2
+     */
+    int compareVersions(String v1, String v2);
 
 }
index aaa5fa9696dc37ecf57999455123bc53ba894e6f..68a75a88ce3d5d69ceddb74189af430b017f2679 100644 (file)
@@ -34,19 +34,24 @@ public class DefaultVersionManagerTest {
     }
 
     @Test
-    public void satisfies() {
-        assertFalse(versionManager.satisfies(">2.0.0", "1.4.3")); // simple
-        assertTrue(versionManager.satisfies(">=1.4.0 & <1.6.0", "1.4.3")); // range
+    public void checkVersionConstraint() {
+        assertFalse(versionManager.checkVersionConstraint("1.4.3", ">2.0.0")); // simple
+        assertTrue(versionManager.checkVersionConstraint("1.4.3", ">=1.4.0 & <1.6.0")); // range
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void nullOrEmptyVersion() {
-        assertFalse(versionManager.satisfies(">2.0.0", null));
+        assertFalse(versionManager.checkVersionConstraint(null, ">2.0.0"));
     }
 
     @Test(expected = ParseException.class)
     public void invalidVersion() {
-        assertFalse(versionManager.satisfies(">2.0.0", "1.0"));
+        assertFalse(versionManager.checkVersionConstraint("1.0", ">2.0.0"));
+    }
+
+    @Test
+    public void compareVersions() {
+        assertTrue(versionManager.compareVersions("1.1.0", "1.0.0") > 0);
     }
 
 }
index fcd00350b6e2ac194246739ef49c91f99a4bd38f..c073c88dcc3330025b5c616b144f4ffab15a796f 100644 (file)
@@ -93,7 +93,7 @@ public class ManifestPluginDescriptorFinderTest {
         assertEquals("test-plugin-3", plugin1.getDependencies().get(1).getPluginId());
         assertEquals("~1.0", plugin1.getDependencies().get(1).getPluginVersionSupport());
         assertEquals("Apache-2.0", plugin1.getLicense());
-        assertTrue(versionManager.satisfies(plugin1.getRequires(), "1.0.0"));
+        assertTrue(versionManager.checkVersionConstraint("1.0.0", plugin1.getRequires()));
 
         assertEquals("test-plugin-2", plugin2.getPluginId());
         assertEquals("", plugin2.getPluginDescription());
@@ -101,7 +101,7 @@ public class ManifestPluginDescriptorFinderTest {
         assertEquals("0.0.1", plugin2.getVersion());
         assertEquals("Decebal Suiu", plugin2.getProvider());
         assertEquals(0, plugin2.getDependencies().size());
-        assertTrue(versionManager.satisfies(plugin2.getRequires(), "1.0.0"));
+        assertTrue(versionManager.checkVersionConstraint("1.0.0", plugin2.getRequires()));
     }
 
     /**
index a3e3c683bf20c072084b63ad6a99f2692fc4854b..cf36b4f901886cf814585e683d8c05023b00a4b7 100644 (file)
@@ -83,8 +83,8 @@ public class PropertiesPluginDescriptorFinderTest {
         assertEquals("~1.0", plugin1.getDependencies().get(1).getPluginVersionSupport());
         assertEquals("Apache-2.0", plugin1.getLicense());
         assertEquals(">=1", plugin1.getRequires());
-        assertTrue(versionManager.satisfies(plugin1.getRequires(), "1.0.0"));
-        assertFalse(versionManager.satisfies(plugin1.getRequires(), "0.1.0"));
+        assertTrue(versionManager.checkVersionConstraint("1.0.0", plugin1.getRequires()));
+        assertFalse(versionManager.checkVersionConstraint("0.1.0", plugin1.getRequires()));
 
         assertEquals("test-plugin-2", plugin2.getPluginId());
         assertEquals("", plugin2.getPluginDescription());
@@ -93,7 +93,7 @@ public class PropertiesPluginDescriptorFinderTest {
         assertEquals("Decebal Suiu", plugin2.getProvider());
         assertEquals(0, plugin2.getDependencies().size());
         assertEquals("*", plugin2.getRequires()); // Default is *
-        assertTrue(versionManager.satisfies(plugin2.getRequires(), "1.0.0"));
+        assertTrue(versionManager.checkVersionConstraint("1.0.0", plugin2.getRequires()));
     }
 
     @Test(expected = PluginException.class)