Package restx.build.shell

Source Code of restx.build.shell.BuildShellCommand$GenerateModuleCommandRunner

package restx.build.shell;

import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import jline.console.completer.ArgumentCompleter;
import jline.console.completer.Completer;
import jline.console.completer.StringsCompleter;
import restx.build.RestxBuild;
import restx.factory.Component;
import restx.shell.RestxShell;
import restx.shell.ShellCommandRunner;
import restx.shell.StdShellCommand;

import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.util.List;

/**
* User: xavierhanin
* Date: 4/16/13
* Time: 5:08 PM
*/
@Component
public class BuildShellCommand extends StdShellCommand {
    protected BuildShellCommand() {
        super(ImmutableList.of("build"), "build commands: generate pom, ivy, ...");
    }

    @Override
    protected Optional<? extends ShellCommandRunner> doMatch(String line) {
        final List<String> args = splitArgs(line);
        if (args.size() < 2) {
            return Optional.absent();
        }
        switch (args.get(1)) {
            case "generate":
                if (args.size() < 3) {
                    return Optional.absent();
                }
                switch (args.get(2)) {
                    case "ivy":
                        return Optional.<ShellCommandRunner>of(new GenerateModuleCommandRunner("module.ivy"));
                    case "pom":
                        return Optional.<ShellCommandRunner>of(new GenerateModuleCommandRunner("pom.xml"));
                }
                break;
            case "watch":
                return Optional.<ShellCommandRunner>of(new WatchCommandRunner());
        }

        return Optional.absent();
    }

    @Override
    protected String resourceMan() {
        return "restx/build/shell/build.man";
    }

    @Override
    public Iterable<Completer> getCompleters() {
        return ImmutableList.<Completer>of(
                new ArgumentCompleter(new StringsCompleter("build"), new StringsCompleter("generate"), new StringsCompleter("ivy", "pom")),
                new ArgumentCompleter(new StringsCompleter("build"), new StringsCompleter("watch")));
    }

    private class GenerateModuleCommandRunner implements ShellCommandRunner {
        private final String target;

        public GenerateModuleCommandRunner(String target) {
            this.target = target;
        }

        @Override
        public void run(RestxShell shell) throws Exception {
            Path currentLocationAbsolutePath = shell.currentLocation().toAbsolutePath();
            List<Path> convert = RestxBuild.convert(currentLocationAbsolutePath + "/**/md.restx.json", target);
            if (convert.isEmpty()) {
                shell.println("no mathing file found. module descriptors should be named `md.restx.json`");
            } else {
                shell.println("converted:");
                for (Path path : convert) {
                    shell.println("\t" + currentLocationAbsolutePath.relativize(path));
                }
            }
        }
    }

    private class WatchCommandRunner implements ShellCommandRunner, RestxShell.WatchListener {
        @Override
        public void run(RestxShell shell) throws Exception {
            shell.watchFile(this);
            shell.printIn("now watching md.restx.json files\n", RestxShell.AnsiCodes.ANSI_YELLOW);
        }

        @Override
        public void onEvent(RestxShell shell, WatchEvent.Kind<?> kind, Path path) {
            if (path.endsWith("md.restx.json") && kind == StandardWatchEventKinds.ENTRY_MODIFY) {
                mayConvertTo(shell, path, path.getParent().resolve("pom.xml"));
                mayConvertTo(shell, path, path.getParent().resolve("ivy.xml"));
                mayConvertTo(shell, path, path.getParent().resolve("module.ivy"));
            }
        }

        private void mayConvertTo(RestxShell shell, Path source, Path target) {
            if (target.toFile().exists()) {
                try {
                    RestxBuild.convert(source, target);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}
TOP

Related Classes of restx.build.shell.BuildShellCommand$GenerateModuleCommandRunner

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.