package com.prezi.haxe.gradle; import com.google.common.base.Function; import com.google.common.base.Joiner; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import org.gradle.api.internal.ConventionTask; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.TaskAction; import java.io.IOException; import java.util.Arrays; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Pattern; public class CheckHaxeVersion extends ConventionTask { private Set<Object> compilerVersions = Sets.newLinkedHashSet(); @Input public Set<Object> getCompilerVersions() { return compilerVersions; } public void setCompilerVersions(Object... versions) { compilerVersions.addAll(Arrays.asList(versions)); } public void setCompilerVersion(Object... versions) { setCompilerVersions(versions); } public void compilerVersions(Object... versions) { setCompilerVersions(versions); } public void compilerVersion(Object... versions) { setCompilerVersions(versions); } @TaskAction public void check() throws IOException, InterruptedException { Set<Object> compilerVersions = getCompilerVersions(); if (!compilerVersions.isEmpty()) { final AtomicReference<String> versionRef = new AtomicReference<String>(); CommandExecutor.execute(Arrays.asList("haxe", "-version"), null, new ExecutionResultHandler() { @Override public void handleResult(int exitValue, String output) { if (exitValue != 0) { throw new RuntimeException("Could not get Haxe version:\n" + output); } versionRef.set(output.trim()); } }); final String version = versionRef.get(); boolean matches = checkVersion(compilerVersions, version); if (!matches) { String validVersions = Joiner.on(", ").join(Collections2.transform(compilerVersions, new Function<Object, String>() { @Override public String apply(Object compilerVersion) { if (compilerVersion instanceof Pattern) { return ((Pattern) compilerVersion).pattern(); } else { return String.valueOf(compilerVersion); } } })); if (compilerVersions.size() > 1) { validVersions = "either of " + validVersions; } throw new RuntimeException("Invalid Haxe version: " + version + ", should match " + validVersions); } } else { getLogger().debug("Not checking compiler version as no requirement is specified"); } } static boolean checkVersion(Set<Object> compilerVersions, final String version) { return Iterables.any(Collections2.transform(compilerVersions, new Function<Object, Pattern>() { @Override public Pattern apply(Object compilerVersion) { if (compilerVersion instanceof Pattern) { return (Pattern) compilerVersion; } else if (compilerVersion instanceof String) { return Pattern.compile(Pattern.quote((String) compilerVersion)); } else { return Pattern.compile(Pattern.quote(String.valueOf(compilerVersion))); } } }), new Predicate<Pattern>() { @Override public boolean apply(Pattern pattern) { return pattern.matcher(version).matches(); } }); } }