diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/api/access/PermissionEmitterRegistry.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/api/access/PermissionEmitterRegistry.java
index 8c7be401b..47aba86f5 100644
--- a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/api/access/PermissionEmitterRegistry.java
+++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/api/access/PermissionEmitterRegistry.java
@@ -12,13 +12,13 @@
*******************************************************************************/
package org.eclipse.passage.lic.api.access;
-import org.eclipse.passage.lic.internal.api.conditions.evaluation.EmittedPermissionsRegistry;
+import org.eclipse.passage.lic.internal.api.conditions.evaluation.PermissionEmittersRegistry;
/**
* Takes care of all {@link PermissionEmitter} services registered at runtime.
*
* @since 0.4.0
- * @deprecated use {@link EmittedPermissionsRegistry}
+ * @deprecated use {@link PermissionEmittersRegistry}
*/
@Deprecated
public interface PermissionEmitterRegistry {
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
index 1ad816e5d..3848df1aa 100644
--- 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
@@ -14,6 +14,8 @@
import java.util.Objects;
+import org.eclipse.passage.lic.internal.api.registry.ServiceId;
+
/**
*
* Defines the way the condition will be evaluated in a running environment. For
@@ -25,7 +27,7 @@
* Designed to be a data-class.
*
*/
-public abstract class EvaluationType {
+public abstract class EvaluationType implements ServiceId {
private final String identifier;
diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/Emission.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/Emission.java
index 69a50b9aa..a80bacd19 100644
--- a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/Emission.java
+++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/Emission.java
@@ -13,6 +13,7 @@
package org.eclipse.passage.lic.internal.api.conditions.evaluation;
import java.util.Collection;
+import java.util.Objects;
/**
* Report {@linkplain Condition}s evaluation results.
@@ -51,6 +52,7 @@ public static final class Successful implements Emission {
private final Collection permissions;
public Successful(Collection permissions) {
+ Objects.requireNonNull(permissions, "Emission.Successful::permissions"); //$NON-NLS-1$
this.permissions = permissions;
}
@@ -76,6 +78,7 @@ public static final class Failed implements Emission {
private final EmissionFailureDiagnostic diagnose;
public Failed(EmissionFailureDiagnostic diagnose) {
+ Objects.requireNonNull(diagnose, "Emission.Failed::diagnose"); //$NON-NLS-1$
this.diagnose = diagnose;
}
diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionEvaluationService.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionEvaluationService.java
new file mode 100644
index 000000000..935f1cfed
--- /dev/null
+++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionEvaluationService.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * 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.evaluation;
+
+import org.eclipse.passage.lic.internal.api.registry.Service;
+
+public interface ExpressionEvaluationService extends Service {
+
+ boolean evaluate(ParsedExpression expression, ExpressionTokenAssessmentService assessor);
+
+}
diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionEvaluatorsRegistry.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionEvaluatorsRegistry.java
new file mode 100644
index 000000000..88ecb514e
--- /dev/null
+++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionEvaluatorsRegistry.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * 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.evaluation;
+
+import java.util.function.Supplier;
+
+import org.eclipse.passage.lic.internal.api.registry.Registry;
+
+public interface ExpressionEvaluatorsRegistry
+ extends Supplier> {
+
+}
diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionParsingException.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionParsingException.java
new file mode 100644
index 000000000..caa25c2a3
--- /dev/null
+++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionParsingException.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * 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.evaluation;
+
+@SuppressWarnings("serial")
+public final class ExpressionParsingException extends Exception {
+
+ public ExpressionParsingException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public ExpressionParsingException(String message) {
+ super(message);
+ }
+
+}
diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionPasringRegistry.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionPasringRegistry.java
new file mode 100644
index 000000000..cba61958a
--- /dev/null
+++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionPasringRegistry.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * 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.evaluation;
+
+import java.util.function.Supplier;
+
+import org.eclipse.passage.lic.internal.api.registry.Registry;
+
+public interface ExpressionPasringRegistry extends Supplier> {
+
+}
diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionPasringService.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionPasringService.java
new file mode 100644
index 000000000..e3281388b
--- /dev/null
+++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionPasringService.java
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * 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.evaluation;
+
+import org.eclipse.passage.lic.internal.api.registry.Service;
+
+public interface ExpressionPasringService extends Service {
+
+ ParsedExpression parsed(String expression) throws ExpressionParsingException;
+
+}
diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionProtocol.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionProtocol.java
new file mode 100644
index 000000000..8e7fb8b33
--- /dev/null
+++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionProtocol.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * 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.evaluation;
+
+import java.util.Objects;
+
+import org.eclipse.passage.lic.internal.api.registry.ServiceId;
+
+public abstract class ExpressionProtocol implements ServiceId {
+
+ private final String identifier;
+
+ protected ExpressionProtocol(String identifier) {
+ Objects.requireNonNull(identifier, "ExpressionProtocol::identifier"); //$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 (!ExpressionProtocol.class.isInstance(object)) {
+ return false;
+ }
+ return identifier.equals(((ExpressionProtocol) object).identifier);
+ }
+
+ @Override
+ public final String toString() {
+ return identifier;
+ }
+
+ public static final class Ands extends ExpressionProtocol {
+
+ public Ands() {
+ super("ands"); //$NON-NLS-1$
+ }
+
+ }
+
+ public static final class Default extends ExpressionProtocol {
+
+ public Default() {
+ super(new Ands().identifier());
+ }
+
+ }
+
+ public static final class Of extends ExpressionProtocol {
+
+ public Of(String identifier) {
+ super(identifier);
+ }
+
+ }
+
+}
diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionTokenAssessmentService.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionTokenAssessmentService.java
new file mode 100644
index 000000000..6159fa8c7
--- /dev/null
+++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionTokenAssessmentService.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * 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.evaluation;
+
+import org.eclipse.passage.lic.internal.api.conditions.EvaluationType;
+import org.eclipse.passage.lic.internal.api.registry.Service;
+
+/**
+ *
+ * Condition expression parsing, depending on the protocol used, can boil down
+ * to a sophisticated construction of predicates.
+ *
+ *
+ * But at the bottom of the evaluation of such a construction there are quite
+ * simple questions for the runtime environment: is current operating system is
+ * Linux-like? is the hard disk serial equal to this precise value? - that kind
+ * of asking.
+ *
+ *
+ * Implementation of this interface for a particular {@linkplain EvaluationType}
+ * must answer only these simple questions. the rest of the evaluation logic is
+ * on {@linkplain ExpressionProtocol}-aware services.
+ *
+ */
+public interface ExpressionTokenAssessmentService extends Service {
+
+ boolean equal(String key, String value);
+
+ // contains ()
+
+ // startsWith ()
+
+ // all the things we will ever need -> slice to [Operation]s
+
+}
diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionTokenAssessorsRegistry.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionTokenAssessorsRegistry.java
new file mode 100644
index 000000000..2bf8e9d1a
--- /dev/null
+++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ExpressionTokenAssessorsRegistry.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * 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.evaluation;
+
+import java.util.function.Supplier;
+
+import org.eclipse.passage.lic.internal.api.conditions.EvaluationType;
+import org.eclipse.passage.lic.internal.api.registry.Registry;
+
+public interface ExpressionTokenAssessorsRegistry
+ extends Supplier> {
+
+}
diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ParsedExpression.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ParsedExpression.java
new file mode 100644
index 000000000..d4e3d2a80
--- /dev/null
+++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/ParsedExpression.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * 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.evaluation;
+
+public interface ParsedExpression {
+
+ ExpressionProtocol protocol();
+
+}
diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/EmittedPermissionsRegistry.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/PermissionEmittersRegistry.java
similarity index 86%
rename from bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/EmittedPermissionsRegistry.java
rename to bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/PermissionEmittersRegistry.java
index b531c4a0b..5f2b4dc5e 100644
--- a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/EmittedPermissionsRegistry.java
+++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/PermissionEmittersRegistry.java
@@ -17,6 +17,6 @@
import org.eclipse.passage.lic.internal.api.registry.Registry;
import org.eclipse.passage.lic.internal.api.registry.StringServiceId;
-public interface EmittedPermissionsRegistry extends Supplier> {
+public interface PermissionEmittersRegistry extends Supplier> {
}
diff --git a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/EmittedPermissions.java b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/PermissionEmittingService.java
similarity index 93%
rename from bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/EmittedPermissions.java
rename to bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/PermissionEmittingService.java
index a29fe6c83..fceb0accf 100644
--- a/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/EmittedPermissions.java
+++ b/bundles/org.eclipse.passage.lic.api/src/org/eclipse/passage/lic/internal/api/conditions/evaluation/PermissionEmittingService.java
@@ -19,7 +19,7 @@
import org.eclipse.passage.lic.internal.api.registry.Service;
import org.eclipse.passage.lic.internal.api.registry.StringServiceId;
-public interface EmittedPermissions extends Service {
+public interface PermissionEmittingService extends Service {
/**
*
@@ -47,6 +47,6 @@ public interface EmittedPermissions extends Service {
* reported in the returned {@linkplain Emission} instance.
*
*/
- Emission get(Collection conditions, LicensedProduct product);
+ Emission emit(Collection conditions, LicensedProduct product);
}