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
;
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
;
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";
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
) {
54 this.delegate
= delegate
;
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
);
74 return super.loadClass(name
, resolve
);
78 protected PermissionCollection
getPermissions(CodeSource codesource
) {
79 PermissionCollection permissions
= super.getPermissions(codesource
);
80 permissions
.add(new AllPermission());