package com.github.dreamhead.moco.runner; import com.github.dreamhead.moco.bootstrap.arg.StartArgs; import com.github.dreamhead.moco.parser.GlobalSettingParser; import com.github.dreamhead.moco.parser.model.GlobalSetting; import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.base.Predicate; import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableList; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import static com.github.dreamhead.moco.runner.JsonRunner.newJsonRunnerWithSetting; import static com.github.dreamhead.moco.runner.RunnerSetting.aRunnerSetting; import static com.google.common.collect.FluentIterable.from; public class SettingRunner implements Runner { private final GlobalSettingParser parser = new GlobalSettingParser(); private final ImmutableList<GlobalSetting> globalSettings; private final Optional<String> env; private final StartArgs startArgs; private Runner runner; private final FluentIterable<File> files; public SettingRunner(final InputStream stream, final StartArgs args) { this.env = args.getEnv(); this.globalSettings = parser.parse(stream); this.files = from(globalSettings).transform(toFile()); this.startArgs = args; } public Iterable<File> getFiles() { return files; } public void run() { runner = newJsonRunnerWithSetting(from(globalSettings) .filter(byEnv(this.env)) .transform(toRunnerSetting()), startArgs); runner.run(); } private Predicate<? super GlobalSetting> byEnv(final Optional<String> env) { return new Predicate<GlobalSetting>() { @Override public boolean apply(final GlobalSetting globalSetting) { return !env.isPresent() || env.get().equalsIgnoreCase(globalSetting.getEnv()); } }; } private Function<GlobalSetting, RunnerSetting> toRunnerSetting() { return new Function<GlobalSetting, RunnerSetting>() { @Override public RunnerSetting apply(final GlobalSetting setting) { try { return aRunnerSetting() .withStream(new FileInputStream(setting.getInclude())) .withContext(setting.getContext()) .withFileRoot(setting.getFileRoot()) .withRequest(setting.getRequest()) .withResponse(setting.getResponse()) .build(); } catch (FileNotFoundException e) { throw new RuntimeException(e); } } }; } public void stop() { runner.stop(); } private Function<? super GlobalSetting, File> toFile() { return new Function<GlobalSetting, File>() { @Override public File apply(final GlobalSetting input) { return new File(input.getInclude()); } }; } }