Author: bentmann
Date: Thu Oct 29 12:33:36 2009
New Revision: 830915
URL: http://svn.apache.org/viewvc?rev=830915&view=rev
Log:
[MNG-4416] [regression] Plugins are not properly ordered after merging with
profile plugins
Added:
maven/maven-3/trunk/maven-core/src/test/resources-project-builder/plugin-injection-merge-order/
(with props)
maven/maven-3/trunk/maven-core/src/test/resources-project-builder/plugin-injection-merge-order/pom.xml
(with props)
Modified:
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/profile/DefaultProfileInjector.java
Modified:
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java?rev=830915&r1=830914&r2=830915&view=diff
==============================================================================
---
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java
(original)
+++
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java
Thu Oct 29 12:33:36 2009
@@ -1728,6 +1728,33 @@
assertEquals( actual, expected );
}
+ /** MNG-4416 */
+ public void testPluginOrderAfterMergingWithInjectedPlugins()
+ throws Exception
+ {
+ PomTestWrapper pom = buildPom( "plugin-injection-merge-order" );
+
+ List<String> expected = new ArrayList<String>();
+ expected.add( "maven-it-plugin-error" );
+ expected.add( "maven-it-plugin-configuration" );
+ expected.add( "maven-it-plugin-dependency-resolution" );
+ expected.add( "maven-it-plugin-packaging" );
+ expected.add( "maven-it-plugin-log-file" );
+ expected.add( "maven-it-plugin-expression" );
+ expected.add( "maven-it-plugin-fork" );
+ expected.add( "maven-it-plugin-touch" );
+
+ List<String> actual = new ArrayList<String>();
+ for ( Plugin plugin : (List<Plugin>) pom.getValue( "build/plugins" ) )
+ {
+ actual.add( plugin.getArtifactId() );
+ }
+
+ actual.retainAll( expected );
+
+ assertEquals( actual, expected );
+ }
+
private void assertPathSuffixEquals( String expected, Object actual )
{
String a = actual.toString();
Propchange:
maven/maven-3/trunk/maven-core/src/test/resources-project-builder/plugin-injection-merge-order/
------------------------------------------------------------------------------
bugtraq:label = Enter issue ID:
Propchange:
maven/maven-3/trunk/maven-core/src/test/resources-project-builder/plugin-injection-merge-order/
------------------------------------------------------------------------------
bugtraq:message = Issue id: %BUGID%
Propchange:
maven/maven-3/trunk/maven-core/src/test/resources-project-builder/plugin-injection-merge-order/
------------------------------------------------------------------------------
bugtraq:number = false
Propchange:
maven/maven-3/trunk/maven-core/src/test/resources-project-builder/plugin-injection-merge-order/
------------------------------------------------------------------------------
bugtraq:url = http://jira.codehaus.org/browse/%BUGID%
Added:
maven/maven-3/trunk/maven-core/src/test/resources-project-builder/plugin-injection-merge-order/pom.xml
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/test/resources-project-builder/plugin-injection-merge-order/pom.xml?rev=830915&view=auto
==============================================================================
---
maven/maven-3/trunk/maven-core/src/test/resources-project-builder/plugin-injection-merge-order/pom.xml
(added)
+++
maven/maven-3/trunk/maven-core/src/test/resources-project-builder/plugin-injection-merge-order/pom.xml
Thu Oct 29 12:33:36 2009
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<project>
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.apache.maven.its.mng4416</groupId>
+ <artifactId>test</artifactId>
+ <version>0.1</version>
+
+ <name>Maven Integration Test :: MNG-4416</name>
+ <description>
+ Test that merging of plugins during profile injection follows these rules
regarding ordering:
+ model: X -> A -> B -> D -> E
+ profile: Y -> A -> C -> D -> F
+ result: X -> Y -> A -> B -> C -> D -> E -> F
+ </description>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.its.plugins</groupId>
+ <artifactId>maven-it-plugin-error</artifactId>
+ <version>2.1-SNAPSHOT</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.its.plugins</groupId>
+ <artifactId>maven-it-plugin-dependency-resolution</artifactId>
+ <version>2.1-SNAPSHOT</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.its.plugins</groupId>
+ <artifactId>maven-it-plugin-packaging</artifactId>
+ <version>2.1-SNAPSHOT</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.its.plugins</groupId>
+ <artifactId>maven-it-plugin-expression</artifactId>
+ <version>2.1-SNAPSHOT</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.its.plugins</groupId>
+ <artifactId>maven-it-plugin-fork</artifactId>
+ <version>2.1-SNAPSHOT</version>
+ </plugin>
+ </plugins>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>test</id>
+ <activation>
+ <property>
+ <name>!skip-mng4416</name>
+ </property>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.its.plugins</groupId>
+ <artifactId>maven-it-plugin-configuration</artifactId>
+ <version>2.1-SNAPSHOT</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.its.plugins</groupId>
+ <artifactId>maven-it-plugin-dependency-resolution</artifactId>
+ <version>2.1-SNAPSHOT</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.its.plugins</groupId>
+ <artifactId>maven-it-plugin-log-file</artifactId>
+ <version>2.1-SNAPSHOT</version>
+ <configuration>
+ <logFile>target/it.properties</logFile>
+ </configuration>
+ <executions>
+ <execution>
+ <id>first</id>
+ <phase>validate</phase>
+ <goals>
+ <goal>reset</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.its.plugins</groupId>
+ <artifactId>maven-it-plugin-expression</artifactId>
+ <version>2.1-SNAPSHOT</version>
+ <configuration>
+ <outputFile>target/it.properties</outputFile>
+ <expressions>
+ <expression>project/build/plugins</expression>
+ </expressions>
+ </configuration>
+ <executions>
+ <execution>
+ <id>second</id>
+ <phase>validate</phase>
+ <goals>
+ <goal>eval</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.its.plugins</groupId>
+ <artifactId>maven-it-plugin-touch</artifactId>
+ <version>2.1-SNAPSHOT</version>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+</project>
Propchange:
maven/maven-3/trunk/maven-core/src/test/resources-project-builder/plugin-injection-merge-order/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/maven-3/trunk/maven-core/src/test/resources-project-builder/plugin-injection-merge-order/pom.xml
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified:
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/profile/DefaultProfileInjector.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/profile/DefaultProfileInjector.java?rev=830915&r1=830914&r2=830915&view=diff
==============================================================================
---
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/profile/DefaultProfileInjector.java
(original)
+++
maven/maven-3/trunk/maven-model-builder/src/main/java/org/apache/maven/model/profile/DefaultProfileInjector.java
Thu Oct 29 12:33:36 2009
@@ -91,29 +91,49 @@
if ( !src.isEmpty() )
{
List<Plugin> tgt = target.getPlugins();
- Map<Object, Plugin> merged = new LinkedHashMap<Object,
Plugin>( ( src.size() + tgt.size() ) * 2 );
+ Map<Object, Plugin> master = new LinkedHashMap<Object,
Plugin>( tgt.size() * 2 );
for ( Plugin element : tgt )
{
Object key = getPluginKey( element );
- merged.put( key, element );
+ master.put( key, element );
}
+ Map<Object, List<Plugin>> predecessors = new
LinkedHashMap<Object, List<Plugin>>();
+ List<Plugin> pending = new ArrayList<Plugin>();
for ( Plugin element : src )
{
Object key = getPluginKey( element );
- Plugin existing = merged.get( key );
- if ( existing == null )
+ Plugin existing = master.get( key );
+ if ( existing != null )
{
- merged.put( key, element );
+ mergePlugin( existing, element, sourceDominant,
context );
+
+ if ( !pending.isEmpty() )
+ {
+ predecessors.put( key, pending );
+ pending = new ArrayList<Plugin>();
+ }
}
else
{
- mergePlugin( existing, element, sourceDominant,
context );
+ pending.add( element );
+ }
+ }
+
+ List<Plugin> result = new ArrayList<Plugin>( src.size() +
tgt.size() );
+ for ( Map.Entry<Object, Plugin> entry : master.entrySet() )
+ {
+ List<Plugin> pre = predecessors.get( entry.getKey() );
+ if ( pre != null )
+ {
+ result.addAll( pre );
}
+ result.add( entry.getValue() );
}
+ result.addAll( pending );
- target.setPlugins( new ArrayList<Plugin>( merged.values() ) );
+ target.setPlugins( result );
}
}