in tools/maven-plugin/src/main/java/org/apache/batchee/tools/maven/doc/ComponentDocumentationGenerator.java [252:385]
private String component(final Map<String, ClassDoc> commands, final File classFile) throws IOException {
InputStream stream = null;
try {
stream = new FileInputStream(classFile);
final ClassReader reader = new ClassReader(stream);
reader.accept(new ClassVisitor(Opcodes.ASM7) {
public boolean isLeaf;
private String parentName;
private String configName;
private String className;
private String doc;
private List<FieldDoc> configs;
@Override
public void visit(final int version, final int access, final String name, final String signature, final String superName, final String[] interfaces) {
parentName = superName == null || OBJECT_NAME.equals(superName) ? null : superName.replace('/', '.');
className = name.replace('/', '.');
isLeaf = !Modifier.isAbstract(access); // TODO: interfaces?
}
@Override
public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
final AnnotationVisitor annotationVisitor = super.visitAnnotation(desc, visible);
if (NAMED_MARKER.equals(desc)) {
configName = className;
final int dollar = configName.lastIndexOf('$');
if (dollar > 0) {
configName = configName.substring(dollar + 1);
} else {
final int dot = configName.lastIndexOf('.');
if (dot > 0) {
configName = configName.substring(dot + 1);
}
}
configName = Introspector.decapitalize(configName);
return new AnnotationVisitor(Opcodes.ASM7, annotationVisitor) {
@Override
public void visit(final String name, final Object value) {
super.visit(name, value);
if ("value".equals(name) && String.class.isInstance(value) && !String.class.cast(value).isEmpty()) {
configName = value.toString();
}
}
};
}
if (CONFIGURATION_MARKER.equals(desc)) {
return new AnnotationVisitor(Opcodes.ASM7, annotationVisitor) {
@Override
public void visit(final String name, final Object value) {
super.visit(name, value);
if ("value".equals(name) && String.class.isInstance(value) && !String.class.cast(value).isEmpty()) {
doc = value.toString();
}
}
};
}
return annotationVisitor;
}
@Override
public FieldVisitor visitField(final int access, final String name, final String desc, final String signature, final Object value) {
return new FieldVisitor(Opcodes.ASM7, super.visitField(access, name, desc, signature, value)) {
private boolean marked = false;
private boolean hasInject = false;
private String configName = name;
private String doc = null;
@Override
public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) {
final AnnotationVisitor annotationVisitor = super.visitAnnotation(desc, visible);
if (PROPERTY_MARKER.equals(desc)) {
marked = true;
return new AnnotationVisitor(Opcodes.ASM7, annotationVisitor) {
@Override
public void visit(final String name, final Object value) {
super.visit(name, value);
if ("name".equals(name) && String.class.isInstance(value) && !String.class.cast(value).isEmpty()) {
configName = value.toString();
}
}
};
}
if (INJECT_MARKER.equals(desc)) {
hasInject = true;
return annotationVisitor;
}
if (CONFIGURATION_MARKER.equals(desc)) {
return new AnnotationVisitor(Opcodes.ASM7, annotationVisitor) {
@Override
public void visit(final String name, final Object value) {
super.visit(name, value);
if ("value".equals(name) && String.class.isInstance(value) && !String.class.cast(value).isEmpty()) {
doc = value.toString();
}
}
};
}
return annotationVisitor;
}
@Override
public void visitEnd() {
super.visitEnd();
if (marked && hasInject) {
if (configs == null) {
configs = new ArrayList<FieldDoc>();
}
configs.add(new FieldDoc(configName, doc));
}
}
};
}
@Override
public void visitEnd() {
super.visitEnd();
if (configs != null) {
Collections.sort(configs);
commands.put(className, new ClassDoc(isLeaf, parentName, configName == null ? className: configName, doc, configs));
}
}
}, SKIP_CODE + SKIP_DEBUG + SKIP_FRAMES);
} finally {
try {
if (stream != null) {
stream.close();
}
} catch (final IOException e) {
// no-op
}
}
return null;
}