You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2012/11/16 07:03:51 UTC

svn commit: r1410208 [2/2] - /myfaces/core/branches/2.2.x/impl/src/main/java/org/apache/myfaces/application/viewstate/

Modified: myfaces/core/branches/2.2.x/impl/src/main/java/org/apache/myfaces/application/viewstate/ServerSideStateCacheImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.2.x/impl/src/main/java/org/apache/myfaces/application/viewstate/ServerSideStateCacheImpl.java?rev=1410208&r1=1410207&r2=1410208&view=diff
==============================================================================
--- myfaces/core/branches/2.2.x/impl/src/main/java/org/apache/myfaces/application/viewstate/ServerSideStateCacheImpl.java (original)
+++ myfaces/core/branches/2.2.x/impl/src/main/java/org/apache/myfaces/application/viewstate/ServerSideStateCacheImpl.java Fri Nov 16 06:03:50 2012
@@ -25,31 +25,19 @@ import java.io.InputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.OutputStream;
-import java.io.Serializable;
 import java.security.AccessController;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
-import java.util.Random;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.zip.GZIPInputStream;
 import java.util.zip.GZIPOutputStream;
-import javax.faces.application.ProjectStage;
 
 import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 import javax.faces.lifecycle.ClientWindow;
-import org.apache.commons.codec.DecoderException;
-import org.apache.commons.codec.binary.Hex;
 
-import org.apache.commons.collections.map.AbstractReferenceMap;
-import org.apache.commons.collections.map.LRUMap;
-import org.apache.commons.collections.map.ReferenceMap;
 import org.apache.myfaces.application.StateCache;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFWebConfigParam;
 import org.apache.myfaces.shared.renderkit.RendererUtils;
