View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   *  Unless required by applicable law or agreed to in writing, software
12   *  distributed under the License is distributed on an "AS IS" BASIS,
13   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   *  See the License for the specific language governing permissions and
15   *  limitations under the License.
16   *
17   */
18  package org.apache.bcel.util;
19  
20  import java.lang.ref.SoftReference;
21  import java.util.HashMap;
22  import java.util.Map;
23  
24  import org.apache.bcel.classfile.JavaClass;
25  
26  /**
27   * This repository is used in situations where a Class is created outside the realm of a ClassLoader. Classes are loaded from the file systems using the paths
28   * specified in the given class path. By default, this is the value returned by ClassPath.getClassPath(). This repository holds onto classes with
29   * SoftReferences, and will reload as needed, in cases where memory sizes are important.
30   *
31   * @see org.apache.bcel.Repository
32   */
33  public class MemorySensitiveClassPathRepository extends AbstractClassPathRepository {
34  
35      private final Map<String, SoftReference<JavaClass>> loadedClasses = new HashMap<>(); // CLASSNAME X JAVACLASS
36  
37      public MemorySensitiveClassPathRepository(final ClassPath path) {
38          super(path);
39      }
40  
41      /**
42       * Store a new JavaClass instance into this Repository.
43       */
44      @Override
45      public void storeClass(final JavaClass clazz) {
46          // Not calling super.storeClass because this subclass maintains the mapping.
47          loadedClasses.put(clazz.getClassName(), new SoftReference<>(clazz));
48          clazz.setRepository(this);
49      }
50  
51      /**
52       * Remove class from repository
53       */
54      @Override
55      public void removeClass(final JavaClass clazz) {
56          loadedClasses.remove(clazz.getClassName());
57      }
58  
59      /**
60       * Find an already defined (cached) JavaClass object by name.
61       */
62      @Override
63      public JavaClass findClass(final String className) {
64          final SoftReference<JavaClass> ref = loadedClasses.get(className);
65          if (ref == null) {
66              return null;
67          }
68          return ref.get();
69      }
70  
71      /**
72       * Clear all entries from cache.
73       */
74      @Override
75      public void clear() {
76          loadedClasses.clear();
77      }
78  }