diff options
author | rfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68> | 2009-10-06 16:55:15 +0000 |
---|---|---|
committer | rfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68> | 2009-10-06 16:55:15 +0000 |
commit | 381a103a148d1aacb19f0afb14f66d9d6e298878 (patch) | |
tree | b6a1b26b5d8670d3f60cea728c5d9668bcb34d96 /java/sca/modules/host-http/src/main/java | |
parent | 5d83de3646c6f1b07d2221f5586088deeca27d0a (diff) |
Enable lazy loading of ServletHost extensions
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@822343 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/sca/modules/host-http/src/main/java')
-rw-r--r-- | java/sca/modules/host-http/src/main/java/org/apache/tuscany/sca/host/http/DefaultServletHostExtensionPoint.java | 151 |
1 files changed, 150 insertions, 1 deletions
diff --git a/java/sca/modules/host-http/src/main/java/org/apache/tuscany/sca/host/http/DefaultServletHostExtensionPoint.java b/java/sca/modules/host-http/src/main/java/org/apache/tuscany/sca/host/http/DefaultServletHostExtensionPoint.java index 5e6de0b29b..7573141656 100644 --- a/java/sca/modules/host-http/src/main/java/org/apache/tuscany/sca/host/http/DefaultServletHostExtensionPoint.java +++ b/java/sca/modules/host-http/src/main/java/org/apache/tuscany/sca/host/http/DefaultServletHostExtensionPoint.java @@ -19,27 +19,176 @@ package org.apache.tuscany.sca.host.http; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.net.URL; import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import javax.servlet.RequestDispatcher; +import javax.servlet.Servlet; + +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.core.LifeCycleListener; +import org.apache.tuscany.sca.extensibility.ServiceDeclaration; +import org.apache.tuscany.sca.extensibility.ServiceDiscovery; + /** * Default implementation of a Servlet host extension point. * * @version $Rev$ $Date$ */ -public class DefaultServletHostExtensionPoint implements ServletHostExtensionPoint { +public class DefaultServletHostExtensionPoint implements ServletHostExtensionPoint, LifeCycleListener { private List<ServletHost> servletHosts = new ArrayList<ServletHost>(); + private boolean loaded; + + private ExtensionPointRegistry registry; + + public DefaultServletHostExtensionPoint(ExtensionPointRegistry registry) { + this.registry = registry; + } public void addServletHost(ServletHost servletHost) { servletHosts.add(servletHost); + if (servletHost instanceof LifeCycleListener) { + ((LifeCycleListener)servletHost).start(); + } } public void removeServletHost(ServletHost servletHost) { servletHosts.remove(servletHost); + if (servletHost instanceof LifeCycleListener) { + ((LifeCycleListener)servletHost).stop(); + } } public List<ServletHost> getServletHosts() { + loadServletHosts(); return servletHosts; } + + private synchronized void loadServletHosts() { + if (loaded) + return; + + // Get the databinding service declarations + Collection<ServiceDeclaration> sds; + try { + sds = ServiceDiscovery.getInstance().getServiceDeclarations(ServletHost.class, true); + } catch (IOException e) { + throw new IllegalStateException(e); + } + + // Load data bindings + for (ServiceDeclaration sd : sds) { + // Create a data binding wrapper and register it + ServletHost servletHost = new LazyServletHost(sd); + addServletHost(servletHost); + } + + loaded = true; + } + + /** + * A data binding facade allowing data bindings to be lazily loaded and + * initialized. + */ + private class LazyServletHost implements ServletHost, LifeCycleListener { + private ServiceDeclaration sd; + private ServletHost host; + + /** + * @param sd + */ + public LazyServletHost(ServiceDeclaration sd) { + super(); + this.sd = sd; + } + + private synchronized ServletHost getServletHost() { + if (host == null) { + try { + Class<?> cls = sd.loadClass(); + Constructor<?> ctor = null; + try { + ctor = cls.getConstructor(ExtensionPointRegistry.class); + host = (ServletHost)ctor.newInstance(registry); + } catch (NoSuchMethodException e) { + ctor = cls.getConstructor(); + host = (ServletHost)ctor.newInstance(); + } + if(host instanceof LifeCycleListener) { + ((LifeCycleListener) host).start(); + } + } catch (Throwable e) { + throw new IllegalStateException(e); + } + } + return host; + } + + public void addServletMapping(String uri, Servlet servlet) throws ServletMappingException { + getServletHost().addServletMapping(uri, servlet); + } + + public String getContextPath() { + return getServletHost().getContextPath(); + } + + public int getDefaultPort() { + return getServletHost().getDefaultPort(); + } + + public RequestDispatcher getRequestDispatcher(String uri) throws ServletMappingException { + return getServletHost().getRequestDispatcher(uri); + } + + public Servlet getServletMapping(String uri) throws ServletMappingException { + return getServletHost().getServletMapping(uri); + } + + public URL getURLMapping(String uri) { + return getServletHost().getURLMapping(uri); + } + + public Servlet removeServletMapping(String uri) throws ServletMappingException { + return getServletHost().removeServletMapping(uri); + } + + public void setAttribute(String name, Object value) { + getServletHost().setAttribute(name, value); + } + + public void setContextPath(String path) { + getServletHost().setContextPath(path); + } + + public void setDefaultPort(int port) { + getServletHost().setDefaultPort(port); + } + + public void start() { + } + + public void stop() { + if (host instanceof LifeCycleListener) { + ((LifeCycleListener)host).stop(); + } + } + } + + public void start() { + } + + public void stop() { + for (ServletHost host : servletHosts) { + if (host instanceof LifeCycleListener) { + ((LifeCycleListener)host).stop(); + } + } + servletHosts.clear(); + registry = null; + } } |