diff --git a/pf4j/pom.xml b/pf4j/pom.xml index dbedbbb..4f05a19 100644 --- a/pf4j/pom.xml +++ b/pf4j/pom.xml @@ -14,17 +14,17 @@ PF4J Plugin Framework for Java - - - - org.apache.maven.plugins - maven-compiler-plugin - - -proc:none - - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + + -proc:none + + + + @@ -32,6 +32,11 @@ slf4j-api 1.7.5 + + com.github.zafarkhaja + java-semver + 0.9.0 + junit junit diff --git a/pf4j/src/main/java/ro/fortsoft/pf4j/DefaultPluginManager.java b/pf4j/src/main/java/ro/fortsoft/pf4j/DefaultPluginManager.java index df73ad5..147ec3d 100644 --- a/pf4j/src/main/java/ro/fortsoft/pf4j/DefaultPluginManager.java +++ b/pf4j/src/main/java/ro/fortsoft/pf4j/DefaultPluginManager.java @@ -12,6 +12,8 @@ */ package ro.fortsoft.pf4j; +import com.github.zafarkhaja.semver.Version; +import com.github.zafarkhaja.semver.expr.Expression; import java.io.File; import java.io.FileFilter; import java.io.IOException; @@ -86,7 +88,7 @@ public class DefaultPluginManager implements PluginManager { /** * The system version used for comparisons to the plugin requires attribute. */ - private Version systemVersion = Version.ZERO; + private Version systemVersion = Version.forIntegers(0, 0, 0); private PluginFactory pluginFactory; private ExtensionFactory extensionFactory; @@ -587,7 +589,7 @@ public class DefaultPluginManager implements PluginManager { } } - return (version != null) ? Version.createVersion(version) : Version.ZERO; + return (version != null) ? Version.valueOf(version) : Version.forIntegers(0, 0, 0); } /** @@ -641,9 +643,9 @@ public class DefaultPluginManager implements PluginManager { } protected boolean isPluginValid(PluginWrapper pluginWrapper) { - Version requires = pluginWrapper.getDescriptor().getRequires(); + Expression requires = pluginWrapper.getDescriptor().getRequires(); Version system = getSystemVersion(); - if (system.isZero() || system.atLeast(requires)) { + if (requires.interpret(system)) { return true; } diff --git a/pf4j/src/main/java/ro/fortsoft/pf4j/ManifestPluginDescriptorFinder.java b/pf4j/src/main/java/ro/fortsoft/pf4j/ManifestPluginDescriptorFinder.java index ad5e426..3328782 100644 --- a/pf4j/src/main/java/ro/fortsoft/pf4j/ManifestPluginDescriptorFinder.java +++ b/pf4j/src/main/java/ro/fortsoft/pf4j/ManifestPluginDescriptorFinder.java @@ -12,6 +12,7 @@ */ package ro.fortsoft.pf4j; +import com.github.zafarkhaja.semver.Version; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -96,7 +97,7 @@ public class ManifestPluginDescriptorFinder implements PluginDescriptorFinder { if (StringUtils.isEmpty(version)) { throw new PluginException("Plugin-Version cannot be empty"); } - pluginDescriptor.setPluginVersion(Version.createVersion(version)); + pluginDescriptor.setPluginVersion(Version.valueOf(version)); String provider = attrs.getValue("Plugin-Provider"); pluginDescriptor.setProvider(provider); @@ -105,7 +106,7 @@ public class ManifestPluginDescriptorFinder implements PluginDescriptorFinder { String requires = attrs.getValue("Plugin-Requires"); if (StringUtils.isNotEmpty(requires)) { - pluginDescriptor.setRequires(Version.createVersion(requires)); + pluginDescriptor.setRequires(requires); } return pluginDescriptor; diff --git a/pf4j/src/main/java/ro/fortsoft/pf4j/PluginDependency.java b/pf4j/src/main/java/ro/fortsoft/pf4j/PluginDependency.java index e572e1a..2d1887e 100644 --- a/pf4j/src/main/java/ro/fortsoft/pf4j/PluginDependency.java +++ b/pf4j/src/main/java/ro/fortsoft/pf4j/PluginDependency.java @@ -12,38 +12,38 @@ */ package ro.fortsoft.pf4j; +import com.github.zafarkhaja.semver.Version; + /** * @author Decebal Suiu */ public class PluginDependency { - private String pluginId; - private Version pluginVersion; - - public PluginDependency(String dependency) { - /* - int index = dependency.indexOf(':'); - if (index == -1) { - throw new IllegalArgumentException("Illegal dependency specifier "+ dependency); - } - - this.pluginId = dependency.substring(0, index); - this.pluginVersion = Version.createVersion(dependency.substring(index + 1)); - */ - this.pluginId = dependency; - } - - public String getPluginId() { - return pluginId; - } - - public Version getPluginVersion() { - return pluginVersion; - } - - @Override - public String toString() { - return "PluginDependency [pluginId=" + pluginId + ", pluginVersion=" + pluginVersion + "]"; - } + private String pluginId; + private String pluginVersionSupport; + + public PluginDependency(String dependency) { + int index = dependency.indexOf('@'); + if (index == -1) { + this.pluginId = dependency; + } else { + + this.pluginId = dependency.substring(0, index); + this.pluginVersionSupport = dependency.substring(index + 1); + } + } + + public String getPluginId() { + return pluginId; + } + + public String getPluginVersionSupport() { + return pluginVersionSupport; + } + + @Override + public String toString() { + return "PluginDependency [pluginId=" + pluginId + ", pluginVersionSupport=" + pluginVersionSupport + "]"; + } } diff --git a/pf4j/src/main/java/ro/fortsoft/pf4j/PluginDescriptor.java b/pf4j/src/main/java/ro/fortsoft/pf4j/PluginDescriptor.java index 0721474..f469e7d 100644 --- a/pf4j/src/main/java/ro/fortsoft/pf4j/PluginDescriptor.java +++ b/pf4j/src/main/java/ro/fortsoft/pf4j/PluginDescriptor.java @@ -12,6 +12,11 @@ */ package ro.fortsoft.pf4j; +import com.github.zafarkhaja.semver.Parser; +import com.github.zafarkhaja.semver.Version; +import static com.github.zafarkhaja.semver.expr.CompositeExpression.Helper.gte; +import com.github.zafarkhaja.semver.expr.Expression; +import com.github.zafarkhaja.semver.expr.ExpressionParser; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -28,12 +33,12 @@ public class PluginDescriptor { private String pluginDescription; private String pluginClass; private Version version; - private Version requires; + private Expression requires; private String provider; private List dependencies; public PluginDescriptor() { - requires = Version.ZERO; + requires = gte("0.0.0"); // Any dependencies = new ArrayList<>(); } @@ -68,7 +73,7 @@ public class PluginDescriptor { /** * Returns the requires of this plugin. */ - public Version getRequires() { + public Expression getRequires() { return requires; } @@ -115,7 +120,12 @@ public class PluginDescriptor { this.provider = provider; } - void setRequires(Version requires) { + void setRequires(String requires) { + Parser parser = ExpressionParser.newInstance(); + this.requires = parser.parse(requires); + } + + void setRequires(Expression requires) { this.requires = requires; } diff --git a/pf4j/src/main/java/ro/fortsoft/pf4j/PluginManager.java b/pf4j/src/main/java/ro/fortsoft/pf4j/PluginManager.java index ca381d0..d889169 100644 --- a/pf4j/src/main/java/ro/fortsoft/pf4j/PluginManager.java +++ b/pf4j/src/main/java/ro/fortsoft/pf4j/PluginManager.java @@ -12,6 +12,7 @@ */ package ro.fortsoft.pf4j; +import com.github.zafarkhaja.semver.Version; import java.io.File; import java.util.List; import java.util.Set; diff --git a/pf4j/src/main/java/ro/fortsoft/pf4j/PropertiesPluginDescriptorFinder.java b/pf4j/src/main/java/ro/fortsoft/pf4j/PropertiesPluginDescriptorFinder.java index f009532..609987b 100644 --- a/pf4j/src/main/java/ro/fortsoft/pf4j/PropertiesPluginDescriptorFinder.java +++ b/pf4j/src/main/java/ro/fortsoft/pf4j/PropertiesPluginDescriptorFinder.java @@ -12,6 +12,7 @@ */ package ro.fortsoft.pf4j; +import com.github.zafarkhaja.semver.Version; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -92,7 +93,7 @@ public class PropertiesPluginDescriptorFinder implements PluginDescriptorFinder if (StringUtils.isEmpty(version)) { throw new PluginException("plugin.version cannot be empty"); } - pluginDescriptor.setPluginVersion(Version.createVersion(version)); + pluginDescriptor.setPluginVersion(Version.valueOf(version)); String provider = properties.getProperty("plugin.provider"); pluginDescriptor.setProvider(provider); diff --git a/pf4j/src/main/java/ro/fortsoft/pf4j/Version.java b/pf4j/src/main/java/ro/fortsoft/pf4j/Version.java deleted file mode 100644 index 842a37f..0000000 --- a/pf4j/src/main/java/ro/fortsoft/pf4j/Version.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright 2012 Decebal Suiu - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with - * the License. You may obtain a copy of the License in the LICENSE file, or 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 ro.fortsoft.pf4j; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import ro.fortsoft.pf4j.util.StringUtils; - -/** - * Version following semantic defined by Semantic Versioning document. - * Version identifiers have four components. - * - * 1. Major version. A non-negative integer. - * 2. Minor version. A non-negative integer. - * 3. Patch version. A non-negative integer. - * 4. Qualifier. A text string. - * - * This class is immutable. - * - * @author Decebal Suiu - */ -public class Version implements Comparable { - - public static final Version ZERO = new Version(0, 0, 0); - - private static final String FORMAT = "(\\d+)\\.(\\d+)(?:\\.)?(\\d*)(\\.|-|\\+)?([0-9A-Za-z-.]*)?"; - private static final Pattern PATTERN = Pattern.compile(FORMAT); - - private int major; - private int minor; - private int patch; - private String separator; - private String qualifier; - - public Version(int major, int minor, int patch) { - this.major = major; - this.minor = minor; - this.patch = patch; - } - - public Version(int major, int minor, int patch, String separator, String qualifier) { - this.major = major; - this.minor = minor; - this.patch = patch; - this.separator = separator; - this.qualifier = qualifier; - } - - public static Version createVersion(String version) { - Matcher matcher = PATTERN.matcher(version); - if (!matcher.matches()) { - throw new IllegalArgumentException("'" + version + "' does not match format '" + FORMAT + "'"); - } - - - - int major = Integer.valueOf(matcher.group(1)); - int minor = Integer.valueOf(matcher.group(2)); - int patch; - String patchMatch = matcher.group(3); - if (StringUtils.isNotEmpty(patchMatch)) { - patch = Integer.valueOf(patchMatch); - } else { - patch = 0; - } - String separator = matcher.group(4); - String qualifier = matcher.group(5); - - return new Version(major, minor, patch, separator, "".equals(qualifier) ? null : qualifier); - } - - public int getMajor() { - return this.major; - } - - public int getMinor() { - return this.minor; - } - - public int getPatch() { - return this.patch; - } - - public String getQualifier() { - return qualifier; - } - - @Override - public String toString() { - StringBuffer sb = new StringBuffer(50); - sb.append(major); - sb.append('.'); - sb.append(minor); - sb.append('.'); - sb.append(patch); - if (separator != null) { - sb.append(separator); - } - if (qualifier != null) { - sb.append(qualifier); - } - - return sb.toString(); - } - - @Override - public int compareTo(Version version) { - if (version.major > major) { - return 1; - } else if (version.major < major) { - return -1; - } - - if (version.minor > minor) { - return 1; - } else if (version.minor < minor) { - return -1; - } - - if (version.patch > patch) { - return 1; - } else if (version.patch < patch) { - return -1; - } - - return 0; - } - - public boolean isZero() { - return compareTo(ZERO) == 0; - } - - public boolean atLeast(Version v) { - return compareTo(v) <= 0; - } - - public boolean exceeds(Version v) { - return compareTo(v) > 0; - } - - // for test only - public static void main(String[] args) { - Version v = Version.createVersion("1.2.3-SNAPSHOT"); - System.out.println(v.toString()); - Version v1 = Version.createVersion("4.1.0"); - System.out.println(v1.toString()); - Version v2 = Version.createVersion("4.0.32"); - System.out.println(v2.toString()); - System.out.println(v1.compareTo(v2)); - } - -}