All Downloads are FREE. Search and download functionalities are using the official Maven repository.

restx.core.shell.ShellAppRunner Maven / Gradle / Ivy

There is a newer version: 1.0
Show newest version
package restx.core.shell;

import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import com.google.common.io.Files;
import restx.AppSettings;
import restx.Apps;
import restx.shell.RestxShell;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import static restx.common.MoreFiles.copyDir;

/**
 * User: xavierhanin
 * Date: 9/8/13
 * Time: 2:48 PM
 */
public class ShellAppRunner {
    public static enum CompileMode {
        NO {
            @Override
            boolean compile(RestxShell shell, Path targetClasses, Path dependenciesDir, Path mainSources, Path mainResources, String className) throws IOException, InterruptedException {
                return true;
            }
        },
        RESOURCES_ONLY {
            @Override
            boolean compile(RestxShell shell, Path targetClasses, Path dependenciesDir, Path mainSources, Path mainResources, String className) throws IOException, InterruptedException {
                shell.print("copying resources...");
                copyDir(
                        shell.currentLocation().resolve(mainResources),
                        shell.currentLocation().resolve(targetClasses)
                );
                shell.printIn(" [DONE]", RestxShell.AnsiCodes.ANSI_GREEN);
                shell.println("");
                return true;
            }
        },
        MAIN_CLASS {
            @Override
            boolean compile(RestxShell shell, Path targetClasses, Path dependenciesDir, Path mainSources, Path mainResources, String className) throws IOException, InterruptedException {
                shell.print("compiling App...");
                shell.currentLocation().resolve(targetClasses).toFile().mkdirs();
                int compiled = new ProcessBuilder(
                        "javac", "-cp", dependenciesDir + "/*", "-sourcepath", mainSources.toString(),
                            "-d", targetClasses.toString(),
                            mainSources.resolve(className.replace('.', '/') + ".java").toString())
                        .redirectErrorStream(true)
                        .redirectOutput(ProcessBuilder.Redirect.INHERIT)
                        .directory(shell.currentLocation().toFile().getAbsoluteFile())
                        .start()
                        .waitFor();
                if (compiled != 0) {
                    shell.printIn(" [ERROR]", RestxShell.AnsiCodes.ANSI_RED);
                    shell.println("");
                    return false;
                }
                shell.printIn(" [DONE]", RestxShell.AnsiCodes.ANSI_GREEN);
                shell.println("");

                shell.print("copying resources...");
                copyDir(
                        shell.currentLocation().resolve(mainResources),
                        shell.currentLocation().resolve(targetClasses)
                );
                shell.printIn(" [DONE]", RestxShell.AnsiCodes.ANSI_GREEN);
                shell.println("");
                return true;
            }
        },
        ALL {
            @Override
            boolean compile(RestxShell shell,
                            Path targetClasses, Path dependenciesDir,
                            final Path mainSources, Path mainResources,
                            String className) throws IOException, InterruptedException {
                shell.print("compiling App...");
                shell.currentLocation().resolve(targetClasses).toFile().mkdirs();
                File currentDir = shell.currentLocation().toFile().getAbsoluteFile();

                final List sources = new ArrayList<>();
                java.nio.file.Files.walkFileTree(mainSources, new SimpleFileVisitor() {
                    @Override
                    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                        if (file.toString().endsWith(".java")) {
                            sources.add(file.toAbsolutePath().toString());
                        }
                        return FileVisitResult.CONTINUE;
                    }
                });
                shell.printIn(" [" + sources.size() + " source files]", RestxShell.AnsiCodes.ANSI_CYAN);
                File classesFile = new File(currentDir, ".restx.classes");
                Files.write(Joiner.on("\n").join(sources), classesFile, Charsets.UTF_8);
                int compiled = new ProcessBuilder(
                        "javac", "-cp", dependenciesDir + "/*", "-sourcepath", mainSources.toString(),
                            "-d", targetClasses.toString(),
                            "@" + classesFile.getName())
                        .redirectErrorStream(true)
                        .redirectOutput(ProcessBuilder.Redirect.INHERIT)
                        .directory(currentDir)
                        .start()
                        .waitFor();
                classesFile.delete();

                if (compiled != 0) {
                    shell.printIn(" [ERROR]", RestxShell.AnsiCodes.ANSI_RED);
                    shell.println("");
                    return false;
                }
                shell.printIn(" [DONE]", RestxShell.AnsiCodes.ANSI_GREEN);
                shell.println("");

                shell.print("copying resources...");
                copyDir(
                        shell.currentLocation().resolve(mainResources),
                        shell.currentLocation().resolve(targetClasses)
                );
                shell.printIn(" [DONE]", RestxShell.AnsiCodes.ANSI_GREEN);
                shell.println("");
                return true;
            }
        };

        abstract boolean compile(RestxShell shell, Path targetClasses, Path dependenciesDir, Path mainSources, Path mainResources, String className) throws IOException, InterruptedException;

    }
    private final AppSettings appSettings;

    private final String appClassName;
    private final CompileMode compile;
    private final boolean quiet;
    private final boolean daemon;
    private final List vmOptions;

    public ShellAppRunner(AppSettings appSettings, String appClassName, CompileMode compile,
                          boolean quiet, boolean daemon, List vmOptions) {
        this.appSettings = appSettings;
        this.appClassName = appClassName;
        this.compile = compile;
        this.quiet = quiet;
        this.daemon = daemon;
        this.vmOptions = new ArrayList<>(vmOptions);
    }

    public void run(RestxShell shell) throws IOException, InterruptedException {
        Path targetClasses = Paths.get(appSettings.targetClasses());
        Path dependenciesDir = Paths.get(appSettings.targetDependency());
        Path mainSources = Paths.get(appSettings.mainSources());
        Path mainResources = Paths.get(appSettings.mainResources());

        if (!compile.compile(shell, targetClasses, dependenciesDir, mainSources, mainResources, appClassName)) return;

        shell.println("starting " + appClassName + "..." +
                (daemon ? " - type `stop` to stop it and go back to restx shell" : ""));
        vmOptions.add("-Drestx.app.package=" + appSettings.appPackage());
        Process run = Apps.with(appSettings)
                                .run(shell.currentLocation().toFile(),
                                        targetClasses, dependenciesDir, vmOptions,
                                        appClassName, Collections.emptyList(), quiet);

        if (daemon) {
            while (!shell.ask("", "").equals("stop")) {
                shell.printIn("restx> unrecognized command - type `stop` to stop the app",
                        RestxShell.AnsiCodes.ANSI_YELLOW);
                shell.println("");
            }
            run.destroy();
        }
        run.waitFor();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy