/// <summary> /// Débuter le traitement de toutes les ressources. /// </summary> public void Reprocess() { lock (_lock) { foreach (Resource resource in Resources.Values.Where(x => x.Status == ResourceStatus.Ignored || x.Status == ResourceStatus.ReadyToProcess)) { IBehaviorRule rule = _behaviorRules.GetBehaviorRule(resource); resource.Behavior = rule == null ? ResourceBehavior.Ignore : rule.Behavior; // En fonction du behavior et de la limitation de ressource, on décide // si une ressource devra être traitée ou non. if (resource.Behavior != ResourceBehavior.Ignore && (!_limitResources.HasValue || _limitResources > 0)) { if (_limitResources.HasValue) { _limitResources--; } resource.Status = ResourceStatus.ReadyToProcess; rule.TargetBucket.QueueItem(resource); resource.CurrentBucket = rule.TargetBucket.Name; } else { resource.Status = ResourceStatus.Ignored; resource.CurrentBucket = null; } } } }
/// <summary> /// Récupère une ressource à partir d'une URL absolue. Utilise un caching afin qu'une /// même ressource ne soit pas traitée deux fois. /// </summary> /// <param name="url"></param> /// <returns></returns> private Resource GetResource(Uri url, ResourceContentType initialContentType) { Resource resource; Uri urlWithoutSessionId = url.WithoutSession(); if (!Resources.TryGetValue(urlWithoutSessionId.AbsoluteUri, out resource)) { lock (_lock) { if (!Resources.TryGetValue(urlWithoutSessionId.AbsoluteUri, out resource)) { resource = new Resource(urlWithoutSessionId, ResourceBehavior.Ignore); resource.ContentType = initialContentType; IBehaviorRule behaviorRule = _behaviorRules.GetBehaviorRule(resource); resource.Behavior = behaviorRule == null ? ResourceBehavior.Ignore : behaviorRule.Behavior; Resources.Add(urlWithoutSessionId.AbsoluteUri, resource); Context.Resources.Add(resource); // En fonction du behavior et de la limitation de ressource, on décide // si une ressource devra être traitée ou non. if (resource.Behavior != ResourceBehavior.Ignore && (!_limitResources.HasValue || _limitResources > 0)) { if (_limitResources.HasValue) { _limitResources--; } behaviorRule.TargetBucket.QueueItem(resource); resource.CurrentBucket = behaviorRule.TargetBucket.Name; } else { resource.Status = ResourceStatus.Ignored; resource.CurrentBucket = null; } } } } return(resource); }