001    package org.apache.maven.plugin;
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 java.util.Collection;
023    import java.util.Iterator;
024    import java.util.List;
025    import java.util.Map;
026    import java.util.Properties;
027    
028    import org.apache.maven.plugin.descriptor.MojoDescriptor;
029    import org.apache.maven.plugin.descriptor.Parameter;
030    import org.codehaus.plexus.util.StringUtils;
031    
032    public class PluginParameterException
033        extends PluginConfigurationException
034    {
035    
036        private final List<Parameter> parameters;
037    
038        private final MojoDescriptor mojo;
039    
040        public PluginParameterException( MojoDescriptor mojo, List<Parameter> parameters )
041        {
042            super( mojo.getPluginDescriptor(), "The parameters " + format( parameters ) + " for goal "
043                + mojo.getRoleHint() + " are missing or invalid" );
044    
045            this.mojo = mojo;
046    
047            this.parameters = parameters;
048        }
049    
050        private static String format( List<Parameter> parameters )
051        {
052            StringBuilder buffer = new StringBuilder( 128 );
053            if ( parameters != null )
054            {
055                for ( Parameter parameter : parameters )
056                {
057                    if ( buffer.length() > 0 )
058                    {
059                        buffer.append( ", " );
060                    }
061                    buffer.append( '\'' ).append( parameter.getName() ).append( '\'' );
062                }
063            }
064            return buffer.toString();
065        }
066    
067        public MojoDescriptor getMojoDescriptor()
068        {
069            return mojo;
070        }
071    
072        public List<Parameter> getParameters()
073        {
074            return parameters;
075        }
076    
077        private static void decomposeParameterIntoUserInstructions( MojoDescriptor mojo, Parameter param,
078                                                                    StringBuilder messageBuffer )
079        {
080            String expression = param.getExpression();
081            
082            if ( param.isEditable() )
083            {
084                boolean isArray = param.getType().endsWith( "[]" );
085                boolean isCollection = false;
086                boolean isMap = false;
087                boolean isProperties = false;
088                if ( !isArray )
089                {
090                    try
091                    {
092                        //assuming Type is available in current ClassLoader
093                        isCollection = Collection.class.isAssignableFrom( Class.forName( param.getType() ) );
094                        isMap = Map.class.isAssignableFrom( Class.forName( param.getType() ) );
095                        isProperties = Properties.class.isAssignableFrom( Class.forName( param.getType() ) );
096                    }
097                    catch ( ClassNotFoundException e )
098                    {
099                        // assume it is not assignable from Collection or Map
100                    }
101                }
102                
103                messageBuffer.append( "Inside the definition for plugin \'" );
104                messageBuffer.append( mojo.getPluginDescriptor().getArtifactId() );
105                messageBuffer.append( "\', specify the following:\n\n<configuration>\n  ...\n" );
106                messageBuffer.append( "  <" ).append( param.getName() ).append( '>' );
107                if ( isArray || isCollection )
108                {
109                    messageBuffer.append( '\n' );
110                    messageBuffer.append( "    <item>" );
111                }
112                else if ( isProperties )
113                {
114                    messageBuffer.append( '\n' );
115                    messageBuffer.append( "    <property>\n" );
116                    messageBuffer.append( "      <name>KEY</name>\n" );
117                    messageBuffer.append( "      <value>" );
118                }
119                else if ( isMap )
120                {
121                    messageBuffer.append( '\n' );
122                    messageBuffer.append( "    <KEY>" );
123                }
124                messageBuffer.append( "VALUE" );
125                if ( isArray || isCollection )
126                {
127                    messageBuffer.append( "</item>\n" );
128                    messageBuffer.append( "  " );
129                }
130                else if ( isProperties )
131                {
132                    messageBuffer.append( "</value>\n" );
133                    messageBuffer.append( "    </property>\n" );
134                    messageBuffer.append( "  " );
135                }
136                else if ( isMap )
137                {
138                    messageBuffer.append( "</KEY>\n" );
139                    messageBuffer.append( "  " );
140                }    
141                messageBuffer.append( "</" ).append( param.getName() ).append( ">\n" );
142                messageBuffer.append( "</configuration>" );
143    
144                String alias = param.getAlias();
145                if ( StringUtils.isNotEmpty( alias ) && !alias.equals( param.getName() ) )
146                {
147                    messageBuffer.append(
148                        "\n\n-OR-\n\n<configuration>\n  ...\n  <" + alias + ">VALUE</" + alias + ">\n</configuration>\n" );
149                }
150            }
151    
152            if ( StringUtils.isEmpty( expression ) )
153            {
154                messageBuffer.append( "." );
155            }
156            else
157            {
158                if ( param.isEditable() )
159                {
160                    messageBuffer.append( "\n\n-OR-\n\n" );
161                }
162    
163                //addParameterUsageInfo( expression, messageBuffer );
164            }
165        }
166    
167        public String buildDiagnosticMessage()
168        {
169            StringBuilder messageBuffer = new StringBuilder( 256 );
170    
171            List<Parameter> params = getParameters();
172            MojoDescriptor mojo = getMojoDescriptor();
173    
174            messageBuffer.append( "One or more required plugin parameters are invalid/missing for \'" )
175                .append( mojo.getPluginDescriptor().getGoalPrefix() ).append( ":" ).append( mojo.getGoal() )
176                .append( "\'\n" );
177    
178            int idx = 0;
179            for ( Iterator<Parameter> it = params.iterator(); it.hasNext(); idx++ )
180            {
181                Parameter param = it.next();
182    
183                messageBuffer.append( "\n[" ).append( idx ).append( "] " );
184    
185                decomposeParameterIntoUserInstructions( mojo, param, messageBuffer );
186    
187                messageBuffer.append( "\n" );
188            }
189    
190            return messageBuffer.toString();
191        }
192    }