@@ -58,15 +46,15 @@ import org.apache.myfaces.shared.util.We
 
 class ServerSideStateCacheImpl extends StateCache<Object, Object>
 {
-    private static final Logger log = Logger.getLogger(ServerSideStateCacheImpl.class.getName());
+    public static final Logger log = Logger.getLogger(ServerSideStateCacheImpl.class.getName());
     
-    private static final String SERIALIZED_VIEW_SESSION_ATTR= 
+    public static final String SERIALIZED_VIEW_SESSION_ATTR= 
         ServerSideStateCacheImpl.class.getName() + ".SERIALIZED_VIEW";
     
-    private static final String RESTORED_SERIALIZED_VIEW_REQUEST_ATTR = 
+    public static final String RESTORED_SERIALIZED_VIEW_REQUEST_ATTR = 
         ServerSideStateCacheImpl.class.getName() + ".RESTORED_SERIALIZED_VIEW";
 
-    private static final String RESTORED_VIEW_KEY_REQUEST_ATTR = 
+    public static final String RESTORED_VIEW_KEY_REQUEST_ATTR = 
         ServerSideStateCacheImpl.class.getName() + ".RESTORED_VIEW_KEY";
     
     /**
@@ -77,7 +65,7 @@ class ServerSideStateCacheImpl extends S
      * 
      */
     @JSFWebConfigParam(defaultValue="20",since="1.1", classType="java.lang.Integer", group="state", tags="performance")
-    private static final String NUMBER_OF_VIEWS_IN_SESSION_PARAM = "org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION";
+    public static final String NUMBER_OF_VIEWS_IN_SESSION_PARAM = "org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION";
 
     /**
      * Indicates the amount of views (default is not active) that should be stored in session between sequential
@@ -93,13 +81,13 @@ class ServerSideStateCacheImpl extends S
      * the other ones will throw ViewExpiredException.</p>
      */
     @JSFWebConfigParam(since="2.0.6", classType="java.lang.Integer", group="state", tags="performance")
-    private static final String NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION_PARAM
+    public static final String NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION_PARAM
             = "org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION";
     
     /**
      * Default value for <code>org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION</code> context parameter.
      */
-    private static final int DEFAULT_NUMBER_OF_VIEWS_IN_SESSION = 20;
+    public static final int DEFAULT_NUMBER_OF_VIEWS_IN_SESSION = 20;
 
     /**
      * Indicate if the state should be serialized before save it on the session. 
@@ -110,7 +98,7 @@ class ServerSideStateCacheImpl extends S
      * </p>
      */
     @JSFWebConfigParam(defaultValue="true",since="1.1", expectedValues="true,false", group="state", tags="performance")
-    private static final String SERIALIZE_STATE_IN_SESSION_PARAM = "org.apache.myfaces.SERIALIZE_STATE_IN_SESSION";
+    public static final String SERIALIZE_STATE_IN_SESSION_PARAM = "org.apache.myfaces.SERIALIZE_STATE_IN_SESSION";
 
     /**
      * Indicates that the serialized state will be compressed before it is written to the session. By default true.
@@ -121,17 +109,17 @@ class ServerSideStateCacheImpl extends S
      * If <code>false</code> the state will not be compressed.
      */
     @JSFWebConfigParam(defaultValue="true",since="1.1", expectedValues="true,false", group="state", tags="performance")
-    private static final String COMPRESS_SERVER_STATE_PARAM = "org.apache.myfaces.COMPRESS_STATE_IN_SESSION";
+    public static final String COMPRESS_SERVER_STATE_PARAM = "org.apache.myfaces.COMPRESS_STATE_IN_SESSION";
 
     /**
      * Default value for <code>org.apache.myfaces.COMPRESS_STATE_IN_SESSION</code> context parameter.
      */
-    private static final boolean DEFAULT_COMPRESS_SERVER_STATE_PARAM = true;
+    public static final boolean DEFAULT_COMPRESS_SERVER_STATE_PARAM = true;
 
     /**
      * Default value for <code>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</code> context parameter.
      */
-    private static final boolean DEFAULT_SERIALIZE_STATE_IN_SESSION = true;
+    public static final boolean DEFAULT_SERIALIZE_STATE_IN_SESSION = true;
 
     /**
      * Define the way of handle old view references(views removed from session), making possible to
@@ -158,22 +146,22 @@ class ServerSideStateCacheImpl extends S
      */
     @JSFWebConfigParam(defaultValue="off", expectedValues="off, no, hard-soft, soft, soft-weak, weak",
                        since="1.2.5", group="state", tags="performance")
-    private static final String CACHE_OLD_VIEWS_IN_SESSION_MODE = "org.apache.myfaces.CACHE_OLD_VIEWS_IN_SESSION_MODE";
+    public static final String CACHE_OLD_VIEWS_IN_SESSION_MODE = "org.apache.myfaces.CACHE_OLD_VIEWS_IN_SESSION_MODE";
     
     /**
      * This option uses an hard-soft ReferenceMap, but it could cause a 
      * memory leak, because the keys are not removed by any method
      * (MYFACES-1660). So use with caution.
      */
-    private static final String CACHE_OLD_VIEWS_IN_SESSION_MODE_HARD_SOFT = "hard-soft";
+    public static final String CACHE_OLD_VIEWS_IN_SESSION_MODE_HARD_SOFT = "hard-soft";
     
-    private static final String CACHE_OLD_VIEWS_IN_SESSION_MODE_SOFT = "soft";
+    public static final String CACHE_OLD_VIEWS_IN_SESSION_MODE_SOFT = "soft";
     
-    private static final String CACHE_OLD_VIEWS_IN_SESSION_MODE_SOFT_WEAK = "soft-weak";
+    public static final String CACHE_OLD_VIEWS_IN_SESSION_MODE_SOFT_WEAK = "soft-weak";
     
-    private static final String CACHE_OLD_VIEWS_IN_SESSION_MODE_WEAK = "weak";
+    public static final String CACHE_OLD_VIEWS_IN_SESSION_MODE_WEAK = "weak";
     
-    private static final String CACHE_OLD_VIEWS_IN_SESSION_MODE_OFF = "off";
+    public static final String CACHE_OLD_VIEWS_IN_SESSION_MODE_OFF = "off";
 
     /**
      * Allow use flash scope to keep track of the views used in session and the previous ones,
@@ -184,21 +172,21 @@ class ServerSideStateCacheImpl extends S
      * The default value is false.</p>
      */
     @JSFWebConfigParam(since="2.0.6", defaultValue="false", expectedValues="true, false", group="state")
-    private static final String USE_FLASH_SCOPE_PURGE_VIEWS_IN_SESSION
+    public static final String USE_FLASH_SCOPE_PURGE_VIEWS_IN_SESSION
             = "org.apache.myfaces.USE_FLASH_SCOPE_PURGE_VIEWS_IN_SESSION";
 
-    private static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_NONE = "none";
-    private static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_SECURE_RANDOM = "secureRandom";
-    private static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_RANDOM = "random";
+    public static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_NONE = "none";
+    public static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_SECURE_RANDOM = "secureRandom";
+    public static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_RANDOM = "random";
     
     /**
      * Adds a random key to the generated view state session token.
      */
     @JSFWebConfigParam(since="2.1.9, 2.0.15", expectedValues="secureRandom, random, none", 
             defaultValue="none", group="state")
-    private static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_PARAM
+    public static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_PARAM
             = "org.apache.myfaces.RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN";
-    private static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_PARAM_DEFAULT = 
+    public static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_PARAM_DEFAULT = 
             RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_NONE;
 
     /**
@@ -206,23 +194,23 @@ class ServerSideStateCacheImpl extends S
      * By default is 8. 
      */
     @JSFWebConfigParam(since="2.1.9, 2.0.15", defaultValue="8", group="state")
-    private static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_LENGTH_PARAM 
+    public static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_LENGTH_PARAM 
             = "org.apache.myfaces.RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_LENGTH";
-    private static final int RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_LENGTH_PARAM_DEFAULT = 8;
+    public static final int RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_LENGTH_PARAM_DEFAULT = 8;
 
     /**
      * Sets the random class to initialize the secure random id generator. 
      * By default it uses java.security.SecureRandom
      */
     @JSFWebConfigParam(since="2.1.9, 2.0.15", group="state")
-    private static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_SECURE_RANDOM_CLASS_PARAM
+    public static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_SECURE_RANDOM_CLASS_PARAM
             = "org.apache.myfaces.RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_SECURE_RANDOM_CLASS";
     
     /**
      * Sets the random provider to initialize the secure random id generator.
      */
     @JSFWebConfigParam(since="2.1.9, 2.0.15", group="state")
-    private static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_SECURE_RANDOM_PROVIDER_PARAM
+    public static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_SECURE_RANDOM_PROVIDER_PARAM
             = "org.apache.myfaces.RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_SECURE_RANDOM_PROVIDER";
     
     /**
@@ -230,14 +218,14 @@ class ServerSideStateCacheImpl extends S
      * By default is SHA1PRNG
      */
     @JSFWebConfigParam(since="2.1.9, 2.0.15", defaultValue="SHA1PRNG", group="state")
-    private static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_SECURE_RANDOM_ALGORITM_PARAM 
+    public static final String RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_SECURE_RANDOM_ALGORITM_PARAM 
             = "org.apache.myfaces.RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_SECURE_RANDOM_ALGORITM";
     
     
-    private static final int UNCOMPRESSED_FLAG = 0;
-    private static final int COMPRESSED_FLAG = 1;
+    public static final int UNCOMPRESSED_FLAG = 0;
+    public static final int COMPRESSED_FLAG = 1;
     
-    private static final Object[] EMPTY_STATES = new Object[]{null, null};
+    public static final Object[] EMPTY_STATES = new Object[]{null, null};
 
     //private static final int JSF_SEQUENCE_INDEX = 0;
     
@@ -607,469 +595,6 @@ class ServerSideStateCacheImpl extends S
         }
     }
     
