public static bool IsValid(this IDiscriminator me) { return (!Comparer.AreEquals(me.Id, me.Id?.GetType().GetDefaultValue()) && !string.IsNullOrWhiteSpace(me.Name) && !Comparer.AreEquals(me.TypeId, me.TypeId?.GetType().GetDefaultValue()) && !string.IsNullOrWhiteSpace(me.TypeName)); }
private static bool AreEquals(object obj1, object obj2) { // If both are NULL, return TRUE if (Equals(obj1, null) && Equals(obj2, null)) { return(true); } // If some of them is null, return FALSE if (Equals(obj1, null) || Equals(obj2, null)) { return(false); } // If any of them are of other type, return FALSE if (!(obj1 is IFunction) || !(obj2 is IFunction)) { return(false); } var fun1 = (IFunction)obj1; var fun2 = (IFunction)obj2; // Compare the ids return(Comparer.AreEquals(fun1.Id, fun2.Id)); }
static bool AreEquals(object obj1, object obj2) { // If both are NULL, return TRUE if (Equals(obj1, null) && Equals(obj2, null)) { return(true); } // If some of them is null, return FALSE if (Equals(obj1, null) || Equals(obj2, null)) { return(false); } // If any of them are of other type, return FALSE if (!(obj1 is IDiscriminator) || !(obj2 is IDiscriminator)) { return(false); } var dis1 = (IDiscriminator)obj1; var dis2 = (IDiscriminator)obj2; // Use 'Equals' to compare the ids return(Comparer.AreEquals(dis1.Id, dis2.Id) && Comparer.AreEquals(dis1.TypeId, dis2.TypeId)); }
bool AreEquals(object obj1, object obj2) { // If both are NULL, return TRUE if (Equals(obj1, null) && Equals(obj2, null)) { return(true); } // If some of them is null, return FALSE if (Equals(obj1, null) || Equals(obj2, null)) { return(false); } // If any of them are of other type, return FALSE if (!(obj1 is IScope) || !(obj2 is IScope)) { return(false); } var sco1 = (IScope)obj1; var sco2 = (IScope)obj2; // Use 'Equals' to compare the ids return(disCom.Equals(sco1.Discriminator, sco2.Discriminator) && Comparer.AreEquals(sco1.Propagation, sco2.Propagation)); }
public static bool IsValid(this IFunction me) => !Comparer.AreEquals(me.Id, me.Id?.GetType().GetDefaultValue()) && !string.IsNullOrWhiteSpace(me.Name);
public static bool IsValid(this IDiscriminator me) => !Comparer.AreEquals(me.TypeKey, me.TypeKey?.GetType().GetDefaultValue()) && !string.IsNullOrWhiteSpace(me.TypeName);
internal static bool MatchByDiscriminatorsInclusionsAndExclusions(this IPermission me, params IDiscriminator[] discriminators) { //return Printer.Ident($"{nameof(PermissionExtensions)}.{nameof(MatchByDiscriminatorsPath)}:", () => { return(Printer.Indent($"{typeof(PermissionExtensions).GetTypeInfo().DeclaredMethods.FirstOrDefault(m=>m.Name == nameof(MatchByDiscriminatorsInclusionsAndExclusions)).GetSignature()}:", () => { Printer.Indent("Input parameters", () => { //Printer.Print($"Permission (me): {me}"); Printer.WriteLine("Permission:"); new[] { me }.Print(PrintMode.Table); //Printer.Foreach($"Discriminadores:", discriminators, dis => Printer.Print($"{dis.TypeName} - {dis.Name}")); Printer.WriteLine("Discriminators:"); discriminators.Print(PrintMode.Table); }); //Printer.Foreach($"Permission scopes ({me.Scopes.Count()}):", me.Scopes, sco => Printer.Print(sco.ToString())); if (!me.Scopes.Any()) { Printer.WriteLine($"Result: TRUE - Haven't scopes"); return true; } else { return Printer.Indent("Analyze each scope:", () => { // Tenemos que tomar nuestros discriminadores, y comprobarlos contra los discriminadores que me han pasado // - Cojo un discriminador y busco el discriminador del mismo tipo en la entrada: // - No hay un discriminador del mismo tipo, pues no encaja // - Si hay un discriminador del mismo tipo, compruebo la ruta var result = me.Scopes.Select <IScope, bool?>(sco => { Printer.WriteLine($"Scope {sco}"); Printer.IndentationLevel++; if (discriminators.Count(d => Comparer.AreEquals(d.TypeId, sco.Discriminator.TypeId)) == 1) { // Si hay un discriminador del mismo tipo, compruebo la ruta var target = discriminators.Single(d => Comparer.AreEquals(d.TypeId, sco.Discriminator.TypeId)); Printer.WriteLine($"Se propaga a mi {sco.Propagation.HasFlag(ScopePropagation.ToMe)} ids = {target.Id}-{sco.Discriminator.Id}"); // Se propaga a mi y es el mismo discriminador if (sco.Propagation.HasFlag(ScopePropagation.ToMe) && Comparer.AreEquals(target.Id, sco.Discriminator.Id)) { Printer.WriteLine($"Se propaga a mi y es el mismo discriminador"); return true; } // Se propaga hacia arriba y su id esta en mi path: if (sco.Propagation.HasFlag(ScopePropagation.ToExclusions) && sco.Discriminator.GetAllExclusions().Contains(target)) { Printer.WriteLine($"Se propaga hacia arriba y su id esta en mi path"); return true; } // Se propaga hacia abajo y mi id esta en su path: if (sco.Propagation.HasFlag(ScopePropagation.ToInclusions) && sco.Discriminator.GetAllInclusions().Contains(target)) { Printer.WriteLine($"Se propaga hacia abajo y mi id esta en su path"); return true; } Printer.IndentationLevel--; return false; } else { // No hay un discriminador del mismo tipo, pues no encaja Printer.WriteLine($"No hay un discriminador del mismo tipo"); Printer.IndentationLevel--; return null; } }); return result.Any(r => r.HasValue && r.Value) || // Si algun result.All(r => !r.HasValue || r.Value); }); } })); }
internal static bool MatchByDiscriminatorsInclusionsAndExclusions(this IPermission me, bool forFilter, TypeDiscriminator typeDiscriminator, params IDiscriminator[] discriminators) { var res = false; using (Printer.Indent2($"CALL {nameof(MatchByDiscriminatorsInclusionsAndExclusions)}:", '│')) { using (Printer.Indent2("Input parameters")) { Printer.WriteLine($"Permission:"); new[] { me }.Print(PrintMode.Table); Printer.WriteLine($"'{nameof(forFilter)}': " + forFilter); if (typeDiscriminator == null) { Printer.WriteLine($"'{nameof(typeDiscriminator)}': null"); } else { Printer.WriteLine($"'{nameof(typeDiscriminator)}':"); new[] { typeDiscriminator }.Print(PrintMode.Table); } Printer.WriteLine($"'{nameof(discriminators)}':"); discriminators.Print(PrintMode.Table); } if (discriminators.Any(d => Comparer.AreEquals(d.TypeKey, TypeDiscriminator.TypeDiscriminatorId))) { throw new ArgumentException($"'{nameof(discriminators)}' cannot contains a '{nameof(TypeDiscriminator)}'"); } if (typeDiscriminator == null) { throw new ArgumentException($"'{nameof(typeDiscriminator)}' cannot be null"); } bool Compute() { // Si no hay discriminador de tipo, TRUE if (typeDiscriminator == null) { Printer.WriteLine($"'{nameof(typeDiscriminator)}' is null"); //return true; } // Si el permiso no define scopes, TRUE if (!me.Scopes.Any()) { Printer.WriteLine("Permission hasn't scopes"); return(true); } var typeDiscriminatorRelatedWithAnyPermissionScope = false; // Compruebo el discriminador de tipo using (Printer.Indent2($"Checking type discriminator")) { var scopeOfTypeOfTypeDiscriminator = me.Scopes.FirstOrDefault(s => Comparer.AreEquals(s.Discriminator.TypeKey, typeDiscriminator?.TypeKey)); if (scopeOfTypeOfTypeDiscriminator != null) { Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' and permission scope '{scopeOfTypeOfTypeDiscriminator}' have same type '{typeDiscriminator.TypeKey}', continue"); var scopeDiscriminatorRelatedWithTargetDiscriminator = scopeOfTypeOfTypeDiscriminator?.Discriminator .GetAllRelated(scopeOfTypeOfTypeDiscriminator.Propagation) .FirstOrDefault(rel => Comparer.AreEquals(typeDiscriminator.TypeKey, rel.TypeKey) && Comparer.AreEquals(typeDiscriminator.Id, rel.Id)); if (scopeDiscriminatorRelatedWithTargetDiscriminator != null) { Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' is related to permission scope '{scopeOfTypeOfTypeDiscriminator}' on discriminator '{scopeDiscriminatorRelatedWithTargetDiscriminator}', check discriminators"); typeDiscriminatorRelatedWithAnyPermissionScope = true; } else if (typeDiscriminator != TypeDiscriminator.Empty) { Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' isn't related to permission scope '{scopeOfTypeOfTypeDiscriminator}', FALSE"); return(false); } } else { Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' hasn't any scope with discriminator of its type"); if (discriminators.IsNullOrEmpty()) { Printer.WriteLine($"Haven't discriminators, VALUE ({me.Value})"); return(me.Value); } else { Printer.WriteLine($"Have some discriminators, check discriminators"); } } } using (Printer.Indent2($"Checking discriminators:")) { // Compruebo el resto de discriminadores return(discriminators.All(dis => { var scopeOfTypeOfDiscriminator = me.Scopes.FirstOrDefault(s => Comparer.AreEquals(s.Discriminator.TypeKey, dis.TypeKey)); var scopeDiscriminatorRelatedWithDiscriminator = scopeOfTypeOfDiscriminator?.Discriminator .GetAllRelated(scopeOfTypeOfDiscriminator.Propagation) .FirstOrDefault(rel => Comparer.AreEquals(dis.TypeKey, rel.TypeKey) && Comparer.AreEquals(dis.Id, rel.Id)); if (scopeOfTypeOfDiscriminator != null) { Printer.WriteLine($"The discriminator '{dis}' and permission scope '{scopeOfTypeOfDiscriminator}' have same type '{dis.TypeKey}'"); if (scopeDiscriminatorRelatedWithDiscriminator != null) { Printer.WriteLine($"The discriminator '{dis}' is related to permission scope '{scopeOfTypeOfDiscriminator}' on discriminator '{scopeDiscriminatorRelatedWithDiscriminator}'"); return true; } else { Printer.WriteLine($"The discriminator '{dis}' isn't related to permission scopes, continue"); if (forFilter) { Printer.WriteLine($"This search is 'forFilter', TRUE"); return true; } } } else { Printer.WriteLine($"The permission hasn't any discriminator of type '{dis}', check typeDiscriminator"); if (typeDiscriminatorRelatedWithAnyPermissionScope) { Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' is related to any permission scope, TRUE"); return true; } else { Printer.WriteLine($"The {nameof(typeDiscriminator)} '{typeDiscriminator}' isn't related to any permission scope, check if discriminator '{dis}' id is null"); if (dis.Id.IsNullOrDefault()) { Printer.WriteLine($"Discriminator '{dis}' id is null, VALUE ({me.Value})"); return me.Value; } else { Printer.WriteLine($"Discriminator '{dis}' id isn't null, VALUE ({me.Value})"); return !me.Value; } } //return dis.Id.IsNullOrDefault() ? me.Value : !me.Value; } return false; })); } } res = Compute(); } Printer.WriteLine($"● RESULT {nameof(MatchByDiscriminatorsInclusionsAndExclusions)}: {res}"); return(res); }