OSDN Git Service

update document and add reports
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / utils / WarClassLoader.java
1 package jp.sourceforge.stigmata.utils;
2
3 /*
4  * $Id$
5  */
6
7 import java.io.ByteArrayOutputStream;
8 import java.io.IOException;
9 import java.io.InputStream;
10 import java.net.URL;
11 import java.net.URLClassLoader;
12 import java.net.URLStreamHandlerFactory;
13
14 /**
15  * ClassLoader for war file.
16  * A war file layouts classes in /WEB-INF/classes directory.
17  * Therefore, plain jar class loader cannot load classes included in war file.
18  * Because plain jar class loader only loads classes in top directory.
19  * Then, this class loader can load classes included in a plain jar file and a war file.
20  * 
21  * @author Haruaki Tamada
22  * @version $Revision$ 
23  */
24 public class WarClassLoader extends URLClassLoader{
25     public WarClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory){
26         super(urls, parent, factory);
27     }
28
29     public WarClassLoader(URL[] urls, ClassLoader parent){
30         super(urls, parent);
31     }
32
33     public WarClassLoader(URL[] urls){
34         super(urls);
35     }
36
37     @Override
38     protected Class<?> findClass(String name) throws ClassNotFoundException{
39         Class<?> clazz = null;
40         try{
41             clazz = super.findClass(name);
42         } catch(ClassNotFoundException e){
43             String path = "WEB-INF/classes/" + name.replace('.', '/') + ".class";
44             for(URL url: getURLs()){
45                 if(url.toString().endsWith(".war")){
46                     try{
47                         URL newurl = new URL("jar:" + url + "!/" + path);
48                         InputStream in = newurl.openStream();
49                         ByteArrayOutputStream out = new ByteArrayOutputStream();
50                         byte[] data = new byte[256];
51                         int read = 0;
52                         while((read = in.read(data, 0, data.length)) != -1){
53                             out.write(data, 0, read);
54                         }
55                         byte[] classdata = out.toByteArray();
56                         in.close();
57                         out.close();
58                     
59                         clazz = defineClass(name, classdata, 0, classdata.length);
60                         break;
61                     } catch(IOException exp){
62                     }
63                 }
64             }
65         }
66         if(clazz == null){
67             throw new ClassNotFoundException(name);
68         }
69         return clazz;
70     }
71 }