001 /* 002 * The Apache Software License, Version 1.1 003 * 004 * 005 * Copyright (c) 2002-2003 The Apache Software Foundation. All rights 006 * reserved. 007 * 008 * Redistribution and use in source and binary forms, with or without 009 * modification, are permitted provided that the following conditions 010 * are met: 011 * 012 * 1. Redistributions of source code must retain the above copyright 013 * notice, this list of conditions and the following disclaimer. 014 * 015 * 2. Redistributions in binary form must reproduce the above copyright 016 * notice, this list of conditions and the following disclaimer in 017 * the documentation and/or other materials provided with the 018 * distribution. 019 * 020 * 3. The end-user documentation included with the redistribution, 021 * if any, must include the following acknowledgment: 022 * "This product includes software developed by the 023 * Apache Software Foundation (http://www.apache.org/)." 024 * Alternately, this acknowledgment may appear in the software itself, 025 * if and wherever such third-party acknowledgments normally appear. 026 * 027 * 4. The names "Axis" and "Apache Software Foundation" must 028 * not be used to endorse or promote products derived from this 029 * software without prior written permission. For written 030 * permission, please contact apache@apache.org. 031 * 032 * 5. Products derived from this software may not be called "Apache", 033 * nor may "Apache" appear in their name, without prior written 034 * permission of the Apache Software Foundation. 035 * 036 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 037 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 038 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 039 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 040 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 041 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 042 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 043 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 044 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 045 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 046 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 047 * SUCH DAMAGE. 048 * ==================================================================== 049 * 050 * This software consists of voluntary contributions made by many 051 * individuals on behalf of the Apache Software Foundation. For more 052 * information on the Apache Software Foundation, please see 053 * <http://www.apache.org/>. 054 */ 055 package org.apache.axis.utils; 056 057 import java.io.ByteArrayOutputStream; 058 import java.io.FileInputStream; 059 import java.io.FileNotFoundException; 060 import java.io.IOException; 061 import java.io.InputStream; 062 063 /** 064 * Class loader for JWS files. There is one of these per JWS class, and 065 * we keep a static Hashtable of them, indexed by class name. When we want 066 * to reload a JWS, we replace the ClassLoader for that class and let the 067 * old one get GC'ed. 068 * 069 * @author Glen Daniels (gdaniels@apache.org) 070 * @author Doug Davis (dug@us.ibm.com) 071 */ 072 public class JWSClassLoader extends ClassLoader { 073 Rate074 private String classFile = null; 075 private String name = null; 076 077 /** 078 * Construct a JWSClassLoader with a class name, a parent ClassLoader, 079 * and a filename of a .class file containing the bytecode for the class. 080 * The constructor will load the bytecode, define the class, and register 081 * this JWSClassLoader in the static registry. 082 * 083 * @param name the name of the class which will be created/loaded 084 * @param cl the parent ClassLoader 085 * @param classFile filename of the .class file 086 * @exception FileNotFoundException 087 * @exception IOException 088 */ 089 public JWSClassLoader(String name, ClassLoader cl, String classFile) 090 throws FileNotFoundException, IOException 091 { 092 super(cl); 093 094 this.name = name + ".class"; 095 this.classFile = classFile; 096 097 FileInputStream fis = new FileInputStream( classFile ); 098 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 099 byte buf[] = new byte[1024]; 100 for(int i = 0; (i = fis.read(buf)) != -1; ) 101 baos.write(buf, 0, i); 102 fis.close(); 103 baos.close(); 104 105 /* Create a new Class object from it */ 106 /*************************************/ 107 byte[] data = baos.toByteArray(); 108 defineClass( name, data, 0, data.length ); 109 110 ClassUtils.setClassLoader(name,this); 111 } 112 113 /** 114 * Overloaded getResourceAsStream() so we can be sure to return the 115 * correct class file regardless of where it might live on our hard 116 * drive. 117 * 118 * @param resourceName the resource to load (should be "classname.class") 119 * @return an InputStream of the class bytes, or null 120 */ 121 public InputStream getResourceAsStream(String resourceName) { 122 try { 123 if (resourceName.equals(name)) 124 return new FileInputStream( classFile ); 125 } catch (FileNotFoundException e) { 126 // Fall through, return null. 127 } 128 return null; 129 } 130 }