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 }