From b84efb908f5c5d80959d16300d22fac312109ac3 Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Wed, 5 Jan 2011 16:53:38 +0100 Subject: [PATCH] [HUDSON-8390] POMs parsing fails in m2 projects which has a wrong inheritence (m3 constraint) add a workaround ONLY for maven2 builds --- .../hudson/maven/MavenEmbedderRequest.java | 20 +++++-- .../hudson/maven/MavenModuleSetBuild.java | 55 +++++++++++++++--- .../src/main/java/hudson/maven/MavenUtil.java | 3 + .../java/hudson/maven/Maven3BuildTest.java | 15 +++++ .../java/hudson/maven/MavenBuildTest.java | 31 +++++++--- .../maven/incorrect-inheritence-testcase.zip | Bin 0 -> 1004 bytes 6 files changed, 102 insertions(+), 22 deletions(-) mode change 100644 => 100755 maven-plugin/src/main/java/hudson/maven/MavenModuleSetBuild.java mode change 100644 => 100755 maven-plugin/src/main/java/hudson/maven/MavenUtil.java mode change 100644 => 100755 test/src/test/java/hudson/maven/Maven3BuildTest.java mode change 100644 => 100755 test/src/test/java/hudson/maven/MavenBuildTest.java create mode 100755 test/src/test/resources/hudson/maven/incorrect-inheritence-testcase.zip diff --git a/maven-plugin/src/main/java/hudson/maven/MavenEmbedderRequest.java b/maven-plugin/src/main/java/hudson/maven/MavenEmbedderRequest.java index 955f27e82d..1ae8115407 100755 --- a/maven-plugin/src/main/java/hudson/maven/MavenEmbedderRequest.java +++ b/maven-plugin/src/main/java/hudson/maven/MavenEmbedderRequest.java @@ -28,6 +28,7 @@ import java.io.File; import java.util.Properties; import org.apache.maven.model.building.ModelBuildingRequest; +import org.sonatype.aether.repository.WorkspaceReader; import org.sonatype.aether.transfer.TransferListener; /** @@ -73,6 +74,11 @@ public class MavenEmbedderRequest */ private int validationLevel = ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0; + /** + * @since 1.393 + */ + private WorkspaceReader workspaceReader; + /** * @param listener * This is where the log messages from Maven will be recorded. @@ -188,14 +194,20 @@ public class MavenEmbedderRequest return this; } - public int getValidationLevel() - { + public int getValidationLevel() { return validationLevel; } - public MavenEmbedderRequest setValidationLevel( int validationLevel ) - { + public MavenEmbedderRequest setValidationLevel( int validationLevel ) { this.validationLevel = validationLevel; return this; } + + public WorkspaceReader getWorkspaceReader() { + return workspaceReader; + } + + public void setWorkspaceReader( WorkspaceReader workspaceReader ) { + this.workspaceReader = workspaceReader; + } } diff --git a/maven-plugin/src/main/java/hudson/maven/MavenModuleSetBuild.java b/maven-plugin/src/main/java/hudson/maven/MavenModuleSetBuild.java old mode 100644 new mode 100755 index ab52b711e1..10e78f076f --- a/maven-plugin/src/main/java/hudson/maven/MavenModuleSetBuild.java +++ b/maven-plugin/src/main/java/hudson/maven/MavenModuleSetBuild.java @@ -1078,21 +1078,40 @@ public class MavenModuleSetBuild extends AbstractMavenBuild= 0; - if (maven3OrLater) + if (maven3OrLater) { mavenEmbedderRequest.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_0 ); - + } else { + reactorReader = new ReactorReader( new HashMap(), new File(workspaceProper) ); + mavenEmbedderRequest.setWorkspaceReader( reactorReader ); + } //mavenEmbedderRequest.setClassLoader( MavenEmbedderUtils.buildClassRealm( mavenHome.getHomeDir(), null, null ) ); MavenEmbedder embedder = MavenUtil.createEmbedder( mavenEmbedderRequest ); - List mps = embedder.readProjects( pom,true); + MavenProject rootProject = null; + + List mps = new ArrayList(0); + if (maven3OrLater) { + mps = embedder.readProjects( pom,true ); + + } else { + // http://issues.hudson-ci.org/browse/HUDSON-8390 + // we cannot read maven projects in one time for backward compatibility + // but we have to use a ReactorReader to get some pom with bad inheritence configured + MavenProject mavenProject = embedder.readProject( pom ); + rootProject = mavenProject; + mps.add( mavenProject ); + reactorReader.addProject( mavenProject ); + readChilds( mavenProject, embedder, mps, reactorReader ); + } Map canonicalPaths = new HashMap( mps.size() ); for(MavenProject mp : mps) { // Projects are indexed by POM path and not module path because // Maven allows to have several POMs with different names in the same directory canonicalPaths.put( mp.getFile().getCanonicalPath(), mp ); - } + } //MavenUtil.resolveModules(embedder,mp,getRootPath(rootPOMRelPrefix),relPath,listener,nonRecursive); if(verbose) { @@ -1101,11 +1120,13 @@ public class MavenModuleSetBuild extends AbstractMavenBuild infos = new LinkedHashSet(); - MavenProject rootProject = null; - for (MavenProject mp : mps) { - if (mp.isExecutionRoot()) { - rootProject = mp; - continue; + + if (maven3OrLater) { + for (MavenProject mp : mps) { + if (mp.isExecutionRoot()) { + rootProject = mp; + continue; + } } } // if rootProject is null but no reason :-) use the first one @@ -1152,6 +1173,22 @@ public class MavenModuleSetBuild extends AbstractMavenBuild mavenProjects, ReactorReader reactorReader) + throws ProjectBuildingException, MavenEmbedderException { + if (mp.getModules() == null || mp.getModules().isEmpty()) { + return; + } + for (String module : mp.getModules()) { + if ( Util.fixEmptyAndTrim( module ) != null ) { + MavenProject mavenProject2 = + mavenEmbedder.readProject( new File(mp.getFile().getParent(), module + "/pom.xml") ); + mavenProjects.add( mavenProject2 ); + reactorReader.addProject( mavenProject2 ); + readChilds( mavenProject2, mavenEmbedder, mavenProjects, reactorReader ); + } + } + } private static final long serialVersionUID = 1L; } diff --git a/maven-plugin/src/main/java/hudson/maven/MavenUtil.java b/maven-plugin/src/main/java/hudson/maven/MavenUtil.java old mode 100644 new mode 100755 index 025b52c81b..ace90a26d9 --- a/maven-plugin/src/main/java/hudson/maven/MavenUtil.java +++ b/maven-plugin/src/main/java/hudson/maven/MavenUtil.java @@ -166,6 +166,9 @@ public class MavenUtil { // FIXME configure those !! mavenRequest.setGlobalSettingsFile( new File( mavenEmbedderRequest.getMavenHome(), "conf/settings.xml" ).getAbsolutePath() ); + if (mavenEmbedderRequest.getWorkspaceReader() != null ) { + mavenRequest.setWorkspaceReader( mavenEmbedderRequest.getWorkspaceReader() ); + } // TODO olamy check this sould be userProperties mavenRequest.setSystemProperties(mavenEmbedderRequest.getSystemProperties()); diff --git a/test/src/test/java/hudson/maven/Maven3BuildTest.java b/test/src/test/java/hudson/maven/Maven3BuildTest.java old mode 100644 new mode 100755 index 59dd3ddab2..cd7e2de4ab --- a/test/src/test/java/hudson/maven/Maven3BuildTest.java +++ b/test/src/test/java/hudson/maven/Maven3BuildTest.java @@ -84,6 +84,21 @@ public class Maven3BuildTest extends HudsonTestCase { System.out.println("mmsb.getProject().getModules " + mmsb.getProject().getModules() ); assertTrue( mmsb.getProject().getModules().isEmpty()); } + + @Bug(value=8390) + public void testMaven3BuildWrongInheritence() throws Exception { + + MavenModuleSet m = createMavenProject(); + MavenInstallation mavenInstallation = configureMaven3(); + m.setMaven( mavenInstallation.getName() ); + m.getReporters().add(new TestReporter()); + m.setScm(new ExtractResourceSCM(getClass().getResource("incorrect-inheritence-testcase.zip"))); + m.setGoals( "clean validate" ); + MavenModuleSetBuild mmsb = m.scheduleBuild2( 0 ).get(); + assertBuildStatus( Result.FAILURE, mmsb ); + System.out.println("mmsb.getProject().getModules " + mmsb.getProject().getModules() ); + assertTrue( mmsb.getProject().getModules().isEmpty()); + } diff --git a/test/src/test/java/hudson/maven/MavenBuildTest.java b/test/src/test/java/hudson/maven/MavenBuildTest.java old mode 100644 new mode 100755 index 427b83e805..cc38f41d99 --- a/test/src/test/java/hudson/maven/MavenBuildTest.java +++ b/test/src/test/java/hudson/maven/MavenBuildTest.java @@ -64,15 +64,6 @@ public class MavenBuildTest extends HudsonTestCase { assertBuildStatus(Result.FAILURE, m.scheduleBuild2(0).get()); } - private static class TestReporter extends MavenReporter { - @Override - public boolean end(MavenBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { - assertNotNull(build.getProject().getWorkspace()); - assertNotNull(build.getWorkspace()); - return true; - } - } - /** * Workspace determination problem on non-aggregator style build. */ @@ -107,4 +98,26 @@ public class MavenBuildTest extends HudsonTestCase { assertFalse( mmsb.getProject().getModules().isEmpty()); } + @Bug(value=8390) + public void testMaven2BuildWrongInheritence() throws Exception { + + MavenModuleSet m = createMavenProject(); + MavenInstallation mavenInstallation = configureDefaultMaven(); + m.setMaven( mavenInstallation.getName() ); + m.getReporters().add(new TestReporter()); + m.setScm(new ExtractResourceSCM(getClass().getResource("incorrect-inheritence-testcase.zip"))); + m.setGoals( "clean validate" ); + MavenModuleSetBuild mmsb = buildAndAssertSuccess(m); + assertFalse( mmsb.getProject().getModules().isEmpty()); + } + + private static class TestReporter extends MavenReporter { + @Override + public boolean end(MavenBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + assertNotNull(build.getProject().getWorkspace()); + assertNotNull(build.getWorkspace()); + return true; + } + } + } diff --git a/test/src/test/resources/hudson/maven/incorrect-inheritence-testcase.zip b/test/src/test/resources/hudson/maven/incorrect-inheritence-testcase.zip new file mode 100755 index 0000000000000000000000000000000000000000..0a30bcca61d4003e96117ceb532d736c6669c095 GIT binary patch literal 1004 zcmWIWW@Zs#U|`^2Fx{eLw^5IG9XBHb!!;mgXOLki$j{ZQ$ju22;bdSoeXrn~wm{jp zw1S&~k>v$50|S`oop{#ouz^6!dDmCgAv=%1cJQCrd4zY#v@kBGJ6ex*Iu$qS-u_ux z^JdG^rwvDP%m2K6(|4xl>U@nqS+Am=zMFikdNOlKjf3lshl?B+$ znxaqba>pn3lpB|OXR_tr_LXF_p6B({CY)*V)3ZuGPx7XjM-}LA{dIiT)%YViOAh~X z;Gg2N&Z}!fQ|Ycl-$d7PzdM?9;K6jUg|}Yavk7(Gpy(TKxi(0#)BQPX`H2UA6pe%8I7!ot=uv>eesg7@&kZj$ps8c28L&wmF&O_C;u;j(^& zjOz2l)dnl>1a5n<^`diqyy(4|CeEo_PqnDd-LUZ9K)|StoQ?{(CJ1WJVpE2V{st8tZTYCXSu|Mg zialoW>GI3%fB*6Zcr!A|G2=?)65uET1~J2uMi3JovaFCKkCxmahT)23h+zy20t{~* weSl`d;~Z!hD9*7OhAYOAUDk^*3^o3N27}@s!(di6kY|{I@H3Ep%mm^A06#8oRR910 literal 0 HcmV?d00001 -- GitLab