package org.apache.s4.base.util; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.jar.JarEntry; import java.util.jar.JarFile; /** * * CREDITS * * <p> * The source code for this class was derived from <a href= * "http://code.google.com/p/db4o-om/source/browse/trunk/objectmanager-api/src/com/db4o/objectmanager/configuration/MultiClassLoader.java" * >this project</a>. * * */ public class S4RLoader extends MultiClassLoader { private final JarResources jarResource; private final Map<String, byte[]> generatedClassBytes = new HashMap<String, byte[]>(); public S4RLoader(String jarPath) { jarResource = new JarResources(jarPath); } /** * In order to load dynamically generated classes with the same classloader than * the one used for loading application classes from an s4r archive, we register these * generated classes and bytecode in this classloader. They can be picked later. * */ public void addGeneratedClassBytes(String className, byte[] classBytes) { generatedClassBytes.put(className, classBytes); } @Override protected byte[] loadClassBytes(String className) { if (generatedClassBytes.containsKey(className)) { // note: no need to keep that data any longer return generatedClassBytes.remove(className); } className = formatClassName(className); return jarResource.getResource(className); } public List<Class<?>> getClasses(String path) { List<Class<?>> classes = new ArrayList<Class<?>>(); try { S4RLoader jarLoader = new S4RLoader(path); JarFile jarFile = new JarFile(path); for (Enumeration<JarEntry> e = jarFile.entries(); e .hasMoreElements();) { try { JarEntry entry = e.nextElement(); if (entry.getName().endsWith(".class")) { String className = entry .getName() .substring(0, entry.getName().indexOf(".class")) .replace("/", ".").replace("\\", "."); Class<?> clazz = jarLoader.loadClass(className); // clazz.asSubclass(IoAdapter.class); if (clazz != null) { classes.add(clazz); } } } catch (Exception ex) { } } } catch (Exception e) { e.printStackTrace(); } return classes; } }