summaryrefslogtreecommitdiffstats
path: root/java/sca/modules/host-http/src/main/java
diff options
context:
space:
mode:
authorrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2009-10-06 16:55:15 +0000
committerrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2009-10-06 16:55:15 +0000
commit381a103a148d1aacb19f0afb14f66d9d6e298878 (patch)
treeb6a1b26b5d8670d3f60cea728c5d9668bcb34d96 /java/sca/modules/host-http/src/main/java
parent5d83de3646c6f1b07d2221f5586088deeca27d0a (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.java151
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;
+ }
}