Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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;
        }
Exemplo n.º 4
0
        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;
        }
Exemplo n.º 6
0
        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)..];