OSDN Git Service

ClassLoaderの作成にはdoPrivilegeメソッドで囲まなければならない.
authorHaruaki Tamada <tamada@cc.kyoto-su.ac.jp>
Thu, 1 Mar 2012 07:34:25 +0000 (16:34 +0900)
committerHaruaki Tamada <tamada@cc.kyoto-su.ac.jp>
Thu, 1 Mar 2012 07:40:21 +0000 (16:40 +0900)
WarClassLoaderをutilパッケージからdiggerパッケージに移した.
クラス名が解析できなかった場合の例外クラスを追加した.

pom.xml
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/ParseClassNameFailedException.java [new file with mode: 0644]
src/main/java/jp/sourceforge/stigmata/digger/WarClassFileArchive.java
src/main/java/jp/sourceforge/stigmata/digger/WarClassLoader.java [moved from src/main/java/jp/sourceforge/stigmata/digger/util/WarClassLoader.java with 73% similarity]
src/test/java/jp/sourceforge/stigmata/digger/ClasspathContextTest.java
src/test/java/jp/sourceforge/stigmata/digger/WarClassLoaderTest.java [moved from src/test/java/jp/sourceforge/stigmata/digger/util/WarClassLoaderTest.java with 91% similarity]

diff --git a/pom.xml b/pom.xml
index 8193aab..9a5e045 100644 (file)
--- a/pom.xml
+++ b/pom.xml
+<?xml version="1.0" encoding="utf-8"?>\r
+\r
 <project xmlns="http://maven.apache.org/POM/4.0.0"\r
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">\r
-\r
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4_0_0.xsd">\r
   <modelVersion>4.0.0</modelVersion>\r
+\r
+  <parent>\r
+    <groupId>jp.sourceforge</groupId>\r
+    <artifactId>stigmata</artifactId>\r
+    <version>4.0-SNAPSHOT</version>\r
+  </parent>\r
+\r
   <groupId>jp.sourceforge.stigmata</groupId>\r
   <artifactId>digger</artifactId>\r
+  <version>4.0-SNAPSHOT</version>\r
   <packaging>jar</packaging>\r
-  <version>3.0.0</version>\r
-  <name>digger</name>\r
+\r
+  <name>Digger: Class Loading Library for Operating Class Files</name>\r
   <description>Dig up class files</description>\r
   <url>http://stigmata.sourceforge.jp/digger/</url>\r
   <inceptionYear>2008</inceptionYear>\r
 \r
-  <repositories>\r
-    <repository>\r
-      <id>stigmata.sourceforge.jp</id>\r
-      <name>Stigmata Maven2 Repository in sourceforge.jp</name>\r
-      <url>http://stigmata.sourceforge.jp/maven2</url>\r
-    </repository>\r
-    <repository>\r
-      <id>talisman.sourceforge.jp</id>\r
-      <name>Talisman Maven2 Repository in sourceforge.jp</name>\r
-      <url>http://talisman.sourceforge.jp/maven2</url>\r
-    </repository>\r
-  </repositories>\r
-\r
-  <developers>\r
-    <developer>\r
-      <id>tama</id>\r
-      <name>Haruaki TAMADA</name>\r
-      <email>tama3[ at ]users.sourceforge.jp</email>\r
-      <organization>sourceforge.jp</organization>\r
-      <organizationUrl>http://sourceforge.jp/</organizationUrl>\r
-      <timezone>-9</timezone>\r
-    </developer>\r
-  </developers>\r
-\r
-  <organization>\r
-    <name>Stigmata Project, Sourceforge.jp</name>\r
-    <url>http://stigmata.sourceforge.jp/</url>\r
-  </organization>\r
-\r
-  <dependencies>\r
-    <dependency>\r
-      <groupId>asm</groupId>\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.8</version>\r
-      <scope>test</scope>\r
-    </dependency>\r
-  </dependencies>\r
-\r
-  <licenses>\r
-    <license>\r
-      <name>Apache License 2.0</name>\r
-      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>\r
-      <distribution>repo</distribution>\r
-    </license>\r
-  </licenses>\r
+  <scm>\r
+    <connection>scm:git:git://git.sourceforge.jp/gitroot/stigmata/digger.git</connection>\r
+    <developerConnection>scm:git:ssh://tama3@git.sourceforge.jp:/gitroot/stigmata/digger.git</developerConnection>\r
+    <url>http://git.sourceforge.jp/view?p=stigmata/digger.git</url>\r
+  </scm>\r
 \r
   <distributionManagement>\r
-    <repository>\r
-      <id>shell.sourceforge.jp</id>\r
-      <url>scp://tama3@shell.sourceforge.jp/home/groups/s/st/stigmata/htdocs/maven2</url>\r
-    </repository>\r
     <site>\r
       <id>shell.sourceforge.jp</id>\r
