Author: [email protected]
Date: Tue Apr 10 11:18:54 2012
New Revision: 2205

Log:
[AMDATUOPENSOCIAL-211] Overruled Shindig servlets to switch context classloader 
during initialization, preventing the ClassCastExceptions

Modified:
   
trunk/amdatu-opensocial/opensocial-shindig/src/main/java/org/amdatu/opensocial/shindig/service/ShindigRegistrationServiceImpl.java

Modified: 
trunk/amdatu-opensocial/opensocial-shindig/src/main/java/org/amdatu/opensocial/shindig/service/ShindigRegistrationServiceImpl.java
==============================================================================
--- 
trunk/amdatu-opensocial/opensocial-shindig/src/main/java/org/amdatu/opensocial/shindig/service/ShindigRegistrationServiceImpl.java
  (original)
+++ 
trunk/amdatu-opensocial/opensocial-shindig/src/main/java/org/amdatu/opensocial/shindig/service/ShindigRegistrationServiceImpl.java
  Tue Apr 10 11:18:54 2012
@@ -13,8 +13,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.amdatu.opensocial.shindig.service;
-
+package org.amdatu.opensocial.shindig.service;
+
 import org.amdatu.opensocial.shindig.OAuthModule;
 import org.amdatu.opensocial.shindig.ShindigService;
 import org.amdatu.opensocial.shindig.SocialApiModule;
@@ -26,10 +26,6 @@
 import org.amdatu.web.dispatcher.DispatcherService;
 import org.amdatu.web.httpcontext.ResourceProvider;
 
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Dictionary;
@@ -39,6 +35,8 @@
 
 import javax.servlet.Filter;
 import javax.servlet.Servlet;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
 
 import org.apache.felix.dm.Component;
 import org.apache.felix.dm.DependencyManager;
@@ -57,211 +55,375 @@
 import org.osgi.framework.Constants;
 import org.osgi.service.cm.ConfigurationException;
 import org.osgi.service.log.LogService;
