001/*
002 * (C) Copyright 2006-2010 Nuxeo SAS (http://nuxeo.com/) and contributors.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * Contributors:
015 *     bstefanescu
016 */
017package org.nuxeo.runtime.jetty;
018
019import java.util.HashMap;
020import java.util.Map;
021
022import javax.servlet.ServletContextListener;
023
024import org.apache.commons.logging.Log;
025import org.apache.commons.logging.LogFactory;
026import org.mortbay.jetty.Handler;
027import org.mortbay.jetty.Server;
028import org.mortbay.jetty.handler.HandlerCollection;
029import org.mortbay.jetty.servlet.Context;
030import org.mortbay.jetty.servlet.FilterHolder;
031import org.mortbay.jetty.servlet.ServletHolder;
032import org.mortbay.jetty.webapp.WebAppContext;
033
034/**
035 * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
036 */
037public class ContextManager {
038
039    protected Log log = LogFactory.getLog(ContextManager.class);
040
041    protected Server server;
042
043    protected Map<String, Context> contexts;
044
045    protected Map<String, ServletContextListenerDescriptor> listeners;
046
047    public ContextManager(Server server) {
048        this.server = server;
049        this.contexts = new HashMap<String, Context>();
050        this.listeners = new HashMap<String, ServletContextListenerDescriptor>();
051    }
052
053    public Server getServer() {
054        return server;
055    }
056
057    public synchronized void addFilter(FilterDescriptor descriptor) {
058        String path = descriptor.getContext();
059        Context ctx = contexts.get(path);
060        if (ctx == null) {
061            ctx = new Context(server, path, Context.SESSIONS | Context.NO_SECURITY);
062            contexts.put(path, ctx);
063        }
064        FilterHolder holder = new FilterHolder(descriptor.getClazz());
065        String name = descriptor.getName();
066        if (name != null) {
067            holder.setName(name);
068        }
069        String desc = descriptor.getDescription();
070        if (desc != null) {
071            holder.setDisplayName(desc);
072        }
073        Map<String, String> params = descriptor.getInitParams();
074        if (params != null) {
075            holder.setInitParameters(params);
076        }
077        ctx.addFilter(holder, descriptor.getPath(), org.mortbay.jetty.Handler.DEFAULT);
078    }
079
080    public synchronized void addServlet(ServletDescriptor descriptor) {
081        String path = descriptor.getContext();
082        Context ctx = contexts.get(path);
083        if (ctx == null) {
084            ctx = new Context(server, path, Context.SESSIONS | Context.NO_SECURITY);
085            contexts.put(path, ctx);
086        }
087        ServletHolder holder = new ServletHolder(descriptor.getClazz());
088        String name = descriptor.getName();
089        if (name != null) {
090            holder.setName(name);
091        }
092        String desc = descriptor.getDescription();
093        if (desc != null) {
094            holder.setDisplayName(desc);
095        }
096        Map<String, String> params = descriptor.getInitParams();
097        if (params != null) {
098            holder.setInitParameters(params);
099        }
100        ctx.addServlet(holder, descriptor.getPath());
101    }
102
103    public synchronized void addLifecycleListener(ServletContextListenerDescriptor descriptor) {
104        listeners.put(descriptor.name, descriptor);
105    }
106
107    public synchronized void removeLifecycleListener(ServletContextListenerDescriptor descriptor) {
108        listeners.remove(descriptor.name);
109    }
110
111    public synchronized void removeFilter(FilterDescriptor descriptor) {
112        // TODO not yet implemented
113    }
114
115    public synchronized void removeServlet(ServletDescriptor descriptor) {
116        // TODO not yet implemented
117    }
118
119    public void applyLifecycleListeners() {
120        HandlerCollection hc = (HandlerCollection) server.getHandler();
121        Handler[] handlers = hc.getChildHandlersByClass(WebAppContext.class);
122        for (ServletContextListenerDescriptor desc : listeners.values()) {
123            ServletContextListener listener;
124            try {
125                listener = desc.clazz.newInstance();
126            } catch (ReflectiveOperationException e) {
127                log.error("Cannot add life cycle listener " + desc.name, e);
128                continue;
129            }
130            for (Handler handler : handlers) {
131                WebAppContext context = (WebAppContext) handler;
132                if (context.getContextPath().matches(desc.context)) {
133                    context.addEventListener(listener);
134                }
135            }
136        }
137    }
138}