001 // Copyright 2006, 2007, 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.services; 016 017 import org.apache.tapestry5.ComponentResources; 018 import org.apache.tapestry5.internal.transform.ReadOnlyComponentFieldConduit; 019 import org.apache.tapestry5.ioc.Messages; 020 import org.apache.tapestry5.ioc.ObjectLocator; 021 import org.apache.tapestry5.ioc.internal.util.CollectionFactory; 022 import org.apache.tapestry5.model.MutableComponentModel; 023 import org.apache.tapestry5.plastic.ComputedValue; 024 import org.apache.tapestry5.plastic.InstanceContext; 025 import org.apache.tapestry5.plastic.PlasticField; 026 import org.apache.tapestry5.services.pageload.ComponentResourceSelector; 027 import org.apache.tapestry5.services.transform.InjectionProvider2; 028 import org.slf4j.Logger; 029 030 import java.util.Locale; 031 import java.util.Map; 032 033 /** 034 * Allows for a number of anonymous injections based on the type of field that is to be injected. 035 */ 036 public class CommonResourcesInjectionProvider implements InjectionProvider2 037 { 038 abstract static class ResourceProvider<T> implements ComputedValue<T> 039 { 040 public T get(InstanceContext context) 041 { 042 ComponentResources resources = context.get(ComponentResources.class); 043 044 return get(resources); 045 } 046 047 abstract T get(ComponentResources resources); 048 } 049 050 private static ResourceProvider<ComponentResourceSelector> selectorProvider = new ResourceProvider<ComponentResourceSelector>() 051 { 052 public ComponentResourceSelector get(ComponentResources resources) 053 { 054 return resources.getResourceSelector(); 055 } 056 }; 057 058 private static ResourceProvider<Messages> messagesProvider = new ResourceProvider<Messages>() 059 { 060 061 public Messages get(ComponentResources resources) 062 { 063 return resources.getMessages(); 064 } 065 }; 066 067 private static ResourceProvider<Locale> localeProvider = new ResourceProvider<Locale>() 068 { 069 070 public Locale get(ComponentResources resources) 071 { 072 return resources.getLocale(); 073 } 074 }; 075 076 private static ResourceProvider<Logger> loggerProvider = new ResourceProvider<Logger>() 077 { 078 079 public Logger get(ComponentResources resources) 080 { 081 return resources.getLogger(); 082 } 083 }; 084 085 086 private static ResourceProvider<ComponentResources> resourcesProvider = new ResourceProvider<ComponentResources>() 087 { 088 public ComponentResources get(ComponentResources resources) 089 { 090 return resources; 091 } 092 }; 093 094 private static final Map<String, ResourceProvider> configuration = CollectionFactory.newMap(); 095 096 { 097 add(ComponentResources.class, resourcesProvider); 098 add(ComponentResourceSelector.class, selectorProvider); 099 add(Messages.class, messagesProvider); 100 add(Locale.class, localeProvider); 101 add(Logger.class, loggerProvider); 102 } 103 104 private static void add(Class type, ResourceProvider provider) 105 { 106 configuration.put(type.getName(), provider); 107 } 108 109 public boolean provideInjection(PlasticField field, ObjectLocator locator, MutableComponentModel componentModel) 110 { 111 final ResourceProvider provider = configuration.get(field.getTypeName()); 112 113 if (provider == null) 114 { 115 return false; 116 } 117 118 field.injectComputed(provider); 119 120 return true; 121 } 122 }