MYFACES-4337 [perf] avoid lambda instances / computeIfAbsent
diff --git a/api/src/main/java/javax/faces/component/UIComponent.java b/api/src/main/java/javax/faces/component/UIComponent.java
index 2fd8426..b9657ba 100755
--- a/api/src/main/java/javax/faces/component/UIComponent.java
+++ b/api/src/main/java/javax/faces/component/UIComponent.java
@@ -888,8 +888,12 @@
_systemEventListenerClassMap = new HashMap<>(4, 1f);
}
- List<SystemEventListener> listeners = _systemEventListenerClassMap.computeIfAbsent(eventClass,
- k -> new _DeltaList<>(3));
+ List<SystemEventListener> listeners = _systemEventListenerClassMap.get(eventClass);
+ if (listeners == null)
+ {
+ listeners = new _DeltaList<>(3);
+ _systemEventListenerClassMap.put(eventClass, listeners);
+ }
// Deal with contains? Spec is silent
listeners.add(listener);
@@ -1239,8 +1243,14 @@
if (currentComponent != null)
{
- List<UIComponent> componentStack = (List<UIComponent>) contextAttributes.computeIfAbsent(
- UIComponent._COMPONENT_STACK, k -> new ArrayList<>());
+ List<UIComponent> componentStack = (List<UIComponent>)
+ contextAttributes.get(UIComponent._COMPONENT_STACK);
+ if (componentStack == null)
+ {
+ componentStack = new ArrayList<>();
+ contextAttributes.put(UIComponent._COMPONENT_STACK, componentStack);
+ }
+
componentStack.add(currentComponent);
}
@@ -1256,8 +1266,13 @@
}
else
{
- List<UIComponent> componentStack = (List<UIComponent>) contextAttributes.computeIfAbsent(
- UIComponent._COMPONENT_STACK, k -> new ArrayList<>());
+ List<UIComponent> componentStack = (List<UIComponent>) contextAttributes.get(UIComponent._COMPONENT_STACK);
+ if (componentStack == null)
+ {
+ componentStack = new ArrayList<>();
+ contextAttributes.put(UIComponent._COMPONENT_STACK, componentStack);
+ }
+
componentStack.add(component);
if (component._isCompositeComponent())
{
diff --git a/api/src/main/java/javax/faces/component/UIComponentBase.java b/api/src/main/java/javax/faces/component/UIComponentBase.java
index 433de7b..4838e8b 100755
--- a/api/src/main/java/javax/faces/component/UIComponentBase.java
+++ b/api/src/main/java/javax/faces/component/UIComponentBase.java
@@ -345,9 +345,13 @@
_behaviorsMap = new HashMap<>(5, 1f);
}
- // Normally have client only 1 client behaviour per event name, so size 2 must be sufficient:
- List<ClientBehavior> behaviorsForEvent = _behaviorsMap.computeIfAbsent(eventName,
- k -> new _DeltaList<>(2));
+ List<ClientBehavior> behaviorsForEvent = _behaviorsMap.get(eventName);
+ if (behaviorsForEvent == null)
+ {
+ // Normally have client only 1 client behaviour per event name, so size 2 must be sufficient:
+ behaviorsForEvent = new _DeltaList<>(2);
+ _behaviorsMap.put(eventName, behaviorsForEvent);
+ }
behaviorsForEvent.add(behavior);
_unmodifiableBehaviorsMap = null;
diff --git a/api/src/main/java/javax/faces/component/_DeltaStateHelper.java b/api/src/main/java/javax/faces/component/_DeltaStateHelper.java
index 0f4b627..1b9e089 100644
--- a/api/src/main/java/javax/faces/component/_DeltaStateHelper.java
+++ b/api/src/main/java/javax/faces/component/_DeltaStateHelper.java
@@ -303,14 +303,24 @@
if (_createDeltas(key))
{
//Track delta case
- Map<Object, Boolean> deltaListMapValues = (Map<Object, Boolean>) _deltas.computeIfAbsent(key,
- k -> new InternalDeltaListMap<>(3));
+ Map<Object, Boolean> deltaListMapValues = (Map<Object, Boolean>) _deltas.get(key);
+ if (deltaListMapValues == null)
+ {
+ deltaListMapValues = new InternalDeltaListMap<>(3);
+ _deltas.put(key, deltaListMapValues);
+ }
+
deltaListMapValues.put(value, Boolean.TRUE);
}
//Handle change on full map
- List<Object> fullListValues = (List<Object>) _fullState.computeIfAbsent(key,
- k -> new InternalList<>(3));
+ List<Object> fullListValues = (List<Object>) _fullState.get(key);
+ if (fullListValues == null)
+ {
+ fullListValues = new InternalList<>(3);
+ _fullState.put(key, fullListValues);
+ }
+
fullListValues.add(value);
}
@@ -388,8 +398,13 @@
if (_createDeltas(key))
{
//Track delta case
- Map<String, Object> mapValues = (Map<String, Object>) _deltas.computeIfAbsent(key,
- k -> new InternalMap<>());
+ Map<String, Object> mapValues = (Map<String, Object>) _deltas.get(key);
+ if (mapValues == null)
+ {
+ mapValues = new InternalMap<>();
+ _deltas.put(key, mapValues);
+ }
+
if (mapValues.containsKey(mapKey))
{
returnValue = mapValues.put(mapKey, value);
@@ -402,8 +417,13 @@
}
//Handle change on full map
- Map<String, Object> mapValues = (Map<String, Object>) _fullState.computeIfAbsent(key,
- k -> new InternalMap<>());
+ Map<String, Object> mapValues = (Map<String, Object>) _fullState.get(key);
+ if (mapValues == null)
+ {
+ mapValues = new InternalMap<>();
+ _fullState.put(key, mapValues);
+ }
+
if (returnSet)
{
mapValues.put(mapKey, value);
diff --git a/api/src/main/java/javax/faces/component/behavior/_AjaxBehaviorDeltaStateHelper.java b/api/src/main/java/javax/faces/component/behavior/_AjaxBehaviorDeltaStateHelper.java
index 6e5b3df..aed08f4 100644
--- a/api/src/main/java/javax/faces/component/behavior/_AjaxBehaviorDeltaStateHelper.java
+++ b/api/src/main/java/javax/faces/component/behavior/_AjaxBehaviorDeltaStateHelper.java
@@ -100,13 +100,24 @@
if (_createDeltas())
{
//Track delta case
- Map<Object, Boolean> deltaListMapValues = (Map<Object, Boolean>) _deltas.computeIfAbsent(key,
- k -> new InternalDeltaListMap<>(3, 1f));
+ Map<Object, Boolean> deltaListMapValues = (Map<Object, Boolean>) _deltas.get(key);
+ if (deltaListMapValues == null)
+ {
+ deltaListMapValues = new InternalDeltaListMap<>(3, 1f);
+ _deltas.put(key, deltaListMapValues);
+ }
+
deltaListMapValues.put(value, Boolean.TRUE);
}
//Handle change on full map
- List<Object> fullListValues = (List<Object>) _fullState.computeIfAbsent(key, k -> new InternalList<>(3));
+ List<Object> fullListValues = (List<Object>) _fullState.get(key);
+ if (fullListValues == null)
+ {
+ fullListValues = new InternalList<>(3);
+ _fullState.put(key, fullListValues);
+ }
+
fullListValues.add(value);
}
@@ -180,8 +191,13 @@
if (_createDeltas())
{
//Track delta case
- Map<String, Object> mapValues = (Map<String, Object>) _deltas.computeIfAbsent(key,
- k -> new InternalMap<>(8, 1f));
+ Map<String, Object> mapValues = (Map<String, Object>) _deltas.get(key);
+ if (mapValues == null)
+ {
+ mapValues = new InternalMap<>(8, 1f);
+ _deltas.put(key, mapValues);
+ }
+
if (mapValues.containsKey(mapKey))
{
returnValue = mapValues.put(mapKey, value);
@@ -194,8 +210,13 @@
}
//Handle change on full map
- Map<String, Object> mapValues = (Map<String, Object>) _fullState.computeIfAbsent(key,
- k -> new InternalMap<>(8, 1f));
+ Map<String, Object> mapValues = (Map<String, Object>) _fullState.get(key);
+ if (mapValues == null)
+ {
+ mapValues = new InternalMap<>(8, 1f);
+ _fullState.put(key, mapValues);
+ }
+
if (returnSet)
{
mapValues.put(mapKey, value);
diff --git a/api/src/main/java/javax/faces/component/behavior/_DeltaStateHelper.java b/api/src/main/java/javax/faces/component/behavior/_DeltaStateHelper.java
index c82b36b..1f8dbc8 100644
--- a/api/src/main/java/javax/faces/component/behavior/_DeltaStateHelper.java
+++ b/api/src/main/java/javax/faces/component/behavior/_DeltaStateHelper.java
@@ -195,14 +195,24 @@
if (_createDeltas())
{
//Track delta case
- Map<Object, Boolean> deltaListMapValues = (Map<Object, Boolean>) _deltas.computeIfAbsent(key,
- k -> new InternalDeltaListMap<>(3, 1f));
+ Map<Object, Boolean> deltaListMapValues = (Map<Object, Boolean>) _deltas.get(key);
+ if (deltaListMapValues == null)
+ {
+ deltaListMapValues = new InternalDeltaListMap<>(3, 1f);
+ _deltas.put(key, deltaListMapValues);
+ }
+
deltaListMapValues.put(value, Boolean.TRUE);
}
//Handle change on full map
- List<Object> fullListValues = (List<Object>) _fullState.computeIfAbsent(key,
- k -> new InternalList<>(3));
+ List<Object> fullListValues = (List<Object>) _fullState.get(key);
+ if (fullListValues == null)
+ {
+ fullListValues = new InternalList<>(3);
+ _fullState.put(key, fullListValues);
+ }
+
fullListValues.add(value);
}
@@ -279,8 +289,13 @@
if (_createDeltas())
{
//Track delta case
- Map<String, Object> mapValues = (Map<String, Object>) _deltas.computeIfAbsent(key,
- k -> new InternalMap<>());
+ Map<String, Object> mapValues = (Map<String, Object>) _deltas.get(key);
+ if (mapValues == null)
+ {
+ mapValues = new InternalMap<>();
+ _deltas.put(key, mapValues);
+ }
+
if (mapValues.containsKey(mapKey))
{
returnValue = mapValues.put(mapKey, value);
@@ -293,8 +308,13 @@
}
//Handle change on full map
- Map<String, Object> mapValues = (Map<String, Object>) _fullState.computeIfAbsent(key,
- k -> new InternalMap<>());
+ Map<String, Object> mapValues = (Map<String, Object>) _fullState.get(key);
+ if (mapValues == null)
+ {
+ mapValues = new InternalMap<>();
+ _fullState.put(key, mapValues);
+ }
+
if (returnSet)
{
mapValues.put(mapKey, value);
diff --git a/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java b/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
index b0b7b3d..310fd81 100755
--- a/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
+++ b/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
@@ -20,9 +20,6 @@
import java.beans.BeanDescriptor;
import java.beans.BeanInfo;
-import java.beans.IntrospectionException;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Arrays;
@@ -34,7 +31,6 @@
import java.util.Locale;
import java.util.Map;
import java.util.MissingResourceException;
-import java.util.Objects;
import java.util.TimeZone;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -121,6 +117,9 @@
import org.apache.myfaces.flow.FlowHandlerImpl;
import org.apache.myfaces.lifecycle.LifecycleImpl;
import org.apache.myfaces.config.MyfacesConfig;
+import org.apache.myfaces.core.api.shared.lang.LambdaPropertyDescriptor;
+import org.apache.myfaces.core.api.shared.lang.PropertyDescriptorUtils;
+import org.apache.myfaces.core.api.shared.lang.PropertyDescriptorWrapper;
import org.apache.myfaces.util.lang.Assert;
import org.apache.myfaces.util.lang.ClassUtils;
import org.apache.myfaces.util.lang.Lazy;
@@ -219,9 +218,6 @@
private SearchKeywordResolver _searchExpressionResolver;
- private Map<Class<?>, Map<String, PropertyDescriptor>> converterPDCache
- = new ConcurrentHashMap<>();
-
/**
* Represents semantic null in _componentClassMap.
*/
@@ -984,12 +980,21 @@
try
{
- boolean managed = _cdiManagedBehaviorMap.computeIfAbsent(behaviorClass, k ->
+ if (!_cdiManagedBehaviorMap.containsKey(behaviorClass))
{
- FacesBehavior annotation = k.getAnnotation(FacesBehavior.class);
- return annotation == null ? false : annotation.managed();
- });
-
+ FacesBehavior annotation = behaviorClass.getAnnotation(FacesBehavior.class);
+ if (annotation != null && annotation.managed())
+ {
+ _cdiManagedBehaviorMap.put(behaviorClass, true);
+ }
+ else
+ {
+ _cdiManagedBehaviorMap.put(behaviorClass, false);
+ }
+ }
+
+ boolean managed = _cdiManagedBehaviorMap.get(behaviorClass);
+
Behavior behavior = null;
if (managed)
{
@@ -1338,12 +1343,21 @@
try
{
- boolean managed = _cdiManagedConverterMap.computeIfAbsent(converterClass, k ->
+ if (!_cdiManagedConverterMap.containsKey(converterClass))
{
- FacesConverter annotation = k.getAnnotation(FacesConverter.class);
- return annotation == null ? false : annotation.managed();
- });
+ FacesConverter annotation = converterClass.getAnnotation(FacesConverter.class);
+ if (annotation != null && annotation.managed())
+ {
+ _cdiManagedConverterMap.put(converterClass, true);
+ }
+ else
+ {
+ _cdiManagedConverterMap.put(converterClass, false);
+ }
+ }
+ boolean managed = _cdiManagedConverterMap.get(converterClass);
+
Converter converter = null;
if (managed)
{
@@ -1562,42 +1576,29 @@
if (converterConfig != null && !converterConfig.getProperties().isEmpty())
{
- Map<String, PropertyDescriptor> pds = converterPDCache.computeIfAbsent(converterClass, c ->
- {
- HashMap<String, PropertyDescriptor> map = new HashMap<>(converterConfig.getProperties().size());
- try
- {
- for (PropertyDescriptor pd : Introspector.getBeanInfo(c).getPropertyDescriptors())
- {
- for (Property property : converterConfig.getProperties())
- {
- if (Objects.equals(pd.getName(), property.getPropertyName()))
- {
- map.put(property.getPropertyName(), pd);
- }
- }
- }
- }
- catch (IntrospectionException e)
- {
- log.log(Level.SEVERE,
- "Could not read properties for setting default values of converter: "
- + converterClass.getSimpleName(),
- e);
- }
- return map;
- });
+ Map<String, ? extends PropertyDescriptorWrapper> pds = PropertyDescriptorUtils.getPropertyDescriptors(
+ FacesContext.getCurrentInstance().getExternalContext(),
+ converterClass);
for (int i = 0; i < converterConfig.getProperties().size(); i++)
{
Property property = converterConfig.getProperties().get(i);
try
{
- PropertyDescriptor pd = pds.get(property.getPropertyName());
+ PropertyDescriptorWrapper pd = pds.get(property.getPropertyName());
// see MYFACES-2602 - skip set value if it was already set via constructor and now != null
if (!pd.getPropertyType().isPrimitive())
{
- Object defaultValue = pd.getReadMethod().invoke(converter);
+ Object defaultValue;
+ if (pd instanceof LambdaPropertyDescriptor)
+ {
+ defaultValue = ((LambdaPropertyDescriptor) pd).getReadFunction().apply(converter);
+ }
+ else
+ {
+ defaultValue = pd.getReadMethod().invoke(converter);
+ }
+
if (defaultValue != null)
{
continue;
@@ -1605,7 +1606,14 @@
}
Object convertedValue = ClassUtils.convertToType(property.getDefaultValue(), pd.getPropertyType());
- pd.getWriteMethod().invoke(converter, convertedValue);
+ if (pd instanceof LambdaPropertyDescriptor)
+ {
+ ((LambdaPropertyDescriptor) pd).getWriteFunction().accept(converter, convertedValue);
+ }
+ else
+ {
+ pd.getWriteMethod().invoke(converter, convertedValue);
+ }
}
catch (Throwable th)
{
@@ -1640,26 +1648,28 @@
_classToResourceDependencyMap.remove(inspectedClass);
}
- List<ResourceDependency> dependencyList = _classToResourceDependencyMap.computeIfAbsent(inspectedClass, k ->
+ List<ResourceDependency> dependencyList = _classToResourceDependencyMap.get(inspectedClass);
+ if (dependencyList == null)
{
- List<ResourceDependency> values = new ArrayList<>(5);
+ dependencyList = new ArrayList<>(5);
- ResourceDependency dependency = k.getAnnotation(ResourceDependency.class);
+ ResourceDependency dependency = inspectedClass.getAnnotation(ResourceDependency.class);
if (dependency != null)
{
- values.add(dependency);
+ dependencyList.add(dependency);
}
- ResourceDependencies dependencies = k.getAnnotation(ResourceDependencies.class);
+ ResourceDependencies dependencies = inspectedClass.getAnnotation(ResourceDependencies.class);
if (dependencies != null)
{
- values.addAll(Arrays.asList(dependencies.value()));
+ dependencyList.addAll(Arrays.asList(dependencies.value()));
}
- return values.isEmpty() ? Collections.emptyList() : values;
- });
+ _classToResourceDependencyMap.put(inspectedClass,
+ dependencyList.isEmpty() ? Collections.emptyList() : dependencyList);
+ }
- if (dependencyList != null && !dependencyList.isEmpty())
+ if (!dependencyList.isEmpty())
{
for (int i = 0, size = dependencyList.size(); i < size; i++)
{
@@ -1826,12 +1836,21 @@
try
{
- boolean managed = _cdiManagedValidatorMap.computeIfAbsent(validatorClass, k ->
+ if (!_cdiManagedValidatorMap.containsKey(validatorClass))
{
- FacesValidator annotation = k.getAnnotation(FacesValidator.class);
- return annotation == null ? false : annotation.managed();
- });
+ FacesValidator annotation = validatorClass.getAnnotation(FacesValidator.class);
+ if (annotation != null && annotation.managed())
+ {
+ _cdiManagedValidatorMap.put(validatorClass, true);
+ }
+ else
+ {
+ _cdiManagedValidatorMap.put(validatorClass, false);
+ }
+ }
+ boolean managed = _cdiManagedValidatorMap.get(validatorClass);
+
Validator validator = null;
if (managed)
{
@@ -1964,27 +1983,29 @@
_classToListenerForMap.remove(inspectedClass);
}
- List<ListenerFor> listenerForList = _classToListenerForMap.computeIfAbsent(inspectedClass, k ->
+ List<ListenerFor> listenerForList = _classToListenerForMap.get(inspectedClass);
+ if (listenerForList == null)
{
- List<ListenerFor> values = new ArrayList<>();
-
- ListenerFor listener = k.getAnnotation(ListenerFor.class);
+ listenerForList = new ArrayList<>(5);
+
+ ListenerFor listener = inspectedClass.getAnnotation(ListenerFor.class);
if (listener != null)
{
- values.add(listener);
+ listenerForList.add(listener);
}
- ListenersFor listeners = k.getAnnotation(ListenersFor.class);
+ ListenersFor listeners = inspectedClass.getAnnotation(ListenersFor.class);
if (listeners != null)
{
- values.addAll(Arrays.asList(listeners.value()));
+ listenerForList.addAll(Arrays.asList(listeners.value()));
}
- return values.isEmpty() ? Collections.emptyList() : values;
- });
+ _classToListenerForMap.put(inspectedClass,
+ listenerForList.isEmpty() ? Collections.emptyList() : listenerForList);
+ }
// listeners were found through inspection or from cache, handle them
- if (listenerForList != null && !listenerForList.isEmpty())
+ if (!listenerForList.isEmpty())
{
for (int i = 0, size = listenerForList.size(); i < size; i++)
{
diff --git a/impl/src/main/java/org/apache/myfaces/application/ApplicationImplEventManager.java b/impl/src/main/java/org/apache/myfaces/application/ApplicationImplEventManager.java
index 56f4331..6170fc5 100644
--- a/impl/src/main/java/org/apache/myfaces/application/ApplicationImplEventManager.java
+++ b/impl/src/main/java/org/apache/myfaces/application/ApplicationImplEventManager.java
@@ -113,9 +113,13 @@
public void subscribeToEvent(Class<? extends SystemEvent> systemEventClass, Class<?> sourceClass,
SystemEventListener listener)
{
- List<EventInfo> eventInfos = globalListeners.computeIfAbsent(systemEventClass,
- k -> new CopyOnWriteArrayList<>());
-
+ List<EventInfo> eventInfos = globalListeners.get(systemEventClass);
+ if (eventInfos == null)
+ {
+ eventInfos = new CopyOnWriteArrayList<>();
+ globalListeners.put(systemEventClass, eventInfos);
+ }
+
EventInfo eventInfo = new EventInfo();
eventInfo.systemEventClass = systemEventClass;
eventInfo.sourceClass = sourceClass;
diff --git a/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java b/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java
index 088523c..6757d9d 100755
--- a/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java
+++ b/impl/src/main/java/org/apache/myfaces/application/NavigationHandlerImpl.java
@@ -1137,7 +1137,12 @@
// ignore includeViewParams, faces-include-view-params and faces-redirect
continue;
}
- List<String> paramValues = params.computeIfAbsent(splitParam[0], k -> new ArrayList<>());
+ List<String> paramValues = params.get(splitParam[0]);
+ if (paramValues == null)
+ {
+ paramValues = new ArrayList<>(5);
+ params.put(splitParam[0], paramValues);
+ }
paramValues.add(splitParam[1]);
}
else
diff --git a/impl/src/main/java/org/apache/myfaces/application/viewstate/StateCacheServerSide.java b/impl/src/main/java/org/apache/myfaces/application/viewstate/StateCacheServerSide.java
index cc86326..eedbc81 100644
--- a/impl/src/main/java/org/apache/myfaces/application/viewstate/StateCacheServerSide.java
+++ b/impl/src/main/java/org/apache/myfaces/application/viewstate/StateCacheServerSide.java
@@ -136,8 +136,13 @@
protected void saveSerializedViewInSession(FacesContext context, Object serializedView)
{
Map<String, Object> sessionMap = context.getExternalContext().getSessionMap();
- SerializedViewCollection viewCollection = (SerializedViewCollection) sessionMap.computeIfAbsent(
- SERIALIZED_VIEW_SESSION_ATTR, k -> sessionViewStorageFactory.createSerializedViewCollection(context));
+ SerializedViewCollection viewCollection = (SerializedViewCollection)
+ sessionMap.get(SERIALIZED_VIEW_SESSION_ATTR);
+ if (viewCollection == null)
+ {
+ viewCollection = sessionViewStorageFactory.createSerializedViewCollection(context);
+ sessionMap.put(SERIALIZED_VIEW_SESSION_ATTR, viewCollection);
+ }
Map<Object,Object> attributeMap = context.getAttributes();
diff --git a/impl/src/main/java/org/apache/myfaces/component/visit/PartialVisitContext.java b/impl/src/main/java/org/apache/myfaces/component/visit/PartialVisitContext.java
index 7fa3f0f..eba2810 100644
--- a/impl/src/main/java/org/apache/myfaces/component/visit/PartialVisitContext.java
+++ b/impl/src/main/java/org/apache/myfaces/component/visit/PartialVisitContext.java
@@ -343,8 +343,12 @@
// NamingContainer client id. If not, create the
// Collection for this NamingContainer client id and
// stash it away in our map
- Collection<String> c = _subtreeClientIds.computeIfAbsent(namingContainerClientId,
- k -> new ArrayList<>(5));
+ Collection<String> c = _subtreeClientIds.get(namingContainerClientId);
+ if (c == null)
+ {
+ c = new ArrayList<>(5);
+ _subtreeClientIds.put(namingContainerClientId, c);
+ }
// Stash away the client id
c.add(clientId);
diff --git a/impl/src/main/java/org/apache/myfaces/context/RequestViewContext.java b/impl/src/main/java/org/apache/myfaces/context/RequestViewContext.java
index ed4c201..5fd5b1f 100644
--- a/impl/src/main/java/org/apache/myfaces/context/RequestViewContext.java
+++ b/impl/src/main/java/org/apache/myfaces/context/RequestViewContext.java
@@ -84,7 +84,7 @@
if (create && map == null)
{
- map = new HashMap<>();
+ map = new HashMap<>(5);
ctx.getAttributes().put(VIEW_CONTEXT_KEY, map);
}
diff --git a/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentSupport.java b/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentSupport.java
index 53126d5..b49bd95 100644
--- a/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentSupport.java
+++ b/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentSupport.java
@@ -736,8 +736,13 @@
if (fcc.isUsingPSSOnThisView() && !fcc.isRefreshTransientBuildOnPSSPreserveState())
{
UIViewRoot root = getViewRoot(ctx, parent);
- FaceletState map = (FaceletState) root.getAttributes().computeIfAbsent(FACELET_STATE_INSTANCE,
- k -> new FaceletState());
+ FaceletState map = (FaceletState) root.getAttributes().get(FACELET_STATE_INSTANCE);
+ if (map == null)
+ {
+ map = new FaceletState();
+ root.getAttributes().put(FACELET_STATE_INSTANCE, map);
+ }
+
map.putState(uniqueId, value);
}
}
diff --git a/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/FaceletState.java b/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/FaceletState.java
index 1ef77ed..9bb572b 100644
--- a/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/FaceletState.java
+++ b/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/FaceletState.java
@@ -140,7 +140,13 @@
bindingsMap = new HashMap<>();
}
- Map<String, ValueExpression> bindings = bindingsMap.computeIfAbsent(uniqueId, k -> new HashMap<>());
+ Map<String, ValueExpression> bindings = bindingsMap.get(uniqueId);
+ if (bindings == null)
+ {
+ bindings = new HashMap<>();
+ bindingsMap.put(uniqueId, bindings);
+ }
+
bindings.put(key, expr);
}