2012/11/16 Mark Struberg <[email protected]>: > Leo, why do you backport all this stuff to 2.0.x? That makes no sense to me. > >
Yes, I have to maintain all 4 branches, and it is easier if I backport everything to 2.0.x, because if the code has less differences, that simplifies maintenance in the long term. Really 2.0.x and 2.1.x are very similar. > > > > ----- Original Message ----- >> From: "[email protected]" <[email protected]> >> To: [email protected] >> Cc: >> Sent: Friday, November 16, 2012 7:01 AM >> Subject: svn commit: r1410205 [2/2] - >> /myfaces/core/branches/2.0.x/impl/src/main/java/org/apache/myfaces/application/viewstate/ >> >> Modified: >> myfaces/core/branches/2.0.x/impl/src/main/java/org/apache/myfaces/application/viewstate/ServerSideStateCacheImpl.java >> URL: >> http://svn.apache.org/viewvc/myfaces/core/branches/2.0.x/impl/src/main/java/org/apache/myfaces/application/viewstate/ServerSideStateCacheImpl.java?rev=1410205&r1=1410204&r2=1410205&view=diff >> ============================================================================== >> --- >> myfaces/core/branches/2.0.x/impl/src/main/java/org/apache/myfaces/application/viewstate/ServerSideStateCacheImpl.java >> (original) >> +++ >> myfaces/core/branches/2.0.x/impl/src/main/java/org/apache/myfaces/application/viewstate/ServerSideStateCacheImpl.java >> Fri Nov 16 06:01:51 2012 >> @@ -25,29 +25,17 @@ 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 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.ReferenceMap; >> import org.apache.myfaces.application.StateCache; >> import >> org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFWebConfigParam; >> import org.apache.myfaces.shared.renderkit.RendererUtils; >> @@ -56,15 +44,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"; >> >> /** >> @@ -75,7 +63,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 >> @@ -91,13 +79,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. >> @@ -108,7 +96,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. >> @@ -119,17 +107,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 >> @@ -156,22 +144,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, >> @@ -182,21 +170,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; >> >> /** >> @@ -204,23 +192,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"; >> >> /** >> @@ -228,14 +216,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; >> >> @@ -589,440 +577,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>(); >> - >> - // 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; >> - } >> - >> - /** >> - * @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 >> @@ -1103,349 +657,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.0.x/impl/src/main/java/org/apache/myfaces/application/viewstate/SessionViewStorageFactory.java >> URL: >> http://svn.apache.org/viewvc/myfaces/core/branches/2.0.x/impl/src/main/java/org/apache/myfaces/application/viewstate/SessionViewStorageFactory.java?rev=1410205&view=auto >> ============================================================================== >> --- >> myfaces/core/branches/2.0.x/impl/src/main/java/org/apache/myfaces/application/viewstate/SessionViewStorageFactory.java >> (added) >> +++ >> myfaces/core/branches/2.0.x/impl/src/main/java/org/apache/myfaces/application/viewstate/SessionViewStorageFactory.java >> Fri Nov 16 06:01:51 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.0.x/impl/src/main/java/org/apache/myfaces/application/viewstate/SessionViewStorageFactory.java >> ------------------------------------------------------------------------------ >> svn:eol-style = native >>
