Skip to content

Commit 31e073d

Browse files
committed
Fix user map deserialization
1 parent 6e5eb2d commit 31e073d

File tree

2 files changed

+27
-15
lines changed

2 files changed

+27
-15
lines changed

src/MigrationTools.Clients.TfsObjectModel/Processors/TfsExportUsersForMappingProcessor.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,14 @@ protected override void InternalExecute()
6464

6565
List<IdentityMapData> usersToMap = data.IdentityMap.Where(x => x.Source.DisplayName != x.Target?.DisplayName).ToList();
6666
Log.LogInformation("Filtered to {usersToMap} total viable mappings", usersToMap.Count);
67-
Dictionary<string, string> usermappings = [];
67+
Dictionary<string, string> usermappings = new(StringComparer.CurrentCultureIgnoreCase);
6868
foreach (IdentityMapData userMapping in usersToMap)
6969
{
7070
// We cannot use ToDictionary(), because there can be multiple users with the same display name and so
7171
// it would throw with duplicate key. This way we just overwrite the value – last item in source wins.
7272
usermappings[userMapping.Source.DisplayName] = userMapping.Target?.DisplayName;
7373
}
74-
File.WriteAllText(CommonTools.UserMapping.Options.UserMappingFile, JsonConvert.SerializeObject(usermappings, Formatting.Indented));
75-
Log.LogInformation("User mappings writen to: {LocalExportJsonFile}", CommonTools.UserMapping.Options.UserMappingFile);
74+
TfsUserMappingTool.SerializeUserMap(CommonTools.UserMapping.Options.UserMappingFile, usermappings, Log);
7675
if (Options.ExportAllUsers)
7776
{
7877
ExportAllUsers(data);

src/MigrationTools.Clients.TfsObjectModel/Tools/TfsUserMappingTool.cs

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.IO;
34
using System.Linq;
45
using Microsoft.Extensions.Logging;
56
using Microsoft.Extensions.Options;
@@ -8,6 +9,7 @@
89
using MigrationTools.DataContracts;
910
using MigrationTools.Processors.Infrastructure;
1011
using MigrationTools.Tools.Infrastructure;
12+
using Newtonsoft.Json;
1113
using Riok.Mapperly.Abstractions;
1214

1315
namespace MigrationTools.Tools
@@ -32,6 +34,27 @@ public TfsUserMappingTool(
3234
private readonly CaseInsensitiveStringComparer _workItemNameComparer = new();
3335
private readonly TfsUserMappingToolMapper _mapper = new();
3436

37+
public static void SerializeUserMap(string fileName, Dictionary<string, string> userMap, ILogger logger)
38+
{
39+
File.WriteAllText(fileName, JsonConvert.SerializeObject(userMap, Formatting.Indented));
40+
logger.LogInformation("User mappings writen to: {fileName}", fileName);
41+
}
42+
43+
public static Dictionary<string, string> DeserializeUserMap(string fileName, ILogger logger)
44+
{
45+
try
46+
{
47+
string fileData = File.ReadAllText(fileName);
48+
var mapping = JsonConvert.DeserializeObject<Dictionary<string, string>>(fileData);
49+
return new Dictionary<string, string>(mapping, StringComparer.CurrentCultureIgnoreCase);
50+
}
51+
catch (Exception)
52+
{
53+
logger.LogError($"TfsUserMappingTool::DeserializeUserMap User mapping could not be deserialized from file '{fileName}'.", fileName);
54+
}
55+
return [];
56+
}
57+
3558
private HashSet<string> GetUsersFromWorkItems(List<WorkItemData> workitems, List<string> identityFieldsToCheck)
3659
{
3760
HashSet<string> foundUsers = new(StringComparer.CurrentCultureIgnoreCase);
@@ -72,22 +95,12 @@ public void MapUserIdentityField(Field field)
7295

7396
private Dictionary<string, string> GetMappingFileData()
7497
{
75-
if (!System.IO.File.Exists(Options.UserMappingFile))
98+
if (!File.Exists(Options.UserMappingFile))
7699
{
77100
Log.LogError("TfsUserMappingTool::GetMappingFileData:: The UserMappingFile '{UserMappingFile}' cant be found! Provide a valid file or disable TfsUserMappingTool!", Options.UserMappingFile);
78101
return [];
79102
}
80-
var fileData = System.IO.File.ReadAllText(Options.UserMappingFile);
81-
try
82-
{
83-
var fileMaps = Newtonsoft.Json.JsonConvert.DeserializeObject<List<IdentityMapData>>(fileData);
84-
return fileMaps.ToDictionary(x => x.Source.DisplayName, x => x.Target?.DisplayName);
85-
}
86-
catch (Exception)
87-
{
88-
Log.LogError($"TfsUserMappingTool::GetMappingFileData [UserMappingFile|{Options.UserMappingFile}] <-- invalid - No mapping are applied!");
89-
}
90-
return [];
103+
return DeserializeUserMap(Options.UserMappingFile, Log);
91104
}
92105

93106
private List<IdentityItemData> GetUsersListFromServer(IGroupSecurityService gss)

0 commit comments

Comments
 (0)