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); }
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); }
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)); } }