001/* 002 Copyright 2010-2016 Boxfuse GmbH 003 <p/> 004 Licensed under the Apache License, Version 2.0 (the "License"); 005 you may not use this file except in compliance with the License. 006 You may obtain a copy of the License at 007 <p/> 008 http://www.apache.org/licenses/LICENSE-2.0 009 <p/> 010 Unless required by applicable law or agreed to in writing, software 011 distributed under the License is distributed on an "AS IS" BASIS, 012 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 See the License for the specific language governing permissions and 014 limitations under the License. 015 */ 016package io.avaje.classpath.scanner.core; 017 018import io.avaje.classpath.scanner.ClassFilter; 019import io.avaje.classpath.scanner.Resource; 020import io.avaje.classpath.scanner.ResourceFilter; 021import io.avaje.classpath.scanner.internal.EnvironmentDetection; 022import io.avaje.classpath.scanner.internal.ResourceAndClassScanner; 023import io.avaje.classpath.scanner.internal.scanner.classpath.ClassPathScanner; 024import io.avaje.classpath.scanner.internal.scanner.classpath.android.AndroidScanner; 025import io.avaje.classpath.scanner.internal.scanner.filesystem.FileSystemScanner; 026 027import java.util.List; 028 029/** 030 * Scanner for Resources and Classes. 031 */ 032public class Scanner implements io.avaje.classpath.scanner.ClassPathScanner { 033 034 private final ResourceAndClassScanner resourceAndClassScanner; 035 036 private final FileSystemScanner fileSystemScanner = new FileSystemScanner(); 037 038 public Scanner(ClassLoader classLoader) { 039 if (EnvironmentDetection.isAndroid()) { 040 resourceAndClassScanner = new AndroidScanner(classLoader); 041 } else { 042 resourceAndClassScanner = new ClassPathScanner(classLoader); 043 } 044 } 045 046 /** 047 * Scans this location for resources matching the given predicate. 048 * <p> 049 * The location can have a prefix of <code>filesystem:</code> or <code>classpath:</code> to determine 050 * how to scan. If no prefix is used then classpath scan is the default. 051 * </p> 052 * 053 * @param location The location to start searching. Subdirectories are also searched. 054 * @param predicate The predicate used to match resource names. 055 * @return The resources that were found. 056 */ 057 public List<Resource> scanForResources(Location location, ResourceFilter predicate) { 058 059 if (location.isFileSystem()) { 060 return fileSystemScanner.scanForResources(location, predicate); 061 } 062 return resourceAndClassScanner.scanForResources(location, predicate); 063 } 064 065 /** 066 * Scans this location for resources matching the given predicate. 067 * <p> 068 * The location can have a prefix of <code>filesystem:</code> or <code>classpath:</code> to determine 069 * how to scan. If no prefix is used then classpath scan is the default. 070 * </p> 071 * 072 * @param location The location to start searching. Subdirectories are also searched. 073 * @param predicate The predicate used to match resource names. 074 * @return The resources that were found. 075 */ 076 @Override 077 public List<Resource> scanForResources(String location, ResourceFilter predicate) { 078 return scanForResources(new Location(location), predicate); 079 } 080 081 /** 082 * Scans the classpath for classes under the specified package matching the given predicate. 083 * 084 * @param location The package in the classpath to start scanning. Subpackages are also scanned. 085 * @param predicate The predicate used to match scanned classes. 086 * @return The classes found matching the predicate 087 */ 088 public List<Class<?>> scanForClasses(Location location, ClassFilter predicate) { 089 return resourceAndClassScanner.scanForClasses(location, predicate); 090 } 091 092 /** 093 * Scans the classpath for classes under the specified package matching the given predicate. 094 * 095 * @param location The package in the classpath to start scanning. Subpackages are also scanned. 096 * @param predicate The predicate used to match scanned classes. 097 * @return The classes found matching the predicate 098 */ 099 @Override 100 public List<Class<?>> scanForClasses(String location, ClassFilter predicate) { 101 return scanForClasses(new Location(location), predicate); 102 } 103 104}