001    package org.apache.maven.tools.plugin.scanner;
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    
022    import org.apache.maven.plugin.descriptor.InvalidPluginDescriptorException;
023    import org.apache.maven.plugin.descriptor.MojoDescriptor;
024    import org.apache.maven.plugin.descriptor.PluginDescriptor;
025    import org.apache.maven.project.MavenProject;
026    import org.apache.maven.tools.plugin.DefaultPluginToolsRequest;
027    import org.apache.maven.tools.plugin.PluginToolsRequest;
028    import org.apache.maven.tools.plugin.extractor.ExtractionException;
029    import org.apache.maven.tools.plugin.extractor.MojoDescriptorExtractor;
030    import org.codehaus.plexus.logging.AbstractLogEnabled;
031    import org.codehaus.plexus.logging.Logger;
032    import org.codehaus.plexus.logging.console.ConsoleLogger;
033    import org.codehaus.plexus.util.StringUtils;
034    
035    import java.util.HashSet;
036    import java.util.List;
037    import java.util.Map;
038    import java.util.Set;
039    
040    /**
041     * @author jdcasey
042     */
043    public class DefaultMojoScanner
044        extends AbstractLogEnabled
045        implements MojoScanner
046    {
047    
048        private Map<String, MojoDescriptorExtractor> mojoDescriptorExtractors;
049    
050        /**
051         * The names of the active extractors
052         */
053        private Set<String> activeExtractors;
054    
055        /**
056         * Default constructor
057         *
058         * @param extractors not null
059         */
060        public DefaultMojoScanner( Map<String, MojoDescriptorExtractor> extractors )
061        {
062            this.mojoDescriptorExtractors = extractors;
063    
064            this.enableLogging( new ConsoleLogger( Logger.LEVEL_INFO, "standalone-scanner-logger" ) );
065        }
066    
067        /**
068         * Empty constructor
069         */
070        public DefaultMojoScanner()
071        {
072            // nop
073        }
074    
075        /**
076         * {@inheritDoc}
077         */
078        public void populatePluginDescriptor( MavenProject project, PluginDescriptor pluginDescriptor )
079            throws ExtractionException, InvalidPluginDescriptorException
080        {
081            populatePluginDescriptor( new DefaultPluginToolsRequest( project, pluginDescriptor ) );
082        }
083    
084        /**
085         * {@inheritDoc}
086         */
087        public void populatePluginDescriptor( PluginToolsRequest request )
088            throws ExtractionException, InvalidPluginDescriptorException
089        {
090            Logger logger = getLogger();
091            Set<String> activeExtractorsInternal = getActiveExtractors();
092    
093            logger.debug( "Using " + activeExtractorsInternal.size() + " mojo extractors." );
094    
095            int numMojoDescriptors = 0;
096    
097            for ( String language : activeExtractorsInternal )
098            {
099                MojoDescriptorExtractor extractor = mojoDescriptorExtractors.get( language );
100    
101                if ( extractor == null )
102                {
103                    throw new ExtractionException( "No mojo extractor for language: " + language );
104                }
105    
106                logger.info( "Applying mojo extractor for language: " + language );
107    
108                List<MojoDescriptor> extractorDescriptors = extractor.execute( request );
109    
110                logger.info( "Mojo extractor for language: " + language + " found " + extractorDescriptors.size()
111                                 + " mojo descriptors." );
112                numMojoDescriptors += extractorDescriptors.size();
113    
114                for ( MojoDescriptor descriptor : extractorDescriptors )
115                {
116                    logger.debug( "Adding mojo: " + descriptor + " to plugin descriptor." );
117    
118                    descriptor.setPluginDescriptor( request.getPluginDescriptor() );
119    
120                    request.getPluginDescriptor().addMojo( descriptor );
121                }
122            }
123    
124            if ( numMojoDescriptors == 0 && !request.isSkipErrorNoDescriptorsFound() )
125            {
126                throw new InvalidPluginDescriptorException(
127                    "No mojo definitions were found for plugin: " + request.getPluginDescriptor().getPluginLookupKey()
128                        + "." );
129            }
130        }
131    
132        /**
133         * Gets the name of the active extractors.
134         *
135         * @return A Set containing the names of the active extractors.
136         */
137        protected Set<String> getActiveExtractors()
138        {
139            Set<String> result = activeExtractors;
140    
141            if ( result == null )
142            {
143                result = new HashSet<String>( mojoDescriptorExtractors.keySet() );
144            }
145    
146            return result;
147        }
148    
149        public void setActiveExtractors( Set<String> extractors )
150        {
151            if ( extractors == null )
152            {
153                this.activeExtractors = null;
154            }
155            else
156            {
157                this.activeExtractors = new HashSet<String>();
158    
159                for ( String extractor : extractors )
160                {
161                    if ( StringUtils.isNotEmpty( extractor ) )
162                    {
163                        this.activeExtractors.add( extractor );
164                    }
165                }
166            }
167        }
168    
169    }