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}