OSDN Git Service

Add test case method for loading class from war file.
authorHaruaki Tamada <tamada@cc.kyoto-su.ac.jp>
Wed, 6 Apr 2011 08:16:12 +0000 (17:16 +0900)
committerHaruaki Tamada <tamada@cc.kyoto-su.ac.jp>
Wed, 6 Apr 2011 08:17:28 +0000 (17:17 +0900)
12 files changed:
pom.xml
src/main/java/jp/sourceforge/stigmata/digger/ClassFileArchive.java
src/main/java/jp/sourceforge/stigmata/digger/ClassFileEntry.java
src/main/java/jp/sourceforge/stigmata/digger/ClasspathContext.java
src/main/java/jp/sourceforge/stigmata/digger/DefaultClassFileArchive.java
src/main/java/jp/sourceforge/stigmata/digger/JarClassFileArchive.java
src/main/java/jp/sourceforge/stigmata/digger/WarClassFileArchive.java
src/main/java/jp/sourceforge/stigmata/digger/util/WarClassLoader.java
src/test/java/jp/sourceforge/stigmata/digger/ClasspathContextTest.java
src/test/resources/resources/samplewar.war [new file with mode: 0644]
src/test/resources/resources/samplewar/WEB-INF/classes/HelloWorld.class [new file with mode: 0644]
src/test/resources/resources/samplewar/src/HelloWorld.java [new file with mode: 0644]

diff --git a/pom.xml b/pom.xml
index c70b0f0..cdad674 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
   <groupId>jp.sourceforge.stigmata</groupId>\r
   <artifactId>digger</artifactId>\r
   <packaging>jar</packaging>\r
-  <version>1.1.1-SNAPSHOT</version>\r
+  <version>3.0.0-SNAPSHOT</version>\r
   <name>digger</name>\r
   <description>Dig up class files</description>\r
   <url>http://stigmata.sourceforge.jp/digger/</url>\r
   <dependencies>\r
     <dependency>\r
       <groupId>asm</groupId>\r
-      <artifactId>asm-all</artifactId>\r
-      <version>3.1</version>\r
+      <artifactId>asm</artifactId>\r
+      <version>3.3</version>\r
       <scope>compile</scope>\r
     </dependency>\r
     <dependency>\r
       <groupId>junit</groupId>\r
       <artifactId>junit</artifactId>\r
-      <version>4.3</version>\r
+      <version>4.8</version>\r
       <scope>test</scope>\r
     </dependency>\r
   </dependencies>\r
@@ -69,7 +69,7 @@
     </repository>\r
     <site>\r
       <id>shell.sourceforge.jp</id>\r
-      <url>scp://tama3@shell.sourceforge.jp/home/groups/s/st/stigmata/digger/htdocs</url>\r
+      <url>scp://tama3@shell.sourceforge.jp/home/groups/s/st/stigmata/htdocs/digger</url>\r
     </site>\r
   </distributionManagement>\r
 \r
@@ -84,6 +84,7 @@
       <plugin>\r
         <groupId>org.apache.maven.plugins</groupId>\r
         <artifactId>maven-compiler-plugin</artifactId>\r
+        <version>2.3.2</version>\r
         <configuration>\r
           <source>1.6</source>\r
           <target>1.6</target>\r
         </configuration>\r
       </plugin>\r
 \r
+      <plugin>\r
+        <groupId>org.apache.maven.plugins</groupId>\r
+        <artifactId>maven-resources-plugin</artifactId>\r
+        <version>2.4.3</version>\r
+        <configuration>\r
+          <encoding>utf-8</encoding>\r
+        </configuration>\r
+      </plugin>\r
+\r
       <!-- for JUnit4 -->\r
       <plugin>\r
         <artifactId>maven-surefire-plugin</artifactId>\r
       <plugin>\r
         <groupId>org.apache.maven.plugins</groupId>\r
         <artifactId>maven-site-plugin</artifactId>\r
