private String component()

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(ASM5) {
                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(ASM5, 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(ASM5, 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(ASM5, 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(ASM5, 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(ASM5, 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;
    }