예제 #1
0
        public static EntitySearchDisplayInfo ResourceModel(Related related, int index)
        {
            var indexName = GetName(related, index);
            var rm        = GetResourceCollection(related);

            var info = new EntitySearchDisplayInfo {
                Title       = new ResourceManager(rm.Titles).GetString(indexName),
                Column      = rm.Columns == null ? null: new ResourceManager(rm.Columns).GetString(indexName),
                Description = new ResourceManager(rm.Descriptions).GetString(indexName),
                ShortName   = new ResourceManager(rm.ShortNames).GetString(indexName),
            };

            if (info.Title == null && info.Column == null && info.Description == null || info.ShortName == null)
            {
                return(null);
            }

            return(info);
        }
예제 #2
0
        /// <summary>
        /// Busqueda en el diccionario
        /// </summary>
        /// <param name="property">Propiedades de las entidades</param>
        /// <param name="index">Index de las entidades</param>
        /// <returns></returns>
        public EntitySearchDisplayInfo GetInfoFromProperty(KindProperty property, int index)
        {
            var indexName = ResourcesHelper.GetName(property, index);

            var rm = ResourcesHelper.GetResourceCollection(property);

            var info = new EntitySearchDisplayInfo
            {
                Title       = new ResourceManager(rm.Titles).GetString(indexName),
                Column      = rm.Columns == null ? null : new ResourceManager(rm.Columns).GetString(indexName),
                Description = new ResourceManager(rm.Descriptions).GetString(indexName),
                ShortName   = new ResourceManager(rm.ShortNames).GetString(indexName),
            };

            if (info.Title == null && info.Column == null && info.Description == null || info.ShortName == null)
            {
                return(null);
            }

            return(info);
        }
예제 #3
0
파일: MdmDocs.cs 프로젝트: trifenix/connect
        public EntitySearchDisplayInfo GetInfoFromEntity(int index)
        {
            var indexName = ResourcesHelper.GetEntityName(index);
            var rm        = ResourcesHelper.GetEntityResourceCollection();


            var info = new EntitySearchDisplayInfo
            {
                Title       = new ResourceManager(rm.Titles).GetString(indexName),
                Column      = rm.Columns == null ? null : new ResourceManager(rm.Columns).GetString(indexName),
                Description = new ResourceManager(rm.Descriptions).GetString(indexName),
                ShortName   = new ResourceManager(rm.ShortNames).GetString(indexName),
                PlaceHolder = new ResourceManager(rm.PlaceHolders)?.GetString(indexName) ?? "",
            };

            if (info.Title == null && info.Column == null && info.Description == null || info.ShortName == null)
            {
                return(null);
            }

            return(info);
        }
