001package org.apache.maven.configuration;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *   http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import org.apache.maven.model.Build;
023import org.apache.maven.model.Model;
024import org.apache.maven.model.Plugin;
025import org.apache.maven.model.PluginExecution;
026import org.apache.maven.model.PluginManagement;
027import org.codehaus.plexus.util.StringUtils;
028
029/**
030 * A basic bean configuration request.
031 * 
032 * @author Benjamin Bentmann
033 */
034public class DefaultBeanConfigurationRequest
035    implements BeanConfigurationRequest
036{
037
038    private Object bean;
039
040    private Object configuration;
041
042    private String configurationElement;
043
044    private ClassLoader classLoader;
045
046    private BeanConfigurationValuePreprocessor valuePreprocessor;
047
048    private BeanConfigurationPathTranslator pathTranslator;
049
050    public Object getBean()
051    {
052        return bean;
053    }
054
055    public DefaultBeanConfigurationRequest setBean( Object bean )
056    {
057        this.bean = bean;
058        return this;
059    }
060
061    public Object getConfiguration()
062    {
063        return configuration;
064    }
065
066    public String getConfigurationElement()
067    {
068        return configurationElement;
069    }
070
071    public DefaultBeanConfigurationRequest setConfiguration( Object configuration )
072    {
073        return setConfiguration( configuration, null );
074    }
075
076    public DefaultBeanConfigurationRequest setConfiguration( Object configuration, String element )
077    {
078        this.configuration = configuration;
079        this.configurationElement = element;
080        return this;
081    }
082
083    /**
084     * Sets the configuration to the configuration taken from the specified build plugin in the POM. First, the build
085     * plugins will be searched for the specified plugin, if that fails, the plugin management section will be searched.
086     * 
087     * @param model The POM to extract the plugin configuration from, may be {@code null}.
088     * @param pluginGroupId The group id of the plugin whose configuration should be used, must not be {@code null} or
089     *            empty.
090     * @param pluginArtifactId The artifact id of the plugin whose configuration should be used, must not be
091     *            {@code null} or empty.
092     * @param pluginExecutionId The id of a plugin execution whose configuration should be used, may be {@code null} or
093     *            empty to use the general plugin configuration.
094     * @return This request for chaining, never {@code null}.
095     */
096    public DefaultBeanConfigurationRequest setConfiguration( Model model, String pluginGroupId,
097                                                             String pluginArtifactId, String pluginExecutionId )
098    {
099        Plugin plugin = findPlugin( model, pluginGroupId, pluginArtifactId );
100        if ( plugin != null )
101        {
102            if ( StringUtils.isNotEmpty( pluginExecutionId ) )
103            {
104                for ( PluginExecution execution : plugin.getExecutions() )
105                {
106                    if ( pluginExecutionId.equals( execution.getId() ) )
107                    {
108                        setConfiguration( execution.getConfiguration() );
109                        break;
110                    }
111                }
112            }
113            else
114            {
115                setConfiguration( plugin.getConfiguration() );
116            }
117        }
118        return this;
119    }
120
121    private Plugin findPlugin( Model model, String groupId, String artifactId )
122    {
123        if ( StringUtils.isEmpty( groupId ) )
124        {
125            throw new IllegalArgumentException( "group id for plugin has not been specified" );
126        }
127        if ( StringUtils.isEmpty( artifactId ) )
128        {
129            throw new IllegalArgumentException( "artifact id for plugin has not been specified" );
130        }
131
132        if ( model != null )
133        {
134            Build build = model.getBuild();
135            if ( build != null )
136            {
137                for ( Plugin plugin : build.getPlugins() )
138                {
139                    if ( groupId.equals( plugin.getGroupId() ) && artifactId.equals( plugin.getArtifactId() ) )
140                    {
141                        return plugin;
142                    }
143                }
144
145                PluginManagement mngt = build.getPluginManagement();
146                if ( mngt != null )
147                {
148                    for ( Plugin plugin : mngt.getPlugins() )
149                    {
150                        if ( groupId.equals( plugin.getGroupId() ) && artifactId.equals( plugin.getArtifactId() ) )
151                        {
152                            return plugin;
153                        }
154                    }
155                }
156            }
157        }
158
159        return null;
160    }
161
162    public ClassLoader getClassLoader()
163    {
164        return classLoader;
165    }
166
167    public DefaultBeanConfigurationRequest setClassLoader( ClassLoader classLoader )
168    {
169        this.classLoader = classLoader;
170        return this;
171    }
172
173    public BeanConfigurationValuePreprocessor getValuePreprocessor()
174    {
175        return valuePreprocessor;
176    }
177
178    public DefaultBeanConfigurationRequest setValuePreprocessor( BeanConfigurationValuePreprocessor valuePreprocessor )
179    {
180        this.valuePreprocessor = valuePreprocessor;
181        return this;
182    }
183
184    public BeanConfigurationPathTranslator getPathTranslator()
185    {
186        return pathTranslator;
187    }
188
189    public DefaultBeanConfigurationRequest setPathTranslator( BeanConfigurationPathTranslator pathTranslator )
190    {
191        this.pathTranslator = pathTranslator;
192        return this;
193    }
194
195}