private WebAssetHolder EnsureAsset(MergedAsset asset, string id)
{
string key = "{0}:{1}".FormatWith(GetType().AssemblyQualifiedName, id);
WebAssetHolder assetHolder;
using (syncLock.ReadAndWrite())
{
assetHolder = GetWebAssetHolder(key);
if (assetHolder == null)
{
using (syncLock.Write())
{
assetHolder = GetWebAssetHolder(key);
if (assetHolder == null)
{
List<string> physicalPaths = new List<string>();
StringBuilder contentBuilder = new StringBuilder();
var files = asset.Directories
.SelectMany(d => d.Files.Select(f => new { Directory = d, File = f }))
.OrderBy(f => f.File.Order);
foreach (var pair in files)
{
string path = "~/" + pair.Directory.Path + "/" + pair.File.Name;
string virtualPath = assetLocator.Locate(path, asset.Version);
string fileContent = virtualPathProvider.ReadAllText(virtualPath);
if (string.Compare(asset.ContentType, "text/css", StringComparison.OrdinalIgnoreCase) == 0)
{
string baseDiretory = virtualPathProvider.GetDirectory(virtualPath);
fileContent = ReplaceImagePath(baseDiretory, fileContent);
}
contentBuilder.AppendLine(fileContent);
physicalPaths.Add(pathResolver.Resolve(virtualPath));
}
assetHolder = new WebAssetHolder { Asset = asset, Content = contentBuilder.ToString() };
cacheManager.Insert(key, assetHolder, null, physicalPaths.ToArray());
}
}
}
}
return assetHolder;
}