From c28142095a3c8ee5593ec72b959126305f7ed16a Mon Sep 17 00:00:00 2001 From: reger Date: Tue, 2 Feb 2016 03:44:01 +0100 Subject: [PATCH] add findClass() to servlet class loader (used in YaCyDefaltServlet) In the 2 cases where servlet calls servlet the jvm classloader chain is invoked and servlet class loaded by jvm loader (successful while requiring htroot in system classpath). This patch uses the standard override design for loaders to handle these cases (making in not longer crucial to have htroot in system classpath, as this classLoader is mainly used for servlets and looks in this case for the class in the configured path). + As the default classloader is parallelcapable we should register this too. --- source/net/yacy/server/serverClassLoader.java | 41 +++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/source/net/yacy/server/serverClassLoader.java b/source/net/yacy/server/serverClassLoader.java index a5536b51d..d3c51e23d 100644 --- a/source/net/yacy/server/serverClassLoader.java +++ b/source/net/yacy/server/serverClassLoader.java @@ -25,10 +25,16 @@ import java.io.File; import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import net.yacy.cora.util.ConcurrentLog; import net.yacy.kelondro.util.FileUtils; +import net.yacy.search.Switchboard; +import net.yacy.search.SwitchboardConstants; - +/** + * Class loader for servlet classes + * (findClass looking in default htroot directory) + */ public final class serverClassLoader extends ClassLoader { /** * directory of class files @@ -38,18 +44,47 @@ public final class serverClassLoader extends ClassLoader { public serverClassLoader() { //super(ClassLoader.getSystemClassLoader()); super(Thread.currentThread().getContextClassLoader()); + if (!registerAsParallelCapable()) { // avoid blocking + ConcurrentLog.warn("ClassLoader", "registerAsParallelCapable failed"); + } this.classes = new ConcurrentHashMap>(100); } public serverClassLoader(final ClassLoader parent) { super(parent); + if (!registerAsParallelCapable()) { + ConcurrentLog.warn("ClassLoader", "registerAsParallelCapable failed"); + } this.classes = new ConcurrentHashMap>(100); } - public Package[] packages() { - return super.getPackages(); + /** + * Find servlet class in default htroot directory + * but use the internal loadClass(File) methode to load the class same way + * (e.g. caching) as direct call to loadClass(File) + * This methode is mainly to avoid classpath conflicts for servlet to servlet calls + * making inclusion of htroot in system classpath not crucial + * + * @param servletname (delivered by parent loader without ".class" file extension + * @return class in htroot + * @throws ClassNotFoundException + */ + @Override + protected Class findClass(String classname) throws ClassNotFoundException { + // construct path to htroot for a servletname + File cpath = new File (Switchboard.getSwitchboard().getDataPath(SwitchboardConstants.HTROOT_PATH, SwitchboardConstants.HTROOT_PATH_DEFAULT),classname+".class"); + return loadClass(cpath); } + /** + * A special loadClass using file as argument to find and load a class + * This methode is directly called by the application and not part of the + * normal loadClass chain (= never called by JVM) + * + * @param classfile + * @return loaded an resolved class + * @throws ClassNotFoundException + */ public Class loadClass(final File classfile) throws ClassNotFoundException { // take the class out of the cache, denoted by the class file Class c = this.classes.get(classfile);