예제 #4
0
        /// <summary>
        /// obtiene la metadata de una propiedad desde una clase de entrada
        /// el objetivo es unir la propiedad de input a una en el modelo o viceversa
        /// De esta manera, más los atributos, podrá generar la metadata necesaria para operar con la propiedad.
        /// </summary>
        /// <param name="input">clase input</param>
        /// <param name="output">clase output</param>
        /// <param name="propertyInput">propiedad del input</param>
        /// <param name="info">documentacion de la propiedad</param>
        /// <returns>Metadata de una propiedad y el target encontrado (esto es util para RelatedProperty)</returns>
        public static (PropertyMetadata meta, BaseIndexAttribute target) GetPropMetadata(Type input, Type output, PropertyInfo propertyInput, EntitySearchDisplayInfo info)
        {
            // existe clase de entrada
            var existsClassInput = input != null;

            // exoste clase de salida
            var existsClassOutput = output != null;

            // la clase de entrada puede ser modelo o input
            // si la clase de entrada es nula lanzará excepción
            if (!existsClassInput)
            {
                throw new CustomException("la clase input no puede ser nula");
            }

            // determina si la clase de entrada es input
            var isInput = input.IsSubclassOf(typeof(InputBase));

            // no puede existir una clase input que no tenga una clase modelo.
            if (isInput && !existsClassOutput)
            {
                throw new CustomException("la clase output no puede ser nula, si la clase de entrada es tipo input");
            }


            // si existsClassOutput es nulo, significa que la clase output es input
            // si cla clase output es nula, no es posible obtener la info de la propiedad de esa clase.
            // si ambos clases existen.
            // se buscará la unión por nombre o por atributos, de preferencia atributos
            var propOutput = existsClassOutput ? GetPropOutput(output, propertyInput) : null;

            // si es input, significa que después habrá una herencia y se le asignará el ClassNameInput
            var className = isInput ? output.Name : input.Name;


            // indice del input, por obligación ambos deben tener el atributo Entity
            var index = Reflection.Entities.GetIndex(input);


            // si es input, la propiedad puede tener el mismo nombre y/o igualarse por la unión por atributos
            // si es el mismo nombre, no tiene BaseIndexAttribute
            var inputPropAttr = Reflection.Attributes.GetAttribute <BaseIndexAttribute>(propertyInput);

            // el propOut puede ser nulo
            var outputPropAttr = propOutput != null?Reflection.Attributes.GetAttribute <BaseIndexAttribute>(propOutput) : null;


            // de preferencia toma el input, pero si este es nulo o no tiene atributo, toma el segundo.
            var entityPropAttr = inputPropAttr != null ? inputPropAttr : outputPropAttr;


            var isArray = Reflection.IsEnumerableProperty(propertyInput);

            // esto se da en el caso de que se tenga que ir a buscar el índice en la misma clase y no en la propiedad
            // debido a que no tiene el atributo en la propiedad del modelo.
            if (entityPropAttr == null && !isInput && !Reflection.IsPrimitive(propertyInput.PropertyType))
            {
                var modelTypes = Common.GetTypeModel(output.Assembly);
                var localType  = modelTypes.FirstOrDefault(s => isArray ? s.Equals(propertyInput.PropertyType.GenericTypeArguments.First()) : s.Equals(propertyInput.PropertyType));

                // asigna el atributo de la clase a la que apunta la propiedad.
                entityPropAttr = Reflection.Attributes.GetAttributes <EntityIndexAttribute>(localType).First();
            }

            if (entityPropAttr == null && isInput)
            {
                var modelTypes = Common.GetTypeInputModel(input.Assembly);
                var localType  = modelTypes.FirstOrDefault(s => isArray ? s.Equals(propertyInput.PropertyType.GenericTypeArguments.First()) : s.Equals(propertyInput.PropertyType));

                // asigna el atributo de la clase a la que apunta la propiedad.
                entityPropAttr = localType == null ? null : Reflection.Attributes.GetAttributes <EntityIndexAttribute>(localType).First();
            }

            if (entityPropAttr == null && Reflection.IsPrimitive(propertyInput.PropertyType))
            {
                // lanza excepción si una propiedad no tiene atributos.
                throw new CustomException($"la propiedad {propertyInput.Name} no tiene atributos");
            }



            // los elementos de validación siempre estarán en la clase input.


            // obtiene los atributos requeridos
            var requiredAttr = propOutput != null?
                               isInput?Reflection.Attributes.GetAttribute <RequiredAttribute>(propertyInput) :
                                   Reflection.Attributes.GetAttribute <RequiredAttribute>(propOutput) :
                                       null;

            // obtiene los atributos unicos
            var uniqueAttr = propOutput != null?
                             isInput?
                             Reflection.Attributes.GetAttribute <UniqueAttribute>(propertyInput) :
                                 Reflection.Attributes.GetAttribute <UniqueAttribute>(propOutput)
                                     : null;

            // obtiene los atributos de ocultar.
            var hideAttr = propOutput != null?
                           isInput?
                           Reflection.Attributes.GetAttribute <HideAttribute>(propertyInput) :
                               Reflection.Attributes.GetAttribute <HideAttribute>(propOutput)
                                   : null;


            // el tipo de una propiedad que es de tipo colección, puede buscar el tipo en dos lugares, de acuerdo a si es un array o una colección.
            var tp = propertyInput.PropertyType.IsArray ? propertyInput.PropertyType.GetElementType() : propertyInput.PropertyType.GenericTypeArguments.FirstOrDefault();


            return(new PropertyMetadata
            {
                AutoNumeric = IsAutoNumeric(input, propertyInput),
                ClassName = className,
                HasInput = isInput ? true : propOutput != null,
                Index = entityPropAttr?.Index ?? 0,
                KindProperty = entityPropAttr == null?KindProperty.STR:(KindProperty)entityPropAttr.KindIndex,
                Info = info,
                isArray = isArray,
                NameProp = propertyInput.Name,
                Required = requiredAttr != null,
                TypeString = isArray ? tp.Name : propertyInput.PropertyType.Name,
                Unique = uniqueAttr != null,
                Visible = hideAttr == null,
                IndexFather = index.Value
            }, entityPropAttr);
        }
