package cn.dreampie.route.config; import cn.dreampie.common.util.scan.ClassScaner; import cn.dreampie.log.Logger; import cn.dreampie.route.core.Resource; import java.util.Collections; import java.util.HashSet; import java.util.Set; /** * ResourceLoader. */ final public class ResourceLoader extends Loader { private static final Logger logger = Logger.getLogger(ResourceLoader.class); private final Set<Class<? extends Resource>> resources = new HashSet<Class<? extends Resource>>(); private Set<Class<? extends Resource>> excludeResources = new HashSet<Class<? extends Resource>>(); private Set<Class<? extends Resource>> includeResources = new HashSet<Class<? extends Resource>>(); private Set<String> includeResourcePackages = new HashSet<String>(); private Set<String> excludeResourcePackages = new HashSet<String>(); public ResourceLoader add(ResourceLoader resourceLoader) { if (resourceLoader != null) { resourceLoader.build(); this.resources.addAll(resourceLoader.resources); } return this; } /** * Add url mapping to resource. The view p is resourceKey * * @param resourceClass Controller Class */ public ResourceLoader add(Class<? extends Resource> resourceClass) { resources.add(resourceClass); return this; } public ResourceLoader addExcludeClasses(Class<? extends Resource>... clazzes) { Collections.addAll(excludeResources, clazzes); return this; } public ResourceLoader addExcludeClasses(Set<Class<? extends Resource>> clazzes) { if (clazzes != null) { excludeResources.addAll(clazzes); } return this; } /** * exclude scanToClass packages eg. cn.dreampie.resource * * @param packages packages * @return */ public ResourceLoader addExcludePackages(String... packages) { Collections.addAll(excludeResourcePackages, packages); return this; } public ResourceLoader addIncludeClasses(Class<? extends Resource>... clazzes) { Collections.addAll(includeResources, clazzes); return this; } public ResourceLoader addIncludeClasses(Set<Class<? extends Resource>> clazzes) { if (clazzes != null) { includeResources.addAll(clazzes); } return this; } /** * scanToClass packages eg. cn.dreampie.resource * * @param packages packages * @return */ public ResourceLoader addIncludePackages(String... packages) { Collections.addAll(includeResourcePackages, packages); return this; } public void build() { if (includeResourcePackages.size() > 0) { if (includeResources.size() <= 0) { includeResources = ClassScaner.of(Resource.class).include(includeResourcePackages).scanToClass(); } else { includeResources.addAll(ClassScaner.of(Resource.class).include(includeResourcePackages).scanToClass()); } } boolean isExclude = false; if (includeResources.size() > 0) { for (Class resource : includeResources) { isExclude = false; if (excludeResourcePackages.size() > 0) { for (String excludepath : excludeResourcePackages) { if (resource.getName().startsWith(excludepath)) { logger.debug("Exclude resource:" + resource.getName()); isExclude = true; break; } } } if (isExclude || excludeResources.contains(resource)) { continue; } this.add(resource); logger.info("Resources.add(" + resource.getName() + ")"); } } else { logger.warn("Could not load any resources."); } } public Set<Class<? extends Resource>> getResources() { return resources; } public void clear() { resources.clear(); excludeResources.clear(); includeResources.clear(); includeResourcePackages.clear(); excludeResourcePackages.clear(); } }