Reset conduit states with only one access to PerthreadMap
Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/a6604d83 Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/a6604d83 Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/a6604d83 Branch: refs/heads/master Commit: a6604d83c12787f1a41dbe52fc53f5888de0b484 Parents: 097d0fe Author: Michael Mikhulya <[email protected]> Authored: Fri Jan 30 18:42:39 2015 +0300 Committer: Jochen Kemnade <[email protected]> Committed: Mon Feb 16 12:18:25 2015 +0100 ---------------------------------------------------------------------- .../InternalComponentResourcesImpl.java | 50 ++++++-------------- .../internal/transform/ParameterConduit.java | 8 ++-- .../internal/transform/ParameterWorker.java | 24 ++++++---- 3 files changed, 34 insertions(+), 48 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/a6604d83/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java index 886d773..2081b20 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/structure/InternalComponentResourcesImpl.java @@ -30,6 +30,7 @@ import org.apache.tapestry5.ioc.internal.util.InternalUtils; import org.apache.tapestry5.ioc.internal.util.LockSupport; import org.apache.tapestry5.ioc.internal.util.TapestryException; import org.apache.tapestry5.ioc.services.PerThreadValue; +import org.apache.tapestry5.ioc.util.CaseInsensitiveMap; import org.apache.tapestry5.model.ComponentModel; import org.apache.tapestry5.runtime.Component; import org.apache.tapestry5.runtime.PageLifecycleCallbackHub; @@ -80,8 +81,8 @@ public class InternalComponentResourcesImpl extends LockSupport implements Inter // Maps from parameter name to ParameterConduit, used to support mixins // which need access to the containing component's PC's - // Guarded by: LockSupport - private NamedSet<ParameterConduit> conduits; + private Map<String, ParameterConduit> conduits; + private PerThreadValue<Map<String, Object>> conduitStates; // Guarded by: LockSupport private Messages messages; @@ -137,14 +138,6 @@ public class InternalComponentResourcesImpl extends LockSupport implements Inter } - private static Worker<ParameterConduit> RESET_PARAMETER_CONDUIT = new Worker<ParameterConduit>() - { - public void work(ParameterConduit value) - { - value.reset(); - } - }; - public InternalComponentResourcesImpl(Page page, ComponentPageElement element, ComponentResources containerResources, ComponentPageElementResources elementResources, String completeId, String nestedId, Instantiator componentInstantiator, boolean mixin) @@ -578,7 +571,13 @@ public class InternalComponentResourcesImpl extends LockSupport implements Inter if (variablesMap != null) variablesMap.clear(); - resetParameterConduits(); + if (conduitStates != null) + { + Map<String, Object> conduidStatesMap = conduitStates.get(); + + if (conduidStatesMap != null) + conduidStatesMap.clear(); + } } public void addPageLifecycleListener(PageLifecycleListener listener) @@ -596,32 +595,9 @@ public class InternalComponentResourcesImpl extends LockSupport implements Inter page.addResetListener(listener); } - private void resetParameterConduits() - { - try - { - acquireReadLock(); - - if (conduits != null) - { - conduits.eachValue(RESET_PARAMETER_CONDUIT); - } - } finally - { - releaseReadLock(); - } - } - public ParameterConduit getParameterConduit(String parameterName) { - try - { - acquireReadLock(); - return NamedSet.get(conduits, parameterName); - } finally - { - releaseReadLock(); - } + return conduits.get(parameterName); } public void setParameterConduit(String parameterName, ParameterConduit conduit) @@ -635,6 +611,7 @@ public class InternalComponentResourcesImpl extends LockSupport implements Inter createConduits(); } + conduit.init(conduitStates); conduits.put(parameterName, conduit); } finally { @@ -649,7 +626,8 @@ public class InternalComponentResourcesImpl extends LockSupport implements Inter upgradeReadLockToWriteLock(); if (conduits == null) { - conduits = NamedSet.create(); + conduits = CollectionFactory.newCaseInsensitiveMap(); + conduitStates = elementResources.createPerThreadValue(); } } finally { http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/a6604d83/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterConduit.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterConduit.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterConduit.java index e2a99a7..ab2bc37 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterConduit.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterConduit.java @@ -14,9 +14,12 @@ package org.apache.tapestry5.internal.transform; +import java.util.Map; + import org.apache.tapestry5.Binding; import org.apache.tapestry5.annotations.Parameter; import org.apache.tapestry5.internal.InternalComponentResources; +import org.apache.tapestry5.ioc.services.PerThreadValue; import org.apache.tapestry5.ioc.services.TypeCoercer; import org.apache.tapestry5.plastic.FieldConduit; @@ -41,8 +44,5 @@ public interface ParameterConduit extends FieldConduit<Object> */ boolean isBound(); - /** - * Resets the conduit, clearing any <em>temporarily</em> cached data (from a non-invariant {@link Binding}). - */ - void reset(); + void init(PerThreadValue conduitStates); } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/a6604d83/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java index 9025fdc..533aef0 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java @@ -22,6 +22,7 @@ import org.apache.tapestry5.func.Predicate; import org.apache.tapestry5.internal.InternalComponentResources; import org.apache.tapestry5.internal.bindings.LiteralBinding; import org.apache.tapestry5.internal.services.ComponentClassCache; +import org.apache.tapestry5.ioc.internal.util.CollectionFactory; import org.apache.tapestry5.ioc.internal.util.InternalUtils; import org.apache.tapestry5.ioc.internal.util.TapestryException; import org.apache.tapestry5.ioc.services.PerThreadValue; @@ -38,6 +39,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Comparator; +import java.util.Map; /** * Responsible for identifying parameters via the {@link org.apache.tapestry5.annotations.Parameter} annotation on @@ -73,16 +75,13 @@ public class ParameterWorker implements ComponentClassTransformWorker2 private final TypeCoercer typeCoercer; - private final PerthreadManager perThreadManager; - public ParameterWorker(ComponentClassCache classCache, BindingSource bindingSource, - ComponentDefaultProvider defaultProvider, TypeCoercer typeCoercer, PerthreadManager perThreadManager) + ComponentDefaultProvider defaultProvider, TypeCoercer typeCoercer) { this.classCache = classCache; this.bindingSource = bindingSource; this.defaultProvider = defaultProvider; this.typeCoercer = typeCoercer; - this.perThreadManager = perThreadManager; } private final Comparator<PlasticField> byPrincipalThenName = new Comparator<PlasticField>() @@ -174,8 +173,6 @@ public class ParameterWorker implements ComponentClassTransformWorker2 final Class fieldType = classCache.forName(fieldTypeName); - final PerThreadValue<ParameterState> stateValue = perThreadManager.createValue(); - // Rely on some code generation in the component to set the default binding from // the field, or from a default method. @@ -192,6 +189,8 @@ public class ParameterWorker implements ComponentClassTransformWorker2 private boolean invariant = false; + PerThreadValue<Map<String, ParameterState>> states; + { // Inform the ComponentResources about the parameter conduit, so it can be // shared with mixins. @@ -208,13 +207,18 @@ public class ParameterWorker implements ComponentClassTransformWorker2 private ParameterState getState() { - ParameterState state = stateValue.get(); + Map<String, ParameterState> map = states.get(); + if (map == null) { + map = CollectionFactory.newMap(); + states.set(map); + } + ParameterState state = map.get(parameterName); if (state == null) { state = new ParameterState(); state.value = defaultValue; - stateValue.set(state); + map.put(parameterName, state); } return state; @@ -447,6 +451,10 @@ public class ParameterWorker implements ComponentClassTransformWorker2 parameterBinding = new LiteralBinding(null, "default " + parameterName, defaultValue); } + @Override + public void init(PerThreadValue threadLocalStorage) { + states = (PerThreadValue<Map<String, ParameterState>>)threadLocalStorage; + } }; }
