/**********************************************************************************
* $URL: https://source.sakaiproject.org/svn/portal/trunk/portal-impl/impl/src/java/org/sakaiproject/portal/charon/handlers/BasePortalHandler.java $
* $Id: BasePortalHandler.java 132396 2013-12-10 01:04:51Z matthew@longsight.com $
***********************************************************************************
*
* Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 The 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.portal.charon.handlers;
import java.util.Locale;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.entity.api.ResourcePropertiesEdit;
import org.sakaiproject.portal.api.Portal;
import org.sakaiproject.portal.api.PortalHandler;
import org.sakaiproject.portal.api.PortalHandlerException;
import org.sakaiproject.portal.api.PortalRenderContext;
import org.sakaiproject.portal.api.PortalService;
import org.sakaiproject.site.api.Site;
import org.sakaiproject.component.cover.ComponentManager;
import org.sakaiproject.time.api.TimeService;
import org.sakaiproject.tool.api.Session;
import org.sakaiproject.util.ResourceLoader;
/**
* Abstract class to hold common base methods for portal handlers.
*
* @author ieb
* @since Sakai 2.4
* @version $Rev: 132396 $
*
*/
public abstract class BasePortalHandler implements PortalHandler
{
private static final Log log = LogFactory.getLog(BasePortalHandler.class);
public BasePortalHandler()
{
urlFragment = "none";
timeService = (TimeService) ComponentManager.get(TimeService.class);
}
private TimeService timeService;
protected PortalService portalService;
protected Portal portal;
private String urlFragment;
protected ServletContext servletContext;
public abstract int doGet(String[] parts, HttpServletRequest req,
HttpServletResponse res, Session session) throws PortalHandlerException;
// TODO: Go through and make sure to remove and test the mistaken code that
// simply
// calls doGet in doPost()
public int doPost(String[] parts, HttpServletRequest req, HttpServletResponse res,
Session session) throws PortalHandlerException
{
return NEXT;
}
/*
* (non-Javadoc)
*
* @see org.sakaiproject.portal.charon.PortalHandler#deregister(org.sakaiproject.portal.charon.Portal)
*/
public void deregister(Portal portal)
{
this.portal = null;
}
/*
* (non-Javadoc)
*
* @see org.sakaiproject.portal.charon.PortalHandler#register(org.sakaiproject.portal.charon.Portal)
*/
public void register(Portal portal, PortalService portalService,
ServletContext servletContext)
{
this.portal = portal;
this.portalService = portalService;
this.servletContext = servletContext;
}
/**
* @return the servletContext
*/
public ServletContext getServletContext()
{
return servletContext;
}
/**
* @param servletContext
* the servletContext to set
*/
public void setServletContext(ServletContext servletContext)
{
this.servletContext = servletContext;
}
/**
* @return the urlFragment
*/
public String getUrlFragment()
{
return urlFragment;
}
/**
* @param urlFragment the urlFragment to set
*/
public void setUrlFragment(String urlFragment)
{
this.urlFragment = urlFragment;
}
/**
* *
*
* @return Locale based on its string representation (language_region)
*/
private Locale getLocaleFromString(String localeString)
{
String[] locValues = localeString.trim().split("_");
if (locValues.length >= 3)
return new Locale(locValues[0], locValues[1], locValues[2]); // language, country, variant
else if (locValues.length == 2)
return new Locale(locValues[0], locValues[1]); // language, country
else if (locValues.length == 1)
return new Locale(locValues[0]); // language
else
return Locale.getDefault();
}
protected Locale setSiteLanguage(Site site)
{
ResourceLoader rl = new ResourceLoader();
ResourcePropertiesEdit props = site.getPropertiesEdit();
String locale_string = props.getProperty("locale_string");
if(log.isDebugEnabled()){
log.debug("setSiteLanguage - locale_string property: " + locale_string);
}
Locale loc;
// if no language was specified when creating the site, set default language to session
if(locale_string == null || locale_string == "")
{
if(log.isDebugEnabled()){
log.debug("setSiteLanguage - no locale, setting null.");
}
loc = rl.setContextLocale(null);
}
// if you have indicated a language when creating the site, set selected language to session
else
{
Locale locale = getLocaleFromString(locale_string);
if(log.isDebugEnabled()){
log.debug("setSiteLanguage - locale: " + locale.toString());
}
loc = rl.setContextLocale(locale);
}
return loc;
}
protected void addLocale(PortalRenderContext rcontext, Site site) {
addLocale(rcontext, site, null);
}
protected void addLocale(PortalRenderContext rcontext, Site site, String userId) {
Locale prevLocale = null;
if (userId != null) {
prevLocale = new ResourceLoader().getLocale();
}
Locale locale = setSiteLanguage(site);
if(log.isDebugEnabled()) {
log.debug("Locale for site " + site.getId() + " = " + locale.toString());
}
String localeString = locale.getLanguage();
String country = locale.getCountry();
if(country.length() > 0) localeString += "-" + country;
rcontext.put("locale", localeString);
if (prevLocale != null && !prevLocale.equals(locale)) {
// if the locale was changed, clear the date/time format which was cached in the previous locale
timeService.clearLocalTimeZone(userId);
}
}
}