package br.com.centralit.citcorpore.util;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class UtilClasses {
/**
* Retorna os nomes de classes de um determinadao pacote
*
* @param packageName
* @return
* @throws IOException
*/
public static ArrayList<String> getClassNamesFromPackage(String packageName) throws IOException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URL packageURL;
ArrayList<String> names = new ArrayList<String>();
;
packageName = packageName.replace(".", "/");
packageURL = classLoader.getResource(packageName);
if (packageURL.getProtocol().equals("jar")) {
String jarFileName;
JarFile jf;
Enumeration<JarEntry> jarEntries;
String entryName;
// build jar file name, then loop through zipped entries
jarFileName = URLDecoder.decode(packageURL.getFile(), "UTF-8");
jarFileName = jarFileName.substring(5, jarFileName.indexOf("!"));
System.out.println(">" + jarFileName);
jf = new JarFile(jarFileName);
jarEntries = jf.entries();
while (jarEntries.hasMoreElements()) {
entryName = jarEntries.nextElement().getName();
if (entryName.startsWith(packageName) && entryName.length() > packageName.length() + 5) {
entryName = entryName.substring(packageName.length(), entryName.lastIndexOf('.'));
names.add(entryName);
}
}
jf.close();
// loop through files in classpath
} else {
File folder = new File(packageURL.getFile());
File[] contenuti = folder.listFiles();
String entryName;
for (File actual : contenuti) {
entryName = actual.getName();
entryName = entryName.substring(0, entryName.lastIndexOf('.'));
names.add(entryName);
}
}
return names;
}
/**
* Verifica se uma classe implementa uma interface (mesmo na hierarquia - heran�as)
*
* @param classeAnalisar
* @param nomeCompletoInterfaceComPacote
* @return
*/
public static boolean isClassImplInterface(Class classeAnalisar, String nomeCompletoInterfaceComPacote) {
if (classeAnalisar == null) {
return false;
}
Class[] interfaces = classeAnalisar.getInterfaces();
if (interfaces != null) {
for (int i = 0; i < interfaces.length; i++) {
Class interfaceAux = interfaces[i];
if (interfaceAux.getName().equalsIgnoreCase(nomeCompletoInterfaceComPacote)) {
return true;
} else {
// Se nao for, verifica na hierarquia desta se possui.
boolean bOk = isClassImplInterface(interfaceAux, nomeCompletoInterfaceComPacote);
if (bOk) {
return true;
}
}
}
}
if (classeAnalisar.getSuperclass() != null) {
boolean bOk = isClassImplInterface(classeAnalisar.getSuperclass(), nomeCompletoInterfaceComPacote);
if (bOk) {
return true;
}
}
return false;
}
/**
* Retorna a lista de Classes de um determinado pacote que implementam determinada interface.
*
* @param namePackage
* @param interfaceNameImpl
* @return
* @throws IOException
* @throws ClassNotFoundException
*
* Exemplo: getClassesFromPackageImplInterface("br.com.centralit.citcorpore.bean", "br.com.citframework.dto.IDto")
*/
public static ArrayList<Class> getClassesFromPackageImplInterface(String namePackage, String interfaceNameImpl) throws IOException, ClassNotFoundException {
ArrayList<String> list = UtilClasses.getClassNamesFromPackage(namePackage);
ArrayList<Class> listReturn = null;
for (String className : list) {
Class classe = Class.forName(namePackage + "." + className);
boolean bOk = UtilClasses.isClassImplInterface(classe, interfaceNameImpl);
if (bOk) {
if (listReturn == null) {
listReturn = new ArrayList<Class>();
}
listReturn.add(classe);
}
}
return listReturn;
}
}