Author: bentmann
Date: Sun May 10 20:36:21 2009
New Revision: 773402

URL: http://svn.apache.org/viewvc?rev=773402&view=rev
Log:
o Moved injection of default plugin executions defined by lifecycle bindings 
into dedicated component and decoupled from processors

Added:
    
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/
   (with props)
    
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/
   (with props)
    
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/DefaultLifecycleBindingsInjector.java
   (with props)
    
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/LifecycleBindingsInjector.java
   (with props)
Modified:
    
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
    
maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml

Propchange: 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/
------------------------------------------------------------------------------
    bugtraq:label = Enter issue ID:

Propchange: 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/
------------------------------------------------------------------------------
    bugtraq:message = Issue id: %BUGID%

Propchange: 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/
------------------------------------------------------------------------------
    bugtraq:number = false

Propchange: 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/
------------------------------------------------------------------------------
    bugtraq:url = http://jira.codehaus.org/browse/%BUGID%

Propchange: 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/
------------------------------------------------------------------------------
    bugtraq:label = Enter issue ID:

Propchange: 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/
------------------------------------------------------------------------------
    bugtraq:message = Issue id: %BUGID%

Propchange: 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/
------------------------------------------------------------------------------
    bugtraq:number = false

Propchange: 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/
------------------------------------------------------------------------------
    bugtraq:url = http://jira.codehaus.org/browse/%BUGID%

Added: 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/DefaultLifecycleBindingsInjector.java
URL: 
http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/DefaultLifecycleBindingsInjector.java?rev=773402&view=auto
==============================================================================
--- 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/DefaultLifecycleBindingsInjector.java
 (added)
+++ 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/DefaultLifecycleBindingsInjector.java
 Sun May 10 20:36:21 2009
@@ -0,0 +1,118 @@
+package org.apache.maven.model.lifecycle;
+
+/*
+ * 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.
+ */
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.lifecycle.LifecycleExecutor;
+import org.apache.maven.model.Build;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.model.PluginContainer;
+import org.apache.maven.model.merge.MavenModelMerger;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
+
+/**
+ * Handles injection of plugin executions induced by the lifecycle bindings 
for a packaging.
+ * 
+ * @author Benjamin Bentmann
+ */
+...@component( role = LifecycleBindingsInjector.class )
+public class DefaultLifecycleBindingsInjector
+    implements LifecycleBindingsInjector
+{
+
+    private LifecycleBindingsMerger merger = new LifecycleBindingsMerger();
+
+    @Requirement
+    private LifecycleExecutor lifecycle;
+
+    public void injectLifecycleBindings( Model model )
+    {
+        String packaging = model.getPackaging();
+
+        Collection<Plugin> defaultPlugins = 
lifecycle.getPluginsBoundByDefaultToAllLifecycles( packaging );
+
+        if ( !defaultPlugins.isEmpty() )
+        {
+            Model lifecycleModel = new Model();
+            lifecycleModel.setBuild( new Build() );
+            lifecycleModel.getBuild().getPlugins().addAll( defaultPlugins );
+
+            merger.merge( model, lifecycleModel );
+        }
+    }
+
+    private static class LifecycleBindingsMerger
+        extends MavenModelMerger
+    {
+
+        public void merge( Model target, Model source )
+        {
+            if ( target.getBuild() == null )
+            {
+                target.setBuild( new Build() );
+            }
+            mergePluginContainer_Plugins( target.getBuild(), 
source.getBuild(), false, Collections.emptyMap() );
+        }
+
+        @Override
+        protected void mergePluginContainer_Plugins( PluginContainer target, 
PluginContainer source,
+                                                     boolean sourceDominant, 
Map<Object, Object> context )
+        {
+            List<Plugin> src = source.getPlugins();
+            if ( !src.isEmpty() )
+            {
+                List<Plugin> tgt = target.getPlugins();
+
+                Map<Object, Plugin> merged = new LinkedHashMap<Object, 
Plugin>( ( src.size() + tgt.size() ) * 2 );
+
+                for ( Iterator<Plugin> it = src.iterator(); it.hasNext(); )
+                {
+                    Plugin element = it.next();
+                    Object key = getPluginKey( element );
+                    merged.put( key, element );
+                }
+
+                for ( Iterator<Plugin> it = tgt.iterator(); it.hasNext(); )
+                {
+                    Plugin element = it.next();
+                    Object key = getPluginKey( element );
+                    Plugin existing = merged.get( key );
+                    if ( existing != null )
+                    {
+                        mergePlugin( element, existing, sourceDominant, 
context );
+                    }
+                    merged.put( key, element );
+                }
+
+                target.setPlugins( new ArrayList<Plugin>( merged.values() ) );
+            }
+        }
+    }
+
+}

Propchange: 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/DefaultLifecycleBindingsInjector.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/DefaultLifecycleBindingsInjector.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/LifecycleBindingsInjector.java
URL: 
http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/LifecycleBindingsInjector.java?rev=773402&view=auto
==============================================================================
--- 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/LifecycleBindingsInjector.java
 (added)
+++ 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/LifecycleBindingsInjector.java
 Sun May 10 20:36:21 2009
