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 }