    001    // Copyright 2008, 2009, 2010, 2011 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 org.apache.tapestry5.ComponentResources;
    018    import org.apache.tapestry5.Link;
    019    import org.apache.tapestry5.internal.InternalConstants;
    020    import org.apache.tapestry5.internal.services.ComponentClassCache;
    021    import org.apache.tapestry5.internal.services.LinkSource;
    022    import org.apache.tapestry5.internal.services.RequestPageCache;
    023    import org.apache.tapestry5.ioc.Invokable;
    024    import org.apache.tapestry5.ioc.LoggerSource;
    025    import org.apache.tapestry5.ioc.Messages;
    026    import org.apache.tapestry5.ioc.OperationTracker;
    027    import org.apache.tapestry5.ioc.services.PerThreadValue;
    028    import org.apache.tapestry5.ioc.services.PerthreadManager;
    029    import org.apache.tapestry5.ioc.services.TypeCoercer;
    030    import org.apache.tapestry5.model.ComponentModel;
    031    import org.apache.tapestry5.services.ComponentClassResolver;
    032    import org.apache.tapestry5.services.ContextValueEncoder;
    033    import org.apache.tapestry5.services.messages.ComponentMessagesSource;
    034    import org.apache.tapestry5.services.pageload.ComponentResourceSelector;
    035    import org.slf4j.Logger;
    036
    037    public class ComponentPageElementResourcesImpl implements ComponentPageElementResources
    038    {
    039        private final ComponentResourceSelector selector;
    040
    041        private final ComponentMessagesSource componentMessagesSource;
    042
    043        private final TypeCoercer typeCoercer;
    044
    045        private final ComponentClassCache componentClassCache;
    046
    047        private final ContextValueEncoder contextValueEncoder;
    048
    049        private final LinkSource linkSource;
    050
    051        private final RequestPageCache requestPageCache;
    052
    053        private final ComponentClassResolver componentClassResolver;
    054
    055        private final LoggerSource loggerSource;
    056
    057        private final OperationTracker tracker;
    058
    059        private final PerthreadManager perThreadManager;
    060
    061        public ComponentPageElementResourcesImpl(ComponentResourceSelector selector,
    062                ComponentMessagesSource componentMessagesSource, TypeCoercer typeCoercer,
    063                ComponentClassCache componentClassCache, ContextValueEncoder contextValueEncoder, LinkSource linkSource,
    064                RequestPageCache requestPageCache, ComponentClassResolver componentClassResolver,
    065                LoggerSource loggerSource, OperationTracker tracker, PerthreadManager perThreadManager)
    066        {
    067            this.selector = selector;
    068            this.componentMessagesSource = componentMessagesSource;
    069            this.typeCoercer = typeCoercer;
    070            this.componentClassCache = componentClassCache;
    071            this.contextValueEncoder = contextValueEncoder;
    072            this.linkSource = linkSource;
    073            this.requestPageCache = requestPageCache;
    074            this.componentClassResolver = componentClassResolver;
    075            this.loggerSource = loggerSource;
    076            this.tracker = tracker;
    077            this.perThreadManager = perThreadManager;
    078        }
    079
    080        public ComponentResourceSelector getSelector()
    081        {
    082            return selector;
    083        }
    084
    085        public Messages getMessages(ComponentModel componentModel)
    086        {
    087            return componentMessagesSource.getMessages(componentModel, selector);
    088        }
    089
    090        public <S, T> T coerce(S input, Class<T> targetType)
    091        {
    092            return typeCoercer.coerce(input, targetType);
    093        }
    094
    095        public Class toClass(String className)
    096        {
    097            return componentClassCache.forName(className);
    098        }
    099
    100        public Link createComponentEventLink(ComponentResources resources, String eventType, boolean forForm,
    101                Object... context)
    102        {
    103            Page page = requestPageCache.get(resources.getPageName());
    104
    105            return linkSource.createComponentEventLink(page, resources.getNestedId(), eventType, forForm,
    106                    defaulted(context));
    107        }
    108
    109        public Link createPageRenderLink(String pageName, boolean override, Object... context)
    110        {
    111            return linkSource.createPageRenderLink(pageName, override, defaulted(context));
    112        }
    113
    114        public Link createPageRenderLink(Class pageClass, boolean override, Object... context)
    115        {
    116            assert pageClass != null;
    117            String pageName = componentClassResolver.resolvePageClassNameToPageName(pageClass.getName());
    118
    119            return linkSource.createPageRenderLink(pageName, override, defaulted(context));
    120        }
    121
    122        public Logger getEventLogger(Logger componentLogger)
    123        {
    124            String name = "tapestry.events." + componentLogger.getName();
    125
    126            return loggerSource.getLogger(name);
    127        }
    128
    129        public String toClient(Object value)
    130        {
    131            return contextValueEncoder.toClient(value);
    132        }
    133
    134        public <T> T toValue(Class<T> requiredType, String clientValue)
    135        {
    136            return contextValueEncoder.toValue(requiredType, clientValue);
    137        }
    138
    139        private Object[] defaulted(Object[] context)
    140        {
    141            return context == null ? InternalConstants.EMPTY_STRING_ARRAY : context;
    142        }
    143
    144        public <T> T invoke(String description, Invokable<T> operation)
    145        {
    146            return tracker.invoke(description, operation);
    147        }
    148
    149        public void run(String description, Runnable operation)
    150        {
    151            tracker.run(description, operation);
    152        }
    153
    154        public <T> PerThreadValue<T> createPerThreadValue()
    155        {
    156            return perThreadManager.createValue();
    157        }
    158
    159    }