-
-/**
- * This service manages construction/destruction and 
registration/deregistration of
- * shindig servlets and filters. These depend on 
<code>GuiceInjectorService</code>
- * availability and <code>DispatcherService</code> lifecycle.
- */
-public class ShindigRegistrationServiceImpl implements ShindigService, 
ResourceProvider {
-    /**
-     * Basic URL alias for gadgets.
-     */
-    public static final String GADGETS_BASE = "/gadgets";
-
-    /**
-     * Basic URL alias for social REST calls.
-     */
+
+/**
+ * This service manages construction/destruction and 
registration/deregistration of
+ * shindig servlets and filters. These depend on 
<code>GuiceInjectorService</code>
+ * availability and <code>DispatcherService</code> lifecycle.
+ */
+public class ShindigRegistrationServiceImpl implements ShindigService, 
ResourceProvider {
+    /**
+     * Basic URL alias for gadgets.
+     */
+    public static final String GADGETS_BASE = "/gadgets";
+
+    /**
+     * Basic URL alias for social REST calls.
+     */
     public static final String REST_BASE = "/social/rest";
-    
+
     /**
      * Basix URL alias for RPC calls.
      */
-    public static final String GADGETS_RPC_BASE = "/rpc";
-
-    // Base URLs for filters, servlets and static resources
-    private static final String GADGET_SERVLET_BASE = GADGETS_BASE + "/ifr";
-    private static final String PROXY_BASE = GADGETS_BASE + "/proxy";
-    private static final String MAKEREQUEST_BASE = GADGETS_BASE + 
"/makeRequest";
-   
-    private static final String GADGETS_REST_BASE = GADGETS_BASE + "/api/rest";
-    private static final String CONCAT_BASE = GADGETS_BASE + "/concat";
-    private static final String JS_BASE = GADGETS_BASE + "/js";
-    private static final String METADATA_BASE = GADGETS_BASE + "/metadata";
-    private static final String OAUTH_CALLBACK_BASE = GADGETS_BASE + 
"/oauthcallback";
-    private static final String ECHO_BASE = GADGETS_BASE + "/api/echo";
-
-    // These variables are injected by the Felix dependency manager
-    private volatile BundleContext m_bundleContext;
-    private volatile LogService m_logService;
+    public static final String GADGETS_RPC_BASE = "/rpc";
+
+    // Base URLs for filters, servlets and static resources
+    private static final String GADGET_SERVLET_BASE = GADGETS_BASE + "/ifr";
+    private static final String PROXY_BASE = GADGETS_BASE + "/proxy";
+    private static final String MAKEREQUEST_BASE = GADGETS_BASE + 
"/makeRequest";
+
+    private static final String GADGETS_REST_BASE = GADGETS_BASE + "/api/rest";
+    private static final String CONCAT_BASE = GADGETS_BASE + "/concat";
+    private static final String JS_BASE = GADGETS_BASE + "/js";
+    private static final String METADATA_BASE = GADGETS_BASE + "/metadata";
+    private static final String OAUTH_CALLBACK_BASE = GADGETS_BASE + 
"/oauthcallback";
+    private static final String ECHO_BASE = GADGETS_BASE + "/api/echo";
+
+    // These variables are injected by the Felix dependency manager
+    private volatile BundleContext m_bundleContext;
+    private volatile LogService m_logService;
     private volatile DependencyManager m_dependencyManager;
     private volatile SecurityTokenService m_securityTokenService;
-    
-    // Other instance variables
-    private List<Component> m_registeredServletComponents = new 
ArrayList<Component>();
-
-    /**
+
+    // Other instance variables
+    private List<Component> m_registeredServletComponents = new 
ArrayList<Component>();
+
+    /**
      * The init() method is invoked by the Felix dependency manager.
-     * @throws ConfigurationException 
-     */
-    public void init() throws ConfigurationException {
-        // Beware! The order in which HTTP context, Guice servlet and other 
services are created is very important!
-
-        // First of all copy the security token key, this is needed by the 
Guice injector
-        m_securityTokenService.writeSecurityTokenKeyToFile();
-
-        // Now we need to register the Guice injector servlet. This servlet 
will create the Guice injector
-        // and set it onto the servlet context. The Guice injector servlet 
needs to be registered on the same
-        // HTTP context, therefore we register the servlet and not the Guice 
injector service itself.
-        // When the servlet is initialized it will register itself as a 
GuiceInjectorServlet service (at this moment
-        // the servlet is registered with the GuiceInjectorService interface)
-        registerInjectorServlet();
-
-        // Now register the authentication filter as a service. This filter 
needs the Guice injector to be initialized,
-        // which is done when the GuiceInjectorServlet is initialized. So we 
define a service dependency on the
-        // GuiceInjectorServlet
-        registerAuthenticationFilter();
-
-        m_logService.log(LogService.LOG_INFO, getClass().getName() + " service 
initialized");
-    }
-
-    /**
-     * The start() method is invoked by the Felix dependency manager.
-     */
-    public void start() {
-        m_logService.log(LogService.LOG_INFO, "Starting " + 
getClass().getName() + " service");
-        registerResources();
-        m_logService.log(LogService.LOG_INFO, getClass().getName() + " service 
started.");
-    }
-
-    /**
-     * The stop() method is invoked by the Felix dependency manager.
-     */
-    public void stop() {
-        m_logService.log(LogService.LOG_INFO, "Stopping " + 
getClass().getName() + " service");
-
-        // Unregister statics, servlets and filters
-        unregisterResources();
-    }
-
-    /**
-     * The destroy() method is invoked by the Felix dependency manager.
-     */
-    public void destroy() {
-        m_logService.log(LogService.LOG_INFO, getClass().getName() + " service 
destroyed");
-    }
-
+     * 
+     * @throws ConfigurationException
+     */
+    public void init() throws ConfigurationException {
+        // Beware! The order in which HTTP context, Guice servlet and other 
services are created is very important!
+
+        // First of all copy the security token key, this is needed by the 
Guice injector
+        m_securityTokenService.writeSecurityTokenKeyToFile();
+
+        // Now we need to register the Guice injector servlet. This servlet 
will create the Guice injector
+        // and set it onto the servlet context. The Guice injector servlet 
needs to be registered on the same
+        // HTTP context, therefore we register the servlet and not the Guice 
injector service itself.
+        // When the servlet is initialized it will register itself as a 
GuiceInjectorServlet service (at this moment
+        // the servlet is registered with the GuiceInjectorService interface)
+        registerInjectorServlet();
+
+        // Now register the authentication filter as a service. This filter 
needs the Guice injector to be initialized,
+        // which is done when the GuiceInjectorServlet is initialized. So we 
define a service dependency on the
+        // GuiceInjectorServlet
+        registerAuthenticationFilter();
+
+        m_logService.log(LogService.LOG_INFO, getClass().getName() + " service 
initialized");
+    }
+
+    /**
+     * The start() method is invoked by the Felix dependency manager.
+     */
+    public void start() {
+        m_logService.log(LogService.LOG_INFO, "Starting " + 
getClass().getName() + " service");
+        registerResources();
+        m_logService.log(LogService.LOG_INFO, getClass().getName() + " service 
started.");
+    }
+
+    /**
+     * The stop() method is invoked by the Felix dependency manager.
+     */
+    public void stop() {
+        m_logService.log(LogService.LOG_INFO, "Stopping " + 
getClass().getName() + " service");
+
+        // Unregister statics, servlets and filters
+        unregisterResources();
+    }
+
+    /**
+     * The destroy() method is invoked by the Felix dependency manager.
+     */
+    public void destroy() {
+        m_logService.log(LogService.LOG_INFO, getClass().getName() + " service 
destroyed");
+    }
+
     private void registerInjectorServlet() {
-        GuiceInjectorServletImpl guiceInjectorServlet = new 
GuiceInjectorServletImpl();
-        Properties servletProperties = new Properties();
-        servletProperties.put(DispatcherService.ALIAS_KEY, 
GuiceInjectorServletImpl.SERVLET_ALIAS);
-        servletProperties.put(DispatcherService.CONTEXT_ID_KEY, 
Activator.CONTEXTID);
-
-        Component servletComponent = m_dependencyManager.createComponent()
-            .setImplementation(guiceInjectorServlet)
-            .setInterface(Servlet.class.getName(), servletProperties);
-        
+        GuiceInjectorServletImpl guiceInjectorServlet = new 
GuiceInjectorServletImpl();
+        Properties servletProperties = new Properties();
+        servletProperties.put(DispatcherService.ALIAS_KEY, 
GuiceInjectorServletImpl.SERVLET_ALIAS);
+        servletProperties.put(DispatcherService.CONTEXT_ID_KEY, 
Activator.CONTEXTID);
+
+        Component servletComponent = m_dependencyManager.createComponent()
+                        .setImplementation(guiceInjectorServlet)
+                        .setInterface(Servlet.class.getName(), 
servletProperties);
+
         // Add the service dependencies
         List<ServiceDependency> dependencies = new 
ArrayList<ServiceDependency>();
-        
dependencies.add(m_dependencyManager.createServiceDependency().setService(LogService.class).setRequired(true).setInstanceBound(true));
-        
dependencies.add(m_dependencyManager.createServiceDependency().setService(GadgetSpecProcessor.class).setRequired(true).setInstanceBound(true));
-        
dependencies.add(m_dependencyManager.createServiceDependency().setService(ShindigConfigurationService.class).setRequired(true).setInstanceBound(true));
-        
dependencies.add(m_dependencyManager.createServiceDependency().setService(SocialApiModule.class).setRequired(true).setInstanceBound(true));
-        
dependencies.add(m_dependencyManager.createServiceDependency().setService(OAuthModule.class).setRequired(true).setInstanceBound(true));
-        
dependencies.add(m_dependencyManager.createServiceDependency().setService(ConfigurationAdminGuiceModule.class).setRequired(true).setInstanceBound(true));
-        
dependencies.add(m_dependencyManager.createServiceDependency().setService(GadgetSpecModule.class).setRequired(true).setInstanceBound(true));
+        
dependencies.add(m_dependencyManager.createServiceDependency().setService(LogService.class).setRequired(true)
+            .setInstanceBound(true));
+        
dependencies.add(m_dependencyManager.createServiceDependency().setService(GadgetSpecProcessor.class)
+            .setRequired(true).setInstanceBound(true));
+        
dependencies.add(m_dependencyManager.createServiceDependency().setService(ShindigConfigurationService.class)
+            .setRequired(true).setInstanceBound(true));
+        
dependencies.add(m_dependencyManager.createServiceDependency().setService(SocialApiModule.class)
+            .setRequired(true).setInstanceBound(true));
+        
dependencies.add(m_dependencyManager.createServiceDependency().setService(OAuthModule.class).setRequired(true)
+            .setInstanceBound(true));
+        
dependencies.add(m_dependencyManager.createServiceDependency().setService(ConfigurationAdminGuiceModule.class)
+            .setRequired(true).setInstanceBound(true));
+        
dependencies.add(m_dependencyManager.createServiceDependency().setService(GadgetSpecModule.class)
+            .setRequired(true).setInstanceBound(true));
         servletComponent.add(dependencies);
-         
-        m_dependencyManager.add(servletComponent);
-        m_registeredServletComponents.add(servletComponent);
-    }
-    
-
-    private void registerAuthenticationFilter() {
-        String baseMatch = "[/\\?]?.*";
-        String regex = ".*("
-            + GADGET_SERVLET_BASE + "[^/]*|"
-            + MAKEREQUEST_BASE + "[^/]*|"
-            + REST_BASE + baseMatch + "|"
-            + GADGETS_REST_BASE + baseMatch + "|"
-            + GADGETS_RPC_BASE + baseMatch + ")";
-        Dictionary<String, Object> properties = new Hashtable<String, 
Object>();
-        properties.put("pattern", regex);
-        properties.put(Constants.SERVICE_RANKING, 0);
-        properties.put(DispatcherService.CONTEXT_ID_KEY, Activator.CONTEXTID);
-        Component component = m_dependencyManager.createComponent();
-        component.setImplementation(AuthenticationServletFilter.class);
-        component.setInterface(Filter.class.getName(), properties);
-        
component.add(m_dependencyManager.createServiceDependency().setService(GuiceInjectorServlet.class).setRequired(
-            true));
-        m_dependencyManager.add(component); // TODO shouldn't we remove this 
filter later on?
-    }
-
-    /**
-     * Register additional servlets.
-     */
-    private void registerResources() {
-        try {
-            // Register the gadget rendering servlet. The gadget rendering 
servlet takes a gadget XML file
-            // (for example 
http://gerculanum.appspot.com/gadgets/com.example.chessgadget.client.ChessGadget.gadget.xml)
-            // and converts it to HTML. 'ifr' stands for the 'iframe' way of 
gadget rendering
-            registerServlet(GADGET_SERVLET_BASE, new GadgetRenderingServlet(), 
null);
-
-            registerServlet(MAKEREQUEST_BASE, new MakeRequestServlet(), null);
-            registerServlet(PROXY_BASE, new ProxyServlet(), null);
-            registerServlet(CONCAT_BASE, new ConcatProxyServlet(), null);
-            registerServlet(OAUTH_CALLBACK_BASE, new OAuthCallbackServlet(), 
null);
-            registerServlet(METADATA_BASE, new RpcServlet(), null);
-            registerServlet(JS_BASE, new JsServlet(), null);
-
-            Properties servletProperties = new Properties();
-            servletProperties.put("init.handlers", 
"org.apache.shindig.social.handlers");
-            registerServlet(REST_BASE, new DataServiceServlet(), 
servletProperties);
-            registerServlet(GADGETS_REST_BASE, new DataServiceServlet(), 
servletProperties);
-            registerServlet(GADGETS_RPC_BASE, new JsonRpcServlet(), 
servletProperties);
-            registerServlet(ECHO_BASE, new EchoServlet(), servletProperties);
-        }
-        catch (Throwable t) {
-            m_logService.log(LogService.LOG_ERROR, "Can not activate 
OpenSocial API.", t);
-        }
-    }
-
-    /**
-     * Destroy all components to guard Servlet lifecycle.
-     */
-    private void unregisterResources() {
-        for (Component servletComponent : m_registeredServletComponents) {
-            m_dependencyManager.remove(servletComponent);
-        }
-        m_registeredServletComponents.clear();
-    }
-
-    /**
-     * Register servlet under the common OpenSocial contextId.
-     */
-    private void registerServlet(final String alias, final Servlet servlet, 
final Properties servletProperties) {
-        final Properties properties = new Properties();
-        if (servletProperties != null) {
-            properties.putAll(servletProperties);
-        }
-        properties.put(DispatcherService.ALIAS_KEY, alias);
-        properties.put(DispatcherService.CONTEXT_ID_KEY, Activator.CONTEXTID);
-
-        Component servletComponent = m_dependencyManager.createComponent()
-            .setImplementation(servlet)
-            .setInterface(Servlet.class.getName(), properties)
-            .add(m_dependencyManager.createServiceDependency()
-                .setService(GuiceInjectorServlet.class)
-                .setRequired(true));
-        m_dependencyManager.add(servletComponent);
-        m_registeredServletComponents.add(servletComponent);
-    }
-
-    public URL getResource(final String name) {
-        final String pathPrefix = Activator.ALIAS + "/";
-        if (name != null && name.startsWith(pathPrefix)) {
-            return 
m_bundleContext.getBundle().getResource(name.substring(pathPrefix.length()));
-        }
-        return null;
-    }
-}
+
+        m_dependencyManager.add(servletComponent);
+        m_registeredServletComponents.add(servletComponent);
+    }
+
+    private void registerAuthenticationFilter() {
+        String baseMatch = "[/\\?]?.*";
+        String regex = ".*("
+                        + GADGET_SERVLET_BASE + "[^/]*|"
+                        + MAKEREQUEST_BASE + "[^/]*|"
+                        + REST_BASE + baseMatch + "|"
+                        + GADGETS_REST_BASE + baseMatch + "|"
+                        + GADGETS_RPC_BASE + baseMatch + ")";
+        Dictionary<String, Object> properties = new Hashtable<String, 
Object>();
+        properties.put("pattern", regex);
+        properties.put(Constants.SERVICE_RANKING, 0);
+        properties.put(DispatcherService.CONTEXT_ID_KEY, Activator.CONTEXTID);
+        Component component = m_dependencyManager.createComponent();
+        component.setImplementation(AuthenticationServletFilter.class);
+        component.setInterface(Filter.class.getName(), properties);
+        
component.add(m_dependencyManager.createServiceDependency().setService(GuiceInjectorServlet.class).setRequired(
+            true));
+        m_dependencyManager.add(component); // TODO shouldn't we remove this 
filter later on?
+    }
+
+    /**
+     * Register additional servlets.
+     */
+    private void registerResources() {
+        try {
+            // Register the gadget rendering servlet. The gadget rendering 
servlet takes a gadget XML file
+            // (for example 
http://gerculanum.appspot.com/gadgets/com.example.chessgadget.client.ChessGadget.gadget.xml)
+            // and converts it to HTML. 'ifr' stands for the 'iframe' way of 
gadget rendering
+            registerServlet(GADGET_SERVLET_BASE, new 
InternalGadgetRenderingServlet(), null);
+
+            registerServlet(MAKEREQUEST_BASE, new 
InternalMakeRequestServlet(), null);
+            registerServlet(PROXY_BASE, new InternalProxyServlet(), null);
+            registerServlet(CONCAT_BASE, new InternalConcatProxyServlet(), 
null);
+            registerServlet(OAUTH_CALLBACK_BASE, new 
InternalOAuthCallbackServlet(), null);
+            registerServlet(METADATA_BASE, new InternalRpcServlet(), null);
+            registerServlet(JS_BASE, new InternalJsServlet(), null);
+
+            Properties servletProperties = new Properties();
+            servletProperties.put("init.handlers", 
"org.apache.shindig.social.handlers");
+            registerServlet(REST_BASE, new InternalDataServiceServlet(), 
servletProperties);
+            registerServlet(GADGETS_REST_BASE, new 
InternalDataServiceServlet(), servletProperties);
+            registerServlet(GADGETS_RPC_BASE, new InternalJsonRpcServlet(), 
servletProperties);
+            registerServlet(ECHO_BASE, new InternalEchoServlet(), 
servletProperties);
+        }
+        catch (Throwable t) {
+            m_logService.log(LogService.LOG_ERROR, "Can not activate 
OpenSocial API.", t);
+        }
+    }
+
+    /**
+     * Destroy all components to guard Servlet lifecycle.
+     */
+    private void unregisterResources() {
+        for (Component servletComponent : m_registeredServletComponents) {
+            m_dependencyManager.remove(servletComponent);
+        }
+        m_registeredServletComponents.clear();
+    }
+
+    /**
+     * Register servlet under the common OpenSocial contextId.
+     */
+    private void registerServlet(final String alias, final Servlet servlet, 
final Properties servletProperties) {
+        final Properties properties = new Properties();
+        if (servletProperties != null) {
+            properties.putAll(servletProperties);
+        }
+        properties.put(DispatcherService.ALIAS_KEY, alias);
+        properties.put(DispatcherService.CONTEXT_ID_KEY, Activator.CONTEXTID);
+
+        Component servletComponent = m_dependencyManager.createComponent()
+                        .setImplementation(servlet)
+                        .setInterface(Servlet.class.getName(), properties)
+                        .add(m_dependencyManager.createServiceDependency()
+                            .setService(GuiceInjectorServlet.class)
+                            .setRequired(true));
+        m_dependencyManager.add(servletComponent);
+        m_registeredServletComponents.add(servletComponent);
+    }
+
+    public URL getResource(final String name) {
+        final String pathPrefix = Activator.ALIAS + "/";
+        if (name != null && name.startsWith(pathPrefix)) {
+            return 
m_bundleContext.getBundle().getResource(name.substring(pathPrefix.length()));
+        }
+        return null;
+    }
+
+    // 
*****************************************************************************************
+    //
+    // The code below override the Shindig servlets to set the proper context 
classloader on the
+    // current thread during servlet initialization. This is an alternative of 
fixing it in the
+    // dispatcher as suggested in http://jira.amdatu.org/jira/browse/AMDATU-621
+    //
+    // 
*****************************************************************************************
+    class InternalGadgetRenderingServlet extends GadgetRenderingServlet {
+        private static final long serialVersionUID = -7547421139792366289L;
+
+        public void init(ServletConfig config) throws ServletException {
+            ClassLoader cl = Thread.currentThread().getContextClassLoader();
+            try {
+                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                super.init(config);
+            }
+            finally {
+                Thread.currentThread().setContextClassLoader(cl);
+            }
+        }
+    }
+
+    class InternalMakeRequestServlet extends MakeRequestServlet {
+        private static final long serialVersionUID = -737242738738751216L;
+
+        public void init(ServletConfig config) throws ServletException {
+            ClassLoader cl = Thread.currentThread().getContextClassLoader();
+            try {
+                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                super.init(config);
+            }
+            finally {
+                Thread.currentThread().setContextClassLoader(cl);
+            }
+        }
+    }
+
+    class InternalProxyServlet extends ProxyServlet {
+        private static final long serialVersionUID = 2337902366013023797L;
+
+        public void init(ServletConfig config) throws ServletException {
+            ClassLoader cl = Thread.currentThread().getContextClassLoader();
+            try {
+                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                super.init(config);
+            }
+            finally {
+                Thread.currentThread().setContextClassLoader(cl);
+            }
+        }
+    }
+
+    class InternalConcatProxyServlet extends ConcatProxyServlet {
+        private static final long serialVersionUID = -4408036078002245944L;
+
+        public void init(ServletConfig config) throws ServletException {
+            ClassLoader cl = Thread.currentThread().getContextClassLoader();
+            try {
+                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                super.init(config);
+            }
+            finally {
+                Thread.currentThread().setContextClassLoader(cl);
+            }
+        }
+    }
+
+    class InternalOAuthCallbackServlet extends OAuthCallbackServlet {
+        private static final long serialVersionUID = -4889611812093404304L;
+
+        public void init(ServletConfig config) throws ServletException {
+            ClassLoader cl = Thread.currentThread().getContextClassLoader();
+            try {
+                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                super.init(config);
+            }
+            finally {
+                Thread.currentThread().setContextClassLoader(cl);
+            }
+        }
+    }
+
+    class InternalRpcServlet extends RpcServlet {
+        private static final long serialVersionUID = 2408425432596249585L;
+
+        public void init(ServletConfig config) throws ServletException {
+            ClassLoader cl = Thread.currentThread().getContextClassLoader();
+            try {
+                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                super.init(config);
+            }
+            finally {
+                Thread.currentThread().setContextClassLoader(cl);
+            }
+        }
+    }
+
+    class InternalJsServlet extends JsServlet {
+        private static final long serialVersionUID = -8311670653477079645L;
+
+        public void init(ServletConfig config) throws ServletException {
+            ClassLoader cl = Thread.currentThread().getContextClassLoader();
+            try {
+                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                super.init(config);
+            }
+            finally {
+                Thread.currentThread().setContextClassLoader(cl);
+            }
+        }
+    }
+
+    class InternalDataServiceServlet extends DataServiceServlet {
+        private static final long serialVersionUID = 1085373078171763683L;
+
+        public void init(ServletConfig config) throws ServletException {
+            ClassLoader cl = Thread.currentThread().getContextClassLoader();
+            try {
+                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                super.init(config);
+            }
+            finally {
+                Thread.currentThread().setContextClassLoader(cl);
+            }
+        }
+    }
+
+    class InternalJsonRpcServlet extends JsonRpcServlet {
+        private static final long serialVersionUID = -4983029497658891657L;
+
+        public void init(ServletConfig config) throws ServletException {
+            ClassLoader cl = Thread.currentThread().getContextClassLoader();
+            try {
+                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                super.init(config);
+            }
+            finally {
+                Thread.currentThread().setContextClassLoader(cl);
+            }
+        }
+    }
+
+    class InternalEchoServlet extends EchoServlet {
+        private static final long serialVersionUID = -75293532766225339L;
+
+        public void init(ServletConfig config) throws ServletException {
+            ClassLoader cl = Thread.currentThread().getContextClassLoader();
+            try {
+                
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
+                super.init(config);
+            }
+            finally {
+                Thread.currentThread().setContextClassLoader(cl);
+            }
+        }
+    }
+}
_______________________________________________
Amdatu-commits mailing list
[email protected]
http://lists.amdatu.org/mailman/listinfo/amdatu-commits

Reply via email to