/* * #! * Ontopia Navigator * #- * Copyright (C) 2001 - 2013 The Ontopia Project * #- * Licensed under the Apache 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.apache.org/licenses/LICENSE-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 net.ontopia.topicmaps.nav2.utils; import java.util.List; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import javax.servlet.ServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.JspTagException; import net.ontopia.utils.StringUtils; import net.ontopia.topicmaps.query.parser.QName; import net.ontopia.topicmaps.query.parser.ParseContextIF; import net.ontopia.topicmaps.query.parser.AntlrWrapException; import net.ontopia.topicmaps.nav2.core.NavigatorApplicationIF; import net.ontopia.topicmaps.nav2.core.NavigatorConfigurationIF; import net.ontopia.topicmaps.nav2.core.UserIF; import net.ontopia.topicmaps.nav2.core.NavigatorPageIF; import net.ontopia.topicmaps.nav2.impl.framework.User; import net.ontopia.topicmaps.nav2.impl.framework.InteractionELSupport; import net.ontopia.topicmaps.nav2.taglibs.logic.ContextTag; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * INTERNAL: Framework related utility class providing some helper * methods needed to easier for examples access user information. */ public final class FrameworkUtils { // initialization of logging facility private static Logger log = LoggerFactory .getLogger(FrameworkUtils.class.getName()); /** * INTERNAL: Gets the context tag from the request scope. */ public static ContextTag getContextTag(PageContext pageContext) { return getContextTag(pageContext.getRequest()); } /** * INTERNAL: Gets the context tag from the request. */ public static ContextTag getContextTag(ServletRequest request) { return (ContextTag) request.getAttribute(NavigatorApplicationIF.CONTEXT_KEY); } /** * INTERNAL: Gets user object out of session scope. */ public static UserIF getUser(PageContext pageContext) { return getUser(pageContext, true); } /** * INTERNAL: Gets user object out of session scope. */ public static UserIF getUser(PageContext pageContext, boolean create) { try { Object obj = pageContext.getAttribute(NavigatorApplicationIF.USER_KEY, PageContext.SESSION_SCOPE); if (obj != null && obj instanceof UserIF) return (UserIF) obj; else // if no user object exists just create a new one return (create ? createUserSession(pageContext) : null); } catch (java.lang.IllegalStateException e) { // sessions not allowed in page, so get the user from the request scope instead Object obj = pageContext.getAttribute(NavigatorApplicationIF.USER_KEY, PageContext.REQUEST_SCOPE); if (obj != null && obj instanceof UserIF) return (UserIF) obj; else // if no user object exists just create a new one return (create ? createUserSession(pageContext, PageContext.REQUEST_SCOPE) : null); } } /** * INTERNAL: Create new user object in session scope. */ public static UserIF createUserSession(PageContext pageContext) { return createUserSession(pageContext, PageContext.SESSION_SCOPE); } /** * INTERNAL: Create new user object in given scope. */ public static UserIF createUserSession(PageContext pageContext, int scope) { NavigatorConfigurationIF navConf = NavigatorUtils.getNavigatorApplication(pageContext).getConfiguration(); // try to retrieve the user name from the request, otherwise null String username = null; if (pageContext.getRequest() instanceof HttpServletRequest) username = ((HttpServletRequest) pageContext.getRequest()).getRemoteUser(); // create new user object UserIF user = new User(username, navConf); // set MVS settings user = setDefaultMVS(navConf, user); // set user object to session scope pageContext.setAttribute(NavigatorApplicationIF.USER_KEY, user, scope); log.debug("New user object ('" + user.getId() + "') created and bound in scope ( " + scope + ")."); return user; } /** * INTERNAL: Reset MVS settings in user object in session scope. */ public static void resetMVSsettingsInUserSession(PageContext pageContext) { NavigatorConfigurationIF navConf = NavigatorUtils.getNavigatorApplication(pageContext).getConfiguration(); //! UserIF user = (UserIF) pageContext.getAttribute(NavigatorApplicationIF.USER_KEY, //! PageContext.SESSION_SCOPE); UserIF user = getUser(pageContext, false); if (user == null) return; // ignore if no user // reset MVS settings user = setDefaultMVS(navConf, user); // set user object to session scope (TODO: support other contexts?) pageContext.setAttribute(NavigatorApplicationIF.USER_KEY, user, PageContext.SESSION_SCOPE); log.info("MVS settings in user session has been reset."); } /** * INTERNAL: Evaluates a string of space-separated variable names as a list * of collections, and returns it. */ public static List evaluateParameterList(PageContext pageContext, String params) throws JspTagException { if (params != null && !params.equals("")) return getMultipleValuesAsList(params, pageContext); else return Collections.EMPTY_LIST; } /** * INTERNAL: Returns the values retrieved from the given variable * names or qnames in the order given. * * @param params - variable names or qnames, separated by whitespaces. */ private static List getMultipleValuesAsList(String params, PageContext pageContext) throws JspTagException { log.debug("getMultipleValuesAsList"); // find parsecontext NavigatorPageIF ctxt = (NavigatorPageIF) pageContext.getAttribute(NavigatorApplicationIF.CONTEXT_KEY, PageContext.REQUEST_SCOPE); ParseContextIF pctxt = (ParseContextIF) ctxt.getDeclarationContext(); // Replace sequences of special characters like \n and \t with single space. // Needed since StringUtils.split() treats special characters as tokens. String paramsNormalized = StringUtils.normalizeWhitespace(params.trim()); // get the values String[] names = StringUtils.split(paramsNormalized); List varlist = new ArrayList(names.length); for (int i = 0; i < names.length; i++) { Collection values; if (names[i].indexOf(':') != -1) { // it's a qname try { values = Collections.singleton(pctxt.getObject(new QName(names[i]))); } catch (AntlrWrapException e) { throw new JspTagException(e.getException().getMessage() + " (in action parameter list)"); } } else // it's a variable name values = InteractionELSupport.extendedGetValue(names[i], pageContext); varlist.add(values); } return varlist; } // ------------------------------------------------------------ // internal helper methods // ------------------------------------------------------------ /** * INTERNAL: Resets MVS settings for given user object. */ private static UserIF setDefaultMVS(NavigatorConfigurationIF navConf, UserIF user) { // get defaults from config and set them if (navConf.getDefaultModel() != null && !navConf.getDefaultModel().equals("")) user.setModel( navConf.getDefaultModel() ); if (navConf.getDefaultView() != null && !navConf.getDefaultView().equals("")) user.setView( navConf.getDefaultView() ); if (navConf.getDefaultSkin() != null && !navConf.getDefaultSkin().equals("")) user.setSkin( navConf.getDefaultSkin() ); return user; } }