| package com.android.build.gradle.integration.common.fixture.app; |
| |
| import com.android.annotations.NonNull; |
| import com.android.annotations.Nullable; |
| import com.android.build.gradle.integration.common.fixture.TestProject; |
| import com.google.common.collect.Maps; |
| import com.google.common.io.Files; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.nio.charset.Charset; |
| import java.util.Map; |
| |
| /** |
| * A TestProject containing multiple TestProject as modules. |
| */ |
| public class MultiModuleTestProject implements TestProject { |
| |
| private Map<String, TestProject> subprojects; |
| |
| /** |
| * Creates a MultiModuleTestProject. |
| * |
| * @param subprojects a map with gradle project path as key and the corresponding TestProject as |
| * value. |
| */ |
| public MultiModuleTestProject(Map<String, TestProject> subprojects) { |
| this.subprojects = Maps.newHashMap(subprojects); |
| } |
| |
| /** |
| * Creates a MultiModuleTestProject with multiple subproject of the same TestProject. |
| * |
| * @param baseName Base name of the subproject. Actual project name will be baseName + index. |
| * @param subproject A TestProject. |
| * @param count Number of subprojects to create. |
| */ |
| public MultiModuleTestProject(String baseName, TestProject subproject, int count) { |
| subprojects = Maps.newHashMapWithExpectedSize(count); |
| for (int i = 0; i < count; i++) { |
| subprojects.put(baseName + i, subproject); |
| } |
| } |
| |
| /** |
| * Return the test project with the given project path. |
| */ |
| public TestProject getSubproject(String subprojectPath) { |
| return subprojects.get(subprojectPath); |
| } |
| |
| @Override |
| public void write( |
| @NonNull final File projectDir, |
| @Nullable final String buildScriptContent) throws IOException { |
| for (Map.Entry<String, ? extends TestProject> entry : subprojects.entrySet()) { |
| String subprojectPath = entry.getKey(); |
| TestProject subproject = entry.getValue(); |
| File subprojectDir = new File(projectDir, convertGradlePathToDirectory(subprojectPath)); |
| if (!subprojectDir.exists()) { |
| subprojectDir.mkdirs(); |
| assert subprojectDir.isDirectory(); |
| } |
| subproject.write(subprojectDir, null); |
| } |
| |
| StringBuilder builder = new StringBuilder(); |
| for (String subprojectName : subprojects.keySet()) { |
| builder.append("include '").append(subprojectName).append("'\n"); |
| } |
| Files.write(builder.toString(), |
| new File(projectDir, "settings.gradle"), |
| Charset.defaultCharset()); |
| |
| Files.write(buildScriptContent, |
| new File(projectDir, "build.gradle"), |
| Charset.defaultCharset()); |
| } |
| |
| @Override |
| public boolean containsFullBuildScript() { |
| return false; |
| } |
| |
| private static String convertGradlePathToDirectory(String gradlePath) { |
| return gradlePath.replace(":", "/"); |
| } |
| } |