-      <url>scp://tama3@shell.sourceforge.jp/home/groups/s/st/stigmata/htdocs/digger</url>\r
+      <url>scp://tama3@shell.sourceforge.jp/home/groups/s/st/stigmata/htdocs/digger/</url>\r
     </site>\r
   </distributionManagement>\r
 \r
-  <scm>\r
-    <connection>scm:svn:http://svn.sourceforge.jp/svnroot/stigmata/digger/trunk</connection>\r
-    <developerConnection>scm:svn:svn+ssh://tama3@svn.sourceforge.jp/svnroot/stigmata/digger/trunk/</developerConnection>\r
-    <url>http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi/?root=stigmata</url>\r
-  </scm>\r
-\r
   <build>\r
     <plugins>\r
       <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
-          <encoding>utf-8</encoding>\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
-        <version>2.3</version>\r
-      </plugin>\r
-\r
-      <plugin>\r
-        <groupId>org.apache.maven.plugins</groupId>\r
         <artifactId>maven-dependency-plugin</artifactId>\r
         <executions>\r
           <execution>\r
index 1ab4a9c..f03d66f 100644 (file)
@@ -1,12 +1,12 @@
 package jp.sourceforge.stigmata.digger;
 
 import java.net.URL;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-import jp.sourceforge.stigmata.digger.util.WarClassLoader;
