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