[ 
https://issues.apache.org/jira/browse/AVRO-3603?focusedWorklogId=799886&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-799886
 ]

ASF GitHub Bot logged work on AVRO-3603:
----------------------------------------

                Author: ASF GitHub Bot
            Created on: 11/Aug/22 05:37
            Start Date: 11/Aug/22 05:37
    Worklog Time Spent: 10m 
      Work Description: github-code-scanning[bot] commented on code in PR #1819:
URL: https://github.com/apache/avro/pull/1819#discussion_r943108992


##########
lang/csharp/src/apache/main/Reflect/ReflectDefaultWriter.cs:
##########
@@ -188,9 +181,9 @@
                     return obj is string;
                 case Schema.Type.Error:
                 case Schema.Type.Record:
-                    return _classCache.GetClass(sc as 
RecordSchema).GetClassType() == obj.GetType();
+                    return _reflectCache.GetClass(sc as 
RecordSchema).GetClassType() == obj.GetType();
                 case Schema.Type.Enumeration:
-                    return EnumCache.GetEnumeration(sc as EnumSchema) == 
obj.GetType();
+                    return _reflectCache.GetEnumeration(sc as EnumSchema) == 
obj.GetType();

Review Comment:
   ## Dereferenced variable may be null
   
   Variable [obj](1) may be null here as suggested by [this](2) null check.
   Variable [obj](1) may be null here as suggested by [this](3) null check.
   
   [Show more 
details](https://github.com/apache/avro/security/code-scanning/2845)



##########
lang/csharp/src/apache/main/Reflect/Reflection/ReflectCache.cs:
##########
@@ -288,17 +256,53 @@
~                    else
~                    {
~                        // check the schema types are registered
~                        foreach (var o in us.Schemas)
~                        {
~                            if (o.Tag == Schema.Type.Record && GetClass(o as 
RecordSchema) == null)
~                            {
~                                throw new AvroException($"Class for union 
record type {o.Fullname} is not registered. Create a ClassCache object and call 
LoadClassCache");
~                            }
~                        }
~                    }
~
                     break;
             }
         }
+
+        /// <summary>
+        /// Lookup an entry in the cache - based on the schema fullname
+        /// </summary>
+        /// <param name="schema"></param>
+        /// <returns></returns>
+        public Type GetEnumeration(NamedSchema schema)
+        {
+            Type t;
+            if (!_nameEnumMap.TryGetValue(schema.Fullname, out t))
+            {
+                throw new AvroException($"Couldn't find enumeration for avro 
fullname: {schema.Fullname}");
+            }
+
+            return t;
+        }
+
+         private void AddEnumNameMapItem(NamedSchema schema, Type dotnetEnum)
+        {
+            _nameEnumMap.TryAdd(schema.Fullname, dotnetEnum);
+        }
+
+        private void AddClassNameMapItem(RecordSchema schema, Type dotnetClass)
+        {
+            if (schema != null && GetClass(schema) != null)
+            {
+                return;
+            }
+
+            if (!dotnetClass.IsClass)
+            {
+                throw new AvroException($"Type {dotnetClass.Name} is not a 
class");
+            }
+
+            _nameClassMap.TryAdd(schema.Fullname, new DotnetClass(dotnetClass, 
schema, this));

Review Comment:
   ## Dereferenced variable may be null
   
   Variable [schema](1) may be null here as suggested by [this](2) null check.
   
   [Show more 
details](https://github.com/apache/avro/security/code-scanning/2847)



##########
lang/csharp/src/apache/main/Reflect/Reflection/ReflectCache.cs:
##########
@@ -19,63 +19,31 @@
 using System;
 using System.Collections;
 using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Text;
+using Avro.Reflect.Converter;
+using Avro.Reflect.Interface;
 
-namespace Avro.Reflect
+namespace Avro.Reflect.Reflection
 {
-    /// <summary>
-    /// Class holds a cache of C# classes and their properties. The key for 
the cache is the schema full name.
-    /// </summary>
-    public class ClassCache
+    internal class ReflectCache : IReflectCache
     {
-        private static ConcurrentBag<IAvroFieldConverter> _defaultConverters = 
new ConcurrentBag<IAvroFieldConverter>();
-
+        private ConcurrentDictionary<string, Type> _nameEnumMap = new 
ConcurrentDictionary<string, Type>();

Review Comment:
   ## Missed 'readonly' opportunity
   
   Field '_nameEnumMap' can be 'readonly'.
   
   [Show more 
details](https://github.com/apache/avro/security/code-scanning/2850)



##########
lang/csharp/src/apache/main/Reflect/ReflectDefaultWriter.cs:
##########
@@ -188,9 +181,9 @@
                     return obj is string;
                 case Schema.Type.Error:
                 case Schema.Type.Record:
-                    return _classCache.GetClass(sc as 
RecordSchema).GetClassType() == obj.GetType();
+                    return _reflectCache.GetClass(sc as 
RecordSchema).GetClassType() == obj.GetType();

Review Comment:
   ## Dereferenced variable may be null
   
   Variable [obj](1) may be null here as suggested by [this](2) null check.
   Variable [obj](1) may be null here as suggested by [this](3) null check.
   
   [Show more 
details](https://github.com/apache/avro/security/code-scanning/2844)



##########
lang/csharp/src/apache/main/Reflect/ReflectDefaultWriter.cs:
##########
@@ -28,28 +30,19 @@
     /// </summary>
     public class ReflectDefaultWriter : SpecificDefaultWriter
     {
-        private ClassCache _classCache = new ClassCache();
-
-        /// <summary>
-        /// Class cache
-        /// </summary>
-        public ClassCache ClassCache { get => _classCache; }
+        private IReflectCache _reflectCache;

Review Comment:
   ## Missed 'readonly' opportunity
   
   Field '_reflectCache' can be 'readonly'.
   
   [Show more 
details](https://github.com/apache/avro/security/code-scanning/2849)



##########
lang/csharp/src/apache/main/Reflect/ReflectDefaultReader.cs:
##########
@@ -37,12 +39,7 @@
         /// </summary>
         public Type MapType { get => _mapType; set => _mapType = value; }
 
-        private ClassCache _classCache = new ClassCache();
-
-        /// <summary>
-        /// Class cache
-        /// </summary>
-        public ClassCache ClassCache { get => _classCache; }
+        private IReflectCache _reflectCache;

Review Comment:
   ## Missed 'readonly' opportunity
   
   Field '_reflectCache' can be 'readonly'.
   
   [Show more 
details](https://github.com/apache/avro/security/code-scanning/2848)





Issue Time Tracking
-------------------

    Worklog Id:     (was: 799886)
    Time Spent: 20m  (was: 10m)

> .NET/#C: Refactor ReflectReader/Writer: rename and refactor caches, add DI
> --------------------------------------------------------------------------
>
>                 Key: AVRO-3603
>                 URL: https://issues.apache.org/jira/browse/AVRO-3603
>             Project: Apache Avro
>          Issue Type: Improvement
>            Reporter: Khrystyna Popadyuk
>            Assignee: Khrystyna Popadyuk
>            Priority: Major
>              Labels: pull-request-available
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> Current ReflectReader/Writer use a lot of static entities (classes, methods, 
> fields). It is good to refactor them with interfaces and DI approach.
> If do such update at once it requires massive changes and can we difficult to 
> review and test.
> This story is created as first step for such refactoring. It will include:
>  - group classes by folders
>  - add DI
>  - rename and refactor ClassCash and EnumCache (avoid method refactoring in 
> scope of this story)
> This story do not update method implementation.
> This is breaking changes.
>  
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to