001/* 002 GRANITE DATA SERVICES 003 Copyright (C) 2011 GRANITE DATA SERVICES S.A.S. 004 005 This file is part of Granite Data Services. 006 007 Granite Data Services is free software; you can redistribute it and/or modify 008 it under the terms of the GNU Library General Public License as published by 009 the Free Software Foundation; either version 2 of the License, or (at your 010 option) any later version. 011 012 Granite Data Services is distributed in the hope that it will be useful, but 013 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 014 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License 015 for more details. 016 017 You should have received a copy of the GNU Library General Public License 018 along with this library; if not, see <http://www.gnu.org/licenses/>. 019*/ 020 021package org.granite.config.servlet3; 022 023import java.util.HashSet; 024import java.util.Set; 025 026import javax.servlet.FilterRegistration; 027import javax.servlet.Servlet; 028import javax.servlet.ServletContainerInitializer; 029import javax.servlet.ServletContext; 030import javax.servlet.ServletException; 031import javax.servlet.ServletRegistration; 032import javax.servlet.annotation.HandlesTypes; 033 034import org.granite.config.GraniteConfigListener; 035import org.granite.messaging.webapp.AMFMessageFilter; 036import org.granite.messaging.webapp.AMFMessageServlet; 037import org.granite.util.TypeUtil; 038 039/** 040 * @author William DRAI 041 */ 042@HandlesTypes({ServerFilter.class}) 043public class GraniteServlet3Initializer implements ServletContainerInitializer { 044 045 public void onStartup(Set<Class<?>> scannedClasses, ServletContext servletContext) throws ServletException { 046 Set<Class<?>> classes = new HashSet<Class<?>>(); 047 if (scannedClasses != null) { 048 classes.addAll(scannedClasses); 049 classes.remove(ServerFilter.class); // JBossWeb adds the annotation ??? 050 } 051 if (classes.size() > 1) 052 throw new ServletException("Application must have only one ServerFilter configuration class"); 053 054 if (!classes.isEmpty()) { 055 // Configure GraniteDS only if we find a config class annotated with @ServerFilter 056 Class<?> clazz = classes.iterator().next(); 057 ServerFilter serverFilter = clazz.getAnnotation(ServerFilter.class); 058 059 servletContext.setAttribute(GraniteConfigListener.GRANITE_CONFIG_ATTRIBUTE, clazz); 060 061 servletContext.addListener(new GraniteConfigListener()); 062 063 if (servletContext.getFilterRegistration("AMFMessageFilter") == null) { 064 FilterRegistration.Dynamic graniteFilter = servletContext.addFilter("AMFMessageFilter", AMFMessageFilter.class); 065 graniteFilter.addMappingForUrlPatterns(null, true, serverFilter.graniteUrlMapping()); 066 } 067 if (servletContext.getServletRegistration("AMFMessageServlet") == null) { 068 ServletRegistration.Dynamic graniteServlet = servletContext.addServlet("AMFMessageServlet", AMFMessageServlet.class); 069 graniteServlet.setLoadOnStartup(1); 070 graniteServlet.addMapping(serverFilter.graniteUrlMapping()); 071 } 072 073 try { 074 if (servletContext.getServletRegistration("GravityServlet") == null) { 075 Class<? extends Servlet> gravityAsyncServletClass = TypeUtil.forName("org.granite.gravity.servlet3.GravityAsyncServlet", Servlet.class); 076 ServletRegistration.Dynamic gravityServlet = servletContext.addServlet("GravityServlet", gravityAsyncServletClass); 077 gravityServlet.setLoadOnStartup(1); 078 gravityServlet.setAsyncSupported(true); 079 gravityServlet.addMapping(serverFilter.gravityUrlMapping()); 080 } 081 } 082 catch (ClassNotFoundException e) { 083 servletContext.log("Could not setup GravityAsyncServlet", e); 084 } 085 } 086 } 087}