package org.jblooming.security; import org.jblooming.tracer.Tracer; import java.io.File; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Stack; /** * <pre> * </pre> * * @see PermissionProvider */ public class PermissionHome { protected static final String CLASS_EXTENSION = ".class"; static Map permissions = new HashMap(); Map getPermissionMap() throws IOException { Map map = new HashMap(); String[] roots = System.getProperty("java.class.path").split(File.pathSeparator); for (int i = 0; i < roots.length; i++) { String root = roots[i]; File file = new File(root).getCanonicalFile(); String upperRoot = root.toUpperCase(); if (!file.exists()) continue; if (file.isFile() && upperRoot.endsWith(".JAR")) { processJar(file, map); } else if (file.isDirectory()) { processFolder(file.getCanonicalFile(), new Stack(), map); } } return map; } private void processFolder(File folder, Stack folders, Map map) { File[] content = folder.listFiles(); for (int i = 0; i < content.length; i++) { File file = content[i]; if (file.isFile()) { if (file.getName().endsWith(CLASS_EXTENSION)) { String fqn = composeFQN(file, folders); processClass(fqn, map); } } else if (file.isDirectory()) { folders.push(file.getName()); processFolder(file, folders, map); folders.pop(); } } } private String composeFQN(File file, Stack folders) { String className = file.getName(); className = className.substring(0, className.length() - CLASS_EXTENSION.length()); StringBuffer sb = new StringBuffer(); for (Iterator iterator = folders.iterator(); iterator.hasNext();) { String folder = (String) iterator.next(); sb.append(folder).append('.'); } sb.append(className); return sb.toString(); } private void processJar(File file, Map map) { /* JarFile jar = new JarFile( file ); Enumeration entries = jar.entries(); while (entries.hasMoreElements()) { JarEntry entry = (JarEntry) entries.nextElement(); String path = entry.getName(); if( path.endsWith(CLASS_EXTENSION) ) { String fqn = composeFQN(path); processClass( fqn , map ); } } */ } protected void processClass(String fqn, Map map) { if (fqn.indexOf('$') < 0) { try { Class testingClass = getClass().getClassLoader().loadClass(fqn); processClass(testingClass, map); } catch (Throwable throwable) { Tracer.platformLogger.warn("PermissionHome.processClass Class " + fqn + " not found"); } } } private void processClass(Class testingClass, Map map) { if (PermissionProvider.class.isAssignableFrom(testingClass)) { Field[] fields = testingClass.getFields(); for (int j = 0; j < fields.length; j++) { Field field = fields[j]; if (Modifier.isStatic(field.getModifiers()) && Permission.class.isAssignableFrom(field.getType())) { field.setAccessible(true); try { Permission permission = (Permission) field.get(null); try { storePermission(permission, map); } catch (IllegalStateException e) { throw new IllegalStateException("Class " + testingClass.getName() + " contains a duplicated permission in field " + field.getName() + " : " + e.getMessage()); } } catch (Throwable throwable) { Tracer.platformLogger.warn("PermissionHome.processClass Field \" + field + \" not obtained"); } } } } Class[] declaredClasses = testingClass.getDeclaredClasses(); for (int i = 0; i < declaredClasses.length; i++) { processClass(declaredClasses[i], map); } } private void storePermission(Permission permission, Map map) throws IllegalStateException { } private String composeFQN(String path) { return path.substring(0, path.length() - CLASS_EXTENSION.length()) .replace('\\', '.') .replace('/', '.'); } public static void main(String[] args) throws Throwable { Map permissionMap = new PermissionHome().getPermissionMap(); } }