in uimafit-maven-plugin/src/main/java/org/apache/uima/fit/maven/EnhanceMojo.java [199:334]
public void execute() throws MojoExecutionException, MojoFailureException {
if (isSkipped()) {
return;
}
// Get the compiled classes from this project
String[] files = FileUtils.getFilesFromExtension(project.getBuild().getOutputDirectory(),
new String[] { "class" });
componentLoader = Util.getClassloader(project, getLog(), includeScope);
// Set up class pool with all the project dependencies and the project classes themselves
ClassPool classPool = new ClassPool(true);
classPool.appendClassPath(new LoaderClassPath(componentLoader));
// Set up map to keep a report per class.
Multimap<String, String> reportData = LinkedHashMultimap.create();
// Determine where to write the missing meta data report file
File reportFile = new File(project.getBuild().getDirectory(),
"uimafit-missing-meta-data-report.txt");
// Read existing report
if (generateMissingMetaDataReport) {
readMissingMetaDataReport(reportFile, reportData);
}
// Remember the names of all examined components, whether processed or not.
List<String> examinedComponents = new ArrayList<String>();
int countAlreadyEnhanced = 0;
int countEnhanced = 0;
for (String file : files) {
String clazzName = Util.getClassName(project, file);
// Check if this is a UIMA component
Class<?> clazz;
try {
clazz = componentLoader.loadClass(clazzName);
// Do not process a class twice
// UIMA-3853 workaround for IBM Java 8 beta 3
if (clazz.getAnnotation(EnhancedClassFile.class) != null) {
countAlreadyEnhanced++;
getLog().debug("Class [" + clazzName + "] already enhanced");
// Remember that class was examined
examinedComponents.add(clazzName);
continue;
}
// Only process UIMA components
if (!Util.isComponent(componentLoader, clazz)) {
continue;
}
} catch (ClassNotFoundException e) {
getLog().warn("Cannot analyze class [" + clazzName + "]", e);
continue;
}
// Remember that class was examined
examinedComponents.add(clazzName);
// Forget any previous missing meta data report we have on the class
reportData.removeAll(clazzName);
// Get the Javassist class
CtClass ctClazz;
try {
ctClazz = classPool.get(clazzName);
} catch (NotFoundException e) {
throw new MojoExecutionException(
"Class [" + clazzName + "] not found in class pool: " + getRootCauseMessage(e), e);
}
// Get the source file
String sourceFile = getSourceFile(clazzName);
// Try to extract parameter descriptions from JavaDoc in source file
if (sourceFile != null) {
countEnhanced++;
getLog().debug("Enhancing class [" + clazzName + "]");
// Parse source file so we can extract the JavaDoc
JavaSource ast = parseSource(sourceFile);
// Enhance meta data
enhanceResourceMetaData(ast, clazz, ctClazz, reportData);
// Enhance configuration parameters
enhanceConfigurationParameter(ast, clazz, ctClazz, reportData);
// Add the EnhancedClassFile annotation.
markAsEnhanced(ctClazz);
} else {
getLog().warn("No source file found for class [" + clazzName + "]");
}
try {
if (ctClazz.isModified()) {
getLog().debug("Writing enhanced class [" + clazzName + "]");
// Trying to work around UIMA-2611, see
// http://stackoverflow.com/questions/13797919/javassist-add-method-and-invoke
ctClazz.toBytecode();
ctClazz.writeFile(project.getBuild().getOutputDirectory());
} else {
getLog().debug("No changes to class [" + clazzName + "]");
}
} catch (IOException e) {
throw new MojoExecutionException(
"Enhanced class [" + clazzName + "] cannot be written: " + getRootCauseMessage(e),
e);
} catch (CannotCompileException e) {
throw new MojoExecutionException(
"Enhanced class [" + clazzName + "] cannot be compiled: " + getRootCauseMessage(e),
e);
}
}
getLog().info("Enhanced " + countEnhanced + " class" + (countEnhanced != 1 ? "es" : "") + " ("
+ countAlreadyEnhanced + " already enhanced).");
if (generateMissingMetaDataReport) {
// Remove any classes from the report that are no longer part of the build
List<String> deletedClasses = new ArrayList<String>(reportData.keySet());
deletedClasses.removeAll(examinedComponents);
reportData.removeAll(deletedClasses);
// Write updated report
writeMissingMetaDataReport(reportFile, reportData);
if (failOnMissingMetaData && !reportData.isEmpty()) {
throw new MojoFailureException("Component meta data missing. A report of the missing "
+ "meta data can be found in " + reportFile);
}
}
}