01: // THIS SOFTWARE IS PROVIDED BY SOFTARIS PTY.LTD. AND OTHER METABOSS
02: // CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
03: // BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
04: // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SOFTARIS PTY.LTD.
05: // OR OTHER METABOSS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
06: // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
07: // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
08: // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
09: // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
10: // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
11: // EVEN IF SOFTARIS PTY.LTD. OR OTHER METABOSS CONTRIBUTORS ARE ADVISED OF THE
12: // POSSIBILITY OF SUCH DAMAGE.
13: //
14: // Copyright 2000-2005 © Softaris Pty.Ltd. All Rights Reserved.
15: package com.metaboss.util;
16:
17: import java.io.ByteArrayInputStream;
18: import java.io.ByteArrayOutputStream;
19: import java.io.IOException;
20: import java.util.HashMap;
21: import java.util.jar.JarEntry;
22: import java.util.jar.JarInputStream;
23:
24: /** This utility class loader allows to load and execute classes from the jar file loaded in memory */
25: public class JarClassLoader extends ClassLoader {
26: private HashMap mClassMap = new HashMap(); // Key - resource path, Contents byte[] the resource
27:
28: /** Default constructor. Creates class loader without classes */
29: public JarClassLoader() {
30: }
31:
32: /** Constructor. Takes a class loader parent */
33: public JarClassLoader(ClassLoader pParentClassLoader)
34: throws IOException {
35: super (pParentClassLoader);
36: }
37:
38: /** Constructor. Takes a in memory jar file */
39: public JarClassLoader(byte[] pJar) throws IOException {
40: // Call add
41: addJar(pJar);
42: }
43:
44: /** Constructor. Takes a in memory jar file and class loader parent */
45: public JarClassLoader(byte[] pJar, ClassLoader pParentClassLoader)
46: throws IOException {
47: super (pParentClassLoader);
48: addJar(pJar);
49: }
50:
51: /** This method will take passed in-memory jar file and add it to its library */
52: public void addJar(byte[] pJar) throws java.io.IOException {
53: JarInputStream lJarInputStream = new JarInputStream(
54: new ByteArrayInputStream(pJar));
55: JarEntry lEntry = null;
56: while ((lEntry = lJarInputStream.getNextJarEntry()) != null) {
57: if (lEntry.getName().toLowerCase().endsWith(".class")) {
58: ByteArrayOutputStream lStream = new ByteArrayOutputStream();
59: byte[] lTempBuff = new byte[1000];
60: int lReadLen = 0;
61: while ((lReadLen = lJarInputStream.read(lTempBuff, 0,
62: lTempBuff.length)) > 0)
63: lStream.write(lTempBuff, 0, lReadLen);
64: // Prepare java style class name - strip .class from the end
65: String lClassName = lEntry.getName().substring(0,
66: lEntry.getName().length() - 6);
67: // Ensure that all slashes (back and forward) are converted to dots
68: lClassName = StringUtils.replace(lClassName, "\\", ".");
69: lClassName = StringUtils.replace(lClassName, "/", ".");
70: mClassMap.put(lClassName, lStream.toByteArray());
71: }
72: }
73: }
74:
75: /** Returns true if this classloader has the specified class */
76: public boolean hasClass(String pClassName) {
77: return mClassMap.containsKey(pClassName);
78: }
79:
80: /** This method is a part of ClassLoader mechanism. Overridden here to load classes
81: * from stored ones */
82: public Class findClass(String pClassName)
83: throws java.lang.ClassNotFoundException {
84: byte[] lClassFileBuff = (byte[]) mClassMap.get(pClassName);
85: if (lClassFileBuff != null && lClassFileBuff.length > 0)
86: return defineClass(pClassName, lClassFileBuff, 0,
87: lClassFileBuff.length);
88: throw new ClassNotFoundException(pClassName);
89: }
90: }
|