예제 #5
0
 /// <summary>
 /// Obtiene metadata de propiedad input de tipo enumeración.
 /// </summary>
 /// <param name="input">tipo input</param>
 /// <param name="model">tipo model</param>
 /// <param name="propertyInput">propiedad del input</param>
 /// <param name="info">documentación de la propiedad</param>
 /// <returns>metadata de una enumeración input</returns>
 public static InputPropEnumDetails GetPropInputEnumMetadata(Type input, Type model, PropertyInfo propertyInput, EntitySearchDisplayInfo info)
 {
     return(GetPropInputEnumMetadata(GetEnumPropMetadata(input, model, propertyInput, info), input, model, propertyInput));
 }
예제 #6
0
 /// <summary>
 /// Obtiene la metadata de una propiedad de entidad de input
 /// </summary>
 /// <param name="input">tipo input</param>
 /// <param name="model">tipo model</param>
 /// <param name="propertyInput">propiedad del input</param>
 /// <param name="info">documentación de la propiedad</param>
 /// <returns>Metadata de una propiedad input de tipo entidad</returns>
 public static InputPropRelatedDetails GetPropInputRelatedMetadata(Type input, Type model, PropertyInfo propertyInput, EntitySearchDisplayInfo info)
 {
     return(GetPropInputRelatedMetadata(GetRelatedMetadata(input, model, propertyInput, info), input, model, propertyInput));
 }
예제 #7
0
 /// <summary>
 /// Complementa una metadata con los datos de la propiedad entidad.
 /// </summary>
 /// <param name="input">clase de entrada, puede ser un input o un model</param>
 /// <param name="output">clase de salida, puede ser un input o un model</param>
 /// <param name="propertyInput">propiedad perteneciente a la clase input</param>
 /// <param name="info"></param>
 /// <returns>Metadata de una propiedad de entidad</returns>
 public static PropertyMetadadataEnum GetEnumPropMetadata(Type input, Type output, PropertyInfo propertyInput, EntitySearchDisplayInfo info)
 {
     return(GetEnumPropMetadata(GetPropMetadata(input, output, propertyInput, info).meta, input, output, propertyInput));
 }
예제 #8
0
 /// <summary>
 /// Obtiene la metadata de una propiedad tipo entidad
 /// </summary>
 /// <param name="input">clase de entrada, puede ser un input o un model</param>
 /// <param name="output">clase de salida, puede ser un input o un model</param>
 /// <param name="propertyInput">propiedad perteneciente a la clase input</param>
 /// <param name="info">documentación de la propiedad</param>
 /// <returns>Metadata de la propiedad</returns>
 public static RelatedPropertyMetadata GetRelatedMetadata(Type input, Type output, PropertyInfo propertyInput, EntitySearchDisplayInfo info)
 {
     return(GetRelatedMetadata(GetPropMetadata(input, output, propertyInput, info), input, output, propertyInput));
 }