diff options
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.java | 116 |
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; } - } |