ClassFinder.java revision a7a8fe1efa0fb3299d68709d60701a045bcc72f3
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.LinkedHashSet;
23a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.comimport java.util.Set;
24a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com
25a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.comclass ClassFinder {
26a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com    /**
27a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com     * Returns either a Set with the class represented by classOrPackageName as its only element, if
28a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com     * classOrPackageName represents a class, or a Set containing all of the classes contained
29a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com     * within the package represented by classOrPackageName, if it represents a package.
30a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com     *
31a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com     * Throws an exception if it represents neither a class nor a package with at least one class.
32a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com     */
33a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com    public Set<Class<?>> find(String classOrPackageName) {
34a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com        try {
35a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com            // if no exception thrown, classOrPackageName must represent a class
36a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com            return Collections.<Class<?>>singleton(Class.forName(classOrPackageName));
37a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com        } catch (ClassNotFoundException e) {
38a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com        }
39a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com        // classOrPackageName might represent a package
40a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com        try {
41a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com            Package aPackage = new ClassPathScanner().scan(classOrPackageName);
42a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com            Set<Class<?>> classes = aPackage.getTopLevelClassesRecursive();
43a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com            if (classes.isEmpty()) {
44a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com                throw new IllegalArgumentException("No classes in package: " + classOrPackageName +
45a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com                        "; classpath is " + Arrays.toString(ClassPathScanner.getClassPath()));
46a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com            }
47a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com            return classes;
48a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com        } catch (IOException eIO) {
49a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com            throw new RuntimeException(eIO);
50a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com        }
51a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com    }
52a7a8fe1efa0fb3299d68709d60701a045bcc72f3jsharpe@google.com}
53