/** * Copyright 2005-2014 Restlet * * The contents of this file are subject to the terms of one of the following * open source licenses: Apache 2.0 or or EPL 1.0 (the "Licenses"). You can * select the license that you prefer but you may not use this file except in * compliance with one of these Licenses. * * You can obtain a copy of the Apache 2.0 license at * http://www.opensource.org/licenses/apache-2.0 * * You can obtain a copy of the EPL 1.0 license at * http://www.opensource.org/licenses/eclipse-1.0 * * See the Licenses for the specific language governing permissions and * limitations under the Licenses. * * Alternatively, you can obtain a royalty free commercial license with less * limitations, transferable or non-transferable, directly at * http://restlet.com/products/restlet-framework * * Restlet is a registered trademark of Restlet S.A.S. */ package org.restlet.ext.spring; import org.restlet.Application; import org.restlet.Component; import org.restlet.Context; import org.restlet.ext.servlet.ServerServlet; import org.springframework.beans.BeansException; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; /** * Spring specific ServerServlet adapter. This class is similar to the * ServerServlet, but instead of creating the used Restlet Application and * Restlet Component, it lookups them up from the SpringContext which is found * in the ServletContext. * * If the Application or Component beans can't be found, the default behavior of * the parent class is used. * * @author Florian Schwarz */ public class SpringServerServlet extends ServerServlet { /** * Name of the Servlet parameter containing a bean-id of the application to * use. */ public static final String APPLICATION_BEAN_PARAM_NAME = "org.restlet.application"; /** * Name of the Servlet parameter containing a bean-id of the component to * use. */ public static final String Component_BEAN_PARAM_NAME = "org.restlet.component"; private static final long serialVersionUID = 110030403435929871L; /** * Lookups the single Restlet Application used by this Servlet from the * SpringContext inside the ServletContext. The bean name looked up is * {@link #APPLICATION_BEAN_PARAM_NAME}. * * @param parentContext * The parent component context. * @return The Restlet-Application to use. */ @Override public Application createApplication(Context parentContext) { Application application = null; final String applicationBeanName = getInitParameter( SpringServerServlet.APPLICATION_BEAN_PARAM_NAME, null); application = (Application) getWebApplicationContext().getBean( applicationBeanName); if (application != null) { // Set the context based on the Servlet's context application.setContext(parentContext.createChildContext()); } else { application = super.createApplication(parentContext); } return application; } /** * Lookups the single Restlet Component used by this Servlet from Spring's * Context available inside the ServletContext. The bean name looked up is * {@link #Component_BEAN_PARAM_NAME}. * * @return The Restlet-Component to use. */ @Override public Component createComponent() { Component component = null; final String componentBeanName = getInitParameter( Component_BEAN_PARAM_NAME, null); // Not mentioned in the Spring JavaDocs, but getBean surely fails if // the argument is null. if (componentBeanName != null) { try { component = (Component) getWebApplicationContext().getBean( componentBeanName); } catch (BeansException be) { // The bean has not been found, let the parent create it. } } if (component == null) { component = super.createComponent(); } return component; } /** * Get the Spring WebApplicationContext from the ServletContext. (by hand * would be webApplicationContext applicationContext = * (WebApplicationContext) * getServletContext().getAttribute(WebApplicationContext * .ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);) * * @return The Spring WebApplicationContext. */ public WebApplicationContext getWebApplicationContext() { return WebApplicationContextUtils .getRequiredWebApplicationContext(getServletContext()); } }