public virtual ResourceDefinition DefineResource(string resourceType, string resourceName) { var definition = new ResourceDefinition(this, resourceType, resourceName); var resources = GetResources(resourceType); if (!resources.ContainsKey(resourceName)) { resources[resourceName] = new List <ResourceDefinition>(); } resources[resourceName].Add(definition); return(definition); }
private ResourceDefinition FindMatchingResource( IEnumerable <KeyValuePair <string, IList <ResourceDefinition> > > stream, RequireSettings settings, string type, string name) { Version lower = null; Version upper = null; if (!String.IsNullOrEmpty(settings.Version)) { // Specific version, filter lower = GetLowerBoundVersion(settings.Version); upper = GetUpperBoundVersion(settings.Version); } ResourceDefinition resource = null; foreach (var r in stream) { if (String.Equals(r.Key, name, StringComparison.OrdinalIgnoreCase)) { foreach (var resourceDefinition in r.Value) { var version = resourceDefinition.Version != null ? new Version(resourceDefinition.Version) : null; if (lower != null) { if (lower > version || version >= upper) { continue; } } // Use the highest version of all matches if (resource == null || (resourceDefinition.Version != null && new Version(resource.Version) < version)) { resource = resourceDefinition; } } } } return(resource); }
public void AddExpandedResource(ResourceDefinition resource, RequireSettings settings) { _expanding.Pop(); if (settings.Position != ResourcePosition.ByDependency) { var existing = (RequireSettings)this[resource]; if (existing == null || existing.Position == ResourcePosition.ByDependency) { if (settings.Position == ResourcePosition.First) { FirstCount++; } if (settings.Position == ResourcePosition.Last) { LastCount++; } } } this[resource] = settings; }
protected virtual void ExpandDependencies(ResourceDefinition resource, RequireSettings settings, OrderedDictionary allResources) { if (resource == null) { return; } // Settings is given so they can cascade down into dependencies. For example, if Foo depends on Bar, and Foo's required // location is Head, so too should Bar's location. // forge the effective require settings for this resource // (1) If a require exists for the resource, combine with it. Last settings in gets preference for its specified values. // (2) If no require already exists, form a new settings object based on the given one but with its own type/name. settings = allResources.Contains(resource) ? ((RequireSettings)allResources[resource]).Combine(settings) : new RequireSettings(_options.Value) { Type = resource.Type, Name = resource.Name }.Combine(settings); if (resource.Dependencies != null) { var dependencies = from d in resource.Dependencies let segments = d.Split(':') let name = segments[0] let version = segments.Length > 1 ? segments[1] : null select FindResource(new RequireSettings { Type = resource.Type, Name = name, Version = version }); foreach (var dependency in dependencies) { if (dependency == null) { continue; } ExpandDependencies(dependency, settings, allResources); } } allResources[resource] = settings; }
protected virtual void ExpandDependencies( ResourceDefinition resource, RequireSettings settings, OrderedDictionary allResources) { if (resource == null) { return; } // Use any additional dependencies from the settings without mutating the resource that is held in a singleton collection. List <string> dependencies = null; if (resource.Dependencies != null) { dependencies = new List <string>(resource.Dependencies); if (settings.Dependencies != null) { dependencies.AddRange(settings.Dependencies); } } else if (settings.Dependencies != null) { dependencies = new List <string>(settings.Dependencies); } // Settings is given so they can cascade down into dependencies. For example, if Foo depends on Bar, and Foo's required // location is Head, so too should Bar's location. // forge the effective require settings for this resource // (1) If a require exists for the resource, combine with it. Last settings in gets preference for its specified values. // (2) If no require already exists, form a new settings object based on the given one but with its own type/name. settings = allResources.Contains(resource) ? ((RequireSettings)allResources[resource]).Combine(settings) : new RequireSettings(_options) { Type = resource.Type, Name = resource.Name }.Combine(settings); if (dependencies != null) { // share search instance var tempSettings = new RequireSettings(); for (var i = 0; i < dependencies.Count; i++) { var d = dependencies[i]; var idx = d.IndexOf(':'); var name = d; string version = null; if (idx != -1) { name = d.Substring(0, idx); version = d.Substring(idx + 1); } tempSettings.Type = resource.Type; tempSettings.Name = name; tempSettings.Version = version; var dependency = FindResource(tempSettings); if (dependency == null) { continue; } ExpandDependencies(dependency, settings, allResources); } } allResources[resource] = settings; }
protected virtual void ExpandDependencies( ResourceDefinition resource, RequireSettings settings, ResourceDictionary allResources) { if (resource == null) { return; } allResources.AddExpandingResource(resource, settings); // Use any additional dependencies from the settings without mutating the resource that is held in a singleton collection. List <string> dependencies = null; if (resource.Dependencies != null) { dependencies = new List <string>(resource.Dependencies); if (settings.Dependencies != null) { dependencies.AddRange(settings.Dependencies); } } else if (settings.Dependencies != null) { dependencies = new List <string>(settings.Dependencies); } // Settings is given so they can cascade down into dependencies. For example, if Foo depends on Bar, and Foo's required // location is Head, so too should Bar's location, similarly, if Foo is First positioned, Bar dependency should be too. // // forge the effective require settings for this resource // (1) If a require exists for the resource, combine with it. Last settings in gets preference for its specified values. // (2) If no require already exists, form a new settings object based on the given one but with its own type/name. var dependencySettings = (((RequireSettings)allResources[resource]) ?.NewAndCombine(settings) ?? new RequireSettings(_options) { Name = resource.Name, Type = resource.Type, Position = resource.Position } .Combine(settings)) .CombinePosition(settings) ; if (dependencies != null) { // share search instance var tempSettings = new RequireSettings(); for (var i = 0; i < dependencies.Count; i++) { var d = dependencies[i]; var idx = d.IndexOf(':'); var name = d; string version = null; if (idx != -1) { name = d.Substring(0, idx); version = d[(idx + 1)..];