From 3d68e6a490d651de21ae1fed09095b53f1be82fc Mon Sep 17 00:00:00 2001 From: Jake Oliver Date: Wed, 22 Jan 2025 17:00:28 -0500 Subject: [PATCH 1/5] LT-21053: Update homographs to match publication --- Src/xWorks/ConfiguredLcmGenerator.cs | 27 +++--- Src/xWorks/DictionaryPublicationDecorator.cs | 87 ++++++++++++++++++++ 2 files changed, 104 insertions(+), 10 deletions(-) diff --git a/Src/xWorks/ConfiguredLcmGenerator.cs b/Src/xWorks/ConfiguredLcmGenerator.cs index ddcaacd052..831a547557 100644 --- a/Src/xWorks/ConfiguredLcmGenerator.cs +++ b/Src/xWorks/ConfiguredLcmGenerator.cs @@ -429,7 +429,7 @@ internal static IFragment GenerateContentForFieldByReflection(object field, Conf { // REVIEW: We have overloaded terms here, this is a C# class not a css class, consider a different name var customFieldOwnerClassName = GetClassNameForCustomFieldParent(config, settings.Cache); - if (!GetPropValueForCustomField(field, config, cache, customFieldOwnerClassName, config.FieldDescription, ref propertyValue)) + if (!GetPropValueForCustomField(field, config, cache, publicationDecorator, customFieldOwnerClassName, config.FieldDescription, ref propertyValue)) return settings.ContentGenerator.CreateFragment(); } else @@ -454,7 +454,12 @@ internal static IFragment GenerateContentForFieldByReflection(object field, Conf #endif return settings.ContentGenerator.CreateFragment(); } - propertyValue = GetValueFromMember(property, field); + // This code demonstrates using the cache metadata, + // an alternative form of reflection to get values that respect the decorator + // We may be able to replace the GetValueFromMember above with this code, but the ownerClassName may take + // some work to determine + var success = GetPropValueForCustomField(field, config, cache, publicationDecorator, + ((ICmObject)field).ClassName, property.Name, ref propertyValue); GetSortedReferencePropertyValue(config, ref propertyValue, field); } // If the property value is null there is nothing to generate @@ -467,7 +472,7 @@ internal static IFragment GenerateContentForFieldByReflection(object field, Conf if (config.IsCustomField) { // Get the custom field value (in SubField) using the property which came from the field object - if (!GetPropValueForCustomField(propertyValue, config, cache, ((ICmObject)propertyValue).ClassName, + if (!GetPropValueForCustomField(propertyValue, config, cache, publicationDecorator, ((ICmObject)propertyValue).ClassName, config.SubField, ref propertyValue)) { return settings.ContentGenerator.CreateFragment(); @@ -572,8 +577,10 @@ private static IFragment GenerateContentForGroupingNode(object field, Configurab /// true if the custom field was valid and false otherwise /// propertyValue can be null if the custom field is valid but no value is stored for the owning object private static bool GetPropValueForCustomField(object fieldOwner, ConfigurableDictionaryNode config, - LcmCache cache, string customFieldOwnerClassName, string customFieldName, ref object propertyValue) + LcmCache cache, ISilDataAccess decorator, string customFieldOwnerClassName, string customFieldName, ref object propertyValue) { + if (decorator == null) + decorator = cache.DomainDataByFlid; int customFieldFlid = GetCustomFieldFlid(config, cache, customFieldOwnerClassName, customFieldName); if (customFieldFlid != 0) { @@ -618,36 +625,36 @@ private static bool GetPropValueForCustomField(object fieldOwner, ConfigurableDi case (int)CellarPropertyType.OwningAtomic: { // This method returns the hvo of the object pointed to - propertyValue = cache.MainCacheAccessor.get_ObjectProp(specificObject.Hvo, customFieldFlid); + propertyValue = decorator.get_ObjectProp(specificObject.Hvo, customFieldFlid); // if the hvo is invalid set propertyValue to null otherwise get the object propertyValue = (int)propertyValue > 0 ? cache.LangProject.Services.GetObject((int)propertyValue) : null; break; } case (int)CellarPropertyType.GenDate: { - propertyValue = new GenDate(cache.MainCacheAccessor.get_IntProp(specificObject.Hvo, customFieldFlid)); + propertyValue = new GenDate(decorator.get_IntProp(specificObject.Hvo, customFieldFlid)); break; } case (int)CellarPropertyType.Time: { - propertyValue = SilTime.ConvertFromSilTime(cache.MainCacheAccessor.get_TimeProp(specificObject.Hvo, customFieldFlid)); + propertyValue = SilTime.ConvertFromSilTime(decorator.get_TimeProp(specificObject.Hvo, customFieldFlid)); break; } case (int)CellarPropertyType.MultiUnicode: case (int)CellarPropertyType.MultiString: { - propertyValue = cache.MainCacheAccessor.get_MultiStringProp(specificObject.Hvo, customFieldFlid); + propertyValue = decorator.get_MultiStringProp(specificObject.Hvo, customFieldFlid); break; } case (int)CellarPropertyType.String: { - propertyValue = cache.MainCacheAccessor.get_StringProp(specificObject.Hvo, customFieldFlid); + propertyValue = decorator.get_StringProp(specificObject.Hvo, customFieldFlid); break; } case (int)CellarPropertyType.Integer: { - propertyValue = cache.MainCacheAccessor.get_IntProp(specificObject.Hvo, customFieldFlid); + propertyValue = decorator.get_IntProp(specificObject.Hvo, customFieldFlid); break; } } diff --git a/Src/xWorks/DictionaryPublicationDecorator.cs b/Src/xWorks/DictionaryPublicationDecorator.cs index 69988b8821..06b843b311 100644 --- a/Src/xWorks/DictionaryPublicationDecorator.cs +++ b/Src/xWorks/DictionaryPublicationDecorator.cs @@ -244,6 +244,15 @@ private string GetSenseNumber(ILexSense sense) return Cache.GetOutlineNumber(sense, LexSenseTags.kflidSenses, false, true, this); } + public override ITsMultiString get_MultiStringProp(int hvo, int tag) + { + if (tag == m_mlHeadwordFlid) + { + return new PublicationAwareMultiStringAccessor(hvo, tag, this); + } + return base.get_MultiStringProp(hvo, tag); + } + public override ITsString get_MultiStringAlt(int hvo, int tag, int ws) { if (tag == m_mlHeadwordFlid) @@ -615,5 +624,83 @@ private bool IsPublishableReference(ILexEntryRef entryRef) // A reference is also not publishable if all of its PrimarySensesOrEntries are excluded return entryRef.PrimarySensesOrEntries.Any(senseOrEntry => !m_excludedItems.Contains(senseOrEntry.Item.Hvo)); } + + private class PublicationAwareMultiStringAccessor : IMultiAccessorBase + { + private readonly int m_hvo; + private readonly int m_tag; + private readonly DictionaryPublicationDecorator m_decorator; + + public PublicationAwareMultiStringAccessor(int hvo, int tag, DictionaryPublicationDecorator decorator) + { + m_hvo = hvo; + m_tag = tag; + m_decorator = decorator; + } + + public ITsString GetStringFromIndex(int iws, out int _ws) + { + throw new NotImplementedException(); + } + + public ITsString get_String(int ws) + { + return m_decorator.get_MultiStringAlt(m_hvo, m_tag, ws); + } + + public void set_String(int ws, ITsString _tss) + { + throw new NotImplementedException(); + } + + public int StringCount { get; } + public void SetAnalysisDefaultWritingSystem(string val) + { + throw new NotImplementedException(); + } + + public void SetVernacularDefaultWritingSystem(string val) + { + throw new NotImplementedException(); + } + + public void SetUserWritingSystem(string val) + { + throw new NotImplementedException(); + } + + public void set_String(int ws, string val) + { + throw new NotImplementedException(); + } + + public bool TryWs(int ws, out int actualWs) + { + throw new NotImplementedException(); + } + + public bool TryWs(int ws, out int actualWs, out ITsString tssActual) + { + throw new NotImplementedException(); + } + + public ITsString StringOrNull(int ws) + { + throw new NotImplementedException(); + } + + public int Flid { get; } + public ITsString NotFoundTss { get; } + public ITsString AnalysisDefaultWritingSystem { get; set; } + public ITsString VernacularDefaultWritingSystem { get; set; } + public string UiString { get; } + public ITsString UserDefaultWritingSystem { get; set; } + public ITsString RawUserDefaultWritingSystem { get; } + public ITsString BestAnalysisVernacularAlternative { get; } + public ITsString BestAnalysisAlternative { get; } + public ITsString BestVernacularAlternative { get; } + public ITsString BestVernacularAnalysisAlternative { get; } + public int[] AvailableWritingSystemIds { get; } + } } } From 31a52977e11d4536369007456d7f70e3e9893078 Mon Sep 17 00:00:00 2001 From: Jake Oliver Date: Wed, 22 Jan 2025 17:25:29 -0500 Subject: [PATCH 2/5] Delete unused method and unneeded comment --- Src/xWorks/ConfiguredLcmGenerator.cs | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/Src/xWorks/ConfiguredLcmGenerator.cs b/Src/xWorks/ConfiguredLcmGenerator.cs index 831a547557..7d7d62913b 100644 --- a/Src/xWorks/ConfiguredLcmGenerator.cs +++ b/Src/xWorks/ConfiguredLcmGenerator.cs @@ -456,8 +456,6 @@ internal static IFragment GenerateContentForFieldByReflection(object field, Conf } // This code demonstrates using the cache metadata, // an alternative form of reflection to get values that respect the decorator - // We may be able to replace the GetValueFromMember above with this code, but the ownerClassName may take - // some work to determine var success = GetPropValueForCustomField(field, config, cache, publicationDecorator, ((ICmObject)field).ClassName, property.Name, ref propertyValue); GetSortedReferencePropertyValue(config, ref propertyValue, field); @@ -1226,24 +1224,6 @@ private static Type GetTypeFromMember(MemberInfo property) } } - private static object GetValueFromMember(MemberInfo property, object instance) - { - switch (property.MemberType) - { - case MemberTypes.Property: - { - return ((PropertyInfo)property).GetValue(instance, new object[] {}); - } - case MemberTypes.Method: - { - // Execute the presumed extension method (passing the instance as the 'this' parameter) - return ((MethodInfo)property).Invoke(instance, new object[] {instance}); - } - default: - return null; - } - } - private static Type GetCustomFieldType(Type lookupType, ConfigurableDictionaryNode config, LcmCache cache) { // FDO doesn't work with interfaces, just concrete classes so chop the I off any interface types From 2413f147def40beaf07414e41be9affc0c45b43a Mon Sep 17 00:00:00 2001 From: Jake Oliver Date: Wed, 5 Feb 2025 18:31:23 -0500 Subject: [PATCH 3/5] Changes --- Src/xWorks/ConfiguredLcmGenerator.cs | 177 ++++++++++++++++----------- x64/Debug/System.ValueTuple.dll | Bin 0 -> 78992 bytes 2 files changed, 106 insertions(+), 71 deletions(-) create mode 100644 x64/Debug/System.ValueTuple.dll diff --git a/Src/xWorks/ConfiguredLcmGenerator.cs b/Src/xWorks/ConfiguredLcmGenerator.cs index 7d7d62913b..7a30d4485d 100644 --- a/Src/xWorks/ConfiguredLcmGenerator.cs +++ b/Src/xWorks/ConfiguredLcmGenerator.cs @@ -382,6 +382,34 @@ public static string GetClassNameAttributeForConfig(ConfigurableDictionaryNode c return classAtt; } + private static string PlainFieldName(string fieldname) + { + if (fieldname.EndsWith("OA") || fieldname.EndsWith("OS") || fieldname.EndsWith("OC") + || fieldname.EndsWith("RA") || fieldname.EndsWith("RS") || fieldname.EndsWith("RC")) + { + return fieldname.Substring(0, fieldname.Length - 2); + } + return fieldname; + } + + private static object GetValueFromMember(MemberInfo property, object instance) + { + switch (property.MemberType) + { + case MemberTypes.Property: + { + return ((PropertyInfo)property).GetValue(instance, new object[] { }); + } + case MemberTypes.Method: + { + // Execute the presumed extension method (passing the instance as the 'this' parameter) + return ((MethodInfo)property).Invoke(instance, new object[] { instance }); + } + default: + return null; + } + } + /// /// This method will use reflection to pull data out of the given object based on the given configuration and /// write out appropriate content using the settings parameter. @@ -456,8 +484,14 @@ internal static IFragment GenerateContentForFieldByReflection(object field, Conf } // This code demonstrates using the cache metadata, // an alternative form of reflection to get values that respect the decorator - var success = GetPropValueForCustomField(field, config, cache, publicationDecorator, - ((ICmObject)field).ClassName, property.Name, ref propertyValue); + bool success = false; + if (field is ICmObject) + success = GetPropValueForCustomField(field, config, cache, publicationDecorator, + ((ICmObject)field).ClassName, PlainFieldName(property.Name), ref propertyValue); + + if (!success) + propertyValue = GetValueFromMember(property, field); + GetSortedReferencePropertyValue(config, ref propertyValue, field); } // If the property value is null there is nothing to generate @@ -580,83 +614,84 @@ private static bool GetPropValueForCustomField(object fieldOwner, ConfigurableDi if (decorator == null) decorator = cache.DomainDataByFlid; int customFieldFlid = GetCustomFieldFlid(config, cache, customFieldOwnerClassName, customFieldName); - if (customFieldFlid != 0) + if (customFieldFlid == 0) + return false; + + var customFieldType = cache.MetaDataCacheAccessor.GetFieldType(customFieldFlid); + ICmObject specificObject; + if (fieldOwner is ISenseOrEntry) { - var customFieldType = cache.MetaDataCacheAccessor.GetFieldType(customFieldFlid); - ICmObject specificObject; - if (fieldOwner is ISenseOrEntry) - { - specificObject = ((ISenseOrEntry)fieldOwner).Item; - if (!((IFwMetaDataCacheManaged)cache.MetaDataCacheAccessor).GetFields(specificObject.ClassID, - true, (int)CellarPropertyTypeFilter.All).Contains(customFieldFlid)) - { - return false; - } - } - else + specificObject = ((ISenseOrEntry)fieldOwner).Item; + if (!((IFwMetaDataCacheManaged)cache.MetaDataCacheAccessor).GetFields(specificObject.ClassID, + true, (int)CellarPropertyTypeFilter.All).Contains(customFieldFlid)) { - specificObject = (ICmObject)fieldOwner; + return false; } + } + else + { + specificObject = (ICmObject)fieldOwner; + } - switch (customFieldType) - { - case (int)CellarPropertyType.ReferenceCollection: - case (int)CellarPropertyType.OwningCollection: - // Collections are stored essentially the same as sequences. - case (int)CellarPropertyType.ReferenceSequence: - case (int)CellarPropertyType.OwningSequence: - { - var sda = cache.MainCacheAccessor; - // This method returns the hvo of the object pointed to - var chvo = sda.get_VecSize(specificObject.Hvo, customFieldFlid); - int[] contents; - using (var arrayPtr = MarshalEx.ArrayToNative(chvo)) - { - sda.VecProp(specificObject.Hvo, customFieldFlid, chvo, out chvo, arrayPtr); - contents = MarshalEx.NativeToArray(arrayPtr, chvo); - } - // if the hvo is invalid set propertyValue to null otherwise get the object - propertyValue = contents.Select(id => cache.LangProject.Services.GetObject(id)); - break; - } - case (int)CellarPropertyType.ReferenceAtomic: - case (int)CellarPropertyType.OwningAtomic: + switch (customFieldType) + { + case (int)CellarPropertyType.ReferenceCollection: + case (int)CellarPropertyType.OwningCollection: + // Collections are stored essentially the same as sequences. + case (int)CellarPropertyType.ReferenceSequence: + case (int)CellarPropertyType.OwningSequence: + { + var sda = cache.MainCacheAccessor; + // This method returns the hvo of the object pointed to + var chvo = sda.get_VecSize(specificObject.Hvo, customFieldFlid); + int[] contents; + using (var arrayPtr = MarshalEx.ArrayToNative(chvo)) { - // This method returns the hvo of the object pointed to - propertyValue = decorator.get_ObjectProp(specificObject.Hvo, customFieldFlid); - // if the hvo is invalid set propertyValue to null otherwise get the object - propertyValue = (int)propertyValue > 0 ? cache.LangProject.Services.GetObject((int)propertyValue) : null; - break; - } - case (int)CellarPropertyType.GenDate: - { - propertyValue = new GenDate(decorator.get_IntProp(specificObject.Hvo, customFieldFlid)); - break; + sda.VecProp(specificObject.Hvo, customFieldFlid, chvo, out chvo, arrayPtr); + contents = MarshalEx.NativeToArray(arrayPtr, chvo); } + // if the hvo is invalid set propertyValue to null otherwise get the object + propertyValue = contents.Select(id => cache.LangProject.Services.GetObject(id)); + break; + } + case (int)CellarPropertyType.ReferenceAtomic: + case (int)CellarPropertyType.OwningAtomic: + { + // This method returns the hvo of the object pointed to + propertyValue = decorator.get_ObjectProp(specificObject.Hvo, customFieldFlid); + // if the hvo is invalid set propertyValue to null otherwise get the object + propertyValue = (int)propertyValue > 0 ? cache.LangProject.Services.GetObject((int)propertyValue) : null; + break; + } + case (int)CellarPropertyType.GenDate: + { + propertyValue = new GenDate(decorator.get_IntProp(specificObject.Hvo, customFieldFlid)); + break; + } - case (int)CellarPropertyType.Time: - { - propertyValue = SilTime.ConvertFromSilTime(decorator.get_TimeProp(specificObject.Hvo, customFieldFlid)); - break; - } - case (int)CellarPropertyType.MultiUnicode: - case (int)CellarPropertyType.MultiString: - { - propertyValue = decorator.get_MultiStringProp(specificObject.Hvo, customFieldFlid); - break; - } - case (int)CellarPropertyType.String: - { - propertyValue = decorator.get_StringProp(specificObject.Hvo, customFieldFlid); - break; - } - case (int)CellarPropertyType.Integer: - { - propertyValue = decorator.get_IntProp(specificObject.Hvo, customFieldFlid); - break; - } - } + case (int)CellarPropertyType.Time: + { + propertyValue = SilTime.ConvertFromSilTime(decorator.get_TimeProp(specificObject.Hvo, customFieldFlid)); + break; + } + case (int)CellarPropertyType.MultiUnicode: + case (int)CellarPropertyType.MultiString: + { + propertyValue = decorator.get_MultiStringProp(specificObject.Hvo, customFieldFlid); + break; + } + case (int)CellarPropertyType.String: + { + propertyValue = decorator.get_StringProp(specificObject.Hvo, customFieldFlid); + break; + } + case (int)CellarPropertyType.Integer: + { + propertyValue = decorator.get_IntProp(specificObject.Hvo, customFieldFlid); + break; + } } + return true; } diff --git a/x64/Debug/System.ValueTuple.dll b/x64/Debug/System.ValueTuple.dll new file mode 100644 index 0000000000000000000000000000000000000000..1cadbf3ee367da5c24e64e25054ab2fc0b6e8e79 GIT binary patch literal 78992 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 K-NGShM*DxMJ0np5 literal 0 HcmV?d00001 From 0600927961251ac70c36938610b70c777f213650 Mon Sep 17 00:00:00 2001 From: Jake Oliver Date: Thu, 6 Feb 2025 15:16:48 -0500 Subject: [PATCH 4/5] Changes --- Src/xWorks/ConfiguredLcmGenerator.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Src/xWorks/ConfiguredLcmGenerator.cs b/Src/xWorks/ConfiguredLcmGenerator.cs index 7a30d4485d..5ae54fdaee 100644 --- a/Src/xWorks/ConfiguredLcmGenerator.cs +++ b/Src/xWorks/ConfiguredLcmGenerator.cs @@ -29,6 +29,7 @@ using System.IO; using System.Linq; using System.Reflection; +using System.Runtime.Remoting.Messaging; using System.Text; using System.Text.RegularExpressions; using System.Threading; @@ -2067,6 +2068,13 @@ private static List>> SortAndFilterLexR } } MoveTargetsToMasterList(cmOwner, curType.Item1, config, allTargetsForType, orderedTargets); + orderedTargets.Sort((list1, list2) => + { + if (!list1.Any() && !list2.Any()) return 0; + if (!list1.Any()) return -1; + if (!list2.Any()) return 1; + return CompareLexRefTargets(list1[0], list2[0]); + }); return orderedTargets; } From f8905d0b7fd9f81a2d3de09379555a970e684579 Mon Sep 17 00:00:00 2001 From: Jason Naylor Date: Mon, 10 Feb 2025 07:48:11 -0800 Subject: [PATCH 5/5] Get a collection of the correct type --- Src/xWorks/ConfiguredLcmGenerator.cs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/Src/xWorks/ConfiguredLcmGenerator.cs b/Src/xWorks/ConfiguredLcmGenerator.cs index 5ae54fdaee..f87bdddee3 100644 --- a/Src/xWorks/ConfiguredLcmGenerator.cs +++ b/Src/xWorks/ConfiguredLcmGenerator.cs @@ -487,8 +487,10 @@ internal static IFragment GenerateContentForFieldByReflection(object field, Conf // an alternative form of reflection to get values that respect the decorator bool success = false; if (field is ICmObject) + { success = GetPropValueForCustomField(field, config, cache, publicationDecorator, ((ICmObject)field).ClassName, PlainFieldName(property.Name), ref propertyValue); + } if (!success) propertyValue = GetValueFromMember(property, field); @@ -651,8 +653,11 @@ private static bool GetPropValueForCustomField(object fieldOwner, ConfigurableDi sda.VecProp(specificObject.Hvo, customFieldFlid, chvo, out chvo, arrayPtr); contents = MarshalEx.NativeToArray(arrayPtr, chvo); } - // if the hvo is invalid set propertyValue to null otherwise get the object - propertyValue = contents.Select(id => cache.LangProject.Services.GetObject(id)); + // Convert the contents to IEnumerable + var objects = contents.Select(id => cache.LangProject.Services.GetObject(id)); + var type = objects.FirstOrDefault()?.GetType() ?? typeof(object); + var castMethod = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(type); + propertyValue = castMethod.Invoke(null, new object[] { objects }); break; } case (int)CellarPropertyType.ReferenceAtomic: @@ -747,6 +752,7 @@ private static void GetSortedReferencePropertyValue(ConfigurableDictionaryNode c { var options = config.DictionaryNodeOptions as DictionaryNodeListOptions; var unsortedReferences = propertyValue as IEnumerable; + var list = propertyValue as List; if (options == null || unsortedReferences == null || !unsortedReferences.Any()) return; // Calculate and store the ids for each of the references once for efficiency. @@ -2068,13 +2074,6 @@ private static List>> SortAndFilterLexR } } MoveTargetsToMasterList(cmOwner, curType.Item1, config, allTargetsForType, orderedTargets); - orderedTargets.Sort((list1, list2) => - { - if (!list1.Any() && !list2.Any()) return 0; - if (!list1.Any()) return -1; - if (!list2.Any()) return 1; - return CompareLexRefTargets(list1[0], list2[0]); - }); return orderedTargets; }