Revision created by MOE tool push_codebase.
[gae.git] / java / src / main / com / google / appengine / tools / development / DevAppServerClassLoader.java
blob275255b95cd83f9b0c4b102d2579baa88f3aa32e
1 // Copyright 2008 Google Inc. All Rights Reserved.
3 package com.google.appengine.tools.development;
5 import com.google.appengine.tools.info.SdkImplInfo;
6 import com.google.appengine.tools.info.SdkInfo;
8 import java.net.URL;
9 import java.net.URLClassLoader;
10 import java.security.AllPermission;
11 import java.security.CodeSource;
12 import java.security.PermissionCollection;
13 import java.util.ArrayList;
14 import java.util.List;
16 /**
17 * Isolates the DevAppServer and all of its dependencies into its own classloader.
18 * This ClassLoader refuses to load anything off of the JVM's System ClassLoader
19 * except for JRE classes (i.e. it ignores classpath and JAR manifest entries).
22 class DevAppServerClassLoader extends URLClassLoader {
24 private final ClassLoader delegate;
26 private static final String DEV_APP_SERVER_INTERFACE
27 = "com.google.appengine.tools.development.DevAppServer";
29 private static final String APP_CONTEXT_INTERFACE
30 = "com.google.appengine.tools.development.AppContext";
32 private static final String DEV_APP_SERVER_AGENT
33 = "com.google.appengine.tools.development.agent.AppEngineDevAgent";
35 private static final String DEV_SOCKET_IMPL_FACTORY
36 = "com.google.appengine.tools.development.DevSocketImplFactory";
38 /**
39 * Creates a new {@code DevAppServerClassLoader}, which will load
40 * libraries from the App Engine SDK.
42 * @param delegate A delegate ClassLoader from which a few shared
43 * classes will be loaded (e.g. DevAppServer).
45 public static DevAppServerClassLoader newClassLoader(ClassLoader delegate) {
46 List<URL> libs = new ArrayList<URL>(SdkInfo.getSharedLibs());
47 libs.addAll(SdkImplInfo.getImplLibs());
48 libs.addAll(SdkImplInfo.getUserJspLibs());
49 return new DevAppServerClassLoader(libs.toArray(new URL[libs.size()]), delegate);
52 DevAppServerClassLoader(URL[] urls, ClassLoader delegate) {
53 super(urls, null);
54 this.delegate = delegate;
57 @Override
58 protected synchronized Class<?> loadClass(String name, boolean resolve)
59 throws ClassNotFoundException {
61 if (name.equals(DEV_APP_SERVER_INTERFACE) ||
62 name.equals(APP_CONTEXT_INTERFACE) ||
63 name.equals(DEV_APP_SERVER_AGENT) ||
64 name.equals(DEV_SOCKET_IMPL_FACTORY) ||
65 name.startsWith("com.google.appengine.tools.info.") ||
66 name.startsWith("com.google.appengine.tools.plugins")) {
67 Class c = delegate.loadClass(name);
68 if (resolve) {
69 resolveClass(c);
71 return c;
74 return super.loadClass(name, resolve);
77 @Override
78 protected PermissionCollection getPermissions(CodeSource codesource) {
79 PermissionCollection permissions = super.getPermissions(codesource);
80 permissions.add(new AllPermission());
81 return permissions;