You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by be...@apache.org on 2010/09/14 19:30:14 UTC

svn commit: r997005 - in /maven/maven-3/trunk/maven-core/src: main/java/org/apache/maven/configuration/ main/java/org/apache/maven/configuration/internal/ test/java/org/apache/maven/configuration/

Author: bentmann
Date: Tue Sep 14 17:30:14 2010
New Revision: 997005

URL: http://svn.apache.org/viewvc?rev=997005&view=rev
Log:
[MNG-4484] Create a Maven API for component configuration

Added:
    maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/   (with props)
    maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BasedirBeanConfigurationPathTranslator.java   (with props)
    maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationException.java   (with props)
    maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationPathTranslator.java   (with props)
    maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationRequest.java   (with props)
    maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationValuePreprocessor.java   (with props)
    maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurator.java   (with props)
    maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/DefaultBeanConfigurationRequest.java   (with props)
    maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/internal/   (with props)
    maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/internal/DefaultBeanConfigurator.java   (with props)
    maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/configuration/   (with props)
    maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/configuration/DefaultBeanConfiguratorTest.java   (with props)

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/
------------------------------------------------------------------------------
    bugtraq:label = Enter issue ID:

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/
------------------------------------------------------------------------------
    bugtraq:message = Issue id: %BUGID%

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/
------------------------------------------------------------------------------
    bugtraq:number = false

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/
------------------------------------------------------------------------------
    bugtraq:url = http://jira.codehaus.org/browse/%BUGID%

Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BasedirBeanConfigurationPathTranslator.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BasedirBeanConfigurationPathTranslator.java?rev=997005&view=auto
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BasedirBeanConfigurationPathTranslator.java (added)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BasedirBeanConfigurationPathTranslator.java Tue Sep 14 17:30:14 2010
@@ -0,0 +1,71 @@
+package org.apache.maven.configuration;
+
+/*
+ * 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.io.File;
+
+/**
+ * A path translator that resolves relative paths against a specific base directory.
+ * 
+ * @author Benjamin Bentmann
+ */
+public class BasedirBeanConfigurationPathTranslator
+    implements BeanConfigurationPathTranslator
+{
+
+    private final File basedir;
+
+    /**
+     * Creates a new path translator using the specified base directory.
+     * 
+     * @param basedir The base directory to resolve relative paths against, may be {@code null} to disable path
+     *            translation.
+     */
+    public BasedirBeanConfigurationPathTranslator( File basedir )
+    {
+        this.basedir = basedir;
+    }
+
+    public File translatePath( File path )
+    {
+        File result = path;
+
+        if ( path != null && basedir != null )
+        {
+            if ( path.isAbsolute() )
+            {
+                // path is already absolute, we're done
+            }
+            else if ( path.getPath().startsWith( File.separator ) )
+            {
+                // drive-relative Windows path, don't align with base dir but with drive root
+                result = path.getAbsoluteFile();
+            }
+            else
+            {
+                // an ordinary relative path, align with base dir
+                result = new File( new File( basedir, path.getPath() ).toURI().normalize() ).getAbsoluteFile();
+            }
+        }
+
+        return result;
+    }
+
+}

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BasedirBeanConfigurationPathTranslator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BasedirBeanConfigurationPathTranslator.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationException.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationException.java?rev=997005&view=auto
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationException.java (added)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationException.java Tue Sep 14 17:30:14 2010
@@ -0,0 +1,41 @@
+package org.apache.maven.configuration;
+
+/*
+ * 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.
+ */
+
+/**
+ * Thrown when a bean couldn't be configured.
+ * 
+ * @author Benjamin Bentmann
+ */
+public class BeanConfigurationException
+    extends Exception
+{
+
+    public BeanConfigurationException( String message )
+    {
+        super( message );
+    }
+
+    public BeanConfigurationException( String message, Throwable cause )
+    {
+        super( message, cause );
+    }
+
+}

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationException.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationPathTranslator.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationPathTranslator.java?rev=997005&view=auto
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationPathTranslator.java (added)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationPathTranslator.java Tue Sep 14 17:30:14 2010
@@ -0,0 +1,41 @@
+package org.apache.maven.configuration;
+
+/*
+ * 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.io.File;
+
+/**
+ * Postprocesses filesystem paths. For instance, a path translator might want to resolve relative paths given in the
+ * bean configuration against some base directory.
+ * 
+ * @author Benjamin Bentmann
+ */
+public interface BeanConfigurationPathTranslator
+{
+
+    /**
+     * Translates the specified path.
+     * 
+     * @param path The path to translate, may be {@code null}.
+     * @return The translated path or {@code null} if none.
+     */
+    File translatePath( File path );
+
+}

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationPathTranslator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationPathTranslator.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationRequest.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationRequest.java?rev=997005&view=auto
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationRequest.java (added)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationRequest.java Tue Sep 14 17:30:14 2010
@@ -0,0 +1,108 @@
+package org.apache.maven.configuration;
+
+/*
+ * 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.
+ */
+
+/**
+ * A request to configure a bean from some configuration in the POM or similar.
+ * 
+ * @author Benjamin Bentmann
+ */
+public interface BeanConfigurationRequest
+{
+
+    /**
+     * Gets the bean to configure. Eventually, a valid request must have a bean set.
+     * 
+     * @return The bean to configure, or {@code null} if none.
+     */
+    Object getBean();
+
+    /**
+     * Sets the bean to configure. Eventually, a valid request must have a bean set.
+     * 
+     * @param bean The bean to configure, may be {@code null}.
+     * @return This request for chaining, never {@code null}.
+     */
+    BeanConfigurationRequest setBean( Object bean );
+
+    /**
+     * Gets the configuration to unmarshal into the bean.
+     * 
+     * @return The configuration to unmarshal into the bean or {@code null} if none.
+     */
+    Object getConfiguration();
+
+    /**
+     * Sets the configuration to unmarshal into the bean. The configuration should be taken from
+     * {@link org.apache.maven.model.ConfigurationContainer#getConfiguration()} or a similar source.
+     * 
+     * @param configuration The configuration to unmarshal, may be {@code null}.
+     * @return This request for chaining, never {@code null}.
+     */
+    BeanConfigurationRequest setConfiguration( Object configuration );
+
+    /**
+     * Gets the class loader from which to load any types referenced by the configuration. If unset, the class loader of
+     * the bean class will be used.
+     * 
+     * @return The class loader to load referenced types from or {@code null} if unset.
+     */
+    ClassLoader getClassLoader();
+
+    /**
+     * Sets the class loader from which to load any types referenced by the configuration. If unset, the class loader of
+     * the bean class will be used.
+     * 
+     * @param classLoader The class loader to load referenced types from, may be {@code null}.
+     * @return This request for chaining, never {@code null}.
+     */
+    BeanConfigurationRequest setClassLoader( ClassLoader classLoader );
+
+    /**
+     * Gets the optional preprocessor for configuration values.
+     * 
+     * @return The preprocessor for configuration values or {@code null} if none.
+     */
+    BeanConfigurationValuePreprocessor getValuePreprocessor();
+
+    /**
+     * Sets the optional preprocessor for configuration values.
+     * 
+     * @param valuePreprocessor The preprocessor for configuration values, may be {@code null} if unneeded.
+     * @return This request for chaining, never {@code null}.
+     */
+    BeanConfigurationRequest setValuePreprocessor( BeanConfigurationValuePreprocessor valuePreprocessor );
+
+    /**
+     * Gets the optional path translator for configuration values unmarshalled to files.
+     * 
+     * @return The path translator for files or {@code null} if none.
+     */
+    BeanConfigurationPathTranslator getPathTranslator();
+
+    /**
+     * Sets the optional path translator for configuration values unmarshalled to files.
+     * 
+     * @param pathTranslator The path translator for files, may be {@code null} if unneeded.
+     * @return This request for chaining, never {@code null}.
+     */
+    BeanConfigurationRequest setPathTranslator( BeanConfigurationPathTranslator pathTranslator );
+
+}

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationRequest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationRequest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationValuePreprocessor.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationValuePreprocessor.java?rev=997005&view=auto
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationValuePreprocessor.java (added)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationValuePreprocessor.java Tue Sep 14 17:30:14 2010
@@ -0,0 +1,45 @@
+package org.apache.maven.configuration;
+
+/*
+ * 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.
+ */
+
+/**
+ * Preprocesses a value from a bean configuration before the bean configurator unmarshals it into a bean property. A
+ * common use case for such preprocessing is the evaluation of variables within the configuration value.
+ * 
+ * @author Benjamin Bentmann
+ */
+public interface BeanConfigurationValuePreprocessor
+{
+
+    /**
+     * Preprocesses the specified bean configuration value. The optional type provided to this method is a hint (not a
+     * requirement) for the preprocessor to resolve the value to a compatible value or a (string) value than can be
+     * unmarshalled into that type. The preprocessor is not required to perform any type conversion but should rather
+     * filter out incompatible values from its result.
+     * 
+     * @param value The configuration value to preprocess, must not be {@code null}.
+     * @param type The target type of the value, may be {@code null}.
+     * @return The processed configuration value or {@code null} if none.
+     * @throws BeanConfigurationException If an error occurred while preprocessing the value.
+     */
+    Object preprocessValue( String value, Class<?> type )
+        throws BeanConfigurationException;
+
+}

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationValuePreprocessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurationValuePreprocessor.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurator.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurator.java?rev=997005&view=auto
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurator.java (added)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurator.java Tue Sep 14 17:30:14 2010
@@ -0,0 +1,44 @@
+package org.apache.maven.configuration;
+
+/*
+ * 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.
+ */
+
+/**
+ * Unmarshals some textual configuration from the POM or similar into the properties of a bean. This component works
+ * similar to the way Maven configures plugins from the POM, i.e. some configuration like {@code <param>value</param>}
+ * is mapped to an equally named property of the bean and converted. The properties of the bean are supposed to either
+ * have a public setter or be backed by an equally named field (of any visibility).
+ * 
+ * @since 3.0
+ * @author Benjamin Bentmann
+ */
+public interface BeanConfigurator
+{
+
+    /**
+     * Performs the specified bean configuration.
+     * 
+     * @param request The configuration request that specifies the bean and the configuration to process, must not be
+     *            {@code null}.
+     * @throws BeanConfigurationException If the bean configuration could not be successfully processed.
+     */
+    void configureBean( BeanConfigurationRequest request )
+        throws BeanConfigurationException;
+
+}

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/BeanConfigurator.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/DefaultBeanConfigurationRequest.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/DefaultBeanConfigurationRequest.java?rev=997005&view=auto
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/DefaultBeanConfigurationRequest.java (added)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/DefaultBeanConfigurationRequest.java Tue Sep 14 17:30:14 2010
@@ -0,0 +1,182 @@
+package org.apache.maven.configuration;
+
+/*
+ * 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.Build;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.model.PluginExecution;
+import org.apache.maven.model.PluginManagement;
+import org.codehaus.plexus.util.StringUtils;
+
+/**
+ * A basic bean configuration request.
+ * 
+ * @author Benjamin Bentmann
+ */
+public class DefaultBeanConfigurationRequest
+    implements BeanConfigurationRequest
+{
+
+    private Object bean;
+
+    private Object configuration;
+
+    private ClassLoader classLoader;
+
+    private BeanConfigurationValuePreprocessor valuePreprocessor;
+
+    private BeanConfigurationPathTranslator pathTranslator;
+
+    public Object getBean()
+    {
+        return bean;
+    }
+
+    public DefaultBeanConfigurationRequest setBean( Object bean )
+    {
+        this.bean = bean;
+        return this;
+    }
+
+    public Object getConfiguration()
+    {
+        return configuration;
+    }
+
+    public DefaultBeanConfigurationRequest setConfiguration( Object configuration )
+    {
+        this.configuration = configuration;
+        return this;
+    }
+
+    /**
+     * Sets the configuration to the configuration taken from the specified build plugin in the POM. First, the build
+     * plugins will be searched for the specified plugin, if that fails, the plugin management section will be searched.
+     * 
+     * @param model The POM to extract the plugin configuration from, may be {@code null}.
+     * @param pluginGroupId The group id of the plugin whose configuration should be used, must not be {@code null} or
+     *            empty.
+     * @param pluginArtifactId The artifact id of the plugin whose configuration should be used, must not be
+     *            {@code null} or empty.
+     * @param pluginExecutionId The id of a plugin execution whose configuration should be used, may be {@code null} or
+     *            empty to use the general plugin configuration.
+     * @return This request for chaining, never {@code null}.
+     */
+    public DefaultBeanConfigurationRequest setConfiguration( Model model, String pluginGroupId,
+                                                             String pluginArtifactId, String pluginExecutionId )
+    {
+        Plugin plugin = findPlugin( model, pluginGroupId, pluginArtifactId );
+        if ( plugin != null )
+        {
+            if ( StringUtils.isNotEmpty( pluginExecutionId ) )
+            {
+                for ( PluginExecution execution : plugin.getExecutions() )
+                {
+                    if ( pluginExecutionId.equals( execution.getId() ) )
+                    {
+                        setConfiguration( execution.getConfiguration() );
+                        break;
+                    }
+                }
+            }
+            else
+            {
+                setConfiguration( plugin.getConfiguration() );
+            }
+        }
+        return this;
+    }
+
+    private Plugin findPlugin( Model model, String groupId, String artifactId )
+    {
+        if ( StringUtils.isEmpty( groupId ) )
+        {
+            throw new IllegalArgumentException( "group id for plugin has not been specified" );
+        }
+        if ( StringUtils.isEmpty( artifactId ) )
+        {
+            throw new IllegalArgumentException( "artifact id for plugin has not been specified" );
+        }
+
+        if ( model != null )
+        {
+            Build build = model.getBuild();
+            if ( build != null )
+            {
+                for ( Plugin plugin : build.getPlugins() )
+                {
+                    if ( groupId.equals( plugin.getGroupId() ) && artifactId.equals( plugin.getArtifactId() ) )
+                    {
+                        return plugin;
+                    }
+                }
+
+                PluginManagement mngt = build.getPluginManagement();
+                if ( mngt != null )
+                {
+                    for ( Plugin plugin : mngt.getPlugins() )
+                    {
+                        if ( groupId.equals( plugin.getGroupId() ) && artifactId.equals( plugin.getArtifactId() ) )
+                        {
+                            return plugin;
+                        }
+                    }
+                }
+            }
+        }
+
+        return null;
+    }
+
+    public ClassLoader getClassLoader()
+    {
+        return classLoader;
+    }
+
+    public DefaultBeanConfigurationRequest setClassLoader( ClassLoader classLoader )
+    {
+        this.classLoader = classLoader;
+        return this;
+    }
+
+    public BeanConfigurationValuePreprocessor getValuePreprocessor()
+    {
+        return valuePreprocessor;
+    }
+
+    public DefaultBeanConfigurationRequest setValuePreprocessor( BeanConfigurationValuePreprocessor valuePreprocessor )
+    {
+        this.valuePreprocessor = valuePreprocessor;
+        return this;
+    }
+
+    public BeanConfigurationPathTranslator getPathTranslator()
+    {
+        return pathTranslator;
+    }
+
+    public DefaultBeanConfigurationRequest setPathTranslator( BeanConfigurationPathTranslator pathTranslator )
+    {
+        this.pathTranslator = pathTranslator;
+        return this;
+    }
+
+}

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/DefaultBeanConfigurationRequest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/DefaultBeanConfigurationRequest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/internal/
------------------------------------------------------------------------------
    bugtraq:label = Enter issue ID:

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/internal/
------------------------------------------------------------------------------
    bugtraq:message = Issue id: %BUGID%

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/internal/
------------------------------------------------------------------------------
    bugtraq:number = false

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/internal/
------------------------------------------------------------------------------
    bugtraq:url = http://jira.codehaus.org/browse/%BUGID%

Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/internal/DefaultBeanConfigurator.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/internal/DefaultBeanConfigurator.java?rev=997005&view=auto
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/internal/DefaultBeanConfigurator.java (added)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/internal/DefaultBeanConfigurator.java Tue Sep 14 17:30:14 2010
@@ -0,0 +1,155 @@
+package org.apache.maven.configuration.internal;
+
+/*
+ * 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.io.File;
+
+import org.apache.maven.configuration.BeanConfigurationException;
+import org.apache.maven.configuration.BeanConfigurationPathTranslator;
+import org.apache.maven.configuration.BeanConfigurationRequest;
+import org.apache.maven.configuration.BeanConfigurationValuePreprocessor;
+import org.apache.maven.configuration.BeanConfigurator;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
+import org.codehaus.plexus.component.configurator.converters.composite.ObjectWithFieldsConverter;
+import org.codehaus.plexus.component.configurator.converters.lookup.ConverterLookup;
+import org.codehaus.plexus.component.configurator.converters.lookup.DefaultConverterLookup;
+import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+import org.codehaus.plexus.component.configurator.expression.TypeAwareExpressionEvaluator;
+import org.codehaus.plexus.configuration.PlexusConfiguration;
+import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
+import org.codehaus.plexus.util.xml.Xpp3Dom;
+
+/**
+ * <strong>Warning:</strong> This is an internal class that is only public for technical reasons, it is not part of the
+ * public API. In particular, this class can be changed or deleted without prior notice.
+ * 
+ * @author Benjamin Bentmann
+ */
+@Component( role = BeanConfigurator.class )
+public class DefaultBeanConfigurator
+    implements BeanConfigurator
+{
+
+    private final ConverterLookup converterLookup = new DefaultConverterLookup();
+
+    public void configureBean( BeanConfigurationRequest request )
+        throws BeanConfigurationException
+    {
+        if ( request == null )
+        {
+            throw new IllegalArgumentException( "bean configuration request not specified" );
+        }
+
+        if ( request.getBean() == null )
+        {
+            throw new IllegalArgumentException( "bean to be configured not specified" );
+        }
+
+        Object configuration = request.getConfiguration();
+        if ( configuration == null )
+        {
+            return;
+        }
+
+        PlexusConfiguration plexusConfig = null;
+        if ( configuration instanceof PlexusConfiguration )
+        {
+            plexusConfig = (PlexusConfiguration) configuration;
+        }
+        else if ( configuration instanceof Xpp3Dom )
+        {
+            plexusConfig = new XmlPlexusConfiguration( (Xpp3Dom) configuration );
+        }
+        else
+        {
+            throw new BeanConfigurationException( "unsupported bean configuration source ("
+                + configuration.getClass().getName() + ")" );
+        }
+
+        ClassLoader classLoader = request.getClassLoader();
+        if ( classLoader == null )
+        {
+            classLoader = request.getBean().getClass().getClassLoader();
+        }
+
+        BeanExpressionEvaluator evaluator = new BeanExpressionEvaluator( request );
+
+        ObjectWithFieldsConverter converter = new ObjectWithFieldsConverter();
+
+        try
+        {
+            converter.processConfiguration( converterLookup, request.getBean(), classLoader, plexusConfig, evaluator );
+        }
+        catch ( ComponentConfigurationException e )
+        {
+            throw new BeanConfigurationException( e.getMessage(), e );
+        }
+    }
+
+    static class BeanExpressionEvaluator
+        implements TypeAwareExpressionEvaluator
+    {
+
+        private final BeanConfigurationValuePreprocessor preprocessor;
+
+        private final BeanConfigurationPathTranslator translator;
+
+        public BeanExpressionEvaluator( BeanConfigurationRequest request )
+        {
+            preprocessor = request.getValuePreprocessor();
+            translator = request.getPathTranslator();
+        }
+
+        public Object evaluate( String expression, Class<?> type )
+            throws ExpressionEvaluationException
+        {
+            if ( preprocessor != null )
+            {
+                try
+                {
+                    return preprocessor.preprocessValue( expression, type );
+                }
+                catch ( BeanConfigurationException e )
+                {
+                    throw new ExpressionEvaluationException( e.getMessage(), e );
+                }
+            }
+            return expression;
+        }
+
+        public Object evaluate( String expression )
+            throws ExpressionEvaluationException
+        {
+            return evaluate( expression, null );
+        }
+
+        public File alignToBaseDirectory( File file )
+        {
+            if ( translator != null )
+            {
+                return translator.translatePath( file );
+            }
+            return file;
+        }
+
+    }
+
+}

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/internal/DefaultBeanConfigurator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/configuration/internal/DefaultBeanConfigurator.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/configuration/
------------------------------------------------------------------------------
    bugtraq:label = Enter issue ID:

