}\r
\r
private BirthmarkSet[] extractImpl(String[] birthmarks, String[] files, BirthmarkEnvironment environment) throws IOException, BirthmarkExtractionFailedException{\r
+ ClasspathContext context = environment.getClasspathContext();\r
+ for(int i = 0; i < files.length; i++){\r
+ context.addClasspath(new File(files[i]).toURI().toURL());\r
+ }\r
ClassFileArchive[] archives = createArchives(files, environment);\r
BirthmarkExtractor[] extractors = createExtractors(birthmarks, environment);\r
ExtractionUnit unit = environment.getExtractionUnit();\r
*/\r
\r
import java.net.URL;\r
-import java.net.URLClassLoader;\r
import java.util.ArrayList;\r
import java.util.Iterator;\r
import java.util.List;\r
\r
+import jp.naist.se.stigmata.utils.WarClassLoader;\r
+\r
/**\r
* @author Haruaki TAMADA\r
* @version $Revision$ $Date$\r
list.add(i.next());\r
}\r
\r
- loader = new URLClassLoader(list.toArray(new URL[list.size()]), getClass().getClassLoader());\r
+ loader = new WarClassLoader(list.toArray(new URL[list.size()]), getClass().getClassLoader());\r
}\r
return loader;\r
}\r
--- /dev/null
+package jp.naist.se.stigmata.utils;\r
+\r
+import java.io.ByteArrayOutputStream;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.net.URL;\r
+import java.net.URLClassLoader;\r
+import java.net.URLStreamHandlerFactory;\r
+\r
+public class WarClassLoader extends URLClassLoader{\r
+ public WarClassLoader(URL[] urls, ClassLoader parent,\r
+ URLStreamHandlerFactory factory){\r
+ super(urls, parent, factory);\r
+ }\r
+\r
+ public WarClassLoader(URL[] urls, ClassLoader parent){\r
+ super(urls, parent);\r
+ }\r
+\r
+ public WarClassLoader(URL[] urls){\r
+ super(urls);\r
+ }\r
+\r
+ @Override\r
+ protected Class<?> findClass(String name) throws ClassNotFoundException{\r
+ Class<?> clazz = null;\r
+ try{\r
+ clazz = super.findClass(name);\r
+ } catch(Throwable e){\r
+ String path = "WEB-INF/classes/" + name.replace('.', '/') + ".class";\r
+ for(URL url: getURLs()){\r
+ if(url.toString().endsWith(".war")){\r
+ try{\r
+ URL newurl = new URL("jar:" + url + "!/" + path);\r
+ InputStream in = newurl.openStream();\r
+ ByteArrayOutputStream out = new ByteArrayOutputStream();\r
+ byte[] data = new byte[256];\r
+ int read = 0;\r
+ while((read = in.read(data, 0, data.length)) != -1){\r
+ out.write(data, 0, read);\r
+ }\r
+ byte[] classdata = out.toByteArray();\r
+ in.close();\r
+ out.close();\r
+ \r
+ return defineClass(name, classdata, 0, classdata.length);\r
+ } catch(IOException exp){\r
+ }\r
+ }\r
+ }\r
+ throw new ClassNotFoundException(name);\r
+ }\r
+ return clazz;\r
+ }\r
+}\r