View Javadoc
1 package org.apache.bcel.util; 2 3 /* ==================================================================== 4 * The Apache Software License, Version 1.1 5 * 6 * Copyright (c) 2001 The Apache Software Foundation. All rights 7 * reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in 18 * the documentation and/or other materials provided with the 19 * distribution. 20 * 21 * 3. The end-user documentation included with the redistribution, 22 * if any, must include the following acknowledgment: 23 * "This product includes software developed by the 24 * Apache Software Foundation (http://www.apache.org/)." 25 * Alternately, this acknowledgment may appear in the software itself, 26 * if and wherever such third-party acknowledgments normally appear. 27 * 28 * 4. The names "Apache" and "Apache Software Foundation" and 29 * "Apache BCEL" must not be used to endorse or promote products 30 * derived from this software without prior written permission. For 31 * written permission, please contact apache@apache.org. 32 * 33 * 5. Products derived from this software may not be called "Apache", 34 * "Apache BCEL", nor may "Apache" appear in their name, without 35 * prior written permission of the Apache Software Foundation. 36 * 37 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 38 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 39 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 40 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 41 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 42 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 43 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 44 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 45 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 46 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 47 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 48 * SUCH DAMAGE. 49 * ==================================================================== 50 * 51 * This software consists of voluntary contributions made by many 52 * individuals on behalf of the Apache Software Foundation. For more 53 * information on the Apache Software Foundation, please see 54 * <http://www.apache.org/>;. 55 */ 56 57 import java.io.*; 58 59 import java.util.Map; 60 import java.util.HashMap; 61 62 import org.apache.bcel.classfile.*; 63 64 /*** 65 * This repository is used in situations where a Class is created 66 * outside the realm of a ClassLoader. Classes are loaded from 67 * the file systems using the paths specified in the given 68 * class path. By default, this is the value returned by 69 * ClassPath.getClassPath(). 70 * <br> 71 * It is designed to be used as a singleton, however it 72 * can also be used with custom classpaths. 73 * 74 /** 75 * Abstract definition of a class repository. Instances may be used 76 * to load classes from different sources and may be used in the 77 * Repository.setRepository method. 78 * 79 * @see org.apache.bcel.Repository 80 * 81 * @version $Id: SyntheticRepository.java,v 1.6 2002/11/10 18:30:05 mdahm Exp $ 82 * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A> 83 * @author David Dixon-Peugh 84 */ 85 public class SyntheticRepository implements Repository { 86 private static final String DEFAULT_PATH = ClassPath.getClassPath(); 87 88 private static HashMap _instances = new HashMap(); // CLASSPATH X REPOSITORY 89 90 private ClassPath _path = null; 91 private HashMap _loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS 92 93 private SyntheticRepository(ClassPath path) { 94 _path = path; 95 } 96 97 public static SyntheticRepository getInstance() { 98 return getInstance(ClassPath.SYSTEM_CLASS_PATH); 99 } 100 101 public static SyntheticRepository getInstance(ClassPath classPath) { 102 SyntheticRepository rep = (SyntheticRepository)_instances.get(classPath); 103 104 if(rep == null) { 105 rep = new SyntheticRepository(classPath); 106 _instances.put(classPath, rep); 107 } 108 109 return rep; 110 } 111 112 /*** 113 * Store a new JavaClass instance into this Repository. 114 */ 115 public void storeClass(JavaClass clazz) { 116 _loadedClasses.put(clazz.getClassName(), clazz); 117 clazz.setRepository(this); 118 } 119 120 /*** 121 * Remove class from repository 122 */ 123 public void removeClass(JavaClass clazz) { 124 _loadedClasses.remove(clazz.getClassName()); 125 } 126 127 /*** 128 * Find an already defined (cached) JavaClass object by name. 129 */ 130 public JavaClass findClass(String className) { 131 return (JavaClass)_loadedClasses.get(className); 132 } 133 134 /*** 135 * Load a JavaClass object for the given class name using 136 * the CLASSPATH environment variable. 137 */ 138 public JavaClass loadClass(String className) 139 throws ClassNotFoundException 140 { 141 if(className == null || className.equals("")) { 142 throw new IllegalArgumentException("Invalid class name " + className); 143 } 144 145 className = className.replace('/', '.'); // Just in case, canonical form 146 147 try { 148 return loadClass(_path.getInputStream(className), className); 149 } catch(IOException e) { 150 throw new ClassNotFoundException("Exception while looking for class " + 151 className + ": " + e.toString()); 152 } 153 } 154 155 /*** 156 * Try to find class source via getResourceAsStream(). 157 * @see Class 158 * @return JavaClass object for given runtime class 159 */ 160 public JavaClass loadClass(Class clazz) throws ClassNotFoundException { 161 String className = clazz.getName(); 162 String name = className; 163 int i = name.lastIndexOf('.'); 164 165 if(i > 0) { 166 name = name.substring(i + 1); 167 } 168 169 return loadClass(clazz.getResourceAsStream(name + ".class"), className); 170 } 171 172 private JavaClass loadClass(InputStream is, String className) 173 throws ClassNotFoundException 174 { 175 JavaClass clazz = findClass(className); 176 177 if(clazz != null) { 178 return clazz; 179 } 180 181 try { 182 if(is != null) { 183 ClassParser parser = new ClassParser(is, className); 184 clazz = parser.parse(); 185 186 storeClass(clazz); 187 188 return clazz; 189 } 190 } catch(IOException e) { 191 throw new ClassNotFoundException("Exception while looking for class " + 192 className + ": " + e.toString()); 193 } 194 195 throw new ClassNotFoundException("SyntheticRepository could not load " + 196 className); 197 } 198 199 /*** Clear all entries from cache. 200 */ 201 public void clear() { 202 _loadedClasses.clear(); 203 } 204 }

This page was automatically generated by Maven