Bukkit  1.4.7-R1.0
 All Classes Namespaces Files Functions Variables Enumerator Pages
PluginClassLoader.java
Go to the documentation of this file.
1 package org.bukkit.plugin.java;
2 
3 import java.net.URL;
4 import java.net.URLClassLoader;
5 import java.util.HashMap;
6 import java.util.Map;
7 import java.util.Set;
8 import java.util.logging.Level;
9 
10 import org.apache.commons.lang.Validate;
11 import org.bukkit.plugin.AuthorNagException;
12 
16 public class PluginClassLoader extends URLClassLoader {
17  private final JavaPluginLoader loader;
18  private final Map<String, Class<?>> classes = new HashMap<String, Class<?>>();
19  final boolean extended = this.getClass() != PluginClassLoader.class;
20 
24  @Deprecated
25  public PluginClassLoader(final JavaPluginLoader loader, final URL[] urls, final ClassLoader parent) {
26  this(loader, urls, parent, null);
27 
28  if (loader.warn) {
29  if (extended) {
30  loader.server.getLogger().log(Level.WARNING, "PluginClassLoader not intended to be extended by " + getClass() + ", and may be final in a future version of Bukkit");
31  } else {
32  loader.server.getLogger().log(Level.WARNING, "Constructor \"public PluginClassLoader(JavaPluginLoader, URL[], ClassLoader)\" is Deprecated, and may be removed in a future version of Bukkit", new AuthorNagException(""));
33  }
34  loader.warn = false;
35  }
36  }
37 
38 
39  PluginClassLoader(final JavaPluginLoader loader, final URL[] urls, final ClassLoader parent, final Object methodSignature) {
40  super(urls, parent);
41  Validate.notNull(loader, "Loader cannot be null");
42 
43  this.loader = loader;
44  }
45 
46  @Override
47  public void addURL(URL url) { // Override for access level!
48  super.addURL(url);
49  }
50 
51  @Override
52  protected Class<?> findClass(String name) throws ClassNotFoundException {
53  return extended ? findClass(name, true) : findClass0(name, true); // Don't warn on deprecation, but maintain overridability
54  }
55 
59  @Deprecated
60  protected Class<?> findClass(String name, boolean checkGlobal) throws ClassNotFoundException {
61  if (loader.warn) {
62  loader.server.getLogger().log(Level.WARNING, "Method \"protected Class<?> findClass(String, boolean)\" is Deprecated, and may be removed in a future version of Bukkit", new AuthorNagException(""));
63  loader.warn = false;
64  }
65  return findClass0(name, checkGlobal);
66  }
67 
68  Class<?> findClass0(String name, boolean checkGlobal) throws ClassNotFoundException {
69  if (name.startsWith("org.bukkit.") || name.startsWith("net.minecraft.")) {
70  throw new ClassNotFoundException(name);
71  }
72  Class<?> result = classes.get(name);
73 
74  if (result == null) {
75  if (checkGlobal) {
76  result = loader.extended ? loader.getClassByName(name) : loader.getClassByName0(name); // Don't warn on deprecation, but maintain overridability
77  }
78 
79  if (result == null) {
80  result = super.findClass(name);
81 
82  if (result != null) {
83  if (loader.extended) { // Don't warn on deprecation, but maintain overridability
84  loader.setClass(name, result);
85  } else {
86  loader.setClass0(name, result);
87  }
88  }
89  }
90 
91  classes.put(name, result);
92  }
93 
94  return result;
95  }
96 
100  @Deprecated
101  public Set<String> getClasses() {
102  if (loader.warn) {
103  loader.server.getLogger().log(Level.WARNING, "Method \"public Set<String> getClasses()\" is Deprecated, and may be removed in a future version of Bukkit", new AuthorNagException(""));
104  loader.warn = false;
105  }
106  return getClasses0();
107  }
108 
109  Set<String> getClasses0() {
110  return classes.keySet();
111  }
112 }