    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.ioc.AnnotationProvider;
    018    import org.apache.tapestry5.ioc.ObjectLocator;
    019    import org.apache.tapestry5.ioc.services.MasterObjectProvider;
    020    import org.apache.tapestry5.model.MutableComponentModel;
    021    import org.apache.tapestry5.plastic.PlasticField;
    022    import org.apache.tapestry5.services.transform.InjectionProvider2;
    023
    024    import java.lang.annotation.Annotation;
    025
    026    /**
    027     * Worker for the {@link org.apache.tapestry5.ioc.annotations.Inject} annotation that delegates out to the master
    028     * {@link org.apache.tapestry5.ioc.services.MasterObjectProvider} to access the value. This worker must be scheduled
    029     * after certain other workers, such as {@link BlockInjectionProvider} (which is keyed off a combination of type and
    030     * the Inject annotation).
    031     *
    032     * @see org.apache.tapestry5.ioc.services.MasterObjectProvider
    033     */
    034    public class DefaultInjectionProvider implements InjectionProvider2
    035    {
    036        private final MasterObjectProvider masterObjectProvider;
    037
    038        private final ObjectLocator locator;
    039
    040        private final ComponentClassCache classCache;
    041
    042        public DefaultInjectionProvider(MasterObjectProvider masterObjectProvider, ObjectLocator locator, ComponentClassCache classCache)
    043        {
    044            this.masterObjectProvider = masterObjectProvider;
    045            this.locator = locator;
    046            this.classCache = classCache;
    047        }
    048
    049        public boolean provideInjection(final PlasticField field, ObjectLocator locator, MutableComponentModel componentModel)
    050        {
    051            Class fieldType = classCache.forName(field.getTypeName());
    052
    053            Object injectionValue = masterObjectProvider.provide(fieldType, new AnnotationProvider()
    054            {
    055                public <T extends Annotation> T getAnnotation(Class<T> annotationClass)
    056                {
    057                    return field.getAnnotation(annotationClass);
    058                }
    059            }, this.locator, false);
    060
    061            // Null means that no ObjectProvider could provide the value. We have set up the chain of
    062            // command so that InjectResources can give it a try next. Later, we'll try to match against
    063            // a service.
    064
    065            if (injectionValue != null)
    066            {
    067                field.inject(injectionValue);
    068                return true;
    069            }
    070
    071            return false;
    072        }
    073    }