-
 /**
  * Context object of Classpath.
  * 
@@ -48,7 +48,7 @@ public class ClasspathContext implements Iterable<URL>{
 
     /**
      * Set searching byte code by current ClassLoader.
-     * @see isIncludeSystemClasses
+     * @see #isIncludeSystemClasses
      */
     public synchronized void setIncludeSystemClasses(boolean flag){
         if(includeSystemClass != flag){
@@ -103,7 +103,7 @@ public class ClasspathContext implements Iterable<URL>{
     /**
      * clears all of classpathes of this context. not clear parent context.
      * If you want to clear this context and parent context, use {@link #clearAll <code>clearAll</code>} method.
-     * @see clearAll
+     * @see #clearAll
      */
     public synchronized void clear(){
         classpath.clear();
@@ -159,7 +159,7 @@ public class ClasspathContext implements Iterable<URL>{
      */
     public synchronized ClassLoader createClassLoader(){
         if(loader == null){
-            List<URL> list = new ArrayList<URL>();
+            final List<URL> list = new ArrayList<URL>();
             for(URL url: this){
                 list.add(url);
             }
@@ -176,7 +176,12 @@ public class ClasspathContext implements Iterable<URL>{
                     parentClassLoader = null;
                 }
             }
-            loader = new WarClassLoader(list.toArray(new URL[list.size()]), parentClassLoader);
+            final ClassLoader parent = parentClassLoader;
+            loader = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
+                public ClassLoader run(){
+                    return new WarClassLoader(list.toArray(new URL[list.size()]), parent);
+                }
+            });
         }
         return loader;
     }
index df21cbb..c26b929 100644 (file)
@@ -17,6 +17,7 @@ import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.FieldVisitor;
 import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
 
 /**
  * 
@@ -34,7 +35,11 @@ public class DefaultClassFileArchive implements ClassFileArchive{
     
     public DefaultClassFileArchive(File file){
         this.file = file;
-        parseClassName();
+        try{
+            parseClassName();
+        } catch(ParseClassNameFailedException e){
+            className = null;
+        }
     }
     
     public DefaultClassFileArchive(String file, String className){
@@ -50,8 +55,8 @@ public class DefaultClassFileArchive implements ClassFileArchive{
         try {
             return file.toURI().toURL();
         } catch (MalformedURLException ex) {
+            return null;
         }
-        return null;
     }
 
     public InputStream getInputStream(ClassFileEntry entry) throws IOException{
@@ -77,7 +82,7 @@ public class DefaultClassFileArchive implements ClassFileArchive{
         return className;
     }
 
-    private void parseClassName(){
+    private void parseClassName() throws ParseClassNameFailedException{
         FileInputStream in = null;
         try {
             in = new FileInputStream(file);
@@ -87,22 +92,27 @@ public class DefaultClassFileArchive implements ClassFileArchive{
 
             this.className = visitor.getClassName();
         } catch (FileNotFoundException ex) {
-            ex.printStackTrace();
+            throw new ParseClassNameFailedException(ex);
         } catch (IOException ex) {
-            ex.printStackTrace();
+            throw new ParseClassNameFailedException(ex);
         } finally{
             if(in != null){
                 try{
                     in.close();
                 } catch(IOException e){
+                    throw new ParseClassNameFailedException(e);
                 }
             }
         }
     }
 
-    private static class ClassNameExtractVisitor implements ClassVisitor{
+    private static class ClassNameExtractVisitor extends ClassVisitor{
         private String className;
 
+        public ClassNameExtractVisitor(){
+            super(Opcodes.ASM4);
+        }
+
         public String getClassName(){
             return className;
         }
index ac3ba16..765dc28 100644 (file)
@@ -57,6 +57,7 @@ public class JarClassFileArchive implements ClassFileArchive{
                     
                     list.add(new ClassFileEntry(className, location));
                 } catch (MalformedURLException ex) {
+                    throw new InternalError(ex.getMessage());
                 }
             }
         }
@@ -75,12 +76,13 @@ public class JarClassFileArchive implements ClassFileArchive{
                 
                 return new ClassFileEntry(className, location);
             } catch(MalformedURLException e){
+                throw new InternalError(e.getMessage());
             }
         }
         return null;
     }
 
-    Enumeration<JarEntry> jarentries(){
+    Enumeration<JarEntry> jarEntries(){
         return jarfile.entries();
     }
 
diff --git a/src/main/java/jp/sourceforge/stigmata/digger/ParseClassNameFailedException.java b/src/main/java/jp/sourceforge/stigmata/digger/ParseClassNameFailedException.java
new file mode 100644 (file)
index 0000000..d4e6d34
--- /dev/null
@@ -0,0 +1,21 @@
+package jp.sourceforge.stigmata.digger;\r
+\r
+public class ParseClassNameFailedException extends Exception{\r
+    private static final long serialVersionUID = -5373395187256103446L;\r
+\r
+    public ParseClassNameFailedException(){\r
+        super();\r
+    }\r
+\r
+    public ParseClassNameFailedException(String message, Throwable cause){\r
+        super(message, cause);\r
+    }\r
+\r
+    public ParseClassNameFailedException(String message){\r
+        super(message);\r
+    }\r
+\r
+    public ParseClassNameFailedException(Throwable cause){\r
+        super(cause);\r
+    }\r
+}\r
index 2506c80..32e8cb2 100644 (file)
@@ -31,7 +31,7 @@ public class WarClassFileArchive extends JarClassFileArchive{
     public Iterator<ClassFileEntry> iterator(){
         List<ClassFileEntry> list = new ArrayList<ClassFileEntry>();
 
-        for(Enumeration<JarEntry> e = jarentries(); e.hasMoreElements(); ){
+        for(Enumeration<JarEntry> e = jarEntries(); e.hasMoreElements(); ){
             JarEntry entry = e.nextElement();
             if(entry.getName().endsWith(".class")){
                 URL location = null;
@@ -43,7 +43,7 @@ public class WarClassFileArchive extends JarClassFileArchive{
 
                     list.add(new ClassFileEntry(className, location));
                 } catch (MalformedURLException ex) {
-                    ex.printStackTrace();
+                    throw new InternalError(ex.getMessage());
                 }
             }
         }
@@ -62,6 +62,7 @@ public class WarClassFileArchive extends JarClassFileArchive{
 
                 return new ClassFileEntry(className, location);
             } catch(MalformedURLException e){
+                throw new InternalError(e.getMessage());
             }
         }
         return null;
@@ -1,4 +1,4 @@
-package jp.sourceforge.stigmata.digger.util;
+package jp.sourceforge.stigmata.digger;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -46,23 +46,34 @@ public class WarClassLoader extends URLClassLoader{
             String path = "WEB-INF/classes/" + name.replace('.', '/') + ".class";
             for(URL url: getURLs()){
                 if(url.toString().endsWith(".war")){
+                    InputStream in = null;
+                    ByteArrayOutputStream out = new ByteArrayOutputStream();
                     try{
                         URL newurl = new URL("jar:" + url + "!/" + path);
-                        InputStream in = newurl.openStream();
-                        ByteArrayOutputStream out = new ByteArrayOutputStream();
+                        in = newurl.openStream();
                         byte[] data = new byte[256];
                         int read = 0;
                         while((read = in.read(data, 0, data.length)) != -1){
                             out.write(data, 0, read);
                         }
                         byte[] classdata = out.toByteArray();
-                        in.close();
-                        out.close();
-
                         clazz = defineClass(name, classdata, 0, classdata.length);
-                        break;
                     } catch(IOException exp){
+                        throw e;
+                    } finally{
+                        if(in != null){
+                            try{ in.close(); }
+                            catch(IOException exception){
+                                throw new InternalError(exception.getMessage());
+                            }
+                        }
+                        try{ 
+                            out.close();
+                        } catch(IOException exception){
+                            throw new InternalError(exception.getMessage());
+                        }
                     }
+                    break;
                 }
             }
         }
index 55267b4..72bc187 100644 (file)
@@ -13,7 +13,7 @@ import org.junit.Test;
  * @author Haruaki Tamada
  */
 public class ClasspathContextTest{
-    private static final String ASM_FILE = "target/asm-3.3.jar";
+    private static final String ASM_FILE = "target/asm-all-4.0.jar";
     private ClasspathContext context;
 
     @Before