Пример #1
0
  @Override
  public OutputStream pipe(String command, PrintStream out, PrintStream err) {
    CommandInvocation invocation = javaArgs.parse(command, JAVA_OPTIONS.separatorCode(' '));

    Matcher identifierMatcher = lambdaIdentifierRegex.matcher(invocation.getUnprocessedInput());

    if (identifierMatcher.matches()) {
      String lambdaArgIdentifier = identifierMatcher.group("id");
      String lambdaBody = identifierMatcher.group("body").trim();

      if (lambdaBody.endsWith(";")) {
        lambdaBody = lambdaBody.substring(0, lambdaBody.length() - 1);
      }

      String lineConsumerCode =
          "return (java.util.function.Function<String, ?>)"
              + "(("
              + lambdaArgIdentifier.trim()
              + ") -> "
              + lambdaBody
              + ")";

      JavaCode functionCode = new JavaCode(code);
      functionCode.addLine(lineConsumerCode);

      Optional<Callable<?>> callable =
          javacService.compileJavaSnippet(functionCode, classLoaderContext, err);

      if (callable.isPresent()) {
        try {
          Function<String, ?> callback = (Function<String, ?>) callable.get().call();
          return new LineOutputStream(
              line -> {
                @Nullable Object output = callback.apply(line);
                if (output != null) {
                  out.println(output);
                }
              },
              out);
        } catch (Exception e) {
          err.println(e);
        }
      }
    }

    throw new RuntimeException(
        "When used in a pipeline, the Java snippet must be in the form of a "
            + "lambda of type Function<String, ?> that takes one text line of the input at a time.\n"
            + "Example: ... | java line -> line.contains(\"text\") ? line : null");
  }
Пример #2
0
  @Override
  public void execute(String line, PrintStream out, PrintStream err) {
    Objects.requireNonNull(classLoaderContext, "Did not set ClassLoaderCapabilities");

    CommandInvocation invocation = javaArgs.parse(line, JAVA_OPTIONS.separatorCode(' '));

    if (invocation.hasOption(RESET_CODE_ARG)) {
      code.resetCode();
    }

    if (invocation.hasOption(RESET_ALL_ARG)) {
      code.resetAll();
    }

    String codeToRun = invocation.getUnprocessedInput();
    @Nullable String className;

    if (invocation.hasOption(CLASS_ARG) && (className = extractClassName(codeToRun, err)) != null) {
      Optional<Class<Object>> javaClass =
          javacService.compileJavaClass(classLoaderContext, className, codeToRun, err);
      javaClass.ifPresent(out::println);
    } else {
      breakupJavaLines(codeToRun);

      boolean show = invocation.hasOption(SHOW_ARG);

      if (show) {
        out.println(javacService.getJavaSnippetClass(code));
        if (!codeToRun.isEmpty()) {
          // add new lines between the code and its result
          out.println();
        }
      }

      // run the current code if some input was given, or in any case when no show option
      if (!codeToRun.isEmpty() || !show) {
        runJava(out, err);
      }
    }
  }