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    }