Propchange: maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/configuration/
------------------------------------------------------------------------------
    bugtraq:message = Issue id: %BUGID%

Propchange: maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/configuration/
------------------------------------------------------------------------------
    bugtraq:number = false

Propchange: maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/configuration/
------------------------------------------------------------------------------
    bugtraq:url = http://jira.codehaus.org/browse/%BUGID%

Added: maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/configuration/DefaultBeanConfiguratorTest.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/configuration/DefaultBeanConfiguratorTest.java?rev=997005&view=auto
==============================================================================
--- maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/configuration/DefaultBeanConfiguratorTest.java (added)
+++ maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/configuration/DefaultBeanConfiguratorTest.java Tue Sep 14 17:30:14 2010
@@ -0,0 +1,133 @@
+package org.apache.maven.configuration;
+
+/*
+ * 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.io.File;
+import java.io.IOException;
+import java.io.StringReader;
+
+import org.codehaus.plexus.PlexusTestCase;
+import org.codehaus.plexus.util.xml.Xpp3Dom;
+import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+
+/**
+ * @author Benjamin Bentmann
+ */
+public class DefaultBeanConfiguratorTest
+    extends PlexusTestCase
+{
+
+    private BeanConfigurator configurator;
+
+    @Override
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+
+        configurator = lookup( BeanConfigurator.class );
+    }
+
+    @Override
+    protected void tearDown()
+        throws Exception
+    {
+        configurator = null;
+
+        super.tearDown();
+    }
+
+    private Xpp3Dom toConfig( String xml )
+    {
+        try
+        {
+            return Xpp3DomBuilder.build( new StringReader( "<configuration>" + xml + "</configuration>" ) );
+        }
+        catch ( XmlPullParserException e )
+        {
+            throw new IllegalArgumentException( e );
+        }
+        catch ( IOException e )
+        {
+            throw new IllegalArgumentException( e );
+        }
+    }
+
+    public void testMinimal()
+        throws BeanConfigurationException
+    {
+        SomeBean bean = new SomeBean();
+
+        Xpp3Dom config = toConfig( "<file>test</file>" );
+
+        DefaultBeanConfigurationRequest request = new DefaultBeanConfigurationRequest();
+        request.setBean( bean ).setConfiguration( config );
+
+        configurator.configureBean( request );
+
+        assertEquals( new File( "test" ), bean.file );
+    }
+
+    public void testPreAndPostProcessing()
+        throws BeanConfigurationException
+    {
+        SomeBean bean = new SomeBean();
+
+        Xpp3Dom config = toConfig( "<file>${test}</file>" );
+
+        BeanConfigurationValuePreprocessor preprocessor = new BeanConfigurationValuePreprocessor()
+        {
+            public Object preprocessValue( String value, Class<?> type )
+                throws BeanConfigurationException
+            {
+                if ( value != null && value.startsWith( "${" ) && value.endsWith( "}" ) )
+                {
+                    return value.substring( 2, value.length() - 1 );
+                }
+                return value;
+            }
+        };
+
+        BeanConfigurationPathTranslator translator = new BeanConfigurationPathTranslator()
+        {
+            public File translatePath( File path )
+            {
+                return new File( "base", path.getPath() ).getAbsoluteFile();
+            }
+        };
+
+        DefaultBeanConfigurationRequest request = new DefaultBeanConfigurationRequest();
+        request.setBean( bean ).setConfiguration( config );
+        request.setValuePreprocessor( preprocessor ).setPathTranslator( translator );
+
+        configurator.configureBean( request );
+
+        assertEquals( new File( "base/test" ).getAbsoluteFile(), bean.file );
+    }
+
+    static class SomeBean
+    {
+
+        File file;
+
+    }
+
+}

Propchange: maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/configuration/DefaultBeanConfiguratorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/configuration/DefaultBeanConfiguratorTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision