diff --git a/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarGraphFetchApi.java b/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarGraphFetchApi.java index 857f031bc73..d5123f7cd05 100644 --- a/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarGraphFetchApi.java +++ b/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarGraphFetchApi.java @@ -4,6 +4,7 @@ import org.eclipse.collections.impl.tuple.Tuples; import org.finos.legend.engine.language.pure.grammar.api.grammarToJson.GrammarToJson; import org.finos.legend.engine.language.pure.grammar.api.jsonToGrammar.JsonToGrammar; +import org.finos.legend.engine.protocol.pure.v1.model.SourceInformation; import org.finos.legend.engine.protocol.pure.v1.model.valueSpecification.raw.graph.RootGraphFetchTree; import org.finos.legend.engine.shared.core.api.TestGrammar; import org.finos.legend.engine.shared.core.api.grammar.BatchResult; @@ -42,7 +43,7 @@ public void testSimpleParsingError() " }\n" + " }\n" + " }\n" + - "}#", "{\"message\":\"Unexpected token\",\"sourceInformation\":{\"endColumn\":9,\"endLine\":3,\"sourceId\":\"\",\"startColumn\":5,\"startLine\":3}}"); + "}#", "Unexpected token", new SourceInformation("", 3, 5, 3, 9)); } @Test diff --git a/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarLambdaApi.java b/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarLambdaApi.java index 8df4cc7302d..1512ee57a20 100644 --- a/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarLambdaApi.java +++ b/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarLambdaApi.java @@ -4,6 +4,7 @@ import org.eclipse.collections.impl.tuple.Tuples; import org.finos.legend.engine.language.pure.grammar.api.grammarToJson.GrammarToJson; import org.finos.legend.engine.language.pure.grammar.api.jsonToGrammar.JsonToGrammar; +import org.finos.legend.engine.protocol.pure.v1.model.SourceInformation; import org.finos.legend.engine.protocol.pure.v1.model.valueSpecification.raw.Lambda; import org.finos.legend.engine.shared.core.api.TestGrammar; import org.finos.legend.engine.shared.core.api.grammar.BatchResult; @@ -45,7 +46,7 @@ public void testSimple() @Test public void testSimpleParsingError() { - testError("|1->toString(),", "{\"message\":\"no viable alternative at input '->toString(),'\",\"sourceInformation\":{\"endColumn\":15,\"endLine\":1,\"sourceId\":\"\",\"startColumn\":15,\"startLine\":1}}"); + testError("|1->toString(),", "no viable alternative at input '->toString(),'", new SourceInformation("", 1, 15, 1, 15)); } @Test diff --git a/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarModelApi.java b/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarModelApi.java index 4a6f28c7cd7..fa37e986b82 100644 --- a/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarModelApi.java +++ b/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarModelApi.java @@ -3,6 +3,7 @@ import org.eclipse.collections.api.block.function.Function2; import org.finos.legend.engine.language.pure.grammar.api.grammarToJson.GrammarToJson; import org.finos.legend.engine.language.pure.grammar.api.jsonToGrammar.JsonToGrammar; +import org.finos.legend.engine.protocol.pure.v1.model.SourceInformation; import org.finos.legend.engine.protocol.pure.v1.model.context.PureModelContextData; import org.finos.legend.engine.shared.core.api.TestGrammar; import org.finos.legend.engine.shared.core.api.grammar.RenderStyle; @@ -35,7 +36,7 @@ public void testSimple() @Test public void testSimpleError() { - testError("Class A\n{", "{\"message\":\"Unexpected token\",\"sourceInformation\":{\"endColumn\":1,\"endLine\":2,\"sourceId\":\"\",\"startColumn\":1,\"startLine\":2}}"); + testError("Class A\n{", "Unexpected token", new SourceInformation("", 2, 1, 2, 1)); } private static final GrammarToJson grammarToJson = new GrammarToJson(); diff --git a/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarValueSpecificationApi.java b/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarValueSpecificationApi.java index 9c6b93def1f..14774509953 100644 --- a/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarValueSpecificationApi.java +++ b/legend-engine-language-pure-grammar-api/src/test/java/org/finos/legend/engine/language/pure/grammar/api/test/TestGrammarValueSpecificationApi.java @@ -4,6 +4,7 @@ import org.eclipse.collections.impl.tuple.Tuples; import org.finos.legend.engine.language.pure.grammar.api.grammarToJson.GrammarToJson; import org.finos.legend.engine.language.pure.grammar.api.jsonToGrammar.JsonToGrammar; +import org.finos.legend.engine.protocol.pure.v1.model.SourceInformation; import org.finos.legend.engine.protocol.pure.v1.model.valueSpecification.ValueSpecification; import org.finos.legend.engine.shared.core.api.TestGrammar; import org.finos.legend.engine.shared.core.api.grammar.BatchResult; @@ -28,11 +29,10 @@ public void testSimple() @Test public void testSimpleError() { - testError("1", "{\"_type\":\"integer\",\"multiplicity\":{\"lowerBound\":1,\"upperBound\":1},\"sourceInformation\":{\"endColumn\":1,\"endLine\":1,\"sourceId\":\"\",\"startColumn\":1,\"startLine\":1},\"values\":[1]}"); testError("true->func(\n" + " 2\n" + " 'www'\n" + - ")", "{\"message\":\"Unexpected token\",\"sourceInformation\":{\"endColumn\":7,\"endLine\":3,\"sourceId\":\"\",\"startColumn\":3,\"startLine\":3}}"); + ")", "Unexpected token", new SourceInformation("", 3, 3, 3, 7)); } @Test diff --git a/legend-engine-language-pure-store-relational-grammar-api/pom.xml b/legend-engine-language-pure-store-relational-grammar-api/pom.xml index d4e2c71a5fb..6129d24b8a2 100644 --- a/legend-engine-language-pure-store-relational-grammar-api/pom.xml +++ b/legend-engine-language-pure-store-relational-grammar-api/pom.xml @@ -35,6 +35,10 @@ org.finos.legend.engine legend-engine-protocol-pure + + org.finos.legend.engine + legend-engine-protocol + org.finos.legend.engine legend-engine-language-pure-grammar diff --git a/legend-engine-language-pure-store-relational-grammar-api/src/test/java/org.finos.legend.engine.language.pure.grammar.api.relationalOperationElement.test/TestRelationalOperationElementApi.java b/legend-engine-language-pure-store-relational-grammar-api/src/test/java/org.finos.legend.engine.language.pure.grammar.api.relationalOperationElement.test/TestRelationalOperationElementApi.java index d35e05fb238..05b75dbb611 100644 --- a/legend-engine-language-pure-store-relational-grammar-api/src/test/java/org.finos.legend.engine.language.pure.grammar.api.relationalOperationElement.test/TestRelationalOperationElementApi.java +++ b/legend-engine-language-pure-store-relational-grammar-api/src/test/java/org.finos.legend.engine.language.pure.grammar.api.relationalOperationElement.test/TestRelationalOperationElementApi.java @@ -4,6 +4,7 @@ import org.eclipse.collections.impl.tuple.Tuples; import org.finos.legend.engine.language.pure.grammar.api.relationalOperationElement.RelationalOperationElementGrammarToJson; import org.finos.legend.engine.language.pure.grammar.api.relationalOperationElement.RelationalOperationElementJsonToGrammar; +import org.finos.legend.engine.protocol.pure.v1.model.SourceInformation; import org.finos.legend.engine.protocol.pure.v1.model.packageableElement.store.relational.model.operation.RelationalOperationElement; import org.finos.legend.engine.shared.core.api.TestGrammar; import org.finos.legend.engine.shared.core.api.grammar.BatchResult; @@ -24,7 +25,7 @@ public void testSimple() @Test public void testSimpleError() { - testError("add(1,", "{\"message\":\"Unexpected token\",\"sourceInformation\":{\"endColumn\":11,\"endLine\":1,\"sourceId\":\"\",\"startColumn\":7,\"startLine\":1}}"); + testError("add(1,", "Unexpected token", new SourceInformation("", 1, 7, 1, 11)); } @Test diff --git a/legend-engine-query-graphQL/src/test/java/org/finos/legend/engine/query/graphQL/api/grammar/test/TestGrammarApi.java b/legend-engine-query-graphQL/src/test/java/org/finos/legend/engine/query/graphQL/api/grammar/test/TestGrammarApi.java index fbe416d0c14..a18e30481f4 100644 --- a/legend-engine-query-graphQL/src/test/java/org/finos/legend/engine/query/graphQL/api/grammar/test/TestGrammarApi.java +++ b/legend-engine-query-graphQL/src/test/java/org/finos/legend/engine/query/graphQL/api/grammar/test/TestGrammarApi.java @@ -3,6 +3,7 @@ import org.eclipse.collections.api.block.function.Function2; import org.eclipse.collections.impl.tuple.Tuples; import org.finos.legend.engine.protocol.graphQL.metamodel.ExecutableDocument; +import org.finos.legend.engine.protocol.pure.v1.model.SourceInformation; import org.finos.legend.engine.query.graphQL.api.grammar.GraphQLGrammar; import org.finos.legend.engine.shared.core.api.TestGrammar; import org.finos.legend.engine.shared.core.api.grammar.BatchResult; @@ -33,7 +34,7 @@ public void testSimpleError() " name String!\n" + " values: [String]\n" + " length(unit: LengthUnit = METER): Float\n" + - "}", "{\"message\":\"Unexpected token\",\"sourceInformation\":{\"endColumn\":13,\"endLine\":3,\"sourceId\":\"\",\"startColumn\":8,\"startLine\":3}}"); + "}", "Unexpected token", new SourceInformation("", 3, 8, 3, 13)); } @Test diff --git a/legend-engine-shared-core/src/main/java/org/finos/legend/engine/shared/core/api/grammar/GrammarAPI.java b/legend-engine-shared-core/src/main/java/org/finos/legend/engine/shared/core/api/grammar/GrammarAPI.java index c0aa9085ce2..902b1025154 100644 --- a/legend-engine-shared-core/src/main/java/org/finos/legend/engine/shared/core/api/grammar/GrammarAPI.java +++ b/legend-engine-shared-core/src/main/java/org/finos/legend/engine/shared/core/api/grammar/GrammarAPI.java @@ -24,7 +24,7 @@ public class GrammarAPI { private static final ObjectMapper objectMapper = ObjectMapperFactory.getNewStandardObjectMapperWithPureProtocolExtensionSupports(); - protected Response grammarToJson(String input, Function2 func , ProfileManager pm, boolean returnSourceInfo, String spanText) + protected Response grammarToJson(String input, Function2 func, ProfileManager pm, boolean returnSourceInfo, String spanText) { MutableList profiles = ProfileManagerHelper.extractProfiles(pm); try (Scope scope = GlobalTracer.get().buildSpan(spanText).startActive(true)) @@ -34,27 +34,19 @@ protected Response grammarToJson(String input, Function2 T data = func.apply(input, returnSourceInfo); return ManageConstantResult.manageResult(profiles, data, objectMapper); } - catch (EngineException e) - { - if (!EngineErrorType.PARSER.equals(e.getErrorType())) - { - return ExceptionTool.exceptionManager(e, LoggingEventType.TRANSFORM_GRAMMAR_TO_JSON_ERROR, profiles); - } - return ManageConstantResult.manageResult(profiles, new ParserError(e.getMessage(), e.getSourceInformation()), objectMapper); - } catch (Exception e) { - return ExceptionTool.exceptionManager(e, LoggingEventType.TRANSFORM_GRAMMAR_TO_JSON_ERROR, profiles); + return ExceptionTool.exceptionManager(e, LoggingEventType.TRANSFORM_GRAMMAR_TO_JSON_ERROR, Response.Status.BAD_REQUEST, profiles); } } } - protected Response grammarToJsonBatch(Map input, Function2 func , Map result, ProfileManager pm, boolean returnSourceInfo, String spanText) + protected Response grammarToJsonBatch(Map input, Function2 func, Map result, ProfileManager pm, boolean returnSourceInfo, String spanText) { MutableList profiles = ProfileManagerHelper.extractProfiles(pm); try (Scope scope = GlobalTracer.get().buildSpan(spanText).startActive(true)) { - Map errors = Maps.mutable.empty(); + Map errors = Maps.mutable.empty(); input.forEach((key, value) -> { try @@ -81,7 +73,7 @@ protected Response grammarToJsonBatch(Map input, Function2 Response jsonToGrammar(T graphFetchTree, RenderStyle renderStyle, Function2 func, ProfileManager pm, String spanText) + protected Response jsonToGrammar(T graphFetchTree, RenderStyle renderStyle, Function2 func, ProfileManager pm, String spanText) { MutableList profiles = ProfileManagerHelper.extractProfiles(pm); try (Scope scope = GlobalTracer.get().buildSpan(spanText).startActive(true)) @@ -100,7 +92,8 @@ protected Response jsonToGrammarBatch(RenderStyle renderStyle, Map result = org.eclipse.collections.api.factory.Maps.mutable.empty(); - MapAdapter.adapt(values).forEachKeyValue((key, value) -> { + MapAdapter.adapt(values).forEachKeyValue((key, value) -> + { result.put(key, func.apply(value, renderStyle)); }); return ManageConstantResult.manageResult(profiles, result); diff --git a/legend-engine-shared-core/src/main/java/org/finos/legend/engine/shared/core/operational/errorManagement/ExceptionTool.java b/legend-engine-shared-core/src/main/java/org/finos/legend/engine/shared/core/operational/errorManagement/ExceptionTool.java index 3b55d70ee07..a15f5f91972 100644 --- a/legend-engine-shared-core/src/main/java/org/finos/legend/engine/shared/core/operational/errorManagement/ExceptionTool.java +++ b/legend-engine-shared-core/src/main/java/org/finos/legend/engine/shared/core/operational/errorManagement/ExceptionTool.java @@ -33,15 +33,25 @@ public class ExceptionTool public static Response exceptionManager(Exception exception, LoggingEventType eventType, Iterable pm) { - return manage(eventType, pm, new ExceptionError(-1, exception)); + return manage(eventType, pm, new ExceptionError(-1, exception), Response.Status.INTERNAL_SERVER_ERROR); } public static Response exceptionManager(String message, LoggingEventType eventType, Iterable pm) { - return manage(eventType, pm, new ExceptionError(-1, message)); + return manage(eventType, pm, new ExceptionError(-1, message), Response.Status.INTERNAL_SERVER_ERROR); } - private static Response manage(LoggingEventType eventType, Iterable pm, ExceptionError error) + public static Response exceptionManager(Exception exception, LoggingEventType eventType, Response.Status status, Iterable pm) + { + return manage(eventType, pm, new ExceptionError(-1, exception), status); + } + + public static Response exceptionManager(String message, LoggingEventType eventType, Response.Status status, Iterable pm) + { + return manage(eventType, pm, new ExceptionError(-1, message), status); + } + + private static Response manage(LoggingEventType eventType, Iterable pm, ExceptionError error, Response.Status status) { LOGGER.error(new LogInfo(pm, eventType, error).toString()); String text; @@ -57,6 +67,6 @@ private static Response manage(LoggingEventType eventType, Iterable { @@ -43,13 +46,20 @@ protected void test(String str, boolean returnSourceInfo) } } - protected void testError(String str, String expected) + protected void testError(String str, String expectedErrorMessage, SourceInformation expectedErrorSourceInformation) { try { Response result = grammarToJson().apply(str, true); - String actual = result.getEntity().toString(); - assertEquals(expected, actual); + Object errorObject = result.getEntity(); + assertTrue(errorObject instanceof ExceptionError); + ExceptionError error = (ExceptionError) errorObject; + assertEquals(expectedErrorMessage, error.getMessage()); + assertEquals(expectedErrorSourceInformation.sourceId, error.getSourceInformation().sourceId); + assertEquals(expectedErrorSourceInformation.startLine, error.getSourceInformation().startLine); + assertEquals(expectedErrorSourceInformation.startColumn, error.getSourceInformation().startColumn); + assertEquals(expectedErrorSourceInformation.endLine, error.getSourceInformation().endLine); + assertEquals(expectedErrorSourceInformation.endColumn, error.getSourceInformation().endColumn); } catch (Exception e) {