Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package org.jboss.weld.environment.deployment.discovery.jandex;
  
  import java.util.List;
  import java.util.Map;
  import java.util.Set;
  
 
 import  org.jboss.jandex.AnnotationInstance;
 import  org.jboss.jandex.AnnotationTarget;
 import  org.jboss.jandex.ClassInfo;
 import  org.jboss.jandex.DotName;
 import  org.jboss.jandex.IndexView;
 import  org.jboss.jandex.MethodInfo;
 
A Java class representation backed by Jandex.

Author(s):
Martin Kouba
Matej Briškár
 
 public class JandexClassFileInfo implements ClassFileInfo {
 
     private static final DotName DOT_NAME_INJECT = DotName.createSimple(Inject.class.getName());
 
     private static final DotName DOT_NAME_VETOED = DotName.createSimple(Vetoed.class.getName());
 
     private static final DotName OBJECT_NAME = DotName.createSimple(Object.class.getName());
 
     private static final String CONSTRUCTOR_METHOD_NAME = "<init>";
 
     private static final String PACKAGE_INFO_NAME = "package-info";
 
     private final ClassInfo classInfo;
 
     private final IndexView index;
 
     private final boolean isVetoed;
 
     private final boolean hasCdiConstructor;
 
     private final LoadingCache<DotName, Set<String>> annotationClassAnnotationsCache;
 
     private final ClassLoader classLoader;
 
     private static final Logger log = Logger.getLogger(JandexClassFileInfo.class);
 
     public JandexClassFileInfo(String className, IndexView indexLoadingCache<DotName, Set<String>> annotationClassAnnotationsCacheClassLoader classLoader) {
         this. = index;
         this. = annotationClassAnnotationsCache;
         this. = index.getClassByName(DotName.createSimple(className));
         if (this. == null) {
             throw ..indexForNameNotFound(className);
         }
         this. = isVetoedTypeOrPackage();
         this. = this..hasNoArgsConstructor() || hasInjectConstructor();
         this. = classLoader;
     }
 
     @Override
     public String getClassName() {
         return .name().toString();
     }
 
     @Override
     public boolean isAnnotationDeclared(Class<? extends Annotationannotation) {
         return isAnnotationDeclared(annotation);
     }
 
     @Override
     public boolean containsAnnotation(Class<? extends Annotationannotation) {
         return containsAnnotation(, DotName.createSimple(annotation.getName()), annotation);
     }
 
     @Override
     public int getModifiers() {
         return .flags();
     }
 
     @Override
     public boolean hasCdiConstructor() {
         return ;
     }
 
     @Override
     public boolean isAssignableFrom(Class<?> fromClass) {
         return isAssignableFrom(getClassName(), fromClass);
     }
 
     @Override
    public boolean isAssignableTo(Class<?> toClass) {
        return isAssignableTo(.name(), toClass);
    }
    @Override
    public boolean isVetoed() {
        return ;
    }
    @Override
    public boolean isTopLevelClass() {
        // TODO This is not portable per the JSL
        // TODO Modify jandex to contain isTopLevelClass attribute
        return !.name().local().contains("$");
    }
    @Override
    public String getSuperclassName() {
        return .superName().toString();
    }
    private boolean isVetoedTypeOrPackage() {
            return true;
        }
        final DotName packageInfoName = DotName.createComponentized(getPackageName(.name()), );
        ClassInfo packageInfo = .getClassByName(packageInfoName);
        if (packageInfo != null && isAnnotationDeclared(packageInfo)) {
            return true;
        }
        return false;
    }
    private boolean isAnnotationDeclared(ClassInfo classInfoClass<? extends Annotationannotation) {
        return isAnnotationDeclared(classInfo, DotName.createSimple(annotation.getName()));
    }
    private boolean isAnnotationDeclared(ClassInfo classInfo, DotName requiredAnnotationName) {
        Map<DotName, List<AnnotationInstance>> annotationsMap = classInfo.annotations();
        List<AnnotationInstance> annotations = annotationsMap.get(requiredAnnotationName);
        if (annotations != null) {
            for (AnnotationInstance annotationInstance : annotations) {
                if (annotationInstance.target().equals(classInfo)) {
                    return true;
                }
            }
        }
        return false;
    }
    private boolean hasInjectConstructor() {
        List<AnnotationInstance> annotationInstances = .annotations().get();
        if (annotationInstances != null) {
            for (AnnotationInstance instance : annotationInstances) {
                AnnotationTarget target = instance.target();
                if (target instanceof MethodInfo) {
                    MethodInfo methodInfo = (MethodInfo) target;
                    if (methodInfo.name().equals()) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
    private DotName getPackageName(DotName name) {
        if (name.isComponentized()) {
            return name.prefix();
        } else {
            final int lastIndex = name.local().lastIndexOf(".");
            if (lastIndex == -1) {
                return name;
            }
            return DotName.createSimple(name.local().substring(0, lastIndex));
        }
    }

    

Parameters:
className
fromClass
Returns:
    private boolean isAssignableFrom(String classNameClass<?> fromClass) {
        if (className.equals(fromClass.getName())) {
            return true;
        }
        if (Object.class.equals(fromClass)) {
            return false// there's nothing assignable from Object.class except for Object.class
        }
        Class<?> superClass = fromClass.getSuperclass();
        if (superClass != null && isAssignableFrom(classNamesuperClass)) {
            return true;
        }
        for (Class<?> interfaceClass : fromClass.getInterfaces()) {
            if (isAssignableFrom(classNameinterfaceClass)) {
                return true;
            }
        }
        return false;
    }

    

Parameters:
to
name
Returns:
true if the name is equal to the fromName, or if the name represents a superclass or superinterface of the fromName, false otherwise
    private boolean isAssignableTo(DotName nameClass<?> to) {
        if (to.getName().equals(name.toString())) {
            return true;
        }
        if (.equals(name)) {
            return false// there's nothing assignable from Object.class except for Object.class
        }
        ClassInfo fromClassInfo = .getClassByName(name);
        if (fromClassInfo == null) {
            // We reached a class that is not in the index. Let's use reflection.
            final Class<?> clazz = loadClass(name.toString());
            return to.isAssignableFrom(clazz);
        }
        DotName superName = fromClassInfo.superName();
        if (superName != null && isAssignableTo(superNameto)) {
            return true;
        }
        if (fromClassInfo.interfaces() != null) {
            for (DotName interfaceName : fromClassInfo.interfaces()) {
                if (isAssignableTo(interfaceNameto)) {
                    return true;
                }
            }
        }
        return false;
    }
    private boolean containsAnnotation(ClassInfo classInfo, DotName requiredAnnotationNameClass<? extends AnnotationrequiredAnnotation) {
        // Type and members
        if (classInfo.annotations().containsKey(requiredAnnotationName)) {
            return true;
        }
        // Meta-annotations
        for (DotName annotation : classInfo.annotations().keySet()) {
            try {
                if (.get(annotation).contains(requiredAnnotationName.toString())) {
                    return true;
                }
            } catch (ExecutionException e) {
                throw new RuntimeException(e);
            }
        }
        // Superclass
        final DotName superName = classInfo.superName();
        if (superName != null && !.equals(superName)) {
            final ClassInfo superClassInfo = .getClassByName(superName);
            if (superClassInfo == null) {
                // we are accessing a class that is outside of the jandex index
                // fallback to using reflection
                return Reflections.containsAnnotation(loadClass(superName.toString()), requiredAnnotation);
            }
            if (containsAnnotation(superClassInforequiredAnnotationNamerequiredAnnotation)) {
                return true;
            }
        }
        return false;
    }
    private Class<?> loadClass(String className) {
        .trace("Loading class with class loader: " + className);
        Class<?> clazz = null;
        try {
            clazz = .loadClass(className);
        } catch (ClassNotFoundException ex) {
            throw ..unableToLoadClass(className);
        }
        return clazz;
    }
    @Override
    public String toString() {
        return .toString();
    }
New to GrepCode? Check out our FAQ X