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 ); } }