@@ -0,0 +1,40 @@
+package org.apache.maven.model.lifecycle;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.model.Model;
+
+/**
+ * Handles injection of plugin executions induced by the lifecycle bindings 
for a packaging.
+ * 
+ * @author Benjamin Bentmann
+ */
+public interface LifecycleBindingsInjector
+{
+
+    /**
+     * Injects plugin executions induced by lifecycle bindings into the 
specified model.
+     * 
+     * @param model The model into which to inject the default plugin 
executions for its packaging, must not be
+     *            <code>null</code>.
+     */
+    void injectLifecycleBindings( Model model );
+
+}

Propchange: 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/LifecycleBindingsInjector.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/model/lifecycle/LifecycleBindingsInjector.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
URL: 
http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java?rev=773402&r1=773401&r2=773402&view=diff
==============================================================================
--- 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
 (original)
+++ 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
 Sun May 10 20:36:21 2009
@@ -20,7 +20,6 @@
 import java.io.Reader;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Properties;
@@ -46,6 +45,7 @@
 import org.apache.maven.model.Profile;
 import org.apache.maven.model.interpolator.Interpolator;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
+import org.apache.maven.model.lifecycle.LifecycleBindingsInjector;
 import org.apache.maven.model.processors.PluginProcessor;
 import org.apache.maven.profiles.DefaultProfileManager;
 import org.apache.maven.profiles.ProfileActivationException;
@@ -88,6 +88,9 @@
     private Interpolator interpolator;
 
     @Requirement
+    private LifecycleBindingsInjector lifecycleBindingsInjector;
+
+    @Requirement
     private ResolutionErrorHandler resolutionErrorHandler;
 
     //private static HashMap<String, MavenProject> hm = new HashMap<String, 
MavenProject>();
@@ -152,9 +155,7 @@
         {
             Model model = interpolateDomainModel( domainModel, configuration, 
pomFile );
 
-            Set<Plugin> plugins = 
lifecycle.getPluginsBoundByDefaultToAllLifecycles( model.getPackaging() );
-
-            addPluginsToModel( model, plugins );
+            lifecycleBindingsInjector.injectLifecycleBindings( model );
 
             ProcessorContext.processManagementNodes( model );
 
@@ -337,43 +338,6 @@
         return null;
     }
 
-    public static void addPluginsToModel( Model target, Set<Plugin> plugins )
-    {
-        List<Plugin> mngPlugins = ( target.getBuild().getPluginManagement() != 
null ) ? target.getBuild().getPluginManagement().getPlugins() : new 
ArrayList<Plugin>();
-
-        List<Plugin> pomPlugins = new ArrayList<Plugin>( 
target.getBuild().getPlugins() );
-
-        List<Plugin> lifecyclePlugins = new ArrayList<Plugin>();
-
-        for ( Plugin p : plugins )
-        {
-            //Go ahead and add version if exists in pluginManagement - don't 
use default version
-            Plugin mngPlugin = containsPlugin( p, mngPlugins );
-            if ( mngPlugin != null && mngPlugin.getVersion() != null )
-            {
-                //System.out.println("Set version:" + p.getVersion() + ": To = 
" + mngPlugin.getVersion());
-                p.setVersion( mngPlugin.getVersion() );
-            }
-
-            Plugin pomPlugin = containsPlugin( p, pomPlugins );
-            if ( pomPlugin == null )
-            {
-                lifecyclePlugins.add( p );
-            }
-            else
-            {
-                PluginProcessor.copy2( p, pomPlugin, true );
-                if ( p.getConfiguration() != null )
-                {
-                    System.out.println( Xpp3Dom.mergeXpp3Dom( (Xpp3Dom) 
p.getConfiguration(), (Xpp3Dom) pomPlugin.getConfiguration() ) );
-                }
-            }
-        }
-        pomPlugins.addAll( lifecyclePlugins );
-        target.getBuild().setPlugins( pomPlugins );
-
-    }
-
     private static Plugin containsPlugin( Plugin plugin, List<Plugin> plugins )
     {
         for ( Plugin p : plugins )
@@ -473,7 +437,7 @@
 
             if ( mavenParents.size() > 0 )
             {
-                DomainModel dm = (DomainModel) mavenParents.get( 0 );
+                DomainModel dm = mavenParents.get( 0 );
                 parentFile = dm.getFile();
                 domainModel.setParentFile( parentFile );
                 lineageCount = mavenParents.size();
@@ -487,7 +451,7 @@
         //Process Profiles
         for ( DomainModel domain : domainModels )
         {
-            DomainModel dm = (DomainModel) domain;
+            DomainModel dm = domain;
 
             if ( !dm.getModel().getProfiles().isEmpty() )
             {

Modified: 
maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml
URL: 
http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml?rev=773402&r1=773401&r2=773402&view=diff
==============================================================================
--- 
maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml
 (original)
+++ 
maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml
 Sun May 10 20:36:21 2009
@@ -37,6 +37,11 @@
           <field-name>interpolator</field-name>
         </requirement>
         <requirement>
+          
<role>org.apache.maven.model.lifecycle.LifecycleBindingsInjector</role>
+          <role-hint>default</role-hint>
+          <field-name>lifecycleBindingsInjector</field-name>
+        </requirement>
+        <requirement>
           
<role>org.apache.maven.artifact.resolver.ResolutionErrorHandler</role>
           <role-hint>default</role-hint>
           <field-name>resolutionErrorHandler</field-name>


Reply via email to