]> source.dussan.org Git - vaadin-framework.git/commitdiff
Add VaadinService.setClassLoader (#9819) 45/345/3
authorLeif Åstrand <leif@vaadin.com>
Thu, 22 Nov 2012 16:57:44 +0000 (18:57 +0200)
committerVaadin Code Review <review@vaadin.com>
Fri, 23 Nov 2012 11:38:54 +0000 (11:38 +0000)
* Set default value in constructor
* Remove support for getting a null class loader

Change-Id: Ib2ac914e0832395bb25cb1cff1a9caffbe09631e

server/src/com/vaadin/server/DefaultUIProvider.java
server/src/com/vaadin/server/VaadinPortletService.java
server/src/com/vaadin/server/VaadinService.java
server/src/com/vaadin/server/VaadinServletService.java

index 919f781d3dc5f91eec19bf6c1dc5801423f35fa4..530b56c2a356e796882ce0b618b296dbfd44bcb7 100644 (file)
@@ -34,9 +34,6 @@ public class DefaultUIProvider extends UIProvider {
             String uiClassName = uiClassNameObj.toString();
 
             ClassLoader classLoader = request.getService().getClassLoader();
-            if (classLoader == null) {
-                classLoader = getClass().getClassLoader();
-            }
             try {
                 Class<? extends UI> uiClass = Class.forName(uiClassName, true,
                         classLoader).asSubclass(UI.class);
index 38813ec212d30b1e42d22317c4776d6ce93341ea..bb0ad4ca221ceadc2a9edb95e115cf62d3841525 100644 (file)
@@ -34,6 +34,16 @@ public class VaadinPortletService extends VaadinService {
             DeploymentConfiguration deploymentConfiguration) {
         super(deploymentConfiguration);
         this.portlet = portlet;
+
+        // Set default class loader if not already set
+        if (getClassLoader() == null) {
+            /*
+             * The portlet is most likely to be loaded with a class loader
+             * specific to the application instead of some generic system class
+             * loader that loads the Vaadin classes.
+             */
+            setClassLoader(portlet.getClass().getClassLoader());
+        }
     }
 
     protected VaadinPortlet getPortlet() {
index 50fca54cf7441edb79a40bd734779b00e8aca109..eaa5b51b30b6b699dddd07235b7490bc4ae4e6a7 100644 (file)
@@ -75,6 +75,8 @@ public abstract class VaadinService implements Serializable {
     private SystemMessagesProvider systemMessagesProvider = DefaultSystemMessagesProvider
             .get();
 
+    private ClassLoader classLoader;
+
     /**
      * Creates a new vaadin service based on a deployment configuration
      * 
@@ -83,6 +85,23 @@ public abstract class VaadinService implements Serializable {
      */
     public VaadinService(DeploymentConfiguration deploymentConfiguration) {
         this.deploymentConfiguration = deploymentConfiguration;
+
+        final String classLoaderName = getDeploymentConfiguration()
+                .getApplicationOrSystemProperty("ClassLoader", null);
+        if (classLoaderName != null) {
+            try {
+                final Class<?> classLoaderClass = getClass().getClassLoader()
+                        .loadClass(classLoaderName);
+                final Constructor<?> c = classLoaderClass
+                        .getConstructor(new Class[] { ClassLoader.class });
+                setClassLoader((ClassLoader) c
+                        .newInstance(new Object[] { getClass().getClassLoader() }));
+            } catch (final Exception e) {
+                throw new RuntimeException(
+                        "Could not find specified class loader: "
+                                + classLoaderName, e);
+            }
+        }
     }
 
     /**
@@ -134,35 +153,38 @@ public abstract class VaadinService implements Serializable {
     public abstract boolean isStandalone(VaadinRequest request);
 
     /**
-     * Get the class loader to use for loading classes loaded by name, e.g.
-     * custom UI classes. <code>null</code> indicates that the default class
-     * loader should be used.
+     * Gets the class loader to use for loading classes loaded by name, e.g.
+     * custom UI classes. This is by default the class loader that was used to
+     * load the Servlet or Portlet class to which this service belongs.
      * 
      * @return the class loader to use, or <code>null</code>
+     * 
+     * @see #setClassLoader(ClassLoader)
      */
     public ClassLoader getClassLoader() {
-        final String classLoaderName = getDeploymentConfiguration()
-                .getApplicationOrSystemProperty("ClassLoader", null);
-        ClassLoader classLoader;
-        if (classLoaderName == null) {
-            classLoader = getClass().getClassLoader();
-        } else {
-            try {
-                final Class<?> classLoaderClass = getClass().getClassLoader()
-                        .loadClass(classLoaderName);
-                final Constructor<?> c = classLoaderClass
-                        .getConstructor(new Class[] { ClassLoader.class });
-                classLoader = (ClassLoader) c
-                        .newInstance(new Object[] { getClass().getClassLoader() });
-            } catch (final Exception e) {
-                throw new RuntimeException(
-                        "Could not find specified class loader: "
-                                + classLoaderName, e);
-            }
-        }
         return classLoader;
     }
 
+    /**
+     * Sets the class loader to use for loading classes loaded by name, e.g.
+     * custom UI classes. Invokers of this method should be careful to not break
+     * any existing class loader hierarchy, e.g. by ensuring that a class loader
+     * set for this service delegates to the previously set class loader if the
+     * class is not found.
+     * 
+     * @param classLoader
+     *            the new class loader to set, not <code>null</code>.
+     * 
+     * @see #getClassLoader()
+     */
+    public void setClassLoader(ClassLoader classLoader) {
+        if (classLoader == null) {
+            throw new IllegalArgumentException(
+                    "Can not set class loader to null");
+        }
+        this.classLoader = classLoader;
+    }
+
     /**
      * Returns the MIME type of the specified file, or null if the MIME type is
      * not known. The MIME type is determined by the configuration of the
index aaa2ce327e72032267d9c6c99d253f10cd437341..7a15c0cc1989471a63cba69e3201daa7a3544b74 100644 (file)
@@ -32,6 +32,16 @@ public class VaadinServletService extends VaadinService {
             DeploymentConfiguration deploymentConfiguration) {
         super(deploymentConfiguration);
         this.servlet = servlet;
+
+        // Set default class loader if not already set
+        if (getClassLoader() == null) {
+            /*
+             * The servlet is most likely to be loaded with a class loader
+             * specific to the application instead of some generic system class
+             * loader that loads the Vaadin classes.
+             */
+            setClassLoader(servlet.getClass().getClassLoader());
+        }
     }
 
     protected VaadinServlet getServlet() {