KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > armedbear > lisp > JavaClassLoader


1 /*
2  * JavaClassLoader.java
3  *
4  * Copyright (C) 2003-2004 Peter Graves
5  * $Id: JavaClassLoader.java,v 1.10 2004/09/15 13:20:04 piso Exp $
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20  */

21
22 package org.armedbear.lisp;
23
24 import java.io.DataInputStream JavaDoc;
25 import java.io.File JavaDoc;
26 import java.io.FileInputStream JavaDoc;
27 import java.util.Collections JavaDoc;
28 import java.util.HashSet JavaDoc;
29 import java.util.Set JavaDoc;
30
31 public class JavaClassLoader extends ClassLoader JavaDoc
32 {
33     private static final boolean isSableVM;
34
35     static {
36         String JavaDoc vm = System.getProperty("java.vm.name");
37         if (vm != null && vm.equals("SableVM"))
38             isSableVM = true;
39         else
40             isSableVM = false;
41     }
42
43     private static JavaClassLoader persistentInstance;
44
45     private static Set JavaDoc packages = Collections.synchronizedSet(new HashSet JavaDoc());
46
47     public static JavaClassLoader getPersistentInstance()
48     {
49         return getPersistentInstance(null);
50     }
51
52     public static JavaClassLoader getPersistentInstance(String JavaDoc packageName)
53     {
54         if (persistentInstance == null)
55             persistentInstance = new JavaClassLoader();
56     definePackage(packageName);
57         return persistentInstance;
58     }
59
60     private static void definePackage(String JavaDoc packageName)
61     {
62         if (packageName != null && !packages.contains(packageName)) {
63             persistentInstance.definePackage(packageName,"","1.0","","","1.0","",null);
64             packages.add(packageName);
65         }
66     }
67
68
69     protected Class JavaDoc loadClassFromFile(File JavaDoc file)
70     {
71         try {
72             long length = file.length();
73             if (length < Integer.MAX_VALUE) {
74                 byte[] classbytes = new byte[(int)length];
75                 DataInputStream JavaDoc in =
76                     new DataInputStream JavaDoc(new FileInputStream JavaDoc(file));
77                 in.readFully(classbytes);
78                 in.close();
79                 final String JavaDoc name;
80                 // SableVM requires a non-null name.
81
if (isSableVM) {
82                     String JavaDoc s = file.getName();
83                     int index = s.lastIndexOf('.');
84                     if (index >= 0)
85                         s = s.substring(0, index);
86                     name = "org.armedbear.lisp.".concat(s.replace('-', '_'));
87                 } else
88                     name = null;
89                 Class JavaDoc c = defineClass(name, classbytes, 0, (int) length);
90                 if (c != null) {
91                     resolveClass(c);
92                     return c;
93                 }
94             }
95         }
96         catch (Throwable JavaDoc t) {
97             Debug.trace(t);
98         }
99         return null;
100     }
101
102     public Class JavaDoc loadClassFromByteArray(String JavaDoc className, byte[] classbytes)
103     {
104         try {
105             long length = classbytes.length;
106             if (length < Integer.MAX_VALUE) {
107                 Class JavaDoc c = defineClass(className, classbytes, 0, (int) length);
108                 if (c != null) {
109                     resolveClass(c);
110                     return c;
111                 }
112             }
113         }
114     catch (LinkageError JavaDoc e) {
115             throw e;
116     }
117         catch (Throwable JavaDoc t) {
118             Debug.trace(t);
119         }
120         return null;
121     }
122
123     public Class JavaDoc loadClassFromByteArray(String JavaDoc className, byte[] bytes,
124                                         int offset, int length)
125     {
126         try {
127             Class JavaDoc c = defineClass(className, bytes, offset, length);
128             if (c != null) {
129                 resolveClass(c);
130                 return c;
131             }
132         }
133         catch (Throwable JavaDoc t) {
134             Debug.trace(t);
135         }
136         return null;
137     }
138 }
139
Popular Tags