1a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com/*
2a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com * Copyright (C) 2010 The Android Open Source Project
3a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com *
4a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com * Licensed under the Apache License, Version 2.0 (the "License");
5a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com * you may not use this file except in compliance with the License.
6a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com * You may obtain a copy of the License at
7a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com *
8a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com *      http://www.apache.org/licenses/LICENSE-2.0
9a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com *
10a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com * Unless required by applicable law or agreed to in writing, software
11a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com * distributed under the License is distributed on an "AS IS" BASIS,
12a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com * See the License for the specific language governing permissions and
14a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com * limitations under the License.
15a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com */
16a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com
17a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.compackage vogar.target;
18a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com
19a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.comimport java.io.IOException;
20a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.comimport java.util.Arrays;
21a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.comimport java.util.Collections;
22a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.comimport java.util.Set;
23a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com
24a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.comclass ClassFinder {
25a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com    /**
26a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com     * Returns either a Set with the class represented by classOrPackageName as its only element, if
27a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com     * classOrPackageName represents a class, or a Set containing all of the classes contained
28a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com     * within the package represented by classOrPackageName, if it represents a package.
29a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com     *
30a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com     * Throws an exception if it represents neither a class nor a package with at least one class.
31a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com     */
32a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com    public Set<Class<?>> find(String classOrPackageName) {
33a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com        try {
34a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com            // if no exception thrown, classOrPackageName must represent a class
35a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com            return Collections.<Class<?>>singleton(Class.forName(classOrPackageName));
36a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com        } catch (ClassNotFoundException e) {
37a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com        }
38a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com        // classOrPackageName might represent a package
39a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com        try {
40a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com            Package aPackage = new ClassPathScanner().scan(classOrPackageName);
41a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com            Set<Class<?>> classes = aPackage.getTopLevelClassesRecursive();
42a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com            if (classes.isEmpty()) {
43a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com                throw new IllegalArgumentException("No classes in package: " + classOrPackageName +
44a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com                        "; classpath is " + Arrays.toString(ClassPathScanner.getClassPath()));
45a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com            }
46a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com            return classes;
47a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com        } catch (IOException eIO) {
48a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com            throw new RuntimeException(eIO);
49a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com        }
50a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com    }
51a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com}
52