From a1e1d0597a0dd0a1dec7175e9ff554c007174793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Wy=C5=82uda?= Date: Fri, 12 Jul 2013 02:56:53 +0200 Subject: [PATCH] Implemented insert methods in GradleUtil. --- .../projects/model/GradlePluginType.java | 15 ++++- .../forge/addon/gradle/parser/GradleUtil.java | 65 +++++++++++++++++-- .../addon/gradle/parser/GradleUtilTest.java | 47 +++++++++++++- 3 files changed, 120 insertions(+), 7 deletions(-) diff --git a/api/src/main/java/org/jboss/forge/addon/gradle/projects/model/GradlePluginType.java b/api/src/main/java/org/jboss/forge/addon/gradle/projects/model/GradlePluginType.java index 72ad813..e434ecb 100644 --- a/api/src/main/java/org/jboss/forge/addon/gradle/projects/model/GradlePluginType.java +++ b/api/src/main/java/org/jboss/forge/addon/gradle/projects/model/GradlePluginType.java @@ -16,6 +16,7 @@ */ public enum GradlePluginType { + // TODO short names for plugin types JAVA("org.gradle.api.plugins.JavaPlugin"), GROOVY("org.gradle.api.plugins.GroovyPlugin"), SCALA("org.gradle.api.plugins.scala.ScalaPlugin"), WAR("org.gradle.api.plugins.WarPlugin"), EAR("org.gradle.plugins.EarPlugin"), JETTY("org.gradle.api.plugins.jetty.JettyPlugin"), @@ -45,18 +46,30 @@ private static class TypeContainer } private final String clazz; + private final String shortName; private GradlePluginType(String clazz) + { + this(clazz, ""); + } + + private GradlePluginType(String clazz, String shortName) { this.clazz = clazz; TypeContainer.TYPE_MAP.put(clazz, this); + this.shortName = shortName; } public String getClazz() { return clazz; } - + + public String getShortName() + { + return shortName; + } + /** * @return Plugin type for given class. If there is no such type then it returns {@link #OTHER}. */ diff --git a/impl/src/main/java/org/jboss/forge/addon/gradle/parser/GradleUtil.java b/impl/src/main/java/org/jboss/forge/addon/gradle/parser/GradleUtil.java index bca7faf..67e0a7f 100644 --- a/impl/src/main/java/org/jboss/forge/addon/gradle/parser/GradleUtil.java +++ b/impl/src/main/java/org/jboss/forge/addon/gradle/parser/GradleUtil.java @@ -8,8 +8,10 @@ import java.util.List; -import org.gradle.jarjar.com.google.common.base.Preconditions; +import org.gradle.jarjar.com.google.common.base.Joiner; +import org.gradle.jarjar.com.google.common.collect.Lists; import org.jboss.forge.addon.gradle.projects.exceptions.UnremovableElementException; +import org.jboss.forge.furnace.util.Strings; /** * @author Adam WyƂuda @@ -18,6 +20,8 @@ public class GradleUtil { public static String insertDependency(String source, String name, String group, String version, String configuration) { + String depString = String.format("%s '%s:%s:%s'", configuration, group, name, version); + source = SourceUtil.insertIntoInvocationAtPath(source, depString, "dependencies"); return source; } @@ -28,9 +32,24 @@ public static String removeDependency(String source, String name, String group, return source; } + /** + * Adds {@code apply plugin: 'clazz'} after the last plugin application, if there are no other applied plugins then + * it adds it at the end of source. + */ public static String insertPlugin(String source, String clazz) { - // TODO + String pluginString = String.format("\napply plugin: '%s'", clazz); + + SimpleGroovyParser parser = SimpleGroovyParser.fromSource(source); + if (parser.getInvocationsWithMap().size() > 0) + { + InvocationWithMap lastInvocation = parser.getInvocationsWithMap().get(parser.getInvocationsWithMap().size() - 1); + source = SourceUtil.insertString(source, pluginString, lastInvocation.getLastLineNumber(), lastInvocation.getLastColumnNumber()); + } + else + { + source += pluginString; + } return source; } @@ -43,7 +62,8 @@ public static String removePlugin(String source, String clazz) public static String insertRepository(String source, String name, String url) { - // TODO + String repoString = String.format("url '%s'", url); + source = SourceUtil.insertIntoInvocationAtPath(source, repoString, "repositories", "maven"); return source; } @@ -58,9 +78,46 @@ public static String removeRepository(String source, String name, String url) // so we can only insert new tasks public static String insertTask(String source, String name, List dependsOn, String type, String code) { - // TODO + String taskDeclarationString = taskDeclarationString(name, dependsOn, type); + String taskString = String.format("\ntask %s << {\n%s\n}\n", taskDeclarationString, code); + source += taskString; return source; } + + private static String taskDeclarationString(String name, List dependsOn, String type) + { + if (dependsOn.isEmpty() && Strings.isNullOrEmpty(type)) + { + return name; + } + else + { + String dependsOnString = dependsOnString(dependsOn); + String typeString = Strings.isNullOrEmpty(type) ? "" : ", type: " + type; + return String.format("(name: '%s'%s%s)", name, dependsOnString, typeString); + } + } + + private static String dependsOnString(List dependsOn) + { + if (dependsOn.size() == 0) + { + return ""; + } + else if (dependsOn.size() == 1) + { + return ", dependsOn: '" + dependsOn.get(0) + "'"; + } + else + { + List dependsOnInQuotes = Lists.newArrayList(); + for (String dep : dependsOn) + { + dependsOnInQuotes.add("'" + dep + "'"); + } + return ", dependsOn: [" + Joiner.on(", ").join(dependsOnInQuotes) + "]"; + } + } /** * Checks if source includes forge library and if not then adds it. diff --git a/impl/src/test/java/org/jboss/forge/addon/gradle/parser/GradleUtilTest.java b/impl/src/test/java/org/jboss/forge/addon/gradle/parser/GradleUtilTest.java index 3036ac9..0493b33 100644 --- a/impl/src/test/java/org/jboss/forge/addon/gradle/parser/GradleUtilTest.java +++ b/impl/src/test/java/org/jboss/forge/addon/gradle/parser/GradleUtilTest.java @@ -117,7 +117,7 @@ public void testInsertRepository() String expected = "" + "repositories {\n" + " maven {\n" + - " url 'http://repo.com\n" + + " url 'http://repo.com'\n" + " }\n" + "}"; String result = GradleUtil.insertRepository(source, "", "http://repo.com"); @@ -166,9 +166,52 @@ public void testInsertTask() " println variable\n" + "}\n"; String result = GradleUtil.insertTask(source, "efgh", Lists. newArrayList(), "", "" + + " def variable = 10\n" + + " println variable"); + assertEquals(expected, result); + } + + @Test + public void testInsertTaskWithDependenciesAndType() + { + String source = "" + + "task abcd << {\n" + + " println 'ABCD!!'\n" + + "}\n"; + String expected = "" + + "task abcd << {\n" + + " println 'ABCD!!'\n" + + "}\n" + + "\n" + + "task (name: 'efgh', dependsOn: ['x', 'y', 'z'], type: Copy) << {\n" + + " def variable = 10\n" + + " println variable\n" + + "}\n"; + String result = GradleUtil.insertTask(source, "efgh", Lists. newArrayList("x", "y", "z"), "Copy", "" + + " def variable = 10\n" + + " println variable"); + assertEquals(expected, result); + } + + @Test + public void testInsertTaskWithOneDependency() + { + String source = "" + + "task abcd << {\n" + + " println 'ABCD!!'\n" + + "}\n"; + String expected = "" + + "task abcd << {\n" + + " println 'ABCD!!'\n" + + "}\n" + "\n" + + "task (name: 'efgh', dependsOn: 'x', type: Copy) << {\n" + + " def variable = 10\n" + + " println variable\n" + + "}\n"; + String result = GradleUtil.insertTask(source, "efgh", Lists. newArrayList("x"), "Copy", "" + " def variable = 10\n" + - " println variable\n"); + " println variable"); assertEquals(expected, result); }