-    protected static class SerializedViewCollection implements Serializable
-    {
-        private static final long serialVersionUID = -3734849062185115847L;
-
-        private final List<SerializedViewKey> _keys
-                = new ArrayList<SerializedViewKey>(DEFAULT_NUMBER_OF_VIEWS_IN_SESSION);
-        private final Map<SerializedViewKey, Object> _serializedViews = new HashMap<SerializedViewKey, Object>();
-        
-        private final Map<SerializedViewKey, SerializedViewKey> _precedence = 
-            new HashMap<SerializedViewKey, SerializedViewKey>();
-        
-        private Map<String, SerializedViewKey> _lastWindowKeys = null;
-
-        // old views will be hold as soft references which will be removed by
-        // the garbage collector if free memory is low
-        private transient Map<Object, Object> _oldSerializedViews = null;
-
-        public synchronized void add(FacesContext context, Object state, SerializedViewKey key,
-                                     SerializedViewKey previousRestoredKey)
-        {
-            if (state == null)
-            {
-                state = EMPTY_STATES;
-            }
-            else if (state instanceof Object[] &&
-                ((Object[])state).length == 2 &&
-                ((Object[])state)[0] == null &&
-                ((Object[])state)[1] == null)
-            {
-                // The generated state can be considered zero, set it as null
-                // into the map.
-                state = null;
-            }
-            
-            Integer maxCount = getNumberOfSequentialViewsInSession(context);
-            if (maxCount != null)
-            {
-                if (previousRestoredKey != null)
-                {
-                    if (!_serializedViews.isEmpty())
-                    {
-                        _precedence.put((SerializedViewKey) key, previousRestoredKey);
-                    }
-                    else
-                    {
-                        // Note when the session is invalidated, _serializedViews map is empty,
-                        // but we could have a not null previousRestoredKey (the last one before
-                        // invalidate the session), so we need to check that condition before
-                        // set the precence. In that way, we ensure the precedence map will always
-                        // have valid keys.
-                        previousRestoredKey = null;
-                    }
-                }
-            }
-            _serializedViews.put(key, state);
-
-            while (_keys.remove(key))
-            {
-                // do nothing
-            }
-            _keys.add(key);
-
-            if (previousRestoredKey != null && maxCount != null && maxCount > 0)
-            {
-                int count = 0;
-                SerializedViewKey previousKey = (SerializedViewKey) key;
-                do
-                {
-                  previousKey = _precedence.get(previousKey);
-                  count++;
-                } while (previousKey != null && count < maxCount);
-                
-                if (previousKey != null)
-                {
-                    SerializedViewKey keyToRemove = (SerializedViewKey) previousKey;
-                    // In theory it should be only one key but just to be sure
-                    // do it in a loop, but in this case if cache old views is on,
-                    // put on that map.
-                    do
-                    {
-                        while (_keys.remove(keyToRemove))
-                        {
-                            // do nothing
-                        }
-
-                        if (_serializedViews.containsKey(keyToRemove) &&
-                                !CACHE_OLD_VIEWS_IN_SESSION_MODE_OFF.equals(getCacheOldViewsInSessionMode(context)))
-                        {
-                            getOldSerializedViewsMap().put(keyToRemove, _serializedViews.remove(keyToRemove));
-                        }
-                        else
-                        {
-                            _serializedViews.remove(keyToRemove);
-                        }
-                    
-                        keyToRemove = _precedence.remove(keyToRemove);
-                    }  while(keyToRemove != null);
-                }
-            }
-
-            int views = getNumberOfViewsInSession(context);
-            while (_keys.size() > views)
-            {
-                key = _keys.remove(0);
-                
-                if (maxCount != null && maxCount > 0)
-                {
-                    SerializedViewKey keyToRemove = (SerializedViewKey) key;
-                    // Note in this case the key to delete is the oldest one, 
-                    // so it could be at least one precedence, but to be safe
-                    // do it with a loop.
-                    do
-                    {
-                        keyToRemove = _precedence.remove(keyToRemove);
-                    } while (keyToRemove != null);
-                }
-
-                if (_serializedViews.containsKey(key) &&
-                    !CACHE_OLD_VIEWS_IN_SESSION_MODE_OFF.equals(getCacheOldViewsInSessionMode(context)))
-                {
-                    
-                    getOldSerializedViewsMap().put(key, _serializedViews.remove(key));
-                }
-                else
-                {
-                    _serializedViews.remove(key);
-                }
-            }
-        }
-
-        protected Integer getNumberOfSequentialViewsInSession(FacesContext context)
-        {
-            return WebConfigParamUtils.getIntegerInitParameter(context.getExternalContext(), 
-                    NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION_PARAM);
-        }
-        
-        /**
-         * Reads the amount (default = 20) of views to be stored in session.
-         * @see #NUMBER_OF_VIEWS_IN_SESSION_PARAM
-         * @param context FacesContext for the current request, we are processing
-         * @return Number vf views stored in the session
-         */
-        protected int getNumberOfViewsInSession(FacesContext context)
-        {
-            String value = context.getExternalContext().getInitParameter(
-                    NUMBER_OF_VIEWS_IN_SESSION_PARAM);
-            int views = DEFAULT_NUMBER_OF_VIEWS_IN_SESSION;
-            if (value != null)
-            {
-                try
-                {
-                    views = Integer.parseInt(value);
-                    if (views <= 0)
-                    {
-                        log.severe("Configured value for " + NUMBER_OF_VIEWS_IN_SESSION_PARAM
-                                  + " is not valid, must be an value > 0, using default value ("
-                                  + DEFAULT_NUMBER_OF_VIEWS_IN_SESSION);
-                        views = DEFAULT_NUMBER_OF_VIEWS_IN_SESSION;
-                    }
-                }
-                catch (Throwable e)
-                {
-                    log.log(Level.SEVERE, "Error determining the value for " + NUMBER_OF_VIEWS_IN_SESSION_PARAM
-                              + ", expected an integer value > 0, using default value ("
-                              + DEFAULT_NUMBER_OF_VIEWS_IN_SESSION + "): " + e.getMessage(), e);
-                }
-            }
-            return views;
-        }
-        
-        public synchronized void putLastWindowKey(FacesContext context, String id, SerializedViewKey key)
-        {
-            if (_lastWindowKeys == null)
-            {
-                Integer i = getNumberOfSequentialViewsInSession(context);
-                int j = getNumberOfViewsInSession(context);
-                if (i != null && i.intValue() > 0)
-                {
-                    _lastWindowKeys = new LRUMap((j / i.intValue()) + 1);
-                }
-                else
-                {
-                    _lastWindowKeys = new LRUMap(j + 1);
-                }
-            }
-            _lastWindowKeys.put(id, key);
-        }
-        
-        public SerializedViewKey getLastWindowKey(FacesContext context, String id)
-        {
-            if (_lastWindowKeys != null)
-            {
-                return _lastWindowKeys.get(id);
-            }
-            return null;
-        }
-
-        /**
-         * @return old serialized views map
-         */
-        @SuppressWarnings("unchecked")
-        protected Map<Object, Object> getOldSerializedViewsMap()
-        {
-            FacesContext context = FacesContext.getCurrentInstance();
-            if (_oldSerializedViews == null && context != null)
-            {
-                String cacheMode = getCacheOldViewsInSessionMode(context); 
-                if (CACHE_OLD_VIEWS_IN_SESSION_MODE_WEAK.equals(cacheMode))
-                {
-                    _oldSerializedViews = new ReferenceMap(AbstractReferenceMap.WEAK, AbstractReferenceMap.WEAK, true);
-                }
-                else if (CACHE_OLD_VIEWS_IN_SESSION_MODE_SOFT_WEAK.equals(cacheMode))
-                {
-                    _oldSerializedViews = new ReferenceMap(AbstractReferenceMap.SOFT, AbstractReferenceMap.WEAK, true);
-                }
-                else if (CACHE_OLD_VIEWS_IN_SESSION_MODE_SOFT.equals(cacheMode))
-                {
-                    _oldSerializedViews = new ReferenceMap(AbstractReferenceMap.SOFT, AbstractReferenceMap.SOFT, true);
-                }
-                else if (CACHE_OLD_VIEWS_IN_SESSION_MODE_HARD_SOFT.equals(cacheMode))
-                {
-                    _oldSerializedViews = new ReferenceMap(AbstractReferenceMap.HARD, AbstractReferenceMap.SOFT);
-                }
-            }
-            
-            return _oldSerializedViews;
-        }
-        
-        /**
-         * Reads the value of the <code>org.apache.myfaces.CACHE_OLD_VIEWS_IN_SESSION_MODE</code> context parameter.
-         * 
-         * @since 1.2.5
-         * @param context
-         * @return constant indicating caching mode
-         * @see #CACHE_OLD_VIEWS_IN_SESSION_MODE
-         */
-        protected String getCacheOldViewsInSessionMode(FacesContext context)
-        {
-            String value = context.getExternalContext().getInitParameter(
-                    CACHE_OLD_VIEWS_IN_SESSION_MODE);
-            if (value == null)
-            {
-                return CACHE_OLD_VIEWS_IN_SESSION_MODE_OFF;
-            }
-            else if (value.equalsIgnoreCase(CACHE_OLD_VIEWS_IN_SESSION_MODE_SOFT))
-            {
-                return CACHE_OLD_VIEWS_IN_SESSION_MODE_SOFT;
-            }
-            else if (value.equalsIgnoreCase(CACHE_OLD_VIEWS_IN_SESSION_MODE_SOFT_WEAK))
-            {
-                return CACHE_OLD_VIEWS_IN_SESSION_MODE_SOFT_WEAK;
-            }            
-            else if (value.equalsIgnoreCase(CACHE_OLD_VIEWS_IN_SESSION_MODE_WEAK))
-            {
-                return CACHE_OLD_VIEWS_IN_SESSION_MODE_WEAK;
-            }
-            else if (value.equalsIgnoreCase(CACHE_OLD_VIEWS_IN_SESSION_MODE_HARD_SOFT))
-            {
-                return CACHE_OLD_VIEWS_IN_SESSION_MODE_HARD_SOFT;
-            }
-            else
-            {
-                return CACHE_OLD_VIEWS_IN_SESSION_MODE_OFF;
-            }
-        }
-        
-        public Object get(SerializedViewKey key)
-        {
-            Object value = _serializedViews.get(key);
-            if (value == null)
-            {
-                if (_serializedViews.containsKey(key))
-                {
-                    return EMPTY_STATES;
-                }
-                Map<Object,Object> oldSerializedViewMap = getOldSerializedViewsMap();
-                if (oldSerializedViewMap != null)
-                {
-                    value = oldSerializedViewMap.get(key);
-                    if (value == null && oldSerializedViewMap.containsKey(key) )
-                    {
-                        return EMPTY_STATES;
-                    }
-                }
-            }
-            else if (value instanceof Object[] &&
-                ((Object[])value).length == 2 &&
-                ((Object[])value)[0] == null &&
-                ((Object[])value)[1] == null)
-            {
-                // Remember inside the state map null is stored as an empty array.
-                return null;
-            }
-            return value;
-        }
-    }
-
-    /**
-     * Base implementation where all keys used to identify the state of a view should
-     * extend.
-     */
-    protected abstract static class SerializedViewKey implements Serializable
-    {
-    }
-
-    /**
-     * Implementation of SerializedViewKey, where the hashCode of the viewId is used
-     * and the sequenceId is a numeric value.
-     */
-    private static class IntIntSerializedViewKey extends SerializedViewKey 
-        implements Serializable
-    {
-        private static final long serialVersionUID = -1170697124386063642L;
-        
-        private final int _viewId;
-        private final int _sequenceId;
-        
-        public IntIntSerializedViewKey(int viewId, int sequence)
-        {
-            _sequenceId = sequence;
-            _viewId = viewId;
-        }
-
-        @Override
-        public boolean equals(Object obj)
-        {
-            if (obj == null)
-            {
-                return false;
-            }
-            if (getClass() != obj.getClass())
-            {
-                return false;
-            }
-            final IntIntSerializedViewKey other = (IntIntSerializedViewKey) obj;
-            if (this._viewId != other._viewId)
-            {
-                return false;
-            }
-            if (this._sequenceId != other._sequenceId)
-            {
-                return false;
-            }
-            return true;
-        }
-
-        @Override
-        public int hashCode()
-        {
-            int hash = 7;
-            hash = 83 * hash + this._viewId;
-            hash = 83 * hash + this._sequenceId;
-            return hash;
-        }
-    }
-
-    /**
-     * Implementation of SerializedViewKey, where the hashCode of the viewId is used
-     * and the sequenceId is a string value.
-     */
-    private static class IntByteArraySerializedViewKey extends SerializedViewKey
-        implements Serializable
-    {
-        private final int _viewId;
-        private final byte[] _sequenceId;
-        
-        public IntByteArraySerializedViewKey(int viewId, byte[] sequence)
-        {
-            _sequenceId = sequence;
-            _viewId = viewId;
-        }
-
-        @Override
-        public boolean equals(Object obj)
-        {
-            if (obj == null)
-            {
-                return false;
-            }
-            if (getClass() != obj.getClass())
-            {
-                return false;
-            }
-            final IntByteArraySerializedViewKey other = (IntByteArraySerializedViewKey) obj;
-            if (this._viewId != other._viewId)
-            {
-                return false;
-            }
-            if (!Arrays.equals(this._sequenceId, other._sequenceId))
-            {
-                return false;
-            }
-            return true;
-        }
-
-        @Override
-        public int hashCode()
-        {
-            int hash = 5;
-            hash = 37 * hash + this._viewId;
-            hash = 37 * hash + Arrays.hashCode(this._sequenceId);
-            return hash;
-        }
-    }
-    
-    
-    /**
-     * Implementation of SerializedViewKey, where the viewId and the sequenceId can be
-     * anything.
-     */
-    private static class ReferenceSerializedViewKey<I,K> extends SerializedViewKey
-        implements Serializable
-    {
-        private static final long serialVersionUID = -1170697124386063642L;
-
-        private final I _viewId;
-        private final K _sequenceId;
-
-        public ReferenceSerializedViewKey()
-        {
-            _sequenceId = null;
-            _viewId = null;
-        }
-        public ReferenceSerializedViewKey(I viewId, K sequence)
-        {
-            _sequenceId = sequence;
-            _viewId = viewId;
-        }
-
-        @Override
-        public boolean equals(Object obj)
-        {
-            if (obj == null)
-            {
-                return false;
-            }
-            if (getClass() != obj.getClass())
-            {
-                return false;
-            }
-            final ReferenceSerializedViewKey<I, K> other = (ReferenceSerializedViewKey<I, K>) obj;
-            if (this._viewId != other._viewId && (this._viewId == null || !this._viewId.equals(other._viewId)))
-            {
-                return false;
-            }
-            if (this._sequenceId != other._sequenceId && 
-                (this._sequenceId == null || !this._sequenceId.equals(other._sequenceId)))
-            {
-                return false;
-            }
-            return true;
-        }
-
-        @Override
-        public int hashCode()
-        {
-            int hash = 7;
-            hash = 83 * hash + (this._viewId != null ? this._viewId.hashCode() : 0);
-            hash = 83 * hash + (this._sequenceId != null ? this._sequenceId.hashCode() : 0);
-            return hash;
-        }
-    }
-    
     //------------------------------------- METHOD FROM StateCache ------------------------------------------------
 
     @Override
