Author: jacopoc
Date: Fri Sep 12 13:49:17 2014
New Revision: 1624549
URL: http://svn.apache.org/r1624549
Log:
Removed the custom CachedClassLoader and related artifacts in favour of a
simpler bootstrap process and a simpler classpath tree; now the classpath tree
is made of: bootstrap classloader (primordial+ext) -> system classloader (aka
applications or classpath classloader) -> two custom classloaders (one loads
the framework/base classes and one loads all the other classes) -> Webapp
classloaders (one per web application).
Junit tests are included. The two custom classloaders could be merged into one
but this will be addressed in a second phase because it will require some
changes to the bootstrap componenr and process.
Removed:
ofbiz/trunk/framework/base/src/org/ofbiz/base/config/ClasspathLoader.java
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/CachedClassLoader.java
ofbiz/trunk/framework/entity/src/META-INF/services/org.ofbiz.base.util.CachedClassLoader$Init
ofbiz/trunk/framework/entity/src/org/ofbiz/entity/util/CachedClassLoaderInit.java
Modified:
ofbiz/trunk/framework/base/ofbiz-component.xml
ofbiz/trunk/framework/base/src/org/ofbiz/base/container/ClassLoaderContainer.java
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ObjectType.java
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilIO.java
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/test/ObjectTypeTests.java
ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java
ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Config.java
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/WebDavServlet.java
Modified: ofbiz/trunk/framework/base/ofbiz-component.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/ofbiz-component.xml?rev=1624549&r1=1624548&r2=1624549&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/ofbiz-component.xml (original)
+++ ofbiz/trunk/framework/base/ofbiz-component.xml Fri Sep 12 13:49:17 2014
@@ -28,7 +28,7 @@ under the License.
<test-suite loader="main" location="testdef/basetests.xml"/>
- <!-- load the cached classloader container (always second) -->
+ <!-- load the classloader container -->
<container name="classloader-container"
loaders="main,rmi,pos,install,test"
class="org.ofbiz.base.container.ClassLoaderContainer"/>
<!-- load the naming (JNDI) server -->
Modified:
ofbiz/trunk/framework/base/src/org/ofbiz/base/container/ClassLoaderContainer.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/container/ClassLoaderContainer.java?rev=1624549&r1=1624548&r2=1624549&view=diff
==============================================================================
---
ofbiz/trunk/framework/base/src/org/ofbiz/base/container/ClassLoaderContainer.java
(original)
+++
ofbiz/trunk/framework/base/src/org/ofbiz/base/container/ClassLoaderContainer.java
Fri Sep 12 13:49:17 2014
@@ -18,36 +18,22 @@
*******************************************************************************/
package org.ofbiz.base.container;
-import java.net.URL;
-
-import org.ofbiz.base.start.Classpath;
-import org.ofbiz.base.util.CachedClassLoader;
import org.ofbiz.base.util.Debug;
/**
- * ClassLoader Container; Created a CachedClassLoader for use by all following
containers
+ * ClassLoader Container
*
*/
public class ClassLoaderContainer implements Container {
public static final String module = ClassLoaderContainer.class.getName();
- protected static CachedClassLoader cl = null;
public static Integer portOffset = 0;
private String name;
@Override
public void init(String[] args, String name, String configFile) throws
ContainerException {
this.name = name;
- ClassLoader parent = Thread.currentThread().getContextClassLoader();
- if (parent == null) {
- parent = Classpath.class.getClassLoader();
- }
- if (parent == null) {
- parent = ClassLoader.getSystemClassLoader();
- }
- cl = new CachedClassLoader(new URL[0], parent);
-
if (args != null) {
for (String argument : args) {
// arguments can prefix w/ a '-'. Just strip them off
@@ -75,8 +61,6 @@ public class ClassLoaderContainer implem
}
}
- Thread.currentThread().setContextClassLoader(cl);
- Debug.logInfo("CachedClassLoader created", module);
}
/**
@@ -99,11 +83,4 @@ public class ClassLoaderContainer implem
return name;
}
- public static ClassLoader getClassLoader() {
- if (cl != null) {
- return cl;
- } else {
- return ClassLoader.getSystemClassLoader();
- }
- }
}
Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ObjectType.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ObjectType.java?rev=1624549&r1=1624548&r2=1624549&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ObjectType.java
(original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/ObjectType.java Fri Sep
12 13:49:17 2014
@@ -22,13 +22,12 @@ import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
+import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
-import javolution.util.FastMap;
-
import org.ofbiz.base.conversion.ConversionException;
import org.ofbiz.base.conversion.Converter;
import org.ofbiz.base.conversion.Converters;
@@ -47,11 +46,48 @@ public class ObjectType {
public static final Object NULL = new NullObject();
- protected static FastMap<String, Class<?>> classCache =
FastMap.newInstance();
-
public static final String LANG_PACKAGE = "java.lang."; // We will test
both the raw value and this + raw value
public static final String SQL_PACKAGE = "java.sql."; // We will test
both the raw value and this + raw value
+ private static final Map<String, String> classAlias = new HashMap<String,
String>();
+ private static final Map<String, Class> primitives = new HashMap<String,
Class>();
+
+ static {
+ classAlias.put("Object", "java.lang.Object");
+ classAlias.put("String", "java.lang.String");
+ classAlias.put("Boolean", "java.lang.Boolean");
+ classAlias.put("BigDecimal", "java.math.BigDecimal");
+ classAlias.put("Double", "java.lang.Double");
+ classAlias.put("Float", "java.lang.Float");
+ classAlias.put("Long", "java.lang.Long");
+ classAlias.put("Integer", "java.lang.Integer");
+ classAlias.put("Short", "java.lang.Short");
+ classAlias.put("Byte", "java.lang.Byte");
+ classAlias.put("Character", "java.lang.Character");
+ classAlias.put("Timestamp", "java.sql.Timestamp");
+ classAlias.put("Time", "java.sql.Time");
+ classAlias.put("Date", "java.sql.Date");
+ classAlias.put("Locale", "java.util.Locale");
+ classAlias.put("Collection", "java.util.Collection");
+ classAlias.put("List", "java.util.List");
+ classAlias.put("Set", "java.util.Set");
+ classAlias.put("Map", "java.util.Map");
+ classAlias.put("HashMap", "java.util.HashMap");
+ classAlias.put("TimeZone", "java.util.TimeZone");
+ classAlias.put("TimeDuration", "org.ofbiz.base.util.TimeDuration");
+ classAlias.put("GenericValue", "org.ofbiz.entity.GenericValue");
+ classAlias.put("GenericPK", "org.ofbiz.entity.GenericPK");
+ classAlias.put("GenericEntity", "org.ofbiz.entity.GenericEntity");
+ primitives.put("boolean", Boolean.TYPE);
+ primitives.put("short", Short.TYPE);
+ primitives.put("int", Integer.TYPE);
+ primitives.put("long", Long.TYPE);
+ primitives.put("float", Float.TYPE);
+ primitives.put("double", Double.TYPE);
+ primitives.put("byte", Byte.TYPE);
+ primitives.put("char", Character.TYPE);
+ }
+
/**
* Loads a class with the current thread's context classloader.
* @param className The name of the class to load
@@ -59,25 +95,23 @@ public class ObjectType {
* @throws ClassNotFoundException
*/
public static Class<?> loadClass(String className) throws
ClassNotFoundException {
- int genericsStart = className.indexOf("<");
- if (genericsStart != -1) className = className.substring(0,
genericsStart);
-
- // small block to speed things up by putting using preloaded classes
for common objects, this turns out to help quite a bit...
- Class<?> theClass =
CachedClassLoader.globalClassNameClassMap.get(className);
-
- if (theClass != null) return theClass;
-
return loadClass(className, null);
}
/**
- * Loads a class with the current thread's context classloader.
+ * Loads a class with the specified classloader.
* @param className The name of the class to load
* @param loader The ClassLoader to use
* @return The requested class
* @throws ClassNotFoundException
*/
public static Class<?> loadClass(String className, ClassLoader loader)
throws ClassNotFoundException {
+ Class<?> theClass = null;
+ // if it is a primitive type, return the object from the "primitives"
map
+ if (primitives.containsKey(className)) {
+ return primitives.get(className);
+ }
+
int genericsStart = className.indexOf("<");
if (genericsStart != -1) className = className.substring(0,
genericsStart);
@@ -98,26 +132,14 @@ public class ObjectType {
}
}
- // small block to speed things up by putting using preloaded classes
for common objects, this turns out to help quite a bit...
- Class<?> theClass =
CachedClassLoader.globalClassNameClassMap.get(className);
-
- if (theClass != null) return theClass;
+ // if className is an alias (e.g. "String") then replace it with the
proper class name (e.g. "java.lang.String")
+ if (classAlias.containsKey(className)) {
+ className = classAlias.get(className);
+ }
if (loader == null) loader =
Thread.currentThread().getContextClassLoader();
- try {
- theClass = Class.forName(className, true, loader);
- } catch (Exception e) {
- theClass = classCache.get(className);
- if (theClass == null) {
- theClass = Class.forName(className);
- if (theClass != null) {
- if (classCache.putIfAbsent(className, theClass) == null) {
- if (Debug.verboseOn()) Debug.logVerbose("Loaded Class:
" + theClass.getName(), module);
- }
- }
- }
- }
+ theClass = Class.forName(className, true, loader);
return theClass;
}
Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilIO.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilIO.java?rev=1624549&r1=1624548&r2=1624549&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilIO.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/UtilIO.java Fri Sep 12
13:49:17 2014
@@ -43,7 +43,6 @@ import java.nio.charset.Charset;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
-import org.ofbiz.base.container.ClassLoaderContainer;
import org.ofbiz.base.conversion.Converter;
import org.ofbiz.base.conversion.Converters;
import org.ofbiz.base.json.JSON;
@@ -378,7 +377,7 @@ public final class UtilIO {
for (i = offset; i < length && buffer[i] != ':'; i++);
if (i > offset && i < length) {
String className = new String(buffer, offset, i);
- Class<?> type = Class.forName(className, true,
ClassLoaderContainer.getClassLoader());
+ Class<?> type = Class.forName(className);
if (buffer[length - 1] == '\n') {
length--;
}
Modified:
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/test/ObjectTypeTests.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/test/ObjectTypeTests.java?rev=1624549&r1=1624548&r2=1624549&view=diff
==============================================================================
---
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/test/ObjectTypeTests.java
(original)
+++
ofbiz/trunk/framework/base/src/org/ofbiz/base/util/test/ObjectTypeTests.java
Fri Sep 12 13:49:17 2014
@@ -194,6 +194,58 @@ public class ObjectTypeTests extends Gen
assertSame(label + ":to-java.lang.Object", toConvert,
simpleTypeConvert(toConvert, "java.lang.Object", null, null, null, true));
}
+ public void testLoadClassWithNonExistentClass() {
+ Exception exception = null;
+ try {
+ ObjectType.loadClass("foobarbaz");
+ } catch (Exception e) {
+ exception = e;
+ }
+ assertTrue("Exception thrown by loadClass(\"foobarbaz\") is not
ClassNotFoundException", exception instanceof ClassNotFoundException);
+ }
+
+ public void testLoadClassWithPrimitives() {
+ try {
+ Class<?> theClass;
+ theClass = ObjectType.loadClass("boolean");
+ assertEquals("Wrong class returned by loadClass(\"boolean\")",
(Boolean.TYPE).getName(), theClass.getName());
+ theClass = ObjectType.loadClass("short");
+ assertEquals("Wrong class returned by loadClass(\"short\")",
(Short.TYPE).getName(), theClass.getName());
+ theClass = ObjectType.loadClass("int");
+ assertEquals("Wrong class returned by loadClass(\"int\")",
(Integer.TYPE).getName(), theClass.getName());
+ theClass = ObjectType.loadClass("long");
+ assertEquals("Wrong class returned by loadClass(\"long\")",
(Long.TYPE).getName(), theClass.getName());
+ theClass = ObjectType.loadClass("float");
+ assertEquals("Wrong class returned by loadClass(\"float\")",
(Float.TYPE).getName(), theClass.getName());
+ theClass = ObjectType.loadClass("double");
+ assertEquals("Wrong class returned by loadClass(\"double\")",
(Double.TYPE).getName(), theClass.getName());
+ theClass = ObjectType.loadClass("byte");
+ assertEquals("Wrong class returned by loadClass(\"byte\")",
(Byte.TYPE).getName(), theClass.getName());
+ theClass = ObjectType.loadClass("char");
+ assertEquals("Wrong class returned by loadClass(\"char\")",
(Character.TYPE).getName(), theClass.getName());
+ } catch (Exception e) {
+ fail("Exception thrown by loadClass: " + e.getMessage());
+ }
+ }
+
+ public void testLoadClassWithAlias() {
+ try {
+ Class<?> theClass;
+ // first try with a class full name
+ theClass = ObjectType.loadClass("java.lang.String");
+ assertEquals("Wrong class returned by
loadClass(\"java.lang.String\")", "java.lang.String", theClass.getName());
+ // now try with some aliases
+ theClass = ObjectType.loadClass("String");
+ assertEquals("Wrong class returned by loadClass(\"String\")",
"java.lang.String", theClass.getName());
+ theClass = ObjectType.loadClass("Object");
+ assertEquals("Wrong class returned by loadClass(\"Object\")",
"java.lang.Object", theClass.getName());
+ theClass = ObjectType.loadClass("Date");
+ assertEquals("Wrong class returned by loadClass(\"Date\")",
"java.sql.Date", theClass.getName());
+ } catch (Exception e) {
+ fail("Exception thrown by loadClass: " + e.getMessage());
+ }
+ }
+
public void testClassNotFound() {
GeneralException caught = null;
try {
Modified:
ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java?rev=1624549&r1=1624548&r2=1624549&view=diff
==============================================================================
---
ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java
(original)
+++
ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java
Fri Sep 12 13:49:17 2014
@@ -678,7 +678,7 @@ public class CatalinaContainer implement
context.setJ2EEApplication(J2EE_APP);
context.setJ2EEServer(J2EE_SERVER);
- context.setLoader(new
WebappLoader(ClassLoaderContainer.getClassLoader()));
+ context.setLoader(new
WebappLoader(Thread.currentThread().getContextClassLoader()));
context.setCookies(appInfo.isSessionCookieAccepted());
context.addParameter("cookies", appInfo.isSessionCookieAccepted() ?
"true" : "false");
Modified: ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Config.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Config.java?rev=1624549&r1=1624548&r2=1624549&view=diff
==============================================================================
--- ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Config.java (original)
+++ ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Config.java Fri Sep 12
13:49:17 2014
@@ -270,9 +270,10 @@ public class Config {
if (this.baseLib != null) {
loadLibs(classPath, this.baseLib, true);
}
- // load the ofbiz-base.jar
+ // load the ofbiz-base.jar and the ofbiz-base-test.jar
if (this.baseJar != null) {
classPath.addComponent(this.baseJar);
+ classPath.addComponent(this.baseJar.substring(0,
this.baseJar.indexOf(".jar")) + "-test.jar");
}
// load the base schema directory
if (this.baseDtd != null) {
Modified:
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java?rev=1624549&r1=1624548&r2=1624549&view=diff
==============================================================================
---
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java
(original)
+++
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java
Fri Sep 12 13:49:17 2014
@@ -35,14 +35,12 @@ import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.ofbiz.base.util.CachedClassLoader;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.StringUtil;
import org.ofbiz.base.util.UtilGenerics;
import org.ofbiz.base.util.UtilHttp;
import org.ofbiz.base.util.UtilMisc;
import org.ofbiz.base.util.UtilObject;
-import org.ofbiz.base.util.UtilProperties;
import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.entity.Delegator;
import org.ofbiz.entity.DelegatorFactory;
@@ -65,7 +63,6 @@ public class ContextFilter implements Fi
public static final String module = ContextFilter.class.getName();
public static final String FORWARDED_FROM_SERVLET =
"_FORWARDED_FROM_SERVLET_";
- protected ClassLoader localCachedClassLoader = null;
protected FilterConfig config = null;
protected boolean debug = false;
@@ -78,10 +75,6 @@ public class ContextFilter implements Fi
// puts all init-parameters in ServletContext attributes for easier
parameterization without code changes
this.putAllInitParametersInAttributes();
- // initialize the cached class loader for this application
- ClassLoader loader = Thread.currentThread().getContextClassLoader();
- localCachedClassLoader = new CachedClassLoader(loader, (String)
config.getServletContext().getAttribute("webSiteId"));
-
// set debug
this.debug = "true".equalsIgnoreCase(config.getInitParameter("debug"));
if (!debug) {
@@ -111,11 +104,6 @@ public class ContextFilter implements Fi
// Debug.logInfo("Running ContextFilter.doFilter", module);
// ----- Servlet Object Setup -----
- // set the cached class loader for more speedy running in this thread
- String disableCachedClassloader =
config.getInitParameter("disableCachedClassloader");
- if (disableCachedClassloader == null ||
!"Y".equalsIgnoreCase(disableCachedClassloader)) {
-
Thread.currentThread().setContextClassLoader(localCachedClassLoader);
- }
// set the ServletContext in the request for future use
httpRequest.setAttribute("servletContext", config.getServletContext());
Modified:
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/WebDavServlet.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/WebDavServlet.java?rev=1624549&r1=1624548&r2=1624549&view=diff
==============================================================================
--- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/WebDavServlet.java
(original)
+++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/webdav/WebDavServlet.java
Fri Sep 12 13:49:17 2014
@@ -30,7 +30,6 @@ import javax.servlet.http.HttpServletReq
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
-import org.ofbiz.base.util.CachedClassLoader;
import org.ofbiz.base.util.Debug;
import org.ofbiz.entity.Delegator;
import org.ofbiz.entity.DelegatorFactory;
@@ -61,8 +60,6 @@ public class WebDavServlet extends Gener
public void init(ServletConfig config) throws ServletException{
try {
super.init(config);
- ClassLoader loader = new
CachedClassLoader(Thread.currentThread().getContextClassLoader(), null);
- Thread.currentThread().setContextClassLoader(loader);
ServletContext context = this.getServletContext();
String delegatorName =
context.getInitParameter("entityDelegatorName");
this.delegator = DelegatorFactory.getDelegator(delegatorName);
@@ -70,7 +67,7 @@ public class WebDavServlet extends Gener
this.dispatcher =
ServiceContainer.getLocalDispatcher(dispatcherName, this.delegator);
this.security = SecurityFactory.getInstance(this.delegator);
String factoryClassName =
context.getInitParameter("requestHandlerFactoryClass");
- this.handlerFactory = (RequestHandlerFactory)
loader.loadClass(factoryClassName).newInstance();
+ this.handlerFactory = (RequestHandlerFactory)
Class.forName(factoryClassName).newInstance();
} catch (Exception e) {
Debug.logError(e, "Error while initializing WebDAV servlet: ",
module);
throw new ServletException(e);