/******************************************************************************* * Copyright (c) 2008, 2010 VMware Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VMware Inc. - initial contribution *******************************************************************************/ package org.eclipse.virgo.snaps.core; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.virgo.snaps.core.internal.SnapsLogEvents; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import org.osgi.framework.InvalidSyntaxException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.eclipse.virgo.medic.eventlog.EventLogger; public class SnapHostFilter implements Filter { private static final String ATTRIBUTE_OSGI_CONTEXT = "osgi-bundlecontext"; private final Logger logger = LoggerFactory.getLogger(this.getClass()); private final EventLogger eventLogger; private volatile String contextPath; private volatile RequestRouter router; public SnapHostFilter() { BundleContext bundleContext = FrameworkUtil.getBundle(SnapHostFilter.class).getBundleContext(); EventLogger eventLogger = (EventLogger) bundleContext.getService(bundleContext.getServiceReference(EventLogger.class.getName())); this.eventLogger = eventLogger; } SnapHostFilter(EventLogger eventLogger) { this.eventLogger = eventLogger; } public final void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if ((request instanceof HttpServletRequest) && (response instanceof HttpServletResponse)) { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; router.service(httpRequest, httpResponse, chain); } else { chain.doFilter(request, response); } } public final void init(FilterConfig filterConfig) throws ServletException { SnapRegistry registry = createSnapRegistry(filterConfig.getServletContext()); registry.init(); this.router = new RequestRouter(registry, filterConfig.getServletContext()); this.contextPath = filterConfig.getServletContext().getContextPath(); this.eventLogger.log(SnapsLogEvents.HOST_CREATED, this.contextPath); } public final void destroy() { if (this.router != null) { this.router.destroy(); this.router = null; } this.eventLogger.log(SnapsLogEvents.HOST_DESTROYED, this.contextPath); } protected SnapRegistry createSnapRegistry(ServletContext servletContext) throws ServletException { try { return new OsgiSnapRegistry(getRequiredBundleContext(servletContext)); } catch (InvalidSyntaxException e) { logger.error("Unable to create OsgiSnapRegistry", e); throw new ServletException("Unable to create OsgiSnapRegistry.", e); } } protected final BundleContext getRequiredBundleContext(ServletContext servletContext) throws ServletException { Object attr = servletContext.getAttribute(ATTRIBUTE_OSGI_CONTEXT); if (attr == null) { logger.error("ServletContext attribute '{}' is missing.", ATTRIBUTE_OSGI_CONTEXT); throw new ServletException("ServletContext attribute '" + ATTRIBUTE_OSGI_CONTEXT + "' is missing."); } return (BundleContext) attr; } }