protected void linkParent()

in xbean-finder/src/main/java/org/apache/xbean/finder/AnnotationFinder.java [363:408]


    protected void linkParent(ClassInfo classInfo) {
        if (classInfo.superType == null) return;
        if (isJvm(classInfo.superType)) return;

        ClassInfo parentInfo = classInfo.superclassInfo;

        if (parentInfo == null) {

            parentInfo = classInfos.get(classInfo.superType);

            if (parentInfo == null) {
                // best scanning we can do, try it first
                readClassDef(classInfo.superType);

                parentInfo = classInfos.get(classInfo.superType);

                if (parentInfo == null) {
                    // parentInfo == null means readClassDef fails so clean up error and retry
                    classesNotLoaded.remove(classInfo.superType);

                    try {
                        if (classInfo.get() != null) { // call get() to ensure clazz got a change to be loaded
                            readClassDef(((Class<?>) classInfo.clazz).getSuperclass());
                            parentInfo = classInfos.get(classInfo.superType);
                        }
                    } catch (final ClassNotFoundException e) {
                        // no-op
                    } catch (final Throwable e) {
                        // no-op
                    }
                }

                if (parentInfo == null) return;

                linkParent(parentInfo);
            }

            classInfo.superclassInfo = parentInfo;
        }

        synchronized (parentInfo.subclassInfos) {
            if (!parentInfo.subclassInfos.contains(classInfo)) {
                parentInfo.subclassInfos.add(classInfo);
            }
        }
    }