private void DisposeManager() { var hashQueryStringKeyName = _crusherConfiguration.QuerystringKeyName; var cssGroups = _crusherConfiguration.CssGroups; var cssAssetsFileHasher = new CssAssetsFileHasher(hashQueryStringKeyName, _hasher, _pathProvider); var cssPathRewriter = new CssPathRewriter(cssAssetsFileHasher, _pathProvider); var cssCrusher = new CssCrusher(_cacheManager, _pathProvider, _retryableFileOpener, _retryableFileWriter, cssPathRewriter, _fileMetaData, _crusherConfiguration.WatchAssets); foreach (CssGroupElement group in cssGroups) { var outputUri = new Uri(_pathProvider.ToAbsolute(group.OutputFilePath), UriKind.Relative); cssCrusher.RemoveGroup(outputUri); } var jsGroups = _crusherConfiguration.JsGroups; var jsCrusher = new JsCrusher(_cacheManager, _pathProvider, _retryableFileOpener, _retryableFileWriter, _fileMetaData); foreach (JsGroupElement group in jsGroups) { var outputUri = new Uri(_pathProvider.ToAbsolute(group.OutputFilePath), UriKind.Relative); jsCrusher.RemoveGroup(outputUri); } if (AppDomain.CurrentDomain != null) { AppDomain.CurrentDomain.DomainUnload -= OnDomainUnload; } }
private void InitManager() { AppDomain.CurrentDomain.DomainUnload += OnDomainUnload; var jsExceptions = new List <JsException>(); var cssExceptions = new List <CssException>(); var countdownEvents = new CountdownEvent(2); ThreadPool.QueueUserWorkItem(data => { var manualResetEvent = (CountdownEvent)data; try { var jsGroups = _crusherConfiguration.JsGroups; var jsCrusher = new JsCrusher(_cacheManager, _pathProvider, _retryableFileOpener, _retryableFileWriter, _fileMetaData); var groupsProcessor = new JsGroupsProcessor(); groupsProcessor.ProcessGroups(_pathProvider, jsCrusher, jsGroups); } catch (Exception exception) { jsExceptions.Add(new JsException(exception)); } manualResetEvent.Signal(); }, countdownEvents); ThreadPool.QueueUserWorkItem(data => { var manualResetEvent = (CountdownEvent)data; try { var hashQueryStringKeyName = _crusherConfiguration.QuerystringKeyName; var cssGroups = _crusherConfiguration.CssGroups; var cssAssetsFileHasher = new CssAssetsFileHasher(hashQueryStringKeyName, _hasher, _pathProvider); var cssPathRewriter = new CssPathRewriter(cssAssetsFileHasher, _pathProvider); var cssCrusher = new CssCrusher(_cacheManager, _pathProvider, _retryableFileOpener, _retryableFileWriter, cssPathRewriter, _fileMetaData, _crusherConfiguration.WatchAssets); var groupsProcessor = new CssGroupsProcessor(); groupsProcessor.ProcessGroups(_pathProvider, cssCrusher, cssGroups); } catch (Exception exception) { cssExceptions.Add(new CssException(exception)); } manualResetEvent.Signal(); }, countdownEvents); countdownEvents.Wait(); var exceptions = cssExceptions.Cast <Exception>().Concat(jsExceptions.Cast <Exception>()).ToList(); if (exceptions.Any()) { throw new AggregateException(exceptions); } }
static int Main(string[] args) { var showHelp = false; var configPath = string.Empty; var crusherSectionName = "Crusher"; var cssSpriteSectionName = "CssSprite"; var applicationPath = "/"; var options = new OptionSet() { { "c=|configPath=", "the configuration path to the web.config or app.config file. E.g. ../../../Talifun.Web.Examples/Crusher.Demo/web.config", c => configPath = c }, { "cs=|crusherSectionName=", "the section name of the configuration element for the Talifun.Crusher configuration. Defaults to 'Crusher' if not specified.", cs => crusherSectionName = cs }, { "css=|cssSpriteSectionName=", "the section name of the configuration element for the Talifun.CssSprite configuration. Defaults to 'CssSprite' if not specified.", css => cssSpriteSectionName = css }, { "a=|applicationPath=", "the application path to be relative from. Defaults to '/' if not specified.", a => applicationPath = a }, { "?|h|help", "display help screen", h => showHelp = h != null } }; try { options.Parse(args); } catch(OptionException e) { Console.WriteLine(HeaderMessage); Console.WriteLine(e.Message); Console.WriteLine(UsageMessage); Console.WriteLine(HelpMessage); return DisplayHelpScreenExitCode; } if (showHelp) { DisplayHelp(options); return DisplayHelpScreenExitCode; } if (string.IsNullOrEmpty(configPath)) { Console.WriteLine(HeaderMessage); Console.WriteLine(UsageMessage); Console.WriteLine(HelpMessage); return DisplayHelpScreenExitCode; } var crusherConfiguration = GetCrusherSection(configPath, crusherSectionName); if (crusherConfiguration == null) { Console.WriteLine(HeaderMessage); Console.WriteLine("\"{0}\" section name not found in {1} ", crusherSectionName, configPath); Console.WriteLine(HelpMessage); return DisplayHelpScreenExitCode; } try { Console.WriteLine(); Console.WriteLine("Settings used:"); Console.WriteLine("configPath = " + configPath); Console.WriteLine("crusherSectionName = " + crusherSectionName); Console.WriteLine("applicationPath = " + applicationPath); var configUri = new Uri(configPath, UriKind.RelativeOrAbsolute); if (!configUri.IsAbsoluteUri) { configUri = new Uri(Path.Combine(Environment.CurrentDirectory, configUri.ToString())); } var physicalApplicationPath = new FileInfo(configUri.LocalPath).DirectoryName; var retryableFileOpener = new RetryableFileOpener(); var hasher = new Md5Hasher(retryableFileOpener); var retryableFileWriter = new RetryableFileWriter(BufferSize, Encoding, retryableFileOpener, hasher); var pathProvider = new PathProvider(applicationPath, physicalApplicationPath); var cacheManager = new HttpCacheManager(); var fileMetaData = new MultiFileMetaData(retryableFileOpener, retryableFileWriter); var jsOutput = string.Empty; var cssOutput = string.Empty; var cssSpriteOutput = string.Empty; //We want to be able to use output from css sprites in crushed content var countdownEvents = new CountdownEvent(3); var cssSpriteExceptions = new List<CssSpriteException>(); ThreadPool.QueueUserWorkItem(data => { var manualResetEvent = (CountdownEvent)data; try { if (crusherConfiguration != null) { var cssSpriteGroups = crusherConfiguration.CssSpriteGroups; var cssSpriteCreator = new CssSpriteCreator(cacheManager, retryableFileOpener, pathProvider, retryableFileWriter, fileMetaData); var cssSpriteGroupsProcessor = new CssSpriteGroupsProcessor(); cssSpriteOutput = cssSpriteGroupsProcessor.ProcessGroups(pathProvider, cssSpriteCreator, cssSpriteGroups).ToString(); } } catch (Exception exception) { cssSpriteExceptions.Add(new CssSpriteException(exception)); } manualResetEvent.Signal(); }, countdownEvents); var jsExceptions = new List<JsException>(); ThreadPool.QueueUserWorkItem(data => { var manualResetEvent = (CountdownEvent)data; try { if (crusherConfiguration != null) { var jsCrusher = new JsCrusher(cacheManager, pathProvider, retryableFileOpener, retryableFileWriter, fileMetaData); var jsGroups = crusherConfiguration.JsGroups; var jsGroupsProcessor = new JsGroupsProcessor(); jsOutput = jsGroupsProcessor.ProcessGroups(pathProvider, jsCrusher, jsGroups).ToString(); } } catch (Exception exception) { jsExceptions.Add(new JsException(exception)); } manualResetEvent.Signal(); }, countdownEvents); var cssExceptions = new List<CssException>(); ThreadPool.QueueUserWorkItem(data => { var manualResetEvent = (CountdownEvent)data; try { if (crusherConfiguration != null) { var hashQueryStringKeyName = crusherConfiguration.QuerystringKeyName; var cssAssetsFileHasher = new CssAssetsFileHasher(hashQueryStringKeyName, hasher, pathProvider); var cssPathRewriter = new CssPathRewriter(cssAssetsFileHasher, pathProvider); var cssCrusher = new CssCrusher(cacheManager, pathProvider, retryableFileOpener, retryableFileWriter, cssPathRewriter, fileMetaData, crusherConfiguration.WatchAssets); var cssGroups = crusherConfiguration.CssGroups; var cssGroupsCrusher = new CssGroupsProcessor(); cssOutput = cssGroupsCrusher.ProcessGroups(pathProvider, cssCrusher, cssGroups).ToString(); } } catch (Exception exception) { cssExceptions.Add(new CssException(exception)); } manualResetEvent.Signal(); }, countdownEvents); countdownEvents.Wait(); if (string.IsNullOrEmpty(cssSpriteOutput) && !cssSpriteExceptions.Any()) { Console.WriteLine(); Console.WriteLine("Skipping css sprite creation. \"{0}\" section name not found in \"{1}\"", cssSpriteSectionName, configPath); } else { Console.WriteLine(); Console.WriteLine(cssSpriteOutput); if (cssSpriteExceptions.Any()) { Console.WriteLine("Css sprite errors:"); Console.WriteLine(new AggregateException(cssSpriteExceptions.Cast<Exception>())); } } if (string.IsNullOrEmpty(jsOutput) && string.IsNullOrEmpty(cssOutput) && !jsExceptions.Any() && !cssExceptions.Any()) { Console.WriteLine(); Console.WriteLine("Skipping css/js crushed content creation. \"{0}\" section name not found in \"{1}\"", crusherSectionName, configPath); } else { Console.WriteLine(); Console.WriteLine(cssOutput); if (cssExceptions.Any()) { Console.WriteLine("Css errors:"); Console.WriteLine(new AggregateException(cssExceptions.Cast<Exception>())); } Console.WriteLine(); Console.WriteLine(jsOutput); if (jsExceptions.Any()) { Console.WriteLine("Js errors:"); Console.WriteLine(new AggregateException(jsExceptions.Cast<Exception>())); } } } catch (Exception exception) { Console.Write(exception); return ErrorExitCode; } return SuccessExitCode; }
public object Clone() { var filePaths = new List<string>(); var fileRelativePaths = new List<string>(); AppDomain.CurrentDomain.UnhandledException += OnUnhandledException; try { var cssSpriteOutput = string.Empty; var jsOutput = string.Empty; var cssOutput = string.Empty; var countdownEvents = new CountdownEvent(3); ThreadPool.QueueUserWorkItem(data => { var countdownEvent = (CountdownEvent) data; try { if (_crusherConfiguration != null) { var cssSpriteGroups = _crusherConfiguration.CssSpriteGroups; var cssSpriteCreator = new CssSpriteCreator(_cacheManager, _retryableFileOpener, _pathProvider, _retryableFileWriter, _fileMetaData); var cssSpriteGroupsProcessor = new CssSpriteGroupsProcessor(); cssSpriteOutput = cssSpriteGroupsProcessor.ProcessGroups(_pathProvider, cssSpriteCreator, cssSpriteGroups).ToString(); var cssFilePaths = new List<string>(); var cssFileRelativePaths = new List<string>(); foreach (CssSpriteGroupElement cssSpriteGroup in cssSpriteGroups) { cssFilePaths.Add(new Uri(_pathProvider.MapPath(cssSpriteGroup.CssOutputFilePath)).LocalPath); cssFilePaths.Add(new Uri(_pathProvider.MapPath(cssSpriteGroup.ImageOutputFilePath)).LocalPath); cssFileRelativePaths.Add(MakeRelative(cssSpriteGroup.CssOutputFilePath)); cssFileRelativePaths.Add(MakeRelative(cssSpriteGroup.ImageOutputFilePath)); } filePaths.AddRange(cssFilePaths); fileRelativePaths.AddRange(cssFileRelativePaths); _logMessage(cssSpriteOutput); } } catch (Exception exception) { _logError(exception.ToString()); } countdownEvent.Signal(); }, countdownEvents); ThreadPool.QueueUserWorkItem(data => { var countdownEvent = (CountdownEvent) data; try { if (_crusherConfiguration != null) { var jsCrusher = new JsCrusher(_cacheManager, _pathProvider, _retryableFileOpener, _retryableFileWriter, _fileMetaData); var jsGroups = _crusherConfiguration.JsGroups; var jsGroupsProcessor = new JsGroupsProcessor(); jsOutput = jsGroupsProcessor.ProcessGroups(_pathProvider, jsCrusher, jsGroups).ToString(); var jsFilePaths = new List<string>(); var jsFileRelativePaths = new List<string>(); foreach (JsGroupElement jsGroup in jsGroups) { jsFilePaths.Add(new Uri(_pathProvider.MapPath(jsGroup.OutputFilePath)).LocalPath); jsFileRelativePaths.Add(MakeRelative(jsGroup.OutputFilePath)); } filePaths.AddRange(jsFilePaths); fileRelativePaths.AddRange(jsFileRelativePaths); _logMessage(jsOutput); } } catch (Exception exception) { _logError(exception.ToString()); } countdownEvent.Signal(); }, countdownEvents); ThreadPool.QueueUserWorkItem(data => { var countdownEvent = (CountdownEvent) data; try { if (_crusherConfiguration != null) { var hashQueryStringKeyName = _crusherConfiguration.QuerystringKeyName; var cssAssetsFileHasher = new CssAssetsFileHasher(hashQueryStringKeyName, _hasher, _pathProvider); var cssPathRewriter = new CssPathRewriter(cssAssetsFileHasher, _pathProvider); var cssCrusher = new CssCrusher(_cacheManager, _pathProvider, _retryableFileOpener, _retryableFileWriter, cssPathRewriter, _fileMetaData, _crusherConfiguration.WatchAssets); var cssGroups = _crusherConfiguration.CssGroups; var cssGroupsCrusher = new CssGroupsProcessor(); cssOutput = cssGroupsCrusher.ProcessGroups(_pathProvider, cssCrusher, cssGroups).ToString(); var cssFilePaths = new List<string>(); var cssFileRelativePaths = new List<string>(); foreach (CssGroupElement cssGroup in cssGroups) { cssFilePaths.Add(new Uri(_pathProvider.MapPath(cssGroup.OutputFilePath)).LocalPath); cssFileRelativePaths.Add(MakeRelative(cssGroup.OutputFilePath)); } filePaths.AddRange(cssFilePaths); fileRelativePaths.AddRange(cssFileRelativePaths); _logMessage(cssOutput); } } catch (Exception exception) { _logError(exception.ToString()); } countdownEvent.Signal(); }, countdownEvents); countdownEvents.Wait(); } catch (Exception exception) { _logError(exception.ToString()); } finally { AppDomain.CurrentDomain.UnhandledException -= OnUnhandledException; } _setOutputFilePaths(filePaths.ToArray()); _setOutputFileRelativePaths(fileRelativePaths.ToArray()); return null; }
private void InitManager() { AppDomain.CurrentDomain.DomainUnload += OnDomainUnload; var jsExceptions = new List<JsException>(); var cssExceptions = new List<CssException>(); var countdownEvents = new CountdownEvent(2); ThreadPool.QueueUserWorkItem(data => { var manualResetEvent = (CountdownEvent)data; try { var jsGroups = _crusherConfiguration.JsGroups; var jsCrusher = new JsCrusher(_cacheManager, _pathProvider, _retryableFileOpener, _retryableFileWriter, _fileMetaData); var groupsProcessor = new JsGroupsProcessor(); groupsProcessor.ProcessGroups(_pathProvider, jsCrusher, jsGroups); } catch (Exception exception) { jsExceptions.Add(new JsException(exception)); } manualResetEvent.Signal(); }, countdownEvents); ThreadPool.QueueUserWorkItem(data => { var manualResetEvent = (CountdownEvent)data; try { var hashQueryStringKeyName = _crusherConfiguration.QuerystringKeyName; var cssGroups = _crusherConfiguration.CssGroups; var cssAssetsFileHasher = new CssAssetsFileHasher(hashQueryStringKeyName, _hasher, _pathProvider); var cssPathRewriter = new CssPathRewriter(cssAssetsFileHasher, _pathProvider); var cssCrusher = new CssCrusher(_cacheManager, _pathProvider, _retryableFileOpener, _retryableFileWriter, cssPathRewriter, _fileMetaData, _crusherConfiguration.WatchAssets); var groupsProcessor = new CssGroupsProcessor(); groupsProcessor.ProcessGroups(_pathProvider, cssCrusher, cssGroups); } catch (Exception exception) { cssExceptions.Add(new CssException(exception)); } manualResetEvent.Signal(); }, countdownEvents); countdownEvents.Wait(); var exceptions = cssExceptions.Cast<Exception>().Concat(jsExceptions.Cast<Exception>()).ToList(); if (exceptions.Any()) { throw new AggregateException(exceptions); } }