Esempio n. 1
0
        public static IDictionary <string, object> ToDataMap(object value)
        {
            IDictionary <object, object> rawMap = (IDictionary <object, object>)value;
            IDictionary <string, object> outMap = new NullableDictionary <string, object>();

            foreach (var entry in rawMap)
            {
                outMap.Put((string)entry.Key, entry.Value);
            }

            return(outMap);
        }
Esempio n. 2
0
        private static IDictionary <string, ObjectFactory <string> > CreatePropertyConstructors(IDictionary <string, Type> propertyTypes)
        {
            var factories = new NullableDictionary <string, ObjectFactory <string> >();

            foreach (var entry in propertyTypes)
            {
                var property     = entry.Key;
                var propertyType = entry.Value;

                Log.Debug(".CreatePropertyConstructors property==" + property + ", type==" + propertyType);

                factories.Put(property, ObjectFactoryFor(propertyType));
            }

            return(factories);
        }
Esempio n. 3
0
        public DeploymentOrder GetDeploymentOrder(ICollection <Module> modules, DeploymentOrderOptions options)
        {
            using (_iLock.Acquire())
            {
                if (options == null)
                {
                    options = new DeploymentOrderOptions();
                }

                var deployments     = _deploymentStateService.Deployments;
                var proposedModules = new List <Module>();
                proposedModules.AddAll(modules);

                ICollection <String> availableModuleNames = new HashSet <String>();
                foreach (var proposedModule in proposedModules)
                {
                    if (proposedModule.Name != null)
                    {
                        availableModuleNames.Add(proposedModule.Name);
                    }
                }

                // Collect all uses-dependencies of existing modules
                IDictionary <String, ICollection <String> > usesPerModuleName =
                    new Dictionary <String, ICollection <String> >();
                foreach (var deployment in deployments)
                {
                    var info = _deploymentStateService.GetDeployment(deployment);
                    if (info == null)
                    {
                        continue;
                    }
                    if ((info.Module.Name == null) || (info.Module.Uses == null))
                    {
                        continue;
                    }
                    var usesSet = usesPerModuleName.Get(info.Module.Name);
                    if (usesSet == null)
                    {
                        usesSet = new HashSet <String>();
                        usesPerModuleName.Put(info.Module.Name, usesSet);
                    }
                    usesSet.AddAll(info.Module.Uses);
                }

                // Collect uses-dependencies of proposed modules
                foreach (var proposedModule in proposedModules)
                {
                    // check uses-dependency is available
                    if (options.IsCheckUses)
                    {
                        if (proposedModule.Uses != null)
                        {
                            foreach (var uses in proposedModule.Uses)
                            {
                                if (availableModuleNames.Contains(uses))
                                {
                                    continue;
                                }
                                if (IsDeployed(uses))
                                {
                                    continue;
                                }
                                var message = "Module-dependency not found";
                                if (proposedModule.Name != null)
                                {
                                    message += " as declared by module '" + proposedModule.Name + "'";
                                }
                                message += " for uses-declaration '" + uses + "'";
                                throw new DeploymentOrderException(message);
                            }
                        }
                    }

                    if ((proposedModule.Name == null) || (proposedModule.Uses == null))
                    {
                        continue;
                    }
                    var usesSet = usesPerModuleName.Get(proposedModule.Name);
                    if (usesSet == null)
                    {
                        usesSet = new HashSet <String>();
                        usesPerModuleName.Put(proposedModule.Name, usesSet);
                    }
                    usesSet.AddAll(proposedModule.Uses);
                }

                var proposedModuleNames = new NullableDictionary <String, SortedSet <int> >();
                var count = 0;
                foreach (var proposedModule in proposedModules)
                {
                    var moduleNumbers = proposedModuleNames.Get(proposedModule.Name);
                    if (moduleNumbers == null)
                    {
                        moduleNumbers = new SortedSet <int>();
                        proposedModuleNames.Put(proposedModule.Name, moduleNumbers);
                    }
                    moduleNumbers.Add(count);
                    count++;
                }

                var graph      = new DependencyGraph(proposedModules.Count, false);
                var fromModule = 0;
                foreach (var proposedModule in proposedModules)
                {
                    if ((proposedModule.Uses == null) || (proposedModule.Uses.IsEmpty()))
                    {
                        fromModule++;
                        continue;
                    }
                    var dependentModuleNumbers = new SortedSet <int>();
                    foreach (var use in proposedModule.Uses)
                    {
                        var moduleNumbers = proposedModuleNames.Get(use);
                        if (moduleNumbers == null)
                        {
                            continue;
                        }
                        dependentModuleNumbers.AddAll(moduleNumbers);
                    }
                    dependentModuleNumbers.Remove(fromModule);
                    graph.AddDependency(fromModule, dependentModuleNumbers);
                    fromModule++;
                }

                if (options.IsCheckCircularDependency)
                {
                    var circular = graph.FirstCircularDependency;
                    if (circular != null)
                    {
                        var message   = "";
                        var delimiter = "";
                        foreach (var i in circular)
                        {
                            message  += delimiter;
                            message  += "module '" + proposedModules[i].Name + "'";
                            delimiter = " uses (depends on) ";
                        }
                        throw new DeploymentOrderException(
                                  "Circular dependency detected in module uses-relationships: " + message);
                    }
                }

                var reverseDeployList = new List <Module>();
                var ignoreList        = new HashSet <int>();
                while (ignoreList.Count < proposedModules.Count)
                {
                    // seconardy sort according to the order of listing
                    ICollection <int> rootNodes = new SortedSet <int>(
                        new StandardComparer <int>((o1, o2) => - 1 * o1.CompareTo(o2)));

                    rootNodes.AddAll(graph.GetRootNodes(ignoreList));

                    if (rootNodes.IsEmpty())
                    {
                        // circular dependency could cause this
                        for (var i = 0; i < proposedModules.Count; i++)
                        {
                            if (!ignoreList.Contains(i))
                            {
                                rootNodes.Add(i);
                                break;
                            }
                        }
                    }

                    foreach (var root in rootNodes)
                    {
                        ignoreList.Add(root);
                        reverseDeployList.Add(proposedModules[root]);
                    }
                }

                reverseDeployList.Reverse();
                return(new DeploymentOrder(reverseDeployList));
            }
        }