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 015package org.apache.tapestry5.internal.services; 016 017import org.apache.tapestry5.Asset; 018import org.apache.tapestry5.ioc.Resource; 019import org.apache.tapestry5.services.AssetFactory; 020import org.apache.tapestry5.services.AssetPathConverter; 021import org.apache.tapestry5.services.Context; 022import 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 */ 029public 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}