@@ -1150,349 +675,4 @@ class ServerSideStateCacheImpl extends S
     {
         return sessionViewStorageFactory;
     }
-            
-
-    protected abstract static class KeyFactory<K, V>
-    {
-        
-        /**
-         * Generates a unique key per session 
-         * 
-         * @param facesContext
-         * @return 
-         */
-        public abstract K generateKey(FacesContext facesContext);
-        
-        /**
-         * Encode a Key into a value that will be used as view state session token
-         * 
-         * @param key
-         * @return 
-         */
-        public abstract V encode(K key);
-
-        /**
-         * Decode a view state session token into a key
-         * 
-         * @param value
-         * @return 
-         */
-        public abstract K decode(V value);
-
-    }
-
-    private static class CounterKeyFactory extends KeyFactory<Integer, String>
-    {
-        /**
-         * Take the counter from session scope and increment
-         * 
-         * @param facesContext
-         * @return 
-         */
-        @Override
-        public Integer generateKey(FacesContext facesContext)
-        {
-            ExternalContext externalContext = facesContext.getExternalContext();
-            Object sessionObj = externalContext.getSession(true);
-            Integer sequence = null;
-            synchronized(sessionObj) // synchronized to increase sequence if multiple requests
-                                    // are handled at the same time for the session
-            {
-                Map<String, Object> map = externalContext.getSessionMap();
-                sequence = (Integer) map.get(RendererUtils.SEQUENCE_PARAM);
-                if(sequence == null || sequence.intValue() == Integer.MAX_VALUE)
-                {
-                    sequence = Integer.valueOf(1);
-                }
-                else
-                {
-                    sequence = Integer.valueOf(sequence.intValue() + 1);
-                }
-                map.put(RendererUtils.SEQUENCE_PARAM, sequence);
-            }
-            return sequence;
-        }
-        
-        public String encode(Integer sequence)
-        {
-            return Integer.toString(sequence, Character.MAX_RADIX);
-        }
-                
-        public Integer decode(String serverStateId)
-        {
-             return Integer.valueOf((String) serverStateId, Character.MAX_RADIX);
-        }
-    }
-    
-    /**
-     * This factory generate a key composed by a counter and a random number. The
-     * counter ensures uniqueness, and the random number prevents guess the next
-     * session token.
-     */
-    private static class SecureRandomKeyFactory extends KeyFactory<byte[], String>
-    {
-        private final SessionIdGenerator sessionIdGenerator;
-        private final int length;
-
-        public SecureRandomKeyFactory(FacesContext facesContext)
-        {
-            length = WebConfigParamUtils.getIntegerInitParameter(facesContext.getExternalContext(),
-                    RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_LENGTH_PARAM, 
-                    RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_LENGTH_PARAM_DEFAULT);
-            sessionIdGenerator = new SessionIdGenerator();
-            sessionIdGenerator.setSessionIdLength(length);
-            String secureRandomClass = WebConfigParamUtils.getStringInitParameter(
-                    facesContext.getExternalContext(),
-                    RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_SECURE_RANDOM_CLASS_PARAM);
-            if (secureRandomClass != null)
-            {
-                sessionIdGenerator.setSecureRandomClass(secureRandomClass);
-            }
-            String secureRandomProvider = WebConfigParamUtils.getStringInitParameter(
-                    facesContext.getExternalContext(),
-                    RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_SECURE_RANDOM_PROVIDER_PARAM);
-            if (secureRandomProvider != null)
-            {
-                sessionIdGenerator.setSecureRandomProvider(secureRandomProvider);
-            }
-            String secureRandomAlgorithm = WebConfigParamUtils.getStringInitParameter(
-                    facesContext.getExternalContext(), 
-                    RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_SECURE_RANDOM_ALGORITM_PARAM);
-            if (secureRandomAlgorithm != null)
-            {
-                sessionIdGenerator.setSecureRandomAlgorithm(secureRandomAlgorithm);
-            }
-        }
-        
-        public Integer generateCounterKey(FacesContext facesContext)
-        {
-            ExternalContext externalContext = facesContext.getExternalContext();
-            Object sessionObj = externalContext.getSession(true);
-            Integer sequence = null;
-            synchronized(sessionObj) // synchronized to increase sequence if multiple requests
-                                    // are handled at the same time for the session
-            {
-                Map<String, Object> map = externalContext.getSessionMap();
-                sequence = (Integer) map.get(RendererUtils.SEQUENCE_PARAM);
-                if(sequence == null || sequence.intValue() == Integer.MAX_VALUE)
-                {
-                    sequence = Integer.valueOf(1);
-                }
-                else
-                {
-                    sequence = Integer.valueOf(sequence.intValue() + 1);
-                }
-                map.put(RendererUtils.SEQUENCE_PARAM, sequence);
-            }
-            return sequence;
-        }
-
-        @Override
-        public byte[] generateKey(FacesContext facesContext)
-        {
-            byte[] array = new byte[length];
-            byte[] key = new byte[length+4];
-            
-            sessionIdGenerator.getRandomBytes(array);
-            for (int i = 0; i < array.length; i++)
-            {
-                key[i] = array[i];
-            }
-            int value = generateCounterKey(facesContext);
-            key[array.length] =  (byte) (value >>> 24);
-            key[array.length+1] =  (byte) (value >>> 16);
-            key[array.length+2] =  (byte) (value >>> 8);
-            key[array.length+3] =  (byte) (value);
-            
-            return key;
-        }
-
-        @Override
-        public String encode(byte[] key)
-        {
-            return new String(Hex.encodeHex(key));
-        }
-        
-        @Override
-        public byte[] decode(String value)
-        {
-            try
-            {
-                return Hex.decodeHex(value.toCharArray());
-            }
-            catch (DecoderException ex)
-            {
-                // Cannot decode, ignore silently, later it will be handled as
-                // ViewExpiredException
-            }
-            return null;
-        }
-    }
-    
-    private static class RandomKeyFactory extends KeyFactory<byte[], String>
-    {
-        private final Random random;
-        private final int length;
-        
-        public RandomKeyFactory(FacesContext facesContext)
-        {
-            length = WebConfigParamUtils.getIntegerInitParameter(facesContext.getExternalContext(),
-                    RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_LENGTH_PARAM, 
-                    RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN_LENGTH_PARAM_DEFAULT);
-            random = new Random(((int)System.nanoTime())+this.hashCode());
-        }
-        
-        public Integer generateCounterKey(FacesContext facesContext)
-        {
-            ExternalContext externalContext = facesContext.getExternalContext();
-            Object sessionObj = externalContext.getSession(true);
-            Integer sequence = null;
-            synchronized(sessionObj) // synchronized to increase sequence if multiple requests
-                                    // are handled at the same time for the session
-            {
-                Map<String, Object> map = externalContext.getSessionMap();
-                sequence = (Integer) map.get(RendererUtils.SEQUENCE_PARAM);
-                if(sequence == null || sequence.intValue() == Integer.MAX_VALUE)
-                {
-                    sequence = Integer.valueOf(1);
-                }
-                else
-                {
-                    sequence = Integer.valueOf(sequence.intValue() + 1);
-                }
-                map.put(RendererUtils.SEQUENCE_PARAM, sequence);
-            }
-            return sequence;
-        }
-
-        @Override
-        public byte[] generateKey(FacesContext facesContext)
-        {
-            byte[] array = new byte[length];
-            byte[] key = new byte[length+4];
-            
-            //sessionIdGenerator.getRandomBytes(array);
-            random.nextBytes(array);
-            for (int i = 0; i < array.length; i++)
-            {
-                key[i] = array[i];
-            }
-            int value = generateCounterKey(facesContext);
-            key[array.length] =  (byte) (value >>> 24);
-            key[array.length+1] =  (byte) (value >>> 16);
-            key[array.length+2] =  (byte) (value >>> 8);
-            key[array.length+3] =  (byte) (value);
-
-            return key;
-        }
-
-        @Override
-        public String encode(byte[] key)
-        {
-            return new String(Hex.encodeHex(key));
-        }
-        
-        @Override
-        public byte[] decode(String value)
-        {
-            try
-            {
-                return Hex.decodeHex(value.toCharArray());
-            }
-            catch (DecoderException ex)
-            {
-                // Cannot decode, ignore silently, later it will be handled as
-                // ViewExpiredException
-            }
-            return null;
-        }
-    }
-    
-    /**
-     * 
-     * @param <T>
-     * @param <K>
-     * @param <V> 
-     */
-    protected abstract static class SessionViewStorageFactory <T extends KeyFactory<K,V>, K, V >
-    {
-        private KeyFactory<K, V> keyFactory;
-        
-        public SessionViewStorageFactory(KeyFactory<K, V> keyFactory)
-        {
-            this.keyFactory = keyFactory;
-        }
-        
-        public KeyFactory<K, V> getKeyFactory()
-        {
-            return keyFactory;
-        }
-        
-        public abstract SerializedViewCollection createSerializedViewCollection(
-                FacesContext context);
-        
-        public abstract SerializedViewKey createSerializedViewKey(
-                FacesContext facesContext, String viewId, K key);
-        
-    }
-    
-    private static class CounterSessionViewStorageFactory 
-        extends SessionViewStorageFactory <KeyFactory <Integer,String>, Integer, String>
-    {
-        public CounterSessionViewStorageFactory(KeyFactory<Integer, String> keyFactory)
-        {
-            super(keyFactory);
-        }
-
-        @Override
-        public SerializedViewCollection createSerializedViewCollection(
-                FacesContext context)
-        {
-            return new SerializedViewCollection();
-        }
-
-        @Override
-        public SerializedViewKey createSerializedViewKey(
-                FacesContext context, String viewId, Integer key)
-        {
-            if (context.isProjectStage(ProjectStage.Production))
-            {
-                return new IntIntSerializedViewKey(viewId == null ? 0 : viewId.hashCode(), key);
-            }
-            else
-            {
-                return new ReferenceSerializedViewKey(viewId, key);
-            }
-        }
-    }
-    
-    private static class RandomSessionViewStorageFactory
-        extends SessionViewStorageFactory <KeyFactory <byte[],String>, byte[], String>
-    {
-        public RandomSessionViewStorageFactory(KeyFactory<byte[], String> keyFactory)
-        {
-            super(keyFactory);
-        }
-
-        @Override
-        public SerializedViewCollection createSerializedViewCollection(
-                FacesContext context)
-        {
-            return new SerializedViewCollection();
-        }
-
-        @Override
-        public SerializedViewKey createSerializedViewKey(
-                FacesContext context, String viewId, byte[] key)
-        {
-            if (context.isProjectStage(ProjectStage.Production))
-            {
-                return new IntByteArraySerializedViewKey(viewId == null ? 0 : viewId.hashCode(), key);
-            }
-            else
-            {
-                return new ReferenceSerializedViewKey(viewId, key);
-            }
-        }
-    }
 }

