private static Object resolveTypeInstanceOrTypeDecl()

in ti/phase2/jars/compiler-xdoclet/src/java/org/apache/ti/compiler/xdoclet/XDocletCompilerUtils.java [88:160]


    private static Object resolveTypeInstanceOrTypeDecl(String typeName, boolean allowUnknownType, XClass currentClass,
                                                        boolean returnTypeInstance) {
        int arrayDimensions = 0;

        if (typeName.endsWith(".class")) typeName = typeName.substring(0, typeName.length() - 6);

        while (typeName.endsWith("[]")) {
            typeName = typeName.substring(0, typeName.length() - 2);
            ++arrayDimensions;
        }

        if (currentClass == null) currentClass = PageFlowDocletSubTask.get().getCurrentSourceClass();
        XJavaDoc xJavaDoc = currentClass.getXJavaDoc();

        XClass originalResolvedType = getXClass(typeName, xJavaDoc);
        XClass attemptedResolvedType = originalResolvedType;

        if (isUnknownClass(attemptedResolvedType)) {
            attemptedResolvedType = getXClass("java.lang." + typeName, xJavaDoc);
        }

        if (isUnknownClass(attemptedResolvedType)) {
            // See if it was an imported class.
            List importedClasses = currentClass.getImportedClasses();
            String dotPrepended = '.' + typeName;

            for (Iterator i = importedClasses.iterator(); i.hasNext();) {
                XClass importedClass = (XClass) i.next();
                if (importedClass.getQualifiedName().endsWith(dotPrepended)) {
                    attemptedResolvedType = getXClass(importedClass.getQualifiedName(), xJavaDoc);
                    break;
                }
            }
        }

        if (isUnknownClass(attemptedResolvedType)) {
            // See if it was in an imported package.
            List importedPackages = currentClass.getImportedPackages();
            String dotPrepended = '.' + typeName;

            for (Iterator i = importedPackages.iterator(); i.hasNext();) {
                XPackage importedPackage = (XPackage) i.next();
                XClass implicitImportedClass = getXClass(importedPackage.getName() + dotPrepended, xJavaDoc);
                if (! isUnknownClass(implicitImportedClass)) {
                    attemptedResolvedType = implicitImportedClass;
                    break;
                }
            }
        }

        if (isUnknownClass(attemptedResolvedType)) {
            // Try it with the full outer classname appended.
            String outerClassName = currentClass.getQualifiedName();
            attemptedResolvedType = getXClass(outerClassName + '.' + typeName, xJavaDoc);
        }

        if (isUnknownClass(attemptedResolvedType)) {
            // Finally, it may be of the form <outer-class-short-name>.<inner-class-name>
            String outerClassName = currentClass.getQualifiedName();
            int lastDot = outerClassName.lastIndexOf('.');
            outerClassName = lastDot != -1 ? outerClassName.substring(0, lastDot) : outerClassName;
            attemptedResolvedType = getXClass(outerClassName + '.' + typeName, xJavaDoc);
        }

        if (isUnknownClass(attemptedResolvedType)) {
            if (! allowUnknownType) return null;
            if (returnTypeInstance) return WrapperFactory.get().getTypeInstance(originalResolvedType);
            return WrapperFactory.get().getTypeDeclaration(originalResolvedType);
        }

        if (returnTypeInstance) return WrapperFactory.get().getTypeInstance(attemptedResolvedType, arrayDimensions);
        return WrapperFactory.get().getTypeDeclaration(attemptedResolvedType);
    }