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
015package org.apache.tapestry5.internal.structure;
016
017import org.apache.tapestry5.ComponentResources;
018import org.apache.tapestry5.Link;
019import org.apache.tapestry5.internal.InternalConstants;
020import org.apache.tapestry5.internal.services.ComponentClassCache;
021import org.apache.tapestry5.internal.services.LinkSource;
022import org.apache.tapestry5.internal.services.RequestPageCache;
023import org.apache.tapestry5.ioc.Invokable;
024import org.apache.tapestry5.ioc.LoggerSource;
025import org.apache.tapestry5.ioc.Messages;
026import org.apache.tapestry5.ioc.OperationTracker;
027import org.apache.tapestry5.ioc.services.PerThreadValue;
028import org.apache.tapestry5.ioc.services.PerthreadManager;
029import org.apache.tapestry5.ioc.services.TypeCoercer;
030import org.apache.tapestry5.model.ComponentModel;
031import org.apache.tapestry5.services.ComponentClassResolver;
032import org.apache.tapestry5.services.ContextValueEncoder;
033import org.apache.tapestry5.services.messages.ComponentMessagesSource;
034import org.apache.tapestry5.services.pageload.ComponentResourceSelector;
035import org.slf4j.Logger;
036
037public 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}