001    // Copyright 2007, 2008, 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.Asset;
018    import org.apache.tapestry5.ComponentResources;
019    import org.apache.tapestry5.annotations.Path;
020    import org.apache.tapestry5.ioc.ObjectLocator;
021    import org.apache.tapestry5.ioc.Resource;
022    import org.apache.tapestry5.ioc.services.SymbolSource;
023    import org.apache.tapestry5.model.MutableComponentModel;
024    import org.apache.tapestry5.plastic.ComputedValue;
025    import org.apache.tapestry5.plastic.InstanceContext;
026    import org.apache.tapestry5.plastic.PlasticField;
027    import org.apache.tapestry5.services.AssetSource;
028    import org.apache.tapestry5.services.transform.InjectionProvider2;
029    
030    import java.util.Locale;
031    
032    /**
033     * Performs injection of assets, based on the presence of the {@link Path} annotation. This is more
034     * useful than the
035     * general {@link AssetObjectProvider}, because relative assets are supported.
036     */
037    public class AssetInjectionProvider implements InjectionProvider2
038    {
039        private final SymbolSource symbolSource;
040    
041        private final AssetSource assetSource;
042    
043        public AssetInjectionProvider(SymbolSource symbolSource, AssetSource assetSource)
044        {
045            this.symbolSource = symbolSource;
046            this.assetSource = assetSource;
047        }
048    
049        public boolean provideInjection(PlasticField field, ObjectLocator locator, MutableComponentModel componentModel)
050        {
051            Path path = field.getAnnotation(Path.class);
052    
053            if (path == null)
054            {
055                return false;
056            }
057    
058            final String expanded = symbolSource.expandSymbols(path.value());
059    
060            final Resource baseResource = componentModel.getBaseResource();
061    
062            ComputedValue<Asset> computedAsset = new ComputedValue<Asset>()
063            {
064                public Asset get(InstanceContext context)
065                {
066                    ComponentResources resources = context.get(ComponentResources.class);
067    
068                    Locale locale = resources.getLocale();
069    
070                    return assetSource.getAsset(baseResource, expanded, locale);
071                }
072            };
073    
074            field.injectComputed(computedAsset);
075    
076            return true;
077        }
078    
079    }