    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
    015package org.apache.tapestry5.internal.services;
    016
    017import org.apache.tapestry5.ComponentResources;
    018import org.apache.tapestry5.commons.Messages;
    019import org.apache.tapestry5.commons.ObjectLocator;
    020import org.apache.tapestry5.commons.util.CollectionFactory;
    021import org.apache.tapestry5.internal.transform.ReadOnlyComponentFieldConduit;
    022import org.apache.tapestry5.model.MutableComponentModel;
    023import org.apache.tapestry5.plastic.ComputedValue;
    024import org.apache.tapestry5.plastic.InstanceContext;
    025import org.apache.tapestry5.plastic.PlasticField;
    026import org.apache.tapestry5.services.pageload.ComponentResourceSelector;
    027import org.apache.tapestry5.services.transform.InjectionProvider2;
    028import org.slf4j.Logger;
    029
    030import java.util.Locale;
    031import 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 */
    036public 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}