From b14a8ad338c6677425e9d3788965f4fe964f4eab Mon Sep 17 00:00:00 2001 From: Michal Matloka Date: Fri, 15 Aug 2014 15:47:48 +0200 Subject: [PATCH] SHRINKRES-194 Multi-module Gradle project support --- .../src/it/multi-module-sample/build.gradle | 5 ++ .../module-one/build.gradle | 13 +++++ .../src/main/java/test/JarClass.java | 13 +++++ .../module-two/build.gradle | 10 ++++ .../it/multi-module-sample/settings.gradle | 2 + .../embedded/EmbeddedGradleImporterImpl.java | 51 ++++++++++++++++--- ...iModuleEmbeddedGradleImporterTestCase.java | 21 ++++++++ 7 files changed, 109 insertions(+), 6 deletions(-) create mode 100644 impl-gradle-embedded-archive/src/it/multi-module-sample/build.gradle create mode 100644 impl-gradle-embedded-archive/src/it/multi-module-sample/module-one/build.gradle create mode 100644 impl-gradle-embedded-archive/src/it/multi-module-sample/module-one/src/main/java/test/JarClass.java create mode 100644 impl-gradle-embedded-archive/src/it/multi-module-sample/module-two/build.gradle create mode 100644 impl-gradle-embedded-archive/src/it/multi-module-sample/settings.gradle create mode 100644 impl-gradle-embedded-archive/src/test/java/org/jboss/shrinkwrap/impl/gradle/archive/importer/embedded/MultiModuleEmbeddedGradleImporterTestCase.java diff --git a/impl-gradle-embedded-archive/src/it/multi-module-sample/build.gradle b/impl-gradle-embedded-archive/src/it/multi-module-sample/build.gradle new file mode 100644 index 000000000..8fb14cfb5 --- /dev/null +++ b/impl-gradle-embedded-archive/src/it/multi-module-sample/build.gradle @@ -0,0 +1,5 @@ +apply plugin: 'maven' + +group = 'org.jboss.shrinkwrap.resolver.test' +version = '1.0.0' +description = """ShrinkWrap Resolver Maven Archie Implementation Tests: Multi-Module Sample""" diff --git a/impl-gradle-embedded-archive/src/it/multi-module-sample/module-one/build.gradle b/impl-gradle-embedded-archive/src/it/multi-module-sample/module-one/build.gradle new file mode 100644 index 000000000..bcaadabcd --- /dev/null +++ b/impl-gradle-embedded-archive/src/it/multi-module-sample/module-one/build.gradle @@ -0,0 +1,13 @@ +apply plugin: 'java' + +repositories { + mavenCentral() +} + +dependencies { + compile 'commons-codec:commons-codec:1.7' + testCompile 'junit:junit:4.10' + compile('org.jboss.spec:jboss-javaee-web-6.0:3.0.2.Final') { + exclude(module: 'xalan') + } +} diff --git a/impl-gradle-embedded-archive/src/it/multi-module-sample/module-one/src/main/java/test/JarClass.java b/impl-gradle-embedded-archive/src/it/multi-module-sample/module-one/src/main/java/test/JarClass.java new file mode 100644 index 000000000..4ed3da5e1 --- /dev/null +++ b/impl-gradle-embedded-archive/src/it/multi-module-sample/module-one/src/main/java/test/JarClass.java @@ -0,0 +1,13 @@ +package test; + +import javax.ejb.Stateless; + +@Stateless +public class JarClass { + + public static final String GREETINGS = "Hello from EmbeddedGradleImporter imported class"; + + public String greet() { + return GREETINGS; + } +} diff --git a/impl-gradle-embedded-archive/src/it/multi-module-sample/module-two/build.gradle b/impl-gradle-embedded-archive/src/it/multi-module-sample/module-two/build.gradle new file mode 100644 index 000000000..a1b3d9bdb --- /dev/null +++ b/impl-gradle-embedded-archive/src/it/multi-module-sample/module-two/build.gradle @@ -0,0 +1,10 @@ +apply plugin: 'java' +apply plugin: 'war' + +repositories { + mavenCentral() +} + +dependencies { + compile(project(':module-one')) +} \ No newline at end of file diff --git a/impl-gradle-embedded-archive/src/it/multi-module-sample/settings.gradle b/impl-gradle-embedded-archive/src/it/multi-module-sample/settings.gradle new file mode 100644 index 000000000..fe27804cf --- /dev/null +++ b/impl-gradle-embedded-archive/src/it/multi-module-sample/settings.gradle @@ -0,0 +1,2 @@ +include "module-one" +include "module-two" \ No newline at end of file diff --git a/impl-gradle-embedded-archive/src/main/java/org/jboss/shrinkwrap/impl/gradle/archive/importer/embedded/EmbeddedGradleImporterImpl.java b/impl-gradle-embedded-archive/src/main/java/org/jboss/shrinkwrap/impl/gradle/archive/importer/embedded/EmbeddedGradleImporterImpl.java index 6a47dabe9..7a6ff61c0 100644 --- a/impl-gradle-embedded-archive/src/main/java/org/jboss/shrinkwrap/impl/gradle/archive/importer/embedded/EmbeddedGradleImporterImpl.java +++ b/impl-gradle-embedded-archive/src/main/java/org/jboss/shrinkwrap/impl/gradle/archive/importer/embedded/EmbeddedGradleImporterImpl.java @@ -24,6 +24,7 @@ import org.gradle.tooling.BuildLauncher; import org.gradle.tooling.GradleConnector; import org.gradle.tooling.ProjectConnection; +import org.gradle.tooling.model.DomainObjectSet; import org.gradle.tooling.model.GradleProject; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.Assignable; @@ -50,6 +51,8 @@ public class EmbeddedGradleImporterImpl implements EmbeddedGradleImporter, Distr private ProjectConnection projectConnection; + private String projectName; + private BuildLauncher getBuildLauncher() { if (buildLauncher == null) { projectConnection = connector.connect(); @@ -73,6 +76,7 @@ public DistributionConfigurationStage forProjectDirectory(final File projectDir) throw new IllegalArgumentException("Given project dir is not a directory" + absoluteFile); } + projectName = absoluteFile.getName(); connector.forProjectDirectory(absoluteFile); return this; } @@ -91,20 +95,55 @@ public DistributionConfigurationStage forThisProjectDirectory() { @Override public TYPE as(final Class clazz) { - final GradleProject gradleProject = projectConnection.getModel(GradleProject.class); - - final File buildDir = gradleProject.getBuildDirectory(); + final GradleProject currentGradleProject = findCurrentGradleProject(); + final File buildDir = currentGradleProject.getBuildDirectory(); final File libsDir = new File(buildDir, "libs"); - final File result = libsDir.listFiles(new FilenameFilter() { + final File[] results = libsDir.listFiles(new FilenameFilter() { @Override public boolean accept(final File dir, final String name) { - return name.startsWith(gradleProject.getName()); + return name.startsWith(currentGradleProject.getName()); } - })[0]; + }); + if (results.length == 0) { + throw new IllegalArgumentException( + "Wrong project directory is used. Tests have to be run from working directory which is a current sub-module directory."); + } + + final File result = results[0]; return ShrinkWrap.create(ZipImporter.class, archive.getName()).importFrom(result).as(clazz); } + private GradleProject findCurrentGradleProject() { + final GradleProject rootGradleProject = projectConnection.getModel(GradleProject.class); + if (rootGradleProject.getName() != projectName) { + final GradleProject child = findChildProject(rootGradleProject, projectName); + if (child != null) { + return child; + + } + } + return rootGradleProject; + } + + private GradleProject findChildProject(GradleProject gradleProject, String childProjectName) { + final DomainObjectSet children = gradleProject.getChildren(); + for (GradleProject child : children) { + if (child.getName().equals(childProjectName)) { + return child; + } + } + + for (GradleProject child : children) { + final GradleProject foundChild = findChildProject(child, childProjectName); + if (foundChild != null) { + return foundChild; + } + } + + return null; + } + @Override public ConfigurationStage useGradleVersion(final String version) { connector.useGradleVersion(version); diff --git a/impl-gradle-embedded-archive/src/test/java/org/jboss/shrinkwrap/impl/gradle/archive/importer/embedded/MultiModuleEmbeddedGradleImporterTestCase.java b/impl-gradle-embedded-archive/src/test/java/org/jboss/shrinkwrap/impl/gradle/archive/importer/embedded/MultiModuleEmbeddedGradleImporterTestCase.java new file mode 100644 index 000000000..f6bfce11a --- /dev/null +++ b/impl-gradle-embedded-archive/src/test/java/org/jboss/shrinkwrap/impl/gradle/archive/importer/embedded/MultiModuleEmbeddedGradleImporterTestCase.java @@ -0,0 +1,21 @@ +package org.jboss.shrinkwrap.impl.gradle.archive.importer.embedded; + +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.gradle.archive.importer.embedded.EmbeddedGradleImporter; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.junit.Test; + +/** + * @author Michal Matloka + */ +public class MultiModuleEmbeddedGradleImporterTestCase { + + @Test + public void should() { + final String dir = "src/it/multi-module-sample/module-two"; + final WebArchive webArchive = ShrinkWrap.create(EmbeddedGradleImporter.class).forProjectDirectory(dir) + .importBuildOutput().as(WebArchive.class); + + AssertArchive.assertContains(webArchive, "/WEB-INF/lib/module-one.jar"); + } +}