diff --git a/bundles/org.eclipse.passage.lic.api/META-INF/MANIFEST.MF b/bundles/org.eclipse.passage.lic.api/META-INF/MANIFEST.MF
index 869a7842d..c10ada2c6 100644
--- a/bundles/org.eclipse.passage.lic.api/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.passage.lic.api/META-INF/MANIFEST.MF
@@ -22,6 +22,7 @@ Export-Package: org.eclipse.passage.lic.api,
org.eclipse.passage.loc.products.ui,
org.eclipse.passage.loc.users.ui,
org.eclipse.passage.loc.api",
+ org.eclipse.passage.lic.internal.api.conditions;x-internal:=true,
org.eclipse.passage.lic.internal.api.registry;x-internal:=true,
org.eclipse.passage.lic.internal.api.requirements;x-internal:=true,
org.eclipse.passage.lic.internal.api.restrictions;x-internal:=true
diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/api/conditions/LicensingCondition.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/api/conditions/LicensingCondition.java
index c3eac25d6..f2bdb9f10 100644
--- a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/api/conditions/LicensingCondition.java
+++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/api/conditions/LicensingCondition.java
@@ -17,72 +17,76 @@
import org.eclipse.passage.lic.api.access.PermissionEmitter;
/**
- * Defines the set of terms under which the identified {@code Feature} can be used.
- * to be evaluated by {@link PermissionEmitter}
+ * Defines the set of terms under which the identified {@code Feature} can be
+ * used. to be evaluated by {@link PermissionEmitter}
* Obtained from {@link ConditionMiner}
*
+ * @deprecated use {@linkplain Condition} instead
* @since 0.5.0
*/
+@Deprecated
public interface LicensingCondition {
- /**
- * Returns unique identifier of a feature under licensing.
- *
- * @return feature identifier
- * @since 0.5.0
- */
+ /**
+ * Returns unique identifier of a feature under licensing.
+ *
+ * @return feature identifier
+ * @since 0.5.0
+ */
String getFeatureIdentifier();
- /**
- * Returns descriptor of the feature version allowed by this licensing condition.
- *
- * @return version descriptor
- * @since 0.5.0
- */
+ /**
+ * Returns descriptor of the feature version allowed by this licensing
+ * condition.
+ *
+ * @return version descriptor
+ * @since 0.5.0
+ */
String getMatchVersion();
- /**
- * Returns rule of version matching, like "perfect match" or "equal or greater".
- *
- * @return match rule
- * @since 0.5.0
- */
+ /**
+ * Returns rule of version matching, like "perfect match" or "equal or greater".
+ *
+ * @return match rule
+ * @since 0.5.0
+ */
String getMatchRule();
- /**
- * Returns the validity period start date of this licensing condition. This is
- * the value of its "validFrom"
attribute.
- *
- * @return the valid from
- * @since 0.5.0
- */
+ /**
+ * Returns the validity period start date of this licensing condition. This is
+ * the value of its "validFrom"
attribute.
+ *
+ * @return the valid from
+ * @since 0.5.0
+ */
Date getValidFrom();
- /**
- * Returns the validity period end date of this licensing condition. This is the
- * value of its "validUntil"
attribute.
- *
- * @return the valid until
- * @since 0.5.0
- */
+ /**
+ * Returns the validity period end date of this licensing condition. This is the
+ * value of its "validUntil"
attribute.
+ *
+ * @return the valid until
+ * @since 0.5.0
+ */
Date getValidUntil();
- /**
- * The type of condition like "time" or "hardware".
- * Defines the way the condition will be evaluated in a running environment.
- *
- * @return condition type
- * @since 0.5.0
- */
+ /**
+ * The type of condition like "time" or "hardware". Defines the way the
+ * condition will be evaluated in a running environment.
+ *
+ * @return condition type
+ * @since 0.5.0
+ */
String getConditionType();
- /**
- * Returns additional data encoded in a single string value.
- * The expression is utilized by {@link PermissionEmitter} in conjunction with {@code conditionType}
- *
- * @return enlistment of additional information of this licencing condition
- * @see PermissionEmitter
- * @see #getConditionType
- * @since 0.5.0
- */
+ /**
+ * Returns additional data encoded in a single string value. The expression is
+ * utilized by {@link PermissionEmitter} in conjunction with
+ * {@code conditionType}
+ *
+ * @return enlistment of additional information of this licensing condition
+ * @see PermissionEmitter
+ * @see #getConditionType
+ * @since 0.5.0
+ */
String getConditionExpression();
}
diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/Condition.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/Condition.java
new file mode 100644
index 000000000..8686f6781
--- /dev/null
+++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/Condition.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2020 ArSysOp
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * https://www.eclipse.org/legal/epl-2.0/.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * ArSysOp - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.passage.lic.internal.api.conditions;
+
+/**
+ *
+ * Regarding each feature under licensing there is a series of statements in a + * license of some kind. + *
+ *+ * These statements demands the feature to be used under curtain + * {@code condition}s, such as "only version older than 2.14.1 on a workstation + * under Windows OS with hard disk of serial AB0123C4DEFJHI and only for two + * years starting from the 1st of May, 2020." {@code Condition} represents such + * a bundle of demands. + *
+ */ +public interface Condition { + + /** + * @return unique identifier of a feature under licensing. + */ + String feature(); + + /** + * Define the actual {@code version} representing string that has been mined in + * the scope of this condition (typically from license of sorts). + * + * @see VersionMatch + */ + VersionMatch versionMatch(); + + /** + * Period of this condition applicability. + * + * @see ValidityPeriod + */ + ValidityPeriod validityPeriod(); + + /** + *+ * Defined how exactly the condition is to be evaluates. + *
+ *+ * Type of a license dictates how Passage can evaluate the condition (check if + * all it's demands are met). For example, "hardware" license requires examining + * of the actual workstation hardware. + *
+ * + * @see EvaluationInstructions + */ + EvaluationInstructions evaluationInstructions(); +} diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/EvaluationInstructions.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/EvaluationInstructions.java new file mode 100644 index 000000000..82e981a68 --- /dev/null +++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/EvaluationInstructions.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * Copyright (c) 2020 ArSysOp + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * https://www.eclipse.org/legal/epl-2.0/. + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * ArSysOp - initial API and implementation + *******************************************************************************/ +package org.eclipse.passage.lic.internal.api.conditions; + +/** + *+ * Condition definition contains sufficient amount of instructions on how + * exactly can we say if this condition is satisfied or not. + *
+ *+ * For example, condition of {@code hardware} type requires actual workstation + * hardware evaluation and assessing it against condition's expectations. These + * ones can demand particular hardware part of have predefined serial id. + *
+ */ +public interface EvaluationInstructions { + + /** + * Meta classifier of the way this condition can be evaluated + * + * @see EvaluationType + */ + EvaluationType type(); + + /** + * Precise data for evaluation. Each evaluation type can expect it's own format + * here. + * + * @return raw string mined from a license + */ + String expression(); + +} diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/EvaluationType.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/EvaluationType.java new file mode 100644 index 000000000..4c0d8adbf --- /dev/null +++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/EvaluationType.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * Copyright (c) 2020 ArSysOp + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * https://www.eclipse.org/legal/epl-2.0/. + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * ArSysOp - initial API and implementation + *******************************************************************************/ +package org.eclipse.passage.lic.internal.api.conditions; + +import java.util.Objects; + +/** + *+ * Defines the way the condition will be evaluated in a running environment. For + * example, "hardware" means that specially dedicated module is going to access + * a workstation hardware in order to supply enough information to verify if the + * condition is met. + *
+ *+ * Designed to be a data-class. + *
+ */ +public abstract class EvaluationType { + + private final String identifier; + + protected EvaluationType(String identifier) { + Objects.requireNonNull(identifier, "Identifier is mandatory for condition type"); //$NON-NLS-1$ + this.identifier = identifier.trim().toLowerCase(); + } + + public final String identifier() { + return identifier; + } + + @Override + public final int hashCode() { + return Objects.hash(identifier()); + } + + @Override + public final boolean equals(Object object) { + if (!EvaluationType.class.isInstance(object)) { + return false; + } + return identifier.equals(((EvaluationType) object).identifier); + } + + @Override + public final String toString() { + return identifier; + } + + public static final class Hardware extends EvaluationType { + + public Hardware() { + super("hardware"); //$NON-NLS-1$ + } + + } + + public static final class Of extends EvaluationType { + + public Of(String identifier) { + super(identifier); + } + + } + +} diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/MatchingRule.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/MatchingRule.java new file mode 100644 index 000000000..bf5f38a2d --- /dev/null +++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/MatchingRule.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2020 ArSysOp + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * https://www.eclipse.org/legal/epl-2.0/. + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * ArSysOp - initial API and implementation + *******************************************************************************/ +package org.eclipse.passage.lic.internal.api.conditions; + +import org.eclipse.passage.lic.internal.api.requirements.Requirement; + +/** + *+ * Defines the way a two strings can be matched. + *
+ *+ * In scope of condition evaluation we find out if version comes from + * {@linkplain Requirement} ({@code required}) {@code match} to version + * definition string that comes from a license of source through + * {@linkplain Condition} ({@code allowed}). + *
+ *+ * For example {@code perfect match} match rule would mean absolute equality. + *
+ * + * @see VersionMatch + * @see Condition + */ +public abstract interface MatchingRule { + + /** + * Descriptive identifier of a rule. + * + * @return + */ + String identifier(); + + /** + * Find out if the {@code required} ({@code actual}) string {@code matches} with + * the {@code allowed} one ({@code expected}). + */ + boolean match(String required, String allowed); + +} diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/ValidityPeriod.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/ValidityPeriod.java new file mode 100644 index 000000000..b6cdddf9b --- /dev/null +++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/ValidityPeriod.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2020 ArSysOp + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * https://www.eclipse.org/legal/epl-2.0/. + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * ArSysOp - initial API and implementation + *******************************************************************************/ +package org.eclipse.passage.lic.internal.api.conditions; + +import java.util.Date; + +/** + * Time period in which {@code Condition} is valid. + */ +public interface ValidityPeriod { + + /** + * Check if the given {@code date} belongs to the validity period. + * + * @param not null date to be checked if it belongs to the period of validity or + * not + * @return {@code true} if date is valid and {@code false} otherwise + */ + boolean valid(Date date); + +} diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/VersionMatch.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/VersionMatch.java new file mode 100644 index 000000000..ba2365b34 --- /dev/null +++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/VersionMatch.java @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2020 ArSysOp + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * https://www.eclipse.org/legal/epl-2.0/. + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * ArSysOp - initial API and implementation + *******************************************************************************/ +package org.eclipse.passage.lic.internal.api.conditions; + +/** + * + *+ * Part of licensing {@linkplain Condition} that declares license demands + * regarding the feature version. + *
+ *+ * This way or another a license defines which version of a feature is allowed + * to use. It also defines how far from this specified version can be the + * actual version of the feature that is found at runtime. + *
+ *+ * The class aggregates both data (a string describing version demands) + * and algorithmic (knowing how to match couple of version-supplying + * strings) parts. + *
+ * + * @see Condition + * @see MatchingRule + */ +public interface VersionMatch { + + /** + * @return {@code version} definition string, can contain wild cards like + * {@code 1.12.*} meaning any build of version {@code 1.12} + */ + String version(); + + /** + * @return rule of version matching, like "perfect match" or "equal or greater". + * @see MatchingRule + */ + MatchingRule rule(); + +} diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/package-info.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/package-info.java new file mode 100644 index 000000000..561b5aa98 --- /dev/null +++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/package-info.java @@ -0,0 +1,24 @@ +/* ***************************************************************************** + * Copyright (c) 2020 ArSysOp + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * https://www.eclipse.org/legal/epl-2.0/. + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * ArSysOp - initial API and implementation + *******************************************************************************/ + +/** + *+ * Here we cover condition mining phase of access cycle. + *
+ *+ * {@code null}-free zone: no interface or class is intended to receive or + * return {@code null}. Implementations must extend and satisfy the + * corresponding contract tests. + *
+ */ +package org.eclipse.passage.lic.internal.api.conditions; \ No newline at end of file diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/restrictions/RestrictionLevel.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/restrictions/RestrictionLevel.java index e9c4141a3..c866d33bd 100644 --- a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/restrictions/RestrictionLevel.java +++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/restrictions/RestrictionLevel.java @@ -24,8 +24,6 @@ */ public abstract class RestrictionLevel { - // FIXME: to be used further - // private final String meta = "licensing.restriction.level"; //$NON-NLS-1$ private final String identifier; protected RestrictionLevel(String identifier) {