Added: myfaces/core/branches/2.2.x/impl/src/main/java/org/apache/myfaces/application/viewstate/SessionViewStorageFactory.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.2.x/impl/src/main/java/org/apache/myfaces/application/viewstate/SessionViewStorageFactory.java?rev=1410208&view=auto
==============================================================================
--- myfaces/core/branches/2.2.x/impl/src/main/java/org/apache/myfaces/application/viewstate/SessionViewStorageFactory.java (added)
+++ myfaces/core/branches/2.2.x/impl/src/main/java/org/apache/myfaces/application/viewstate/SessionViewStorageFactory.java Fri Nov 16 06:03:50 2012
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 org.apache.myfaces.application.viewstate;
+
+import javax.faces.context.FacesContext;
+
+/**
+ *
+ * @param <T>
+ * @param <K>
+ * @param <V>
+ */
+abstract class SessionViewStorageFactory<T extends KeyFactory<K, V>, K, V>
+{
+    private KeyFactory<K, V> keyFactory;
+
+    public SessionViewStorageFactory(KeyFactory<K, V> keyFactory)
+    {
+        this.keyFactory = keyFactory;
+    }
+
+    public KeyFactory<K, V> getKeyFactory()
+    {
+        return keyFactory;
+    }
+
+    public abstract SerializedViewCollection createSerializedViewCollection(FacesContext context);
+
+    public abstract SerializedViewKey createSerializedViewKey(
+        FacesContext facesContext, String viewId, K key);
+    
+}

Propchange: myfaces/core/branches/2.2.x/impl/src/main/java/org/apache/myfaces/application/viewstate/SessionViewStorageFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native