KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > maven > plugin > PluginConfigurationException


1 package org.apache.maven.plugin;
2
3 /*
4  * Copyright 2001-2005 The Apache Software Foundation.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */

18
19 import org.apache.maven.plugin.descriptor.PluginDescriptor;
20 import org.apache.maven.usability.plugin.Expression;
21 import org.apache.maven.usability.plugin.ExpressionDocumentationException;
22 import org.apache.maven.usability.plugin.ExpressionDocumenter;
23 import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
24 import org.codehaus.plexus.configuration.PlexusConfiguration;
25
26 import java.io.PrintWriter JavaDoc;
27 import java.io.StringWriter JavaDoc;
28 import java.util.Arrays JavaDoc;
29 import java.util.Iterator JavaDoc;
30 import java.util.List JavaDoc;
31 import java.util.Map JavaDoc;
32 import java.util.Properties JavaDoc;
33 import java.util.StringTokenizer JavaDoc;
34 import java.util.regex.Matcher JavaDoc;
35 import java.util.regex.Pattern JavaDoc;
36
37 /**
38  * @author <a HREF="mailto:jason@maven.org">Jason van Zyl</a>
39  * @version $Id: PluginConfigurationException.java 330207 2005-11-02 08:03:25Z brett $
40  */

41 public class PluginConfigurationException
42     extends Exception JavaDoc
43 {
44     private final PluginDescriptor pluginDescriptor;
45
46     private String JavaDoc originalMessage;
47
48     private static final List JavaDoc UNMODIFIABLE_EXPRESSIONS = Arrays.asList(
49         new String JavaDoc[]{"localRepository", "reactorProjects", "settings", "project", "session", "plugin", "basedir"} );
50
51     public PluginConfigurationException( PluginDescriptor pluginDescriptor, String JavaDoc message )
52     {
53         super( "Error configuring: " + pluginDescriptor.getPluginLookupKey() + ". Reason: " + message );
54         this.pluginDescriptor = pluginDescriptor;
55         this.originalMessage = message;
56     }
57
58     public PluginConfigurationException( PluginDescriptor pluginDescriptor, Throwable JavaDoc cause )
59     {
60         super( "Error configuring: " + pluginDescriptor.getPluginLookupKey() + ".", cause );
61         this.pluginDescriptor = pluginDescriptor;
62     }
63
64     public PluginConfigurationException( PluginDescriptor pluginDescriptor, String JavaDoc message, Throwable JavaDoc cause )
65     {
66         super( "Error configuring: " + pluginDescriptor.getPluginLookupKey() + ". Reason: " + message, cause );
67         this.pluginDescriptor = pluginDescriptor;
68         this.originalMessage = message;
69     }
70
71     public PluginDescriptor getPluginDescriptor()
72     {
73         return pluginDescriptor;
74     }
75
76     public String JavaDoc getOriginalMessage()
77     {
78         return originalMessage;
79     }
80
81     protected static void addParameterUsageInfo( String JavaDoc expression, StringBuffer JavaDoc messageBuffer )
82     {
83         StringBuffer JavaDoc expressionMessageBuffer = new StringBuffer JavaDoc();
84
85         Matcher JavaDoc exprMatcher = Pattern.compile( "\\$\\{(.+)\\}" ).matcher( expression );
86
87         boolean unmodifiableElementsFound = false;
88         boolean activeElementsFound = false;
89
90         int elementCount = 0;
91
92         while ( exprMatcher.find() )
93         {
94             elementCount++;
95
96             activeElementsFound = true;
97
98             String JavaDoc subExpression = exprMatcher.group( 1 );
99
100             StringTokenizer JavaDoc expressionParts = new StringTokenizer JavaDoc( subExpression, "." );
101
102             String JavaDoc firstPart = expressionParts.nextToken();
103
104             Map JavaDoc expressions = null;
105             try
106             {
107                 expressions = ExpressionDocumenter.load();
108             }
109             catch ( ExpressionDocumentationException e )
110             {
111                 expressionMessageBuffer.append( "\n\nERROR!! Failed to load expression documentation!" );
112
113                 StringWriter JavaDoc sWriter = new StringWriter JavaDoc();
114                 PrintWriter JavaDoc pWriter = new PrintWriter JavaDoc( sWriter );
115
116                 e.printStackTrace( pWriter );
117
118                 expressionMessageBuffer.append( "\n\nException:\n\n" ).append( sWriter.toString() );
119             }
120
121             if ( expressions != null )
122             {
123                 Expression expr = (Expression) expressions.get( subExpression );
124
125                 if ( expr != null )
126                 {
127                     if ( !expr.isEditable() )
128                     {
129                         unmodifiableElementsFound = true;
130                     }
131                     else
132                     {
133                         addParameterConfigDocumentation( firstPart, exprMatcher.group( 0 ), subExpression,
134                                                          expressionMessageBuffer, expressions );
135                     }
136                 }
137                 else if ( UNMODIFIABLE_EXPRESSIONS.contains( subExpression ) )
138                 {
139                     unmodifiableElementsFound = true;
140                 }
141                 else
142                 {
143                     expressionMessageBuffer.append( "on the command line, specify: \'-D" ).append( subExpression )
144                         .append( "=VALUE\'" );
145                 }
146             }
147         }
148
149         if ( activeElementsFound )
150         {
151             messageBuffer.append( expressionMessageBuffer );
152         }
153         else
154         {
155             messageBuffer.append(
156                 " (found static expression: \'" + expression + "\' which may act as a default value).\n" );
157         }
158
159         if ( unmodifiableElementsFound )
160         {
161             if ( elementCount > 1 )
162             {
163                 messageBuffer.append( " " );
164             }
165
166             messageBuffer
167                 .append( "NOTE: One or more purely derived expression elements were detected in \'" + expression +
168                     "\'.\n If you continue to get this error after any other expression elements are specified correctly," +
169                     "\n please report this issue to the Maven development team.\n" );
170         }
171     }
172
173     private static void addParameterConfigDocumentation( String JavaDoc firstPart, String JavaDoc wholeExpression, String JavaDoc subExpression,
174                                                          StringBuffer JavaDoc expressionMessageBuffer, Map JavaDoc expressionDoco )
175     {
176         Expression expr = (Expression) expressionDoco.get( subExpression );
177
178         if ( expr != null )
179         {
180             expressionMessageBuffer.append( "check that the following section of " );
181             if ( "project".equals( firstPart ) )
182             {
183                 expressionMessageBuffer.append( "the pom.xml " );
184             }
185             else if ( "settings".equals( firstPart ) )
186             {
187                 expressionMessageBuffer.append( "your ~/.m2/settings.xml file " );
188             }
189
190             expressionMessageBuffer.append( "is present and correct:\n\n" );
191
192             String JavaDoc message = expr.getConfiguration();
193
194             if ( message == null )
195             {
196                 message = expr.getDescription();
197             }
198
199             expressionMessageBuffer.append( message );
200
201             Properties JavaDoc cliConfig = expr.getCliOptions();
202
203             if ( cliConfig != null && !cliConfig.isEmpty() )
204             {
205                 expressionMessageBuffer.append( "\n\n-OR-\n\nUse the following command-line switches:\n" );
206
207                 prettyPrintCommandLineSwitches( cliConfig, '.', expressionMessageBuffer );
208             }
209         }
210         else
211         {
212             expressionMessageBuffer.append( "ensure that the expression: \'" + wholeExpression + "\' is satisfied" );
213         }
214     }
215
216     private static void prettyPrintCommandLineSwitches( Properties JavaDoc switches, char filler,
217                                                         StringBuffer JavaDoc expressionMessageBuffer )
218     {
219         int maxKeyLen = 0;
220
221         for ( Iterator JavaDoc it = switches.entrySet().iterator(); it.hasNext(); )
222         {
223             Map.Entry JavaDoc entry = (Map.Entry JavaDoc) it.next();
224
225             String JavaDoc key = (String JavaDoc) entry.getKey();
226
227             int keyLen = key.length();
228             if ( keyLen > maxKeyLen )
229             {
230                 maxKeyLen = keyLen;
231             }
232         }
233
234         final int minFillerCount = 4;
235
236         for ( Iterator JavaDoc it = switches.entrySet().iterator(); it.hasNext(); )
237         {
238             Map.Entry JavaDoc entry = (Map.Entry JavaDoc) it.next();
239
240             String JavaDoc key = (String JavaDoc) entry.getKey();
241
242             int keyLen = key.length();
243
244             int fillerCount = maxKeyLen - keyLen + minFillerCount;
245
246             expressionMessageBuffer.append( '\n' ).append( key ).append( ' ' );
247
248             for ( int i = 0; i < fillerCount; i++ )
249             {
250                 expressionMessageBuffer.append( filler );
251             }
252
253             expressionMessageBuffer.append( ' ' ).append( entry.getValue() );
254         }
255
256         expressionMessageBuffer.append( '\n' );
257     }
258
259     public String JavaDoc buildConfigurationDiagnosticMessage( ComponentConfigurationException cce )
260     {
261         StringBuffer JavaDoc message = new StringBuffer JavaDoc();
262
263         PluginDescriptor descriptor = getPluginDescriptor();
264
265         PlexusConfiguration failedConfiguration = cce.getFailedConfiguration();
266
267         message.append( "Failed to configure plugin parameters for: " + descriptor.getId() + "\n\n" );
268
269         if ( failedConfiguration != null )
270         {
271             String JavaDoc value = failedConfiguration.getValue( null );
272             if ( value != null )
273             {
274                 addParameterUsageInfo( value, message );
275             }
276         }
277
278         message.append( "\n\nCause: " ).append( cce.getMessage() );
279
280         return message.toString();
281     }
282 }
283
Popular Tags