in uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/EnhanceMojo.java [471:557]
private void enhanceConfigurationParameter(JavaSource aAST, Class<?> aClazz, CtClass aCtClazz,
Multimap<String, String> aReportData) throws MojoExecutionException {
// Get the parameter name constants
Map<String, String> parameterNameFields = getParameterConstants(aClazz,
parameterNameConstantPrefixes);
Map<String, String> resourceNameFields = getParameterConstants(aClazz,
externalResourceNameConstantPrefixes);
// Fetch configuration parameters from the @ConfigurationParameter annotations in the
// compiled class. We only need the fields in the class itself. Superclasses should be
// enhanced by themselves.
for (Field field : aClazz.getDeclaredFields()) {
final String pname;
final String type;
final String pdesc;
// Is this a configuration parameter?
if (ConfigurationParameterFactory.isConfigurationParameterField(field)) {
type = "parameter";
// Extract configuration parameter information from the uimaFIT annotation
pname = ConfigurationParameterFactory.createPrimitiveParameter(field).getName();
// Extract JavaDoc for this resource from the source file
pdesc = Util.getParameterDocumentation(aAST, field.getName(),
parameterNameFields.get(pname));
}
// Is this an external resource?
else if (ExternalResourceFactory.isExternalResourceField(field)) {
type = "external resource";
// Extract resource key from the uimaFIT annotation
pname = ExternalResourceFactory.createResourceDependency(field).getKey();
// Extract JavaDoc for this resource from the source file
pdesc = Util.getParameterDocumentation(aAST, field.getName(),
resourceNameFields.get(pname));
} else {
continue;
}
if (pdesc == null) {
String msg = "No description found for " + type + " [" + pname + "]";
getLog().debug(msg);
aReportData.put(aClazz.getName(), msg);
continue;
}
// Update the "description" field of the annotation
try {
CtField ctField = aCtClazz.getField(field.getName());
AnnotationsAttribute annoAttr = (AnnotationsAttribute) ctField.getFieldInfo()
.getAttribute(AnnotationsAttribute.visibleTag);
// Locate and update annotation
if (annoAttr != null) {
Annotation[] annotations = annoAttr.getAnnotations();
// Update existing annotation
for (Annotation a : annotations) {
if (a.getTypeName()
.equals(org.apache.uima.fit.descriptor.ConfigurationParameter.class.getName())
|| a.getTypeName()
.equals(org.apache.uima.fit.descriptor.ExternalResource.class.getName())
|| a.getTypeName().equals("org.uimafit.descriptor.ConfigurationParameter")
|| a.getTypeName().equals("org.uimafit.descriptor.ExternalResource")) {
if (a.getMemberValue("description") == null) {
a.addMemberValue("description",
new StringMemberValue(pdesc, aCtClazz.getClassFile().getConstPool()));
getLog().debug("Enhanced description of " + type + " [" + pname + "]");
// Replace updated annotation
annoAttr.addAnnotation(a);
} else {
// Extract configuration parameter information from the uimaFIT
// annotation
// We only want to override if the description is not set yet.
getLog().debug("Not overwriting description of " + type + " [" + pname + "] ");
}
}
}
}
// Replace annotations
ctField.getFieldInfo().addAttribute(annoAttr);
} catch (NotFoundException e) {
throw new MojoExecutionException("Field [" + field.getName() + "] not found in byte code: "
+ ExceptionUtils.getRootCauseMessage(e), e);
}
}
}