/// ---------------------------------------------------------------------------------------- /// <summary> /// Gives the CSharp interface type for the repository that creates objects of the specified class. /// </summary> /// ---------------------------------------------------------------------------------------- internal static Type GetRepositoryTypeFromFWClassID(IFwMetaDataCacheManaged mdc, int classId) { // if the class ID is cached then return the type now. Type result; if (s_classIdToRepoType.TryGetValue(classId, out result)) return result; // Find the class name of this object var sClassName = mdc.GetClassName(classId); // find the Type for the repository for this class. var fullTypeName = string.Format("SIL.FieldWorks.FDO.I{0}Repository", sClassName); result = Assembly.GetExecutingAssembly().GetType(fullTypeName, true); s_classIdToRepoType.Add(classId, result); // Store for next time. return result; }
/// ---------------------------------------------------------------------------------------- /// <summary> /// Gives the CSharp interface type for the factory that creates objects of the specified class. /// </summary> /// ---------------------------------------------------------------------------------------- internal static Type GetFactoryTypeFromFWClassID(IFwMetaDataCacheManaged mdc, int classId) { // Abstract classes have no factory. if (mdc.GetAbstract(classId)) throw new ArgumentException("No factory for abstract classes", "classId"); // if the class ID is cached then return the type now. Type result; if (s_classIdToFactType.TryGetValue(classId, out result)) return result; // Find the class name of this object var sClassName = mdc.GetClassName(classId); // find the Type for the factory for this class. var fullTypeName = string.Format("SIL.FieldWorks.FDO.I{0}Factory", sClassName); result = Assembly.GetExecutingAssembly().GetType(fullTypeName, true); s_classIdToFactType.Add(classId, result); // Store for next time. return result; }
/// <summary> Gets the name of the class. </summary> /// <param name='luClid'>Class identification number. In the database, this corresponds to "Id" /// column in the Class$ table. </param> /// <returns>Points to the output name of the class with the given /// identification number. In the database, this is the "Name" column in the Class$ table.</returns> public virtual string GetClassName(int luClid) { return(m_metaDataCache.GetClassName(luClid)); }
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 static Dictionary<string, List<PropertyInfo>> CacheBasicProperties(IFwMetaDataCacheManaged mdc) { var cachedBasicProperties = new Dictionary<string, List<PropertyInfo>>(); foreach (var classId in mdc.GetClassIds()) { var className = mdc.GetClassName(classId); List<PropertyInfo> basicProps; if (!cachedBasicProperties.TryGetValue(className, out basicProps)) { basicProps = new List<PropertyInfo>(); cachedBasicProperties.Add(className, basicProps); } basicProps.AddRange(mdc.GetFields(classId, className != "CmObject", (int)CellarPropertyTypeFilter.AllBasic).Select(propId => new PropertyInfo { m_propertyName = mdc.GetFieldName(propId), m_propertyType = (CellarPropertyType)mdc.GetFieldType(propId), m_isCustom = mdc.IsCustom(propId), m_isVirtual = mdc.get_IsVirtual(propId) })); if (basicProps.Count == 0) cachedBasicProperties.Remove(className); } return cachedBasicProperties; }
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 }