private Set<ClassInfo> processHandlesType(DotName typeName, Class<?> type, CompositeIndex index) throws DeploymentUnitProcessingException { Set<ClassInfo> classes = new HashSet<ClassInfo>(); if (type.isAnnotation()) { List<AnnotationInstance> instances = index.getAnnotations(typeName); for (AnnotationInstance instance : instances) { AnnotationTarget annotationTarget = instance.target(); if (annotationTarget instanceof ClassInfo) { classes.add((ClassInfo) annotationTarget); } else if (annotationTarget instanceof FieldInfo) { classes.add(((FieldInfo) annotationTarget).declaringClass()); } else if (annotationTarget instanceof MethodInfo) { classes.add(((MethodInfo) annotationTarget).declaringClass()); } else if (annotationTarget instanceof MethodParameterInfo) { classes.add(((MethodParameterInfo) annotationTarget).method().declaringClass()); } } } else { classes.addAll(index.getAllKnownSubclasses(typeName)); classes.addAll(index.getAllKnownImplementors(typeName)); } return classes; }
protected void scan( final DeploymentUnit du, final ClassLoader classLoader, final ResteasyDeploymentData resteasyDeploymentData) throws DeploymentUnitProcessingException, ModuleLoadException { final CompositeIndex index = du.getAttachment(Attachments.COMPOSITE_ANNOTATION_INDEX); if (!resteasyDeploymentData.shouldScan()) { return; } final Set<ClassInfo> applicationClass = index.getAllKnownSubclasses(APPLICATION); try { if (applicationClass.size() > 1) { StringBuilder builder = new StringBuilder(); Set<ClassInfo> aClasses = new HashSet<ClassInfo>(); for (ClassInfo c : applicationClass) { if (!Modifier.isAbstract(c.flags())) { aClasses.add(c); } builder.append(" ").append(c.name().toString()); } if (aClasses.size() > 1) { throw new DeploymentUnitProcessingException( MESSAGES.onlyOneApplicationClassAllowed(builder)); } else if (aClasses.size() == 1) { ClassInfo aClass = applicationClass.iterator().next(); resteasyDeploymentData.setScannedApplicationClass( (Class<? extends Application>) classLoader.loadClass(aClass.name().toString())); } } else if (applicationClass.size() == 1) { ClassInfo aClass = applicationClass.iterator().next(); resteasyDeploymentData.setScannedApplicationClass( (Class<? extends Application>) classLoader.loadClass(aClass.name().toString())); } } catch (ClassNotFoundException e) { throw MESSAGES.cannotLoadApplicationClass(e); } List<AnnotationInstance> resources = null; List<AnnotationInstance> providers = null; if (resteasyDeploymentData.isScanResources()) { resources = index.getAnnotations(JaxrsAnnotations.PATH.getDotName()); } if (resteasyDeploymentData.isScanProviders()) { providers = index.getAnnotations(JaxrsAnnotations.PROVIDER.getDotName()); } if ((resources == null || resources.isEmpty()) && (providers == null || providers.isEmpty())) return; final Set<ClassInfo> pathInterfaces = new HashSet<ClassInfo>(); if (resources != null) { for (AnnotationInstance e : resources) { final ClassInfo info; if (e.target() instanceof ClassInfo) { info = (ClassInfo) e.target(); } else if (e.target() instanceof MethodInfo) { // ignore continue; } else { JAXRS_LOGGER.classOrMethodAnnotationNotFound("@Path", e.target()); continue; } if (!Modifier.isInterface(info.flags())) { resteasyDeploymentData.getScannedResourceClasses().add(info.name().toString()); } else { pathInterfaces.add(info); } } } if (providers != null) { for (AnnotationInstance e : providers) { if (e.target() instanceof ClassInfo) { ClassInfo info = (ClassInfo) e.target(); if (!Modifier.isInterface(info.flags())) { resteasyDeploymentData.getScannedProviderClasses().add(info.name().toString()); } } else { JAXRS_LOGGER.classAnnotationNotFound("@Provider", e.target()); } } } // look for all implementations of interfaces annotated @Path for (final ClassInfo iface : pathInterfaces) { final Set<ClassInfo> implementors = index.getAllKnownImplementors(iface.name()); for (final ClassInfo implementor : implementors) { resteasyDeploymentData.getScannedResourceClasses().add(implementor.name().toString()); } } }