package com.prezi.spaghetti.gradle.internal; import com.google.common.collect.Sets; import com.prezi.spaghetti.bundle.ModuleBundle; import com.prezi.spaghetti.bundle.ModuleBundleSet; import com.prezi.spaghetti.definition.ModuleConfiguration; import com.prezi.spaghetti.definition.ModuleDefinitionSource; import com.prezi.spaghetti.definition.internal.DefaultModuleDefinitionSource; import com.prezi.spaghetti.definition.internal.ModuleConfigurationParser; import com.prezi.spaghetti.internal.DeprecationNagger; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.internal.ConventionTask; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFiles; import java.io.File; import java.io.IOException; import java.util.SortedSet; public class AbstractSpaghettiTask extends ConventionTask { private ConfigurableFileCollection dependentModules = getProject().files(); private ModuleBundleSet dependentBundles; @InputFiles public ConfigurableFileCollection getDependentModules() { return dependentModules; } /** * Returns names of directly dependent modules. This is here so that Gradle will detect * a change in inputs even if the only change is that a previously directly dependent * module becomes transitively dependent, or vice versa. * * @return names of directly dependent modules. * @throws IOException */ @Input @SuppressWarnings("UnusedDeclaration") protected SortedSet<String> getDirectDependentBundleNames() throws IOException { SortedSet<String> directBundleNames = Sets.newTreeSet(); for (ModuleBundle bundle : lookupBundles().getDirectBundles()) { directBundleNames.add(bundle.getName()); } return directBundleNames; } public void setDependentModules(ConfigurableFileCollection dependentModules) { this.dependentBundles = null; this.dependentModules = dependentModules; } public void dependentModules(Object... additionalDependentModules) { ConfigurableFileCollection dependentModules = getDependentModules(); dependentModules.from(additionalDependentModules); setDependentModules(dependentModules); } public void dependentModule(Object... dependentModules) { dependentModules(dependentModules); } @Deprecated @SuppressWarnings("UnusedDeclaration") public void additionalDependentModules(Object... additionalDependentModules) { DeprecationNagger.nagUserOfReplacedMethod("additionalDependentModules", "dependentModules"); dependentModules(additionalDependentModules); } @Deprecated @SuppressWarnings("UnusedDeclaration") public void additionalDependentModule(Object... additionalDependentModules) { DeprecationNagger.nagUserOfReplacedMethod("additionalDependentModule", "dependentModule"); dependentModules(additionalDependentModules); } @Deprecated @SuppressWarnings("UnusedDeclaration") public void additionalDirectDependentModules(Object... additionalDependentModules) { DeprecationNagger.nagUserOfReplacedMethod("additionalDirectDependentModules", "dependentModules"); dependentModules(additionalDependentModules); } @Deprecated @SuppressWarnings("UnusedDeclaration") public void additionalDirectDependentModule(Object... additionalDependentModules) { DeprecationNagger.nagUserOfReplacedMethod("additionalDirectDependentModule", "dependentModule"); dependentModule(additionalDependentModules); } protected ModuleBundleSet lookupBundles() throws IOException { if (dependentBundles == null) { dependentBundles = ModuleBundleLookup.lookup(getProject(), getDependentModules()); } return dependentBundles; } public ModuleConfiguration readConfig(File definition) throws IOException { ModuleDefinitionSource definitionSource; try { definitionSource = DefaultModuleDefinitionSource.fromFile(definition); } catch (IOException e) { throw new RuntimeException(e); } return readConfigInternal(definitionSource); } private ModuleConfiguration readConfigInternal(ModuleDefinitionSource localDefinition) throws IOException { ModuleBundleSet bundles = lookupBundles(); ModuleConfiguration config = ModuleConfigurationParser.parse(localDefinition, bundles); getLogger().info("Loaded configuration: {}", config); return config; } }