    001    // Copyright 2008, 2009, 2010 The Apache Software Foundation
    002    //
    003    // Licensed under the Apache License, Version 2.0 (the "License");
    004    // you may not use this file except in compliance with the License.
    005    // You may obtain a copy of the License at
    006    //
    007    // http://www.apache.org/licenses/LICENSE-2.0
    008    //
    009    // Unless required by applicable law or agreed to in writing, software
    010    // distributed under the License is distributed on an "AS IS" BASIS,
    011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    012    // See the License for the specific language governing permissions and
    013    // limitations under the License.
    014
    015    package org.apache.tapestry5.internal.structure;
    016
    017    import java.util.Map;
    018
    019    import org.apache.tapestry5.internal.services.ComponentClassCache;
    020    import org.apache.tapestry5.internal.services.LinkSource;
    021    import org.apache.tapestry5.internal.services.RequestPageCache;
    022    import org.apache.tapestry5.ioc.LoggerSource;
    023    import org.apache.tapestry5.ioc.OperationTracker;
    024    import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
    025    import org.apache.tapestry5.ioc.services.PerthreadManager;
    026    import org.apache.tapestry5.ioc.services.TypeCoercer;
    027    import org.apache.tapestry5.services.ComponentClassResolver;
    028    import org.apache.tapestry5.services.ContextValueEncoder;
    029    import org.apache.tapestry5.services.messages.ComponentMessagesSource;
    030    import org.apache.tapestry5.services.pageload.ComponentResourceSelector;
    031
    032    public class ComponentPageElementResourcesSourceImpl implements ComponentPageElementResourcesSource
    033    {
    034        private final Map<ComponentResourceSelector, ComponentPageElementResources> cache = CollectionFactory
    035                .newConcurrentMap();
    036
    037        private final ComponentMessagesSource componentMessagesSource;
    038
    039        private final TypeCoercer typeCoercer;
    040
    041        private final ComponentClassCache componentClassCache;
    042
    043        private final ContextValueEncoder contextValueEncoder;
    044
    045        private final LinkSource linkSource;
    046
    047        private final RequestPageCache requestPageCache;
    048
    049        private final ComponentClassResolver componentClassResolver;
    050
    051        private final LoggerSource loggerSource;
    052
    053        private final OperationTracker tracker;
    054
    055        private final PerthreadManager perThreadManager;
    056
    057        public ComponentPageElementResourcesSourceImpl(ComponentMessagesSource componentMessagesSource,
    058                TypeCoercer typeCoercer, ComponentClassCache componentClassCache, ContextValueEncoder contextValueEncoder,
    059                LinkSource linkSource, RequestPageCache requestPageCache, ComponentClassResolver componentClassResolver,
    060                LoggerSource loggerSource, OperationTracker tracker, PerthreadManager perThreadManager)
    061        {
    062            this.componentMessagesSource = componentMessagesSource;
    063            this.typeCoercer = typeCoercer;
    064            this.componentClassCache = componentClassCache;
    065            this.contextValueEncoder = contextValueEncoder;
    066            this.linkSource = linkSource;
    067            this.requestPageCache = requestPageCache;
    068            this.componentClassResolver = componentClassResolver;
    069            this.loggerSource = loggerSource;
    070            this.tracker = tracker;
    071            this.perThreadManager = perThreadManager;
    072        }
    073
    074        public ComponentPageElementResources get(ComponentResourceSelector selector)
    075        {
    076            assert selector != null;
    077
    078            ComponentPageElementResources result = cache.get(selector);
    079
    080            if (result == null)
    081            {
    082                result = new ComponentPageElementResourcesImpl(selector, componentMessagesSource, typeCoercer,
    083                        componentClassCache, contextValueEncoder, linkSource, requestPageCache, componentClassResolver,
    084                        loggerSource, tracker, perThreadManager);
    085
    086                // Small race condition here, where we may create two instances of the CPER for the same locale,
    087                // but that's not worth worrying about.
    088
    089                cache.put(selector, result);
    090            }
    091
    092            return result;
    093        }
    094    }