All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sakaiproject.component.impl.SakaiContextLoader Maven / Gradle / Ivy

The newest version!
/**********************************************************************************
 * $URL$
 * $Id$
 ***********************************************************************************
 *
 * Copyright (c) 2005, 2006, 2007, 2008 Sakai Foundation
 *
 * Licensed under the Educational Community License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.opensource.org/licenses/ECL-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 **********************************************************************************/

package org.sakaiproject.component.impl;

import java.io.File;
import java.util.Arrays;

import javax.servlet.ServletContext;

import org.apache.commons.lang3.StringUtils;
import org.sakaiproject.component.cover.ComponentManager;
import org.sakaiproject.component.cover.ServerConfigurationService;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.context.ConfigurableWebApplicationContext;
import org.springframework.web.context.ContextLoader;

import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.context.WebApplicationContext;

/**
 * 

* Sakai's extension to Spring's {@link ContextLoader} - adds the location of the ComponentManager shared AC, * linking the local AC to it as parent, and loading localy hosted components into shared. *

*/ @NoArgsConstructor @Slf4j public class SakaiContextLoader extends ContextLoader { public static final String SPRING_CONTEXT_SUFFIX = "-context.xml"; /** * {@inheritDoc} */ public SakaiContextLoader(WebApplicationContext context) { super(context); } /** * Allows loading/override of custom bean definitions from sakai.home * *

The pattern is the 'servlet_name-context.xml'

* * @param sc current servlet context * @param wac the new WebApplicationContext */ @Override protected void customizeContext(ServletContext sc, ConfigurableWebApplicationContext wac) { super.customizeContext(sc, wac); if (wac != null) { final String servletName = sc.getServletContextName(); String location = getHomeBeanDefinitionIfExists(servletName); if (StringUtils.isNotBlank(location)) { String[] configLocations = wac.getConfigLocations(); String[] newLocations = Arrays.copyOf(configLocations, configLocations.length + 1); newLocations[configLocations.length] = "file:" + location; wac.setConfigLocations(newLocations); log.info("Servlet {} added an additional bean config location [{}]", servletName, location); } } } /** * Spring allows a parent ApplicationContext to be set during the creation of a new ApplicationContext * * Sakai sets the SakaiApplicationContext as the parent which managed by the ComponentManager * * @param servletContext (not used) * @return the shared SakaiApplicationContext */ @Override protected ApplicationContext loadParentContext(ServletContext servletContext) throws BeansException { // get the component manager (we know it's a SpringCompMgr) and from that the shared AC ConfigurableApplicationContext sharedAc = ((SpringCompMgr) ComponentManager.getInstance()).getApplicationContext(); return sharedAc; } private String getHomeBeanDefinitionIfExists(String servletName) { if (StringUtils.isBlank(servletName)) { return null; } if (StringUtils.isNotBlank(servletName)) { String name = servletName + SPRING_CONTEXT_SUFFIX; String path = ServerConfigurationService.getSakaiHomePath(); String location = path + name; log.debug("Servlet " + servletName + " is checking for a bean definition at sakai.home/" + name); if (new File(location).canRead()) { log.info("Servlet " + servletName + " located an additional bean definition at sakai.home/" + name); return location; } else { log.debug("Servlet " + servletName + " did not find a bean definition at sakai.home/" + name); } } return null; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy