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); }