1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.plugin;
20
21 import java.util.Collection;
22 import java.util.Iterator;
23 import java.util.List;
24 import java.util.Map;
25 import java.util.Properties;
26
27 import org.apache.maven.plugin.descriptor.MojoDescriptor;
28 import org.apache.maven.plugin.descriptor.Parameter;
29 import org.codehaus.plexus.util.StringUtils;
30
31
32
33
34 public class PluginParameterException extends PluginConfigurationException {
35
36 private final List<Parameter> parameters;
37
38 private final MojoDescriptor mojo;
39
40 public PluginParameterException(MojoDescriptor mojo, List<Parameter> parameters) {
41 super(
42 mojo.getPluginDescriptor(),
43 "The parameters " + format(parameters) + " for goal " + mojo.getRoleHint() + " are missing or invalid");
44
45 this.mojo = mojo;
46
47 this.parameters = parameters;
48 }
49
50 private static String format(List<Parameter> parameters) {
51 StringBuilder buffer = new StringBuilder(128);
52 if (parameters != null) {
53 for (Parameter parameter : parameters) {
54 if (buffer.length() > 0) {
55 buffer.append(", ");
56 }
57 buffer.append('\'').append(parameter.getName()).append('\'');
58 }
59 }
60 return buffer.toString();
61 }
62
63 public MojoDescriptor getMojoDescriptor() {
64 return mojo;
65 }
66
67 public List<Parameter> getParameters() {
68 return parameters;
69 }
70
71 private static void decomposeParameterIntoUserInstructions(
72 MojoDescriptor mojo, Parameter param, StringBuilder messageBuffer) {
73 String expression = param.getExpression();
74
75 if (param.isEditable()) {
76 boolean isArray = param.getType().endsWith("[]");
77 boolean isCollection = false;
78 boolean isMap = false;
79 boolean isProperties = false;
80 if (!isArray) {
81 try {
82
83 isCollection = Collection.class.isAssignableFrom(Class.forName(param.getType()));
84 isMap = Map.class.isAssignableFrom(Class.forName(param.getType()));
85 isProperties = Properties.class.isAssignableFrom(Class.forName(param.getType()));
86 } catch (ClassNotFoundException e) {
87
88 }
89 }
90
91 messageBuffer.append("Inside the definition for plugin \'");
92 messageBuffer.append(mojo.getPluginDescriptor().getArtifactId());
93 messageBuffer.append("\', specify the following:\n\n<configuration>\n ...\n");
94 messageBuffer.append(" <").append(param.getName()).append('>');
95 if (isArray || isCollection) {
96 messageBuffer.append('\n');
97 messageBuffer.append(" <item>");
98 } else if (isProperties) {
99 messageBuffer.append('\n');
100 messageBuffer.append(" <property>\n");
101 messageBuffer.append(" <name>KEY</name>\n");
102 messageBuffer.append(" <value>");
103 } else if (isMap) {
104 messageBuffer.append('\n');
105 messageBuffer.append(" <KEY>");
106 }
107 messageBuffer.append("VALUE");
108 if (isArray || isCollection) {
109 messageBuffer.append("</item>\n");
110 messageBuffer.append(" ");
111 } else if (isProperties) {
112 messageBuffer.append("</value>\n");
113 messageBuffer.append(" </property>\n");
114 messageBuffer.append(" ");
115 } else if (isMap) {
116 messageBuffer.append("</KEY>\n");
117 messageBuffer.append(" ");
118 }
119 messageBuffer.append("</").append(param.getName()).append(">\n");
120 messageBuffer.append("</configuration>");
121
122 String alias = param.getAlias();
123 if (StringUtils.isNotEmpty(alias) && !alias.equals(param.getName())) {
124 messageBuffer
125 .append("\n\n-OR-\n\n<configuration>\n ...\n <")
126 .append(alias)
127 .append(">VALUE</")
128 .append(alias)
129 .append(">\n</configuration>\n");
130 }
131 }
132
133 if (StringUtils.isEmpty(expression)) {
134 messageBuffer.append('.');
135 } else {
136 if (param.isEditable()) {
137 messageBuffer.append("\n\n-OR-\n\n");
138 }
139
140
141 }
142 }
143
144 public String buildDiagnosticMessage() {
145 StringBuilder messageBuffer = new StringBuilder(256);
146
147 List<Parameter> params = getParameters();
148 MojoDescriptor mojo = getMojoDescriptor();
149
150 messageBuffer
151 .append("One or more required plugin parameters are invalid/missing for \'")
152 .append(mojo.getPluginDescriptor().getGoalPrefix())
153 .append(':')
154 .append(mojo.getGoal())
155 .append("\'\n");
156
157 int idx = 0;
158 for (Iterator<Parameter> it = params.iterator(); it.hasNext(); idx++) {
159 Parameter param = it.next();
160
161 messageBuffer.append("\n[").append(idx).append("] ");
162
163 decomposeParameterIntoUserInstructions(mojo, param, messageBuffer);
164
165 messageBuffer.append('\n');
166 }
167
168 return messageBuffer.toString();
169 }
170 }