001package org.apache.maven.tools.plugin.util;
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 java.util.Collections;
023import java.util.Comparator;
024import java.util.HashMap;
025import java.util.List;
026import java.util.Map;
027
028import org.apache.maven.plugin.descriptor.MojoDescriptor;
029import org.apache.maven.plugin.descriptor.Parameter;
030import org.codehaus.plexus.util.DirectoryScanner;
031import org.codehaus.plexus.util.FileUtils;
032import org.codehaus.plexus.util.StringUtils;
033
034/**
035 * Convenience methods to play with Maven plugins.
036 *
037 * @author jdcasey
038 *
039 */
040public final class PluginUtils
041{
042    private PluginUtils()
043    {
044        // nop
045    }
046
047    /**
048     * Expression associated with class types to recognize Maven objects (injected in fact as parameters by <a
049     * href="/ref/current/maven-core/apidocs/org/apache/maven/plugin/PluginParameterExpressionEvaluator.html">
050     * maven-core's PluginParameterExpressionEvaluator</a>) like components ("real" components are injected by Plexus).
051     * 
052     * @deprecated wrong approach (fake components), documented parameter default values instead to learn people how to
053     *             discover them
054     */
055    @Deprecated
056    public static final Map<String, String> MAVEN_COMPONENTS;
057    static
058    {
059        Map<String, String> mavenComponents = new HashMap<>();
060
061        mavenComponents.put( "org.apache.maven.execution.MavenSession", "${session}" );
062        mavenComponents.put( "org.apache.maven.project.MavenProject", "${project}" );
063        mavenComponents.put( "org.apache.maven.plugin.MojoExecution", "${mojoExecution}" );
064        mavenComponents.put( "org.apache.maven.plugin.descriptor.PluginDescriptor", "${plugin}" );
065        mavenComponents.put( "org.apache.maven.settings.Settings", "${settings}" );
066        
067        MAVEN_COMPONENTS = Collections.unmodifiableMap( mavenComponents );
068    }
069
070    /**
071     * @param basedir not null
072     * @param include not null
073     * @return list of included files with default SCM excluded files
074     */
075    public static String[] findSources( String basedir, String include )
076    {
077        return PluginUtils.findSources( basedir, include, null );
078    }
079
080    /**
081     * @param basedir not null
082     * @param include not null
083     * @param exclude could be null
084     * @return list of included files
085     */
086    public static String[] findSources( String basedir, String include, String exclude )
087    {
088        DirectoryScanner scanner = new DirectoryScanner();
089        scanner.setBasedir( basedir );
090        scanner.setIncludes( new String[] { include } );
091        if ( !StringUtils.isEmpty( exclude ) )
092        {
093            scanner.setExcludes( new String[] { exclude, StringUtils.join( FileUtils.getDefaultExcludes(), "," ) } );
094        }
095        else
096        {
097            scanner.setExcludes( FileUtils.getDefaultExcludes() );
098        }
099
100        scanner.scan();
101
102        return scanner.getIncludedFiles();
103    }
104
105    /**
106     * Sorts the specified mojo descriptors by goal name.
107     *
108     * @param mojoDescriptors The mojo descriptors to sort, may be <code>null</code>.
109     * @see MojoDescriptor#getGoal()
110     */
111    public static void sortMojos( List<MojoDescriptor> mojoDescriptors )
112    {
113        if ( mojoDescriptors != null )
114        {
115            Collections.sort( mojoDescriptors, new Comparator<MojoDescriptor>()
116            {
117                /** {@inheritDoc} */
118                @Override
119                public int compare( MojoDescriptor mojo0, MojoDescriptor mojo1 )
120                {
121                    return mojo0.getGoal().compareToIgnoreCase( mojo1.getGoal() );
122                }
123            } );
124        }
125    }
126
127    /**
128     * Sorts the specified mojo parameters by name.
129     *
130     * @param parameters The mojo parameters to sort, may be <code>null</code>.
131     * @see Parameter#getName()
132     * @since 2.4.4
133     */
134    public static void sortMojoParameters( List<Parameter> parameters )
135    {
136        if ( parameters != null )
137        {
138            Collections.sort( parameters, new Comparator<Parameter>()
139            {
140                /** {@inheritDoc} */
141                @Override
142                public int compare( Parameter parameter1, Parameter parameter2 )
143                {
144                    return parameter1.getName().compareToIgnoreCase( parameter2.getName() );
145                }
146            } );
147        }
148    }
149}