001    // Copyright 2006, 2007, 2008, 2009, 2010 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.ioc.Resource;
019    import org.apache.tapestry5.services.AssetFactory;
020    import org.apache.tapestry5.services.AssetPathConverter;
021    import org.apache.tapestry5.services.Context;
022    import org.apache.tapestry5.services.assets.AssetPathConstructor;
023    
024    /**
025     * Implementation of {@link AssetFactory} for assets that are part of the web application context.
026     *
027     * @see org.apache.tapestry5.internal.services.ContextResource
028     */
029    public class ContextAssetFactory implements AssetFactory
030    {
031        private final AssetPathConstructor assetPathConstructor;
032    
033        private final Resource rootResource;
034    
035        private final AssetPathConverter converter;
036    
037        private final boolean invariant;
038    
039        public ContextAssetFactory(AssetPathConstructor assetPathConstructor, Context context,
040    
041                                   AssetPathConverter converter)
042        {
043            this.assetPathConstructor = assetPathConstructor;
044            this.converter = converter;
045    
046            rootResource = new ContextResource(context, "/");
047            invariant = this.converter.isInvariant();
048        }
049    
050        public Asset createAsset(Resource resource)
051        {
052            String defaultPath = assetPathConstructor.constructAssetPath(RequestConstants.CONTEXT_FOLDER, resource.getPath());
053    
054            if (invariant)
055            {
056                return createInvariantAsset(resource, defaultPath);
057            }
058    
059            return createVariantAsset(resource, defaultPath);
060        }
061    
062        private Asset createInvariantAsset(final Resource resource, final String defaultPath)
063        {
064            return new AbstractAsset(true)
065            {
066                private String clientURL;
067    
068                public Resource getResource()
069                {
070                    return resource;
071                }
072    
073                public String toClientURL()
074                {
075                    if (clientURL == null)
076                    {
077                        clientURL = converter.convertAssetPath(defaultPath);
078                    }
079    
080                    return clientURL;
081                }
082            };
083        }
084    
085        private Asset createVariantAsset(final Resource resource, final String defaultPath)
086        {
087            return new AbstractAsset(false)
088            {
089                public Resource getResource()
090                {
091                    return resource;
092                }
093    
094                public String toClientURL()
095                {
096                    return converter.convertAssetPath(defaultPath);
097                }
098            };
099        }
100    
101        /**
102         * Returns the root {@link org.apache.tapestry5.internal.services.ContextResource}.
103         */
104        public Resource getRootResource()
105        {
106            return rootResource;
107        }
108    }