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}