001// Licensed under the Apache License, Version 2.0 (the "License"); 002// you may not use this file except in compliance with the License. 003// You may obtain a copy of the License at 004// 005// http://www.apache.org/licenses/LICENSE-2.0 006// 007// Unless required by applicable law or agreed to in writing, software 008// distributed under the License is distributed on an "AS IS" BASIS, 009// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 010// See the License for the specific language governing permissions and 011// limitations under the License. 012 013package org.apache.tapestry5.modules; 014 015import org.apache.tapestry5.internal.pageload.PageLoaderImpl; 016import org.apache.tapestry5.internal.services.*; 017import org.apache.tapestry5.internal.services.ajax.AjaxFormUpdateController; 018import org.apache.tapestry5.internal.services.javascript.JavaScriptStackPathConstructor; 019import org.apache.tapestry5.internal.structure.ComponentPageElementResourcesSource; 020import org.apache.tapestry5.internal.structure.ComponentPageElementResourcesSourceImpl; 021import org.apache.tapestry5.ioc.MappedConfiguration; 022import org.apache.tapestry5.ioc.OrderedConfiguration; 023import org.apache.tapestry5.ioc.ServiceBinder; 024import org.apache.tapestry5.ioc.annotations.Contribute; 025import org.apache.tapestry5.ioc.annotations.Marker; 026import org.apache.tapestry5.services.*; 027import org.apache.tapestry5.services.transform.ControlledPackageType; 028 029import javax.servlet.http.Cookie; 030 031import java.util.Map; 032 033/** 034 * {@link org.apache.tapestry5.modules.TapestryModule} has gotten too complicated and it is nice to demarkate public 035 * (and stable) from internal (and volatile). 036 */ 037@Marker(Core.class) 038public class InternalModule 039{ 040 /** 041 * Bind all the private/internal services of Tapestry. 042 */ 043 public static void bind(ServiceBinder binder) 044 { 045 binder.bind(PersistentFieldManager.class, PersistentFieldManagerImpl.class); 046 binder.bind(TemplateParser.class, TemplateParserImpl.class); 047 binder.bind(PageResponseRenderer.class, PageResponseRendererImpl.class); 048 binder.bind(PageMarkupRenderer.class, PageMarkupRendererImpl.class); 049 binder.bind(LinkSource.class, LinkSourceImpl.class); 050 binder.bind(LocalizationSetter.class, LocalizationSetterImpl.class); 051 binder.bind(PageElementFactory.class, PageElementFactoryImpl.class); 052 binder.bind(ResourceStreamer.class, ResourceStreamerImpl.class); 053 binder.bind(ClientPersistentFieldStorage.class, ClientPersistentFieldStorageImpl.class); 054 binder.bind(PageRenderQueue.class, PageRenderQueueImpl.class); 055 binder.bind(AjaxPartialResponseRenderer.class, AjaxPartialResponseRendererImpl.class); 056 binder.bind(PageContentTypeAnalyzer.class, PageContentTypeAnalyzerImpl.class); 057 binder.bind(ComponentPageElementResourcesSource.class, ComponentPageElementResourcesSourceImpl.class); 058 binder.bind(RequestSecurityManager.class, RequestSecurityManagerImpl.class); 059 binder.bind(InternalRequestGlobals.class, InternalRequestGlobalsImpl.class); 060 binder.bind(EndOfRequestEventHub.class); 061 binder.bind(ResponseCompressionAnalyzer.class, ResponseCompressionAnalyzerImpl.class); 062 binder.bind(ComponentModelSource.class); 063 binder.bind(JavaScriptStackPathConstructor.class); 064 binder.bind(AjaxFormUpdateController.class); 065 binder.bind(ResourceDigestManager.class, ResourceDigestManagerImpl.class); // Remove in Tapestry 5.5 066 binder.bind(RequestPageCache.class, RequestPageCacheImpl.class); 067 binder.bind(ComponentInstantiatorSource.class); 068 binder.bind(InternalComponentInvalidationEventHub.class); 069 binder.bind(PageSource.class, PageSourceImpl.class); 070 binder.bind(PageLoader.class, PageLoaderImpl.class).preventReloading(); 071 binder.bind(UnknownActivationContextHandler.class, UnknownActivationContextHandlerImpl.class); 072 binder.bind(ReloadHelper.class, ReloadHelperImpl.class); 073 binder.bind(FormControlNameManager.class, FormControlNameManagerImpl.class); 074 075 } 076 077 public static CookieSource buildCookieSource(final RequestGlobals requestGlobals) 078 { 079 return new CookieSource() 080 { 081 082 public Cookie[] getCookies() 083 { 084 return requestGlobals.getHTTPServletRequest().getCookies(); 085 } 086 }; 087 } 088 089 public static CookieSink buildCookieSink(final RequestGlobals requestGlobals) 090 { 091 return new CookieSink() 092 { 093 094 public void addCookie(Cookie cookie) 095 { 096 requestGlobals.getHTTPServletResponse().addCookie(cookie); 097 } 098 }; 099 } 100 101 /** 102 * Contributes: 103 * <dl> 104 * <dt>LinkDecoration (instance of {@link LinkDecorationListener})</dt> 105 * <dd>Triggers events for notifications about links</dd> 106 * <dl> 107 * 108 * @since 5.2.0 109 */ 110 public static void contributeLinkSource(OrderedConfiguration<LinkCreationListener2> configuration) 111 { 112 configuration.addInstance("LinkDecoration", LinkDecorationListener.class); 113 } 114 115 /** 116 * Contributes packages identified by {@link ComponentClassResolver#getControlledPackageMapping()}. 117 * 118 * @since 5.3 119 */ 120 @Contribute(ComponentInstantiatorSource.class) 121 public static void configureControlledPackagesFromComponentClassResolver( 122 MappedConfiguration<String, ControlledPackageType> configuration, ComponentClassResolver resolver) 123 { 124 for (Map.Entry<String, ControlledPackageType> entry : resolver.getControlledPackageMapping().entrySet()) 125 { 126 configuration.add(entry.getKey(), entry.getValue()); 127 } 128 } 129}