diff --git a/Pilz.Cryptography/Json.Converters/UniquieIDStringJsonConverter.TargetType.cs b/Pilz.Cryptography/Json.Converters/UniquieIDStringJsonConverter.TargetType.cs new file mode 100644 index 0000000..8b47679 --- /dev/null +++ b/Pilz.Cryptography/Json.Converters/UniquieIDStringJsonConverter.TargetType.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Pilz.Json.Converters +{ + [Obsolete] + public class UniquieIDStringJsonConverter : UniquieIDStringJsonConverter + { + } +} diff --git a/Pilz.Cryptography/UniquiIDStringJsonConverter.cs b/Pilz.Cryptography/Json.Converters/UniquieIDStringJsonConverter.cs similarity index 55% rename from Pilz.Cryptography/UniquiIDStringJsonConverter.cs rename to Pilz.Cryptography/Json.Converters/UniquieIDStringJsonConverter.cs index 128f4f4..f3725ab 100644 --- a/Pilz.Cryptography/UniquiIDStringJsonConverter.cs +++ b/Pilz.Cryptography/Json.Converters/UniquieIDStringJsonConverter.cs @@ -2,30 +2,28 @@ using Pilz.Cryptography; using System; using System.Collections.Generic; -using System.IO; -using System.IO.Compression; -using System.Linq; using System.Text; -using System.Threading.Tasks; namespace Pilz.Json.Converters { - public class UniquiIDStringJsonConverter : JsonConverter + public class UniquieIDStringJsonConverter : JsonConverter { + public static bool EnableCheckForDepricatedTypes { get; set; } = true; + public override bool CanConvert(Type objectType) { - return typeof(UniquieID).IsAssignableFrom(objectType); + return typeof(UniquieID).IsAssignableFrom(objectType); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var idString = serializer.Deserialize(reader); - UniquieID id; + UniquieID id; - if (existingValue is object) - id = (UniquieID)existingValue; + if (existingValue is UniquieID existingID && (!EnableCheckForDepricatedTypes || existingID.GetType() == typeof(UniquieID))) + id = existingID; else - id = new UniquieID(); + id = new UniquieID(); id.ID = idString; @@ -34,7 +32,7 @@ namespace Pilz.Json.Converters public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { - serializer.Serialize(writer, ((UniquieID)value).ID); + serializer.Serialize(writer, ((UniquieID)value).ID); } } } diff --git a/Pilz.Cryptography/UniquieID.TargetType.cs b/Pilz.Cryptography/UniquieID.TargetType.cs new file mode 100644 index 0000000..588ce60 --- /dev/null +++ b/Pilz.Cryptography/UniquieID.TargetType.cs @@ -0,0 +1,40 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Management; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace Pilz.Cryptography +{ + [Obsolete("To be removed in the future. Use base class UniquieID!")] + public class UniquieID : UniquieID + { + public UniquieID() : base() + { + } + + public UniquieID(bool autoGenerate) : base(autoGenerate) + { + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + + public override bool Equals(object obj) + { + return base.Equals(obj); + } + + public static implicit operator string(UniquieID id) => id.ID; + public static implicit operator UniquieID(string id) => new UniquieID() { ID = id }; + public static implicit operator UniquieID(int id) => new UniquieID() { ID = Convert.ToString(id) }; + + public static bool operator ==(UniquieID left, UniquieID right) => left.ID.Equals(right.ID); + public static bool operator !=(UniquieID left, UniquieID right) => !left.ID.Equals(right.ID); + } +} \ No newline at end of file diff --git a/Pilz.Cryptography/UniquieID.cs b/Pilz.Cryptography/UniquieID.cs index 1647273..b47068b 100644 --- a/Pilz.Cryptography/UniquieID.cs +++ b/Pilz.Cryptography/UniquieID.cs @@ -1,47 +1,119 @@ using Newtonsoft.Json; using System; using System.Collections.Generic; -using System.Linq; using System.Management; using System.Security.Cryptography; using System.Text; -using System.Threading.Tasks; namespace Pilz.Cryptography { - public class UniquieID : UniquieID + [JsonConverter(typeof(Json.Converters.UniquieIDStringJsonConverter))] + public class UniquieID : IUniquieID { - public UniquieID() : base() + protected static ulong currentSimpleID = 0; + + [JsonProperty(nameof(ID))] + protected string _iD; + + [JsonIgnore] + public virtual bool SimpleMode { get; set; } = false; + + [JsonIgnore] + public virtual bool GenerateOnGet { get; set; } = false; + + [JsonIgnore] + public virtual bool HasID => !string.IsNullOrEmpty(_iD); + + [JsonIgnore] + public virtual string ID + { + get + { + if (GenerateOnGet) + GenerateIfNull(); + return _iD; + } + internal set + => _iD = value; + } + + public UniquieID() : this(false) { } - public UniquieID(bool autoGenerate) : base(autoGenerate) + public UniquieID(bool autoGenerate) { + if (autoGenerate) + GenerateIfNull(); } - protected override string GenerateSimple() + public virtual void Generate() { - return typeof(TargetType).ToString() + base.GenerateSimple(); + if (SimpleMode) + ID = GenerateSimple(); + else + ID = GenerateDefault(); } - protected override string GenerateDefault() + protected virtual string GenerateSimple() { - return GenerateUniquieID(string.Empty); + return new Random().Next().ToString() + DateTime.Now.ToString("yyyyMMddHHmmssfffffff") + currentSimpleID++.ToString(); + } + + protected virtual string GenerateDefault() + { + return GenerateUniquieID(currentSimpleID++.ToString()); + } + + public virtual void GenerateIfNull() + { + if (!HasID) Generate(); + } + + public override string ToString() + { + return ID; } public override int GetHashCode() { - return base.GetHashCode(); + return -1430039477 + EqualityComparer.Default.GetHashCode(_iD); } public override bool Equals(object obj) { + if (obj is UniquieID iD) + { + if (ReferenceEquals(obj, iD)) + return true; + else + { + var leftHasID = iD.HasID; + var rightHasID = HasID; + + if (!leftHasID && iD.GenerateOnGet) + { + iD.Generate(); + leftHasID = iD.HasID; + } + + if (!rightHasID && GenerateOnGet) + { + Generate(); + rightHasID = HasID; + } + + if (leftHasID && rightHasID) + return _iD.Equals(iD._iD); + } + } + return base.Equals(obj); } #region Statics for Generation - private static string GenerateUniquieID(string var) + protected static string GenerateUniquieID(string var) { var sn = TryGetSerialNumberOfFirstHardDrive(); var dateTime = DateTime.UtcNow.ToString("yyyyMMddHHmmssfffffff"); @@ -77,11 +149,11 @@ namespace Pilz.Cryptography #endregion - public static implicit operator string(UniquieID id) => id.ID; - public static implicit operator UniquieID(string id) => new UniquieID() { ID = id }; - public static implicit operator UniquieID(int id) => new UniquieID() { ID = Convert.ToString(id) }; + public static implicit operator string(UniquieID id) => id.ID; + public static implicit operator UniquieID(string id) => new UniquieID() { ID = id }; + public static implicit operator UniquieID(int id) => new UniquieID() { ID = Convert.ToString(id) }; - public static bool operator ==(UniquieID left, UniquieID right) => left.ID.Equals(right.ID); - public static bool operator !=(UniquieID left, UniquieID right) => !left.ID.Equals(right.ID); + public static bool operator ==(UniquieID left, UniquieID right) => left.ID.Equals(right.ID); + public static bool operator !=(UniquieID left, UniquieID right) => !left.ID.Equals(right.ID); } } diff --git a/Pilz.Cryptography/UniquieIDBase.cs b/Pilz.Cryptography/UniquieIDBase.cs deleted file mode 100644 index f7f48e8..0000000 --- a/Pilz.Cryptography/UniquieIDBase.cs +++ /dev/null @@ -1,118 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Text; - -namespace Pilz.Cryptography -{ - public class UniquieID : IUniquieID - { - protected static int currentSimpleID = 0; - - [JsonProperty(nameof(ID))] - protected string _iD; - - [JsonIgnore] - public virtual bool SimpleMode { get; set; } = false; - - [JsonIgnore] - public virtual bool GenerateOnGet { get; set; } = false; - - [JsonIgnore] - public virtual bool HasID => !string.IsNullOrEmpty(_iD); - - [JsonIgnore] - public virtual string ID - { - get - { - if (GenerateOnGet) - GenerateIfNull(); - return _iD; - } - internal set - => _iD = value; - } - - public UniquieID() : this(false) - { - } - - public UniquieID(bool autoGenerate) - { - if (autoGenerate) - GenerateIfNull(); - } - - public virtual void Generate() - { - if (SimpleMode) - ID = GenerateSimple(); - else - ID = GenerateDefault(); - } - - protected virtual string GenerateSimple() - { - return DateTime.Now.ToString("yyyyMMddHHmmssfffffff") + currentSimpleID++.ToString(); - } - - protected virtual string GenerateDefault() - { - return new Random().Next().ToString() + currentSimpleID++.ToString(); - } - - public virtual void GenerateIfNull() - { - if (!HasID) Generate(); - } - - public override string ToString() - { - return ID; - } - - public override int GetHashCode() - { - return -1430039477 + EqualityComparer.Default.GetHashCode(_iD); - } - - public override bool Equals(object obj) - { - if (obj is UniquieID iD) - { - if (ReferenceEquals(obj, iD)) - return true; - else - { - var leftHasID = iD.HasID; - var rightHasID = HasID; - - if (!leftHasID && iD.GenerateOnGet) - { - iD.Generate(); - leftHasID = iD.HasID; - } - - if (!rightHasID && GenerateOnGet) - { - Generate(); - rightHasID = HasID; - } - - if (leftHasID && rightHasID) - return _iD.Equals(iD._iD); - } - } - - return base.Equals(obj); - } - - public static implicit operator string(UniquieID id) => id.ID; - public static implicit operator UniquieID(string id) => new UniquieID() { ID = id }; - public static implicit operator UniquieID(int id) => new UniquieID() { ID = Convert.ToString(id) }; - - public static bool operator ==(UniquieID left, UniquieID right) => left.ID.Equals(right.ID); - public static bool operator !=(UniquieID left, UniquieID right) => !left.ID.Equals(right.ID); - } -}