+        <version>3.0-beta-3</version>\r
         <configuration>\r
           <inputEncoding>utf-8</inputEncoding>\r
           <outputEncoding>utf-8</outputEncoding>\r
       </plugin>\r
 \r
       <plugin>\r
-        <groupId>org.apache.maven.plugins</groupId>\r
-        <artifactId>maven-javadoc-plugin</artifactId>\r
-        <configuration>\r
-          <charset>utf-8</charset>\r
-          <docencoding>utf-8</docencoding>\r
-          <locale>en</locale>\r
-        </configuration>\r
-      </plugin>\r
-\r
-      <plugin>\r
         <artifactId>maven-release-plugin</artifactId>\r
         <configuration>\r
           <tagBase>svn+ssh://tama3@svn.sourceforge.jp/svnroot/stigmata/digger/tags</tagBase>\r
       <plugin>\r
         <groupId>org.apache.maven.plugins</groupId>\r
         <artifactId>maven-project-info-reports-plugin</artifactId>\r
-      </plugin>\r
-      <plugin>\r
-        <groupId>org.apache.maven.plugins</groupId>\r
-        <artifactId>maven-javadoc-plugin</artifactId>\r
-        <configuration>\r
-          <locale>en</locale>\r
-        </configuration>\r
+        <version>2.3.1</version>\r
       </plugin>\r
       <plugin>\r
         <groupId>org.codehaus.mojo</groupId>\r
         <artifactId>cobertura-maven-plugin</artifactId>\r
+        <version>2.4</version>\r
+        <configuration>\r
+          <formats>\r
+            <format>xml</format>\r
+            <format>html</format>\r
+          </formats>\r
+          <encoding>utf-8</encoding>\r
+        </configuration>\r
       </plugin>\r
       <plugin>\r
+        <groupId>org.apache.maven.plugins</groupId>\r
         <artifactId>maven-pmd-plugin</artifactId>\r
+        <version>2.5</version>\r
         <configuration>\r
-          <linkXref>true</linkXref>\r
           <sourceEncoding>utf-8</sourceEncoding>\r
+          <outputEncoding>utf-8</outputEncoding>\r
           <targetJdk>1.6</targetJdk>\r
         </configuration>\r
       </plugin>\r
       <plugin>\r
+        <groupId>org.codehaus.mojo</groupId>\r
+        <artifactId>findbugs-maven-plugin</artifactId>\r
+        <version>2.3.2</version>\r
+        <configuration>\r
+          <sourceEncoding>utf-8</sourceEncoding>\r
+          <outputEncoding>utf-8</outputEncoding>\r
+        </configuration>\r
+      </plugin>\r
+      <plugin>\r
         <groupId>org.apache.maven.plugins</groupId>\r
-        <artifactId>maven-jxr-plugin</artifactId>\r
+        <artifactId>maven-surefire-report-plugin</artifactId>\r
+        <version>2.8</version>\r
       </plugin>\r
       <plugin>\r
         <groupId>org.apache.maven.plugins</groupId>\r
-        <artifactId>maven-changes-plugin</artifactId>\r
-        <reportSets>\r
-          <reportSet>\r
-            <reports>\r
-              <report>changes-report</report>\r
-            </reports>\r
-          </reportSet>\r
-        </reportSets>\r
+        <artifactId>maven-jxr-plugin</artifactId>\r
+        <version>2.1</version>\r
+        <configuration>\r
+          <inputEncoding>utf-8</inputEncoding>\r
+          <outputEncoding>utf-8</outputEncoding>\r
+          <aggregate>true</aggregate>\r
+        </configuration>\r
       </plugin>\r
       <plugin>\r
-        <groupId>org.codehaus.mojo</groupId>\r
-        <artifactId>findbugs-maven-plugin</artifactId>\r
+        <groupId>org.apache.maven.plugins</groupId>\r
+        <artifactId>maven-javadoc-plugin</artifactId>\r
+        <version>2.7</version>\r
         <configuration>\r
