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

io.katharsis.errorhandling.mapper.ExceptionMapperRegistryBuilder Maven / Gradle / Ivy

There is a newer version: 3.0.2
Show newest version
package io.katharsis.errorhandling.mapper;

import io.katharsis.resource.exception.init.InvalidResourceException;
import org.reflections.Reflections;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashSet;
import java.util.Set;

public final class ExceptionMapperRegistryBuilder {
    private final Set exceptionMappers = new HashSet<>();


    public Set getExceptionMappers() {
        return exceptionMappers;
    }

    public ExceptionMapperRegistry build(String resourceSearchPackage) throws IllegalAccessException, InstantiationException {
        addKatharsisDefaultMappers();
        scanForCustomMappers(resourceSearchPackage);
        return new ExceptionMapperRegistry(exceptionMappers);
    }

    private void addKatharsisDefaultMappers() {
        registerExceptionMapper(new KatharsisExceptionMapper());
    }

    private void scanForCustomMappers(String resourceSearchPackage) throws InstantiationException, IllegalAccessException {
        Reflections reflections;
        if (resourceSearchPackage != null) {
            String[] packageNames = resourceSearchPackage.split(",");
            reflections = new Reflections(packageNames);
        } else {
            reflections = new Reflections(resourceSearchPackage);
        }
        Set> exceptionMapperClasses = reflections.getTypesAnnotatedWith(ExceptionMapperProvider.class);

        for (Class exceptionMapperClazz : exceptionMapperClasses) {
            if (!JsonApiExceptionMapper.class.isAssignableFrom(exceptionMapperClazz)) {
                throw new InvalidResourceException(exceptionMapperClazz.getCanonicalName() + " is not an implementation of JsonApiExceptionMapper");
            }
            registerExceptionMapper((JsonApiExceptionMapper) exceptionMapperClazz.newInstance());
        }
    }

    private void registerExceptionMapper(JsonApiExceptionMapper exceptionMapper) {
        Class exceptionClass = getGenericType(exceptionMapper.getClass());
        exceptionMappers.add(new ExceptionMapperType(exceptionClass, exceptionMapper));
    }

    private Class getGenericType(Class mapper) {
        Type[] types = mapper.getGenericInterfaces();
        for (Type type : types) {
            if (type instanceof ParameterizedType && ((ParameterizedType)type).getRawType() == JsonApiExceptionMapper.class) {
                //noinspection unchecked
                return (Class)((ParameterizedType)type).getActualTypeArguments()[0];
            }
        }
        //Won't get in here
        return null;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy