OSDN Git Service

war file support; previous version cannot load class from war file when extracting...
authortama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Tue, 11 Sep 2007 02:34:08 +0000 (02:34 +0000)
committertama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Tue, 11 Sep 2007 02:34:08 +0000 (02:34 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/trunk@194 acee48c3-7b26-0410-bdac-b3d0e5314bbc

src/main/java/jp/naist/se/stigmata/BirthmarkContext.java
src/main/java/jp/naist/se/stigmata/BirthmarkEnvironment.java
src/main/java/jp/naist/se/stigmata/Stigmata.java
src/main/java/jp/naist/se/stigmata/reader/ClasspathContext.java
src/main/java/jp/naist/se/stigmata/utils/WarClassLoader.java [new file with mode: 0755]

index 59ec985..aa33d45 100755 (executable)
@@ -14,6 +14,7 @@ import java.util.Map;
 import jp.naist.se.stigmata.event.OperationType;\r
 \r
 /**\r
+ * Runtime properties.\r
  * \r
  * @author Haruaki Tamada\r
  * @version $Revision$ $Date$\r
index 9872cda..15deaa6 100644 (file)
@@ -24,6 +24,7 @@ import jp.naist.se.stigmata.utils.WellknownClassManager;
 \r
 /**\r
  * This class represents the context for extracting/comparing birthmarks.\r
+ * \r
  * @author  Haruaki TAMADA\r
  * @version  $Revision$ $Date$\r
  */\r
index 4c5718b..4219c71 100644 (file)
@@ -342,6 +342,10 @@ public final class Stigmata{
     }\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
index ce7fdcc..fed684b 100644 (file)
@@ -5,11 +5,12 @@ package jp.naist.se.stigmata.reader;
  */\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
@@ -83,7 +84,7 @@ public class ClasspathContext implements Iterable<URL>{
                 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
diff --git a/src/main/java/jp/naist/se/stigmata/utils/WarClassLoader.java b/src/main/java/jp/naist/se/stigmata/utils/WarClassLoader.java
new file mode 100755 (executable)
index 0000000..2284c85
--- /dev/null
@@ -0,0 +1,55 @@
+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