From 2e8a2f6a80fbd974ad877aeee4ef76b740831311 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Fri, 28 Jun 2024 18:58:50 +0200 Subject: refactor: show semantics even if propagation fails --- .../semantics/SemanticsInternalErrorResult.java | 9 --------- .../web/semantics/SemanticsIssuesResult.java | 13 ------------- .../web/semantics/SemanticsModelResult.java | 17 +++++++++++++++++ .../language/web/semantics/SemanticsResult.java | 22 ++++++++++++++++++++-- .../language/web/semantics/SemanticsService.java | 15 ++++++++------- .../web/semantics/SemanticsSuccessResult.java | 16 ---------------- .../language/web/semantics/SemanticsWorker.java | 13 ++++++++----- 7 files changed, 53 insertions(+), 52 deletions(-) delete mode 100644 subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsInternalErrorResult.java delete mode 100644 subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsIssuesResult.java create mode 100644 subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsModelResult.java delete mode 100644 subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsSuccessResult.java (limited to 'subprojects/language-web/src') diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsInternalErrorResult.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsInternalErrorResult.java deleted file mode 100644 index ff592e93..00000000 --- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsInternalErrorResult.java +++ /dev/null @@ -1,9 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.language.web.semantics; - -public record SemanticsInternalErrorResult(String error) implements SemanticsResult { -} diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsIssuesResult.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsIssuesResult.java deleted file mode 100644 index 644bd179..00000000 --- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsIssuesResult.java +++ /dev/null @@ -1,13 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.language.web.semantics; - -import org.eclipse.xtext.web.server.validation.ValidationResult; - -import java.util.List; - -public record SemanticsIssuesResult(List issues) implements SemanticsResult { -} diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsModelResult.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsModelResult.java new file mode 100644 index 00000000..b0ec58c3 --- /dev/null +++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsModelResult.java @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.language.web.semantics; + +import com.google.gson.JsonObject; +import tools.refinery.language.web.semantics.metadata.NodeMetadata; +import tools.refinery.language.web.semantics.metadata.RelationMetadata; + +import java.util.List; + +public record SemanticsModelResult(List nodes, List relations, + JsonObject partialInterpretation) { + public static SemanticsModelResult EMPTY = new SemanticsModelResult(List.of(), List.of(), new JsonObject()); +} diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsResult.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsResult.java index a2e19a2f..16f25309 100644 --- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsResult.java +++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsResult.java @@ -6,7 +6,25 @@ package tools.refinery.language.web.semantics; import org.eclipse.xtext.web.server.IServiceResult; +import org.eclipse.xtext.web.server.validation.ValidationResult; -public sealed interface SemanticsResult extends IServiceResult permits SemanticsSuccessResult, - SemanticsInternalErrorResult, SemanticsIssuesResult { +import java.util.List; + +public record SemanticsResult(SemanticsModelResult model, String error, + List issues) implements IServiceResult { + public SemanticsResult(SemanticsModelResult model) { + this(model, null, List.of()); + } + + public SemanticsResult(String error) { + this(null, error, List.of()); + } + + public SemanticsResult(SemanticsModelResult model, String error) { + this(model, error, List.of()); + } + + public SemanticsResult(List issues) { + this(null, null, issues); + } } diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsService.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsService.java index 331ef84b..f6b723fe 100644 --- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsService.java +++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsService.java @@ -5,7 +5,6 @@ */ package tools.refinery.language.web.semantics; -import com.google.gson.JsonObject; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; @@ -21,9 +20,11 @@ import org.slf4j.LoggerFactory; import tools.refinery.language.model.problem.Problem; import tools.refinery.language.web.xtext.server.push.PushWebDocument; -import java.util.List; import java.util.Optional; -import java.util.concurrent.*; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; @Singleton @@ -74,7 +75,7 @@ public class SemanticsService extends AbstractCachedService { } var problem = getProblem(doc); if (problem == null) { - return new SemanticsSuccessResult(List.of(), List.of(), new JsonObject()); + return new SemanticsResult(SemanticsModelResult.EMPTY); } var worker = workerProvider.get(); worker.setProblem(problem, cancelIndicator); @@ -101,14 +102,14 @@ public class SemanticsService extends AbstractCachedService { if (message == null) { message = "Partial interpretation error"; } - return new SemanticsInternalErrorResult(message); + return new SemanticsResult(message); } catch (TimeoutException e) { future.cancel(true); if (!warmedUpCurrently) { warmedUp.set(true); } LOG.trace("Semantics service timeout", e); - return new SemanticsInternalErrorResult("Partial interpretation timed out"); + return new SemanticsResult("Partial interpretation timed out"); } if (LOG.isTraceEnabled()) { long end = System.currentTimeMillis(); @@ -133,7 +134,7 @@ public class SemanticsService extends AbstractCachedService { if (contents.isEmpty()) { return null; } - var model = contents.get(0); + var model = contents.getFirst(); if (!(model instanceof Problem problem)) { return null; } diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsSuccessResult.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsSuccessResult.java deleted file mode 100644 index f26fa2b2..00000000 --- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsSuccessResult.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2023 The Refinery Authors - * - * SPDX-License-Identifier: EPL-2.0 - */ -package tools.refinery.language.web.semantics; - -import com.google.gson.JsonObject; -import tools.refinery.language.web.semantics.metadata.NodeMetadata; -import tools.refinery.language.web.semantics.metadata.RelationMetadata; - -import java.util.List; - -public record SemanticsSuccessResult(List nodes, List relations, - JsonObject partialInterpretation) implements SemanticsResult { -} diff --git a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java index fed3c8a3..32791960 100644 --- a/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java +++ b/subprojects/language-web/src/main/java/tools/refinery/language/web/semantics/SemanticsWorker.java @@ -21,6 +21,7 @@ import tools.refinery.language.model.problem.Problem; import tools.refinery.language.web.semantics.metadata.MetadataCreator; import tools.refinery.language.semantics.TracedException; import tools.refinery.store.reasoning.literal.Concreteness; +import tools.refinery.store.reasoning.seed.PropagatedModel; import tools.refinery.store.reasoning.translator.TranslationException; import tools.refinery.store.util.CancellationToken; @@ -63,9 +64,9 @@ class SemanticsWorker implements Callable { cancellationToken.checkCancelled(); ModelSemantics semantics; try { - semantics = semanticsFactory.cancellationToken(cancellationToken).createSemantics(problem); + semantics = semanticsFactory.cancellationToken(cancellationToken).tryCreateSemantics(problem); } catch (TranslationException e) { - return new SemanticsInternalErrorResult(e.getMessage()); + return new SemanticsResult(e.getMessage()); } catch (TracedException e) { var cause = e.getCause(); // Suppress the type of the cause exception. @@ -79,12 +80,14 @@ class SemanticsWorker implements Callable { var relationsMetadata = metadataCreator.getRelationsMetadata(); cancellationToken.checkCancelled(); var partialInterpretation = partialInterpretation2Json.getPartialInterpretation(semantics, cancellationToken); - return new SemanticsSuccessResult(nodesMetadata, relationsMetadata, partialInterpretation); + var modelResult = new SemanticsModelResult(nodesMetadata, relationsMetadata, partialInterpretation); + var error = semantics.isRejected() ? PropagatedModel.PROPAGATION_FAILED_MESSAGE : null; + return new SemanticsResult(modelResult, error); } private SemanticsResult getTracedErrorResult(EObject sourceElement, String message) { if (sourceElement == null || !problem.eResource().equals(sourceElement.eResource())) { - return new SemanticsInternalErrorResult(message); + return new SemanticsResult(message); } var diagnostic = new FeatureBasedDiagnostic(Diagnostic.ERROR, message, sourceElement, null, 0, CheckType.EXPENSIVE, DIAGNOSTIC_ID); @@ -94,6 +97,6 @@ class SemanticsWorker implements Callable { .map(issue -> new ValidationResult.Issue(issue.getMessage(), "error", issue.getLineNumber(), issue.getColumn(), issue.getOffset(), issue.getLength())) .toList(); - return new SemanticsIssuesResult(issues); + return new SemanticsResult(issues); } } -- cgit v1.2.3-70-g09d2