001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *     http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.scxml.env.faces;
018    
019    import java.util.Map;
020    
021    import javax.faces.context.FacesContext;
022    
023    import org.apache.commons.scxml.Context;
024    import org.apache.commons.scxml.env.SimpleContext;
025    
026    /**
027     * <p>A Faces Session Context.</p>
028     *
029     * <p>Since the &quot;session map&quot; is obtained from a
030     * <code>FacesContext</code> object using the environment agnostic
031     * <code>getExternalContext()</code>, this <code>Context</code>
032     * will be useful in Servlet as well as Portlet environments.</p>
033     *
034     */
035    public class SessionContext extends SimpleContext {
036    
037        /** Serial version UID. */
038        private static final long serialVersionUID = 1L;
039        /** The map of session scoped variables. */
040        private Map sessionMap;
041        /** Bark if FacesContext is null. */
042        private static final String ERR_HOST_FACES_CTX_NULL =
043            "Host FacesContext cannot be null";
044    
045        /**
046         * Constructor.
047         *
048         * @param fc The current FacesContext
049         */
050        public SessionContext(final FacesContext fc) {
051            this(fc, null);
052        }
053    
054        /**
055         * Constructor.
056         *
057         * @param fc The current FacesContext
058         * @param parent A parent Context, can be null
059         */
060        public SessionContext(final FacesContext fc, final Context parent) {
061            super(parent);
062            if (fc == null) {
063                throw new IllegalArgumentException(ERR_HOST_FACES_CTX_NULL);
064            } else {
065              // only retain the session map
066              this.sessionMap = fc.getExternalContext().getSessionMap();
067            }
068    
069        }
070    
071        /**
072         * Get the value of the given variable in this Context.
073         *
074         * @param name The name of the variable
075         * @return The value (or null)
076         * @see org.apache.commons.scxml.Context#get(java.lang.String)
077         */
078        public Object get(final String name) {
079            Object value = getVars().get(name);
080            if (value == null) {
081                value = sessionMap.get(name);
082            }
083            return value;
084        }
085    
086        /**
087         * Does the given variable exist in this Context.
088         *
089         * @param name The name of the variable
090         * @return boolean true if the variable exists
091         * @see org.apache.commons.scxml.Context#has(java.lang.String)
092         */
093        public boolean has(final String name) {
094            return (sessionMap.containsKey(name) || getVars().containsKey(name));
095        }
096    
097    }
098