@Override public String getMessage() { List<String> lines = new ArrayList<>(4); lines.add("\t" + MessageFormat.format(RESOURCE_BUNDLE.getString("ScriptError"), error.getMessage())); lines.add("\t" + MessageFormat.format(RESOURCE_BUNDLE.getString("File"), projectFilePath)); lines.add("\t" + MessageFormat.format(RESOURCE_BUNDLE.getString("Line"), error.getStartLine())); if (error.getStartColumn() != -1) { lines.add("\t" + MessageFormat.format(RESOURCE_BUNDLE.getString("Column"), error.getStartColumn())); } return String.join(System.lineSeparator(), lines); }
public static ScriptError fromGroovyException(GroovyRuntimeException e, String scriptName) { Objects.requireNonNull(scriptName); for (StackTraceElement element : e.getStackTrace()) { if (scriptName.equals(element.getFileName()) && scriptName.equals(element.getClassName()) && "run".equals(element.getMethodName())) { return new ScriptError(e.getMessage(), element.getLineNumber(), -1, element.getLineNumber(), -1); } } return null; }
} catch (ScriptException e) { assertNotNull(e.getError()); assertTrue(e.getError().getMessage().contains("No signature of method: test.prin() is applicable"));
private static ScriptResult<Object> runGroovyScript(Network network, Reader reader) { String output = ""; ScriptError error = null; Object value = null; try (StringWriter outputWriter = new StringWriter()) { // put network in the binding so that it is accessible from the script Binding binding = new Binding(); binding.setProperty("network", network); binding.setProperty("out", outputWriter); CompilerConfiguration config = new CompilerConfiguration(); GroovyShell shell = new GroovyShell(binding, config); value = shell.evaluate(reader, SCRIPT_FILE_NAME); outputWriter.flush(); output = outputWriter.toString(); } catch (MultipleCompilationErrorsException e) { error = ScriptError.fromGroovyException(e); } catch (MissingPropertyException | MissingMethodException e) { error = ScriptError.fromGroovyException(e, SCRIPT_FILE_NAME); } catch (IOException e) { throw new UncheckedIOException(e); } return new ScriptResult<>(value, output, error); }
public static ScriptError fromGroovyException(MultipleCompilationErrorsException e) { ErrorCollector errorCollector = e.getErrorCollector(); if (errorCollector.getErrorCount() > 0) { Message error = errorCollector.getError(0); if (error instanceof SyntaxErrorMessage) { SyntaxException cause = ((SyntaxErrorMessage) error).getCause(); return new ScriptError(cause.getMessage(), cause.getStartLine(), cause.getStartColumn(), cause.getEndLine(), cause.getEndColumn()); } else { throw new AssertionError("SyntaxErrorMessage is expected"); } } else { throw new AssertionError("At least one error is expected"); } }