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}