-          <xmlOutput>false</xmlOutput>\r
-          <threshold>Normal</threshold>\r
-          <effort>Default</effort>\r
+          <charset>utf-8</charset>\r
+          <encoding>utf-8</encoding>\r
+          <docencoding>utf-8</docencoding>\r
         </configuration>\r
       </plugin>\r
     </plugins>\r
index 291abee..5188785 100644 (file)
@@ -1,9 +1,5 @@
 package jp.sourceforge.stigmata.digger;
 
-/*
- * $Id$
- */
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
@@ -14,7 +10,6 @@ import java.util.Iterator;
  * and the set of a class file included in the archive.
  *
  * @author Haruaki TAMADA
- * @version $Revision$ 
  */
 public interface ClassFileArchive extends Iterable<ClassFileEntry>{
     /**
index 07859a7..b1a9eb8 100644 (file)
@@ -1,9 +1,5 @@
 package jp.sourceforge.stigmata.digger;
 
-/*
- * $Id$
- */
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
@@ -12,7 +8,6 @@ import java.net.URL;
  * This class manages class name and its location.
  *
  * @author Haruaki TAMADA
- * @version $Revision$ 
  */
 public class ClassFileEntry{
     private URL location;
index 56394d7..1ab4a9c 100644 (file)
@@ -1,9 +1,5 @@
 package jp.sourceforge.stigmata.digger;
 
-/*
- * $Id$
- */
-
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -15,7 +11,6 @@ import jp.sourceforge.stigmata.digger.util.WarClassLoader;
  * Context object of Classpath.
  * 
  * @author Haruaki TAMADA
- * @version $Revision$ 
  */
 public class ClasspathContext implements Iterable<URL>{
     private ClasspathContext parent;
index 0655564..df21cbb 100644 (file)
@@ -1,9 +1,5 @@
 package jp.sourceforge.stigmata.digger;
 
-/*
- * $Id$
- */
-
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -15,15 +11,18 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Attribute;
 import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.commons.EmptyVisitor;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.MethodVisitor;
 
 /**
  * 
  * 
  *
  * @author Haruaki TAMADA
- * @version $Revision$ 
  */
 public class DefaultClassFileArchive implements ClassFileArchive{
     private File file;
@@ -101,7 +100,7 @@ public class DefaultClassFileArchive implements ClassFileArchive{
         }
     }
 
-    private static class ClassNameExtractVisitor extends EmptyVisitor{
+    private static class ClassNameExtractVisitor implements ClassVisitor{
         private String className;
 
         public String getClassName(){
@@ -113,5 +112,44 @@ public class DefaultClassFileArchive implements ClassFileArchive{
                 String superClassName, String[] interfaces){
             className = name;
         }
+
+        @Override
+        public AnnotationVisitor visitAnnotation(String arg0, boolean arg1){
+            return null;
+        }
+
+        @Override
+        public void visitAttribute(Attribute arg0){
+        }
+
+        @Override
+        public void visitEnd(){
+        }
+
+        @Override
+        public FieldVisitor visitField(int arg0, String arg1, String arg2,
+                String arg3, Object arg4){
+            return null;
+        }
+
+        @Override
+        public void visitInnerClass(String arg0, String arg1, String arg2,
+                int arg3){
+        }
+
+        @Override
+        public MethodVisitor visitMethod(int arg0, String arg1, String arg2,
+                String arg3, String[] arg4){
+            return null;
+        }
+
+        @Override
+        public void visitOuterClass(String arg0, String arg1, String arg2){
+        }
+
+        @Override
+        public void visitSource(String arg0, String arg1){
+
+        }
     }
 }
index fdcb661..ac3ba16 100644 (file)
@@ -1,9 +1,5 @@
 package jp.sourceforge.stigmata.digger;
 
-/*
- * $Id$
- */
-
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -19,7 +15,6 @@ import java.util.jar.JarFile;
 /**
  *
  * @author Haruaki TAMADA
- * @version $Revision$ 
  */
 public class JarClassFileArchive implements ClassFileArchive{
     private File file;
index ee65856..2506c80 100644 (file)
@@ -1,9 +1,5 @@
 package jp.sourceforge.stigmata.digger;
 
-/*
- * $Id$
- */
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.MalformedURLException;
@@ -19,7 +15,6 @@ import java.util.jar.JarEntry;
  * 
  *
  * @author Haruaki TAMADA
- * @version $Revision$ 
  */
 public class WarClassFileArchive extends JarClassFileArchive{
     public WarClassFileArchive(String jarfile) throws IOException{
index eb7edc7..34cbed1 100644 (file)
@@ -1,9 +1,5 @@
 package jp.sourceforge.stigmata.digger.util;
 
-/*
- * $Id$
- */
-
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -19,7 +15,6 @@ import java.net.URLStreamHandlerFactory;
  * Then, this class loader can load classes included in a plain jar file and a war file.
  * 
  * @author Haruaki Tamada
- * @version $Revision$ 
  */
 public class WarClassLoader extends URLClassLoader{
     public WarClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory){
@@ -45,17 +40,27 @@ public class WarClassLoader extends URLClassLoader{
                 if(url.toString().endsWith(".war")){
                     try{
                         URL newurl = new URL("jar:" + url + "!/" + path);
-                        InputStream in = newurl.openStream();
-                        ByteArrayOutputStream out = new ByteArrayOutputStream();
-                        byte[] data = new byte[256];
-                        int read = 0;
-                        while((read = in.read(data, 0, data.length)) != -1){
-                            out.write(data, 0, read);
+                        InputStream in = null;
+                        ByteArrayOutputStream out = null;
+                        byte[] classdata = null;
+                        try{
+                            in = newurl.openStream();
+                            out = new ByteArrayOutputStream();
+                            byte[] data = new byte[256];
+                            int read = 0;
+                            while((read = in.read(data, 0, data.length)) != -1){
+                                out.write(data, 0, read);
+                            }
+                            classdata = out.toByteArray();
+                        } finally{
+                            if(in != null){
+                                in.close();
+                            }
+                            if(out != null){
+                                out.close();
+                            }
                         }
-                        byte[] classdata = out.toByteArray();
-                        in.close();
-                        out.close();
-                    
+
                         clazz = defineClass(name, classdata, 0, classdata.length);
                         break;
                     } catch(IOException exp){
index 4fa3e05..dde0e20 100644 (file)
@@ -18,6 +18,7 @@ import org.junit.Test;
  * @version $Revision$ 
  */
 public class ClasspathContextTest{
+    private static final String ASM_FILE = "target/asm-3.3.jar";
     private ClasspathContext context;
 
     @Before
@@ -52,14 +53,14 @@ public class ClasspathContextTest{
     public void testParent() throws Exception{
         ClasspathContext subContext = new ClasspathContext(context);
         context.addClasspath(new File("target/classes").toURI().toURL());
-        subContext.addClasspath(new File("target/asm-all-3.1.jar").toURI().toURL());
+        subContext.addClasspath(new File(ASM_FILE).toURI().toURL());
 
         Assert.assertEquals(1, context.getClasspathSize());
         Assert.assertEquals(2, subContext.getClasspathSize());
 
         URL[] url = subContext.getClasspathList();
         Assert.assertEquals(new File("target/classes").toURI().toURL(), url[0]);
-        Assert.assertEquals(new File("target/asm-all-3.1.jar").toURI().toURL(), url[1]);
+        Assert.assertEquals(new File(ASM_FILE).toURI().toURL(), url[1]);
 
         subContext.clear();
         Assert.assertEquals(1, subContext.getClasspathSize());
@@ -72,7 +73,7 @@ public class ClasspathContextTest{
     public void testParent2() throws Exception{
         ClasspathContext subContext = new ClasspathContext(context);
         context.addClasspath(new File("target/classes").toURI().toURL());
-        subContext.addClasspath(new File("target/asm-all-3.1.jar").toURI().toURL());
+        subContext.addClasspath(new File(ASM_FILE).toURI().toURL());
 
         Assert.assertTrue(context.isIncludeSystemClasses());
         subContext.setIncludeSystemClasses(false);
@@ -121,7 +122,7 @@ public class ClasspathContextTest{
     @Test
     public void testFindEntryNotSearchSystemClasspath4() throws Exception{
         context.addClasspath(new File("target/classes").toURI().toURL());
-        context.addClasspath(new File("target/asm-all-3.1.jar").toURI().toURL());
+        context.addClasspath(new File(ASM_FILE).toURI().toURL());
         context.setIncludeSystemClasses(false);
 
         Assert.assertTrue(context.hasEntry("java.lang.Object"));
@@ -159,7 +160,7 @@ public class ClasspathContextTest{
     @Test
     public void testNotSearchSystemClasspath4() throws Exception{
         context.addClasspath(new File("target/classes").toURI().toURL());
-        context.addClasspath(new File("target/asm-all-3.1.jar").toURI().toURL());
+        context.addClasspath(new File(ASM_FILE).toURI().toURL());
         context.setIncludeSystemClasses(false);
         Assert.assertNotNull(context.findClass("java.lang.Object"));
         Assert.assertNotNull(context.findClass("jp.sourceforge.stigmata.digger.ClasspathContext"));
@@ -214,7 +215,7 @@ public class ClasspathContextTest{
     @Test
     public void testSubContextNotSearchSystemClasspath4() throws Exception{
         context.addClasspath(new File("target/classes").toURI().toURL());
-        context.addClasspath(new File("target/asm-all-3.1.jar").toURI().toURL());
+        context.addClasspath(new File(ASM_FILE).toURI().toURL());
         context.setIncludeSystemClasses(false);
 
         ClasspathContext subContext = new ClasspathContext(context);
@@ -222,4 +223,14 @@ public class ClasspathContextTest{
         Assert.assertNotNull(subContext.findClass("jp.sourceforge.stigmata.digger.ClasspathContext"));
         Assert.assertNotNull(subContext.findClass("org.objectweb.asm.ClassReader"));
     }
+
+    @Test
+    public void testWarLoader() throws Exception{
+        context.addClasspath(new File("target/test-classes/resources/samplewar.war").toURI().toURL());
+
+        Assert.assertNotNull(context.findClass("HelloWorld"));
+
+        ClasspathContext subContext = new ClasspathContext(context);
+        Assert.assertNotNull(subContext.findClass("HelloWorld"));
+    }
 }
diff --git a/src/test/resources/resources/samplewar.war b/src/test/resources/resources/samplewar.war
new file mode 100644 (file)
index 0000000..547db8b
Binary files /dev/null and b/src/test/resources/resources/samplewar.war differ
diff --git a/src/test/resources/resources/samplewar/WEB-INF/classes/HelloWorld.class b/src/test/resources/resources/samplewar/WEB-INF/classes/HelloWorld.class
new file mode 100644 (file)
index 0000000..4d05e76
Binary files /dev/null and b/src/test/resources/resources/samplewar/WEB-INF/classes/HelloWorld.class differ
diff --git a/src/test/resources/resources/samplewar/src/HelloWorld.java b/src/test/resources/resources/samplewar/src/HelloWorld.java
new file mode 100644 (file)
index 0000000..28736e1
--- /dev/null
@@ -0,0 +1,5 @@
+public class HelloWorld{
+  public static void main(String[] args){
+    System.out.println("Hello World");
+  }
+}