예제 #1
0
        internal void AddTransformChain(AssetFileExtension assetFileExtension, params Type[] transforms)
        {
            if (null == assetFileExtension)
            {
                throw new ArgumentNullException(nameof(assetFileExtension));
            }
            if (null == transforms || 0 == transforms.Length)
            {
                throw new ArgumentException($"No transforms specified for the predicate.");
            }

            Type typeOfITransform = typeof(ITransform);

            if (!transforms.Any(t => typeOfITransform.IsAssignableFrom(t)))
            {
                throw new InvalidCastException("All transform types must implement the interface ITransform.");
            }
            if (transforms.Any(t => !t.IsClass || t.IsAbstract || !t.IsPublic))
            {
                throw new InvalidCastException("All transform types must be concrete public classes.");
            }

            this.TransformChains[assetFileExtension] = transforms.ToList(); // calling this method for the same key will overwrite the existing chain
        }
예제 #2
0
        public async Task <OptimizationResult> OptimizeAsync(IOptimizationContext context, AssetFileExtension assetFileExtension)
        {
            if (null == assetFileExtension)
            {
                assetFileExtension = string.Empty;
            }

            if (!context.Assets.Any())
            {
                return(OptimizationResult.Empty);
            }

            var orderedAssets = this.Orderer.Order(context.Assets.Where(a => 0 == string.Compare(Path.GetExtension(a.Location.ToString()), assetFileExtension, StringComparison.OrdinalIgnoreCase)));

            foreach (var asset in orderedAssets)
            {
                bool isAssetLoaded = false;

                foreach (var loader in this.Loaders)
                {
                    if (loader.CanLoad(asset))
                    {
                        this.Logger.LogTrace($"Loading asset '{asset.Location}' using '{nameof(loader)}'.");
                        using (var stream = await loader.OpenReadStreamAsync(asset))
                        {
                            await asset.SetContentAsync(stream);

                            isAssetLoaded = true;
                        }
                        break;
                    }
                }

                if (!isAssetLoaded)
                {
                    throw new InvalidOperationException($"Couldn't find an asset loader to load the asset from '{asset.Location}'.");
                }
            }

            IEnumerable <Asset> assets = orderedAssets;

            foreach (var transformPair in this.TransformChains.Where(x => 0 == string.Compare(x.Key, assetFileExtension, StringComparison.OrdinalIgnoreCase)))
            {
                foreach (ITransform transform in transformPair.Value)
                {
                    if (null == this.Events?.TransformRunning || this.Events.TransformRunning.Invoke(assetFileExtension, this.Options, transform))
                    {
                        var inputAssets = assets.ToArray();
                        assets = await transform.TransformAsync(assetFileExtension, inputAssets);

                        await transform.CleanUpAsync(inputAssets);
                    }
                }
                break;
            }

            var optimizationResult = new OptimizationResult();
            await optimizationResult.InitializeAsync(assets);

            return(optimizationResult);
        }