Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'jetty-deploy/src/test/java/org/eclipse/jetty/deploy/CloudLoader.java')
-rw-r--r--jetty-deploy/src/test/java/org/eclipse/jetty/deploy/CloudLoader.java116
1 files changed, 87 insertions, 29 deletions
diff --git a/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/CloudLoader.java b/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/CloudLoader.java
index f540666fb2..04e4c1ab42 100644
--- a/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/CloudLoader.java
+++ b/jetty-deploy/src/test/java/org/eclipse/jetty/deploy/CloudLoader.java
@@ -1,63 +1,121 @@
package org.eclipse.jetty.deploy;
import java.io.IOException;
-import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Enumeration;
-import org.eclipse.jetty.util.IO;
import org.eclipse.jetty.util.log.Log;
+import org.eclipse.jetty.webapp.ClasspathPattern;
import org.eclipse.jetty.webapp.WebAppClassLoader;
-public class CloudLoader extends WebAppClassLoader
+public class CloudLoader extends URLClassLoader
{
- final WebAppClassLoader.Context _context;
+ final WebAppClassLoader _parent;
+ ClasspathPattern _localPaths = new ClasspathPattern();
/* ------------------------------------------------------------ */
- public CloudLoader(WebAppClassLoader.Context context)
+ public CloudLoader(WebAppClassLoader parent)
throws IOException
{
- super(context);
- _context=context;
+ super(parent.getURLs(),parent);
+ _parent=parent;
}
/* ------------------------------------------------------------ */
- public CloudLoader(ClassLoader parent,WebAppClassLoader.Context context)
- throws IOException
+ /** Add a local class pattern
+ * <p>Add a pattern as defined by {@link ClasspathPattern}.
+ */
+ public void addPattern(String pattern)
{
- super(parent,context);
- _context=context;
+ _localPaths.addPattern(pattern);
+ }
+
+ /* ------------------------------------------------------------ */
+ public boolean isLocal(String name)
+ {
+ return _localPaths.match(name) && !_parent.getContext().isSystemClass(name);
}
/* ------------------------------------------------------------ */
- /**
- * @see java.net.URLClassLoader#findClass(java.lang.String)
- */
@Override
- protected Class<?> findClass(String name) throws ClassNotFoundException
+ public Enumeration<URL> getResources(String name) throws IOException
{
- Class<?> clazz = super.findClass(name);
-
- if (clazz!=null && clazz.getClassLoader()==this)
+ return isLocal(name)?findResources(name):_parent.getResources(name);
+ }
+
+ /* ------------------------------------------------------------ */
+ @Override
+ public URL getResource(String name)
+ {
+ if (isLocal(name))
+ {
+ URL url= this.findResource(name);
+
+ if (url == null && name.startsWith("/"))
+ {
+ if (Log.isDebugEnabled())
+ Log.debug("HACK leading / off " + name);
+ url= this.findResource(name.substring(1));
+ }
+ if (url!=null)
+ return url;
+ }
+ return _parent.getResource(name);
+ }
+
+
+ /* ------------------------------------------------------------ */
+ @Override
+ protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
+ {
+ Class<?> c= findLoadedClass(name);
+
+ if (c==null && isLocal(name))
{
- boolean has_non_final_static_fields=false;
- for (Field field : clazz.getFields())
+ try
+ {
+ c= this.findClass(name);
+ }
+ catch (ClassNotFoundException e)
{
- int mods = field.getModifiers();
- if (Modifier.isStatic(mods) && !Modifier.isFinal(mods))
- {
- has_non_final_static_fields=true;
- }
+ Log.ignore(e);
}
+ }
- if (has_non_final_static_fields && !_context.isSystemClass(name))
+ if (c == null)
+ c= _parent.loadClass(name);
+
+ if (resolve)
+ resolveClass(c);
+
+ if (Log.isDebugEnabled())
+ Log.debug("loaded " + c+ " from "+c.getClassLoader());
+
+ // if loaded from direct parent, then scan for non final statics
+ // look for non final static fields
+ boolean has_non_final_static_fields=false;
+ for (Field field : c.getDeclaredFields())
+ {
+ int mods = field.getModifiers();
+ if (Modifier.isStatic(mods) && !Modifier.isFinal(mods))
{
- Log.info("Has non-final static fields: "+name);
+ has_non_final_static_fields=true;
}
}
- return clazz;
+
+ if (has_non_final_static_fields)
+ {
+ if (c.getClassLoader()==_parent)
+ Log.warn(name+" loaded from "+c.getClassLoader()+" has non-final static fields");
+ else
+ Log.debug(name+" loaded from "+c.getClassLoader()+" has non-final static fields");
+ }
+
+ return c;
}
-
}

Back to the top