isn/src/isnd/WebApiReferenceResolver.cs

98 lines
3.0 KiB
C#

3 years ago
using System.Collections.Generic;
using System.Linq;
using System.Text.Json.Serialization;
using isnd.Data.Catalog;
namespace isnd
{
class WebApiReferenceHandler : ReferenceHandler
{
public WebApiReferenceHandler() => Reset();
private ReferenceResolver? _rootedResolver;
public override ReferenceResolver CreateResolver() => _rootedResolver!;
public void Reset() => _rootedResolver = new WebApiReferenceResolver();
}
public class WebApiReferenceResolver : ReferenceResolver
{
private int delautIdCounter;
3 years ago
Dictionary<string, Permalink> HappyIdOwners { get; set; }
3 years ago
Dictionary<int,object> Objects {get; set;}
public WebApiReferenceResolver()
{
delautIdCounter = 0;
3 years ago
HappyIdOwners = new Dictionary<string, Permalink>();
3 years ago
Objects = new Dictionary<int, object>();
}
public override void AddReference(string referenceId, object value)
{
3 years ago
if (value is Permalink)
3 years ago
{
3 years ago
string hoi = (value as Permalink).GetId();
3 years ago
if (HappyIdOwners.ContainsKey(hoi))
{
return;
}
3 years ago
HappyIdOwners[hoi] = value as Permalink;
3 years ago
}
else
{
if (Objects.ContainsValue(value))
{
return;
}
delautIdCounter++;
Objects[delautIdCounter] = value;
}
}
public override string GetReference(object value, out bool alreadyExists)
{
3 years ago
if (value is Permalink)
3 years ago
{
3 years ago
string oid = (value as Permalink).GetId();
3 years ago
if (oid == null)
throw new System.Exception("HappyIdOwner Id property is null");
if (HappyIdOwners.ContainsKey(oid))
{
alreadyExists=true;
return oid;
}
alreadyExists=false;
AddReference(oid, value);
return oid;
}
alreadyExists=false;
if (Objects.ContainsValue(value))
{
alreadyExists=true;
return Objects.First( ode => ode.Value ==value).Key.ToString();
}
alreadyExists=false;
delautIdCounter++;
Objects[delautIdCounter]=value;
return delautIdCounter.ToString();
}
public override object ResolveReference(string referenceId)
{
if (HappyIdOwners.ContainsKey(referenceId))
return HappyIdOwners[referenceId];
int refNId;
if (int.TryParse(referenceId, out refNId))
{
if (Objects.ContainsKey(refNId))
{
return Objects[refNId];
}
}
return null;
}
}
}