All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.vaadin.flow.server.scanner.ReflectionsClassFinder Maven / Gradle / Ivy

There is a newer version: 2.11.1
Show newest version
/*
 * Copyright 2000-2020 Vaadin Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.vaadin.flow.server.scanner;

import java.lang.annotation.Annotation;
import java.lang.annotation.Repeatable;
import java.lang.reflect.AnnotatedElement;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

import org.reflections.Reflections;
import org.reflections.util.ConfigurationBuilder;

import com.vaadin.flow.server.frontend.scanner.ClassFinder;

/**
 * A class finder using org.reflections.
 *
 * @since 2.0
 */
public class ReflectionsClassFinder implements ClassFinder {
    private final transient ClassLoader classLoader;

    private final transient Reflections reflections;

    /**
     * Constructor.
     *
     * @param urls
     *            the list of urls for finding classes.
     */
    public ReflectionsClassFinder(URL... urls) {
        classLoader = new URLClassLoader(urls, null); // NOSONAR
        ConfigurationBuilder configurationBuilder = new ConfigurationBuilder()
                .addClassLoader(classLoader).setExpandSuperTypes(false)
                .addUrls(urls);

        configurationBuilder.setInputsFilter(
            resourceName -> resourceName.endsWith(".class") && !resourceName
                        .endsWith("module-info.class"));
        reflections = new Reflections(configurationBuilder);
    }

    @Override
    public Set> getAnnotatedClasses(
            Class clazz) {
        Set> classes = new LinkedHashSet<>();
        classes.addAll(reflections.getTypesAnnotatedWith(clazz, true));
        classes.addAll(getAnnotatedByRepeatedAnnotation(clazz));
        return classes;

    }

    private Set> getAnnotatedByRepeatedAnnotation(
            AnnotatedElement annotationClass) {
        Repeatable repeatableAnnotation = annotationClass
                .getAnnotation(Repeatable.class);
        if (repeatableAnnotation != null) {
            return reflections.getTypesAnnotatedWith(
                    repeatableAnnotation.value(), true);
        }
        return Collections.emptySet();
    }

    @Override
    public URL getResource(String name) {
        return classLoader.getResource(name);
    }

    @SuppressWarnings("unchecked")
    @Override
    public  Class loadClass(String name)
            throws ClassNotFoundException {
        return (Class) classLoader.loadClass(name);
    }

    @Override
    public  Set> getSubTypesOf(Class type) {
        return reflections.getSubTypesOf(type);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy