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