001package com.ganteater.ae.util;
002
003import java.util.ArrayList;
004import java.util.HashMap;
005import java.util.List;
006import java.util.Map;
007import java.util.ServiceLoader;
008import java.util.stream.Collectors;
009
010import org.apache.commons.collections.ListUtils;
011import org.apache.commons.lang.StringUtils;
012
013public class ClassUtils {
014
015        private static Map<Class<?>, List<Class<?>>> classMap = new HashMap<>();
016
017        public static List<Class<?>> findAssignable(Class<?> parrent) {
018                List<Class<?>> list = classMap.get(parrent);
019                if (list == null) {
020                        list = scanClasses(parrent);
021                }
022                return list;
023        }
024
025        private static List<Class<?>> scanClasses(Class<?> parrent) {
026                ServiceLoader<?> loader = ServiceLoader.load(parrent);
027                for (Object service : loader) {
028                        classMap.computeIfAbsent(parrent, k -> new ArrayList<>()).add(service.getClass());
029                }
030                if (classMap.get(parrent) == null) {
031                        classMap.put(parrent, ListUtils.EMPTY_LIST);
032                }
033                return classMap.get(parrent);
034        }
035
036        public static String[] findAssignable(Class<?> clazz, Package defaultPackage) {
037                String defaultPackageName = defaultPackage.getName() + ".";
038                String[] processors = findAssignable(clazz).stream()
039                                .map(pc -> {
040                                        String name = pc.getName();
041                                        if (name.startsWith(defaultPackageName)) {
042                                                name = StringUtils.substringAfter(name, defaultPackageName);
043                                        }
044                                        return name;
045                                })
046                                .collect(Collectors.toList())
047                                .toArray(new String[0]);
048                return processors;
049        }
050}