public IModuleInfo[] Parse(string xml)
        {
            SolutionProfileElement solution = XmlValidationHelper.DeserializeXml<SolutionProfileV2.SolutionProfileElement>(xml,
                "SolutionProfileV2.xsd", Namespace);

            List<DependentModuleInfo> dmis = new List<DependentModuleInfo>();

            if (solution.Section != null)
            {
                foreach (SectionElement section in solution.Section)
                {
                    foreach (ModuleInfoElement moduleInfo in section.Modules)
                    {
                        DependentModuleInfo dmi = new DependentModuleInfo(moduleInfo.AssemblyFile);
                        SetModuleName(moduleInfo, dmi);
                        SetModuleRoles(moduleInfo, dmi);
                        SetSectionDependencies(solution.Section, section, dmi);
                        SetModuleDependencies(moduleInfo, dmi);
                        dmis.Add(dmi);
                    }
                }
            }

            return dmis.ToArray();
        }
 private static void SetModuleDependencies(ModuleInfoElement moduleInfo, DependentModuleInfo dmi)
 {
     if (moduleInfo.Dependencies == null)
         dmi.Dependencies.AddRange(ModuleMetadataReflectionHelper.GetModuleDependencies(dmi.AssemblyFile));
     else
         foreach (DependencyElement dep in moduleInfo.Dependencies)
             dmi.Dependencies.Add(dep.Name);
 }
        private static void SetModuleName(ModuleInfoElement configModuleInfo, DependentModuleInfo resultModuleInfo)
        {
            resultModuleInfo.SetName(configModuleInfo.Name);

            // If no name in config, check metadata
            if (resultModuleInfo.Name == null)
                resultModuleInfo.SetName(ModuleMetadataReflectionHelper.GetModuleName(resultModuleInfo.AssemblyFile));

            // If still no name, generate one
            if (resultModuleInfo.Name == null)
                resultModuleInfo.SetName(Guid.NewGuid().ToString());

            // Push the "true" name back into the object graph so we can find it later
            configModuleInfo.Name = resultModuleInfo.Name;
        }
        private static void SetSectionDependencies(SectionElement[] sections, SectionElement section, DependentModuleInfo dmi)
        {
            if (section.Dependencies == null)
                return;

            foreach (DependencyElement dep in section.Dependencies)
            {
                bool dependentSectionFound = false;

                foreach (SectionElement sec in sections)
                {
                    if (sec.Name == dep.Name)
                    {
                        dependentSectionFound = true;

                        foreach (ModuleInfoElement mod in sec.Modules)
                            dmi.Dependencies.Add(mod.Name);

                        break;
                    }
                }

                if (!dependentSectionFound)
                    throw new InvalidOperationException(string.Format(Properties.Resources.DependencyNotFound, section.Name, dep.Name));
            }
        }
 private static void SetModuleRoles(ModuleInfoElement moduleInfo, DependentModuleInfo dmi)
 {
     if (moduleInfo.Roles != null && moduleInfo.Roles.Length > 0)
         foreach (RoleElement role in moduleInfo.Roles)
             dmi.AddRoles(role.Allow);
 }