/// ------------------------------------------------------------------------------------ /// <summary> /// Adds the sub nodes. /// </summary> /// <param name="parentNodes">The parent node collection.</param> /// <param name="superClassId">The super class clid.</param> /// ------------------------------------------------------------------------------------ private void AddSubNodes(TreeNodeCollection parentNodes, int superClassId) { foreach (var subclassClid in m_mdc.GetDirectSubclasses(superClassId)) { AddNode(parentNodes, m_mdc.GetClassName(subclassClid), subclassClid); } }
IEnumerable <int> AllSubclasses(int clsid) { yield return(clsid); foreach (var subclassId in m_mdc.GetDirectSubclasses(clsid)) { foreach (var item in AllSubclasses(subclassId)) { yield return(item); } } }
/// <summary> Gets the direct subclasses of the given class (not including itself). </summary> /// <param name='luClid'> </param> /// <param name='cluMax'> </param> /// <param name='_cluOut'> </param> /// <param name='_rgluSubclasses'> </param> public virtual void GetDirectSubclasses(int luClid, int cluMax, out int _cluOut, ArrayPtr _rgluSubclasses) { m_metaDataCache.GetDirectSubclasses(luClid, cluMax, out _cluOut, _rgluSubclasses); }
private readonly IFwMetaDataCacheManaged m_mdc; // needed for some data migrations changing over to custom fields. /// ------------------------------------------------------------------------------------ /// <summary> /// Constructor /// </summary> /// <param name="startingModelVersionNumber">The starting model version number for the /// migration.</param> /// <param name="dtos">DTOs from BEP-land.</param> /// <param name="mdc">The MDC.</param> /// <param name="projectFolder">The project folder (don't even think about trying to /// pass a path on a server other than the local machine, and -- yes -- I CAN control /// your thoughts!).</param> /// <param name="dirs"></param> /// ------------------------------------------------------------------------------------ internal DomainObjectDtoRepository(int startingModelVersionNumber, HashSet <DomainObjectDTO> dtos, IFwMetaDataCacheManaged mdc, string projectFolder, ILcmDirectories dirs) { if (dtos == null) { throw new ArgumentNullException("dtos"); } if (mdc == null) { throw new ArgumentNullException("mdc"); } m_currentModelVersionNumber = startingModelVersionNumber; m_dtos = dtos; m_mdc = mdc; m_projectFolder = projectFolder; m_dirs = dirs; // Add classes from MDC foreach (var clsid in mdc.GetClassIds()) { // Leaf classes will have nothing in 'subclasses'. var className = mdc.GetClassName(clsid); m_dtosByClass.Add(className, new HashSet <DomainObjectDTO>()); if (className == "CmObject") { m_classAndSuperClass.Add(className, null); } var subclasses = new HashSet <string>(); m_classesAndTheirDirectSubclasses.Add(className, subclasses); var subclassIds = mdc.GetDirectSubclasses(clsid); if (subclassIds.Count() == 0) { if (!m_classAndSuperClass.ContainsKey(className)) { m_classAndSuperClass.Add(className, mdc.GetBaseClsName(clsid)); } continue; } foreach (var directSubClsid in subclassIds) { var directSubclassName = mdc.GetClassName(directSubClsid); subclasses.Add(directSubclassName); // added ContainsKey check because of mono bug https://bugzilla.novell.com/show_bug.cgi?id=539288 // see also change in LcmMetaDataCache.cs (AddClass methods replaced with AddClass1, AddClass2) // for simular reasons (order of types obtains via reflection)https://bugzilla.novell.com/show_bug.cgi?id=539288. if (!m_classAndSuperClass.ContainsKey(directSubclassName)) { m_classAndSuperClass.Add(directSubclassName, className); } } } #if ORIGINAL foreach (var classname in m_classesAndTheirDirectSubclasses.Keys) { // Some may have no instances. m_dtosByClass.Add(classname, (from dto in m_dtos where dto.Classname == classname select dto).ToList()); } foreach (var dto in m_dtos) { m_dtoByGuid.Add(dto.Guid.ToLower(), dto); } #else m_dtoByGuid = new Dictionary <string, DomainObjectDTO>(m_dtos.Count); foreach (var dto in m_dtos) { m_dtoByGuid.Add(dto.Guid.ToLower(), dto); AddToClassList(dto); } #endif }
private readonly IFwMetaDataCacheManaged m_mdc; // needed for some data migrations changing over to custom fields. /// ------------------------------------------------------------------------------------ /// <summary> /// Constructor /// </summary> /// <param name="startingModelVersionNumber">The starting model version number for the /// migration.</param> /// <param name="dtos">DTOs from BEP-land.</param> /// <param name="mdc">The MDC.</param> /// <param name="projectFolder">The project folder (don't even think about trying to /// pass a path on a server other than the local machine, and -- yes -- I CAN control /// your thoughts!).</param> /// <param name="dirs"></param> /// ------------------------------------------------------------------------------------ internal DomainObjectDtoRepository(int startingModelVersionNumber, HashSet<DomainObjectDTO> dtos, IFwMetaDataCacheManaged mdc, string projectFolder, IFdoDirectories dirs) { if (dtos == null) throw new ArgumentNullException("dtos"); if (mdc == null) throw new ArgumentNullException("mdc"); m_currentModelVersionNumber = startingModelVersionNumber; m_dtos = dtos; m_mdc = mdc; m_projectFolder = projectFolder; m_dirs = dirs; // Add classes from MDC foreach (var clsid in mdc.GetClassIds()) { // Leaf classes will have nothing in 'subclasses'. var className = mdc.GetClassName(clsid); m_dtosByClass.Add(className, new HashSet<DomainObjectDTO>()); if (className == "CmObject") m_classAndSuperClass.Add(className, null); var subclasses = new HashSet<string>(); m_classesAndTheirDirectSubclasses.Add(className, subclasses); var subclassIds = mdc.GetDirectSubclasses(clsid); if (subclassIds.Count() == 0) { if (!m_classAndSuperClass.ContainsKey(className)) m_classAndSuperClass.Add(className, mdc.GetBaseClsName(clsid)); continue; } foreach (var directSubClsid in subclassIds) { var directSubclassName = mdc.GetClassName(directSubClsid); subclasses.Add(directSubclassName); // added ContainsKey check because of mono bug https://bugzilla.novell.com/show_bug.cgi?id=539288 // see also change in FdoIFwMetaDataCache.cs (AddClass methods replaced with AddClass1, AddClass2) // for simular reasons (order of types obtains via reflection)https://bugzilla.novell.com/show_bug.cgi?id=539288. if (!m_classAndSuperClass.ContainsKey(directSubclassName)) { m_classAndSuperClass.Add(directSubclassName, className); } } } #if ORIGINAL foreach (var classname in m_classesAndTheirDirectSubclasses.Keys) { // Some may have no instances. m_dtosByClass.Add(classname, (from dto in m_dtos where dto.Classname == classname select dto).ToList()); } foreach (var dto in m_dtos) m_dtoByGuid.Add(dto.Guid.ToLower(), dto); #else m_dtoByGuid = new Dictionary<string, DomainObjectDTO>(m_dtos.Count); foreach (var dto in m_dtos) { m_dtoByGuid.Add(dto.Guid.ToLower(), dto); AddToClassList(dto); } #endif }