Пример #1
0
        public IEnumerable <IConceptInfo> CreateNewConcepts(IEnumerable <IConceptInfo> existingConcepts)
        {
            var itemFilter = new ItemFilterInfo
            {
                Expression = String.Format("item => item.{0} != null && item.{1} != null && item.{0} > item.{1}", PropertyFrom.Name, PropertyTo.Name),
                FilterName = PropertyFrom.Name + "_" + PropertyTo.Name + "_RangeFilter",
                Source     = PropertyFrom.DataStructure
            };
            var invalidData = new InvalidDataInfo
            {
                Source       = PropertyFrom.DataStructure,
                FilterType   = itemFilter.FilterName,
                ErrorMessage = "Value of {0} has to be less than or equal to {1}."
            };
            var messageParameters = new InvalidDataMessageParametersConstantInfo
            {
                InvalidData       = invalidData,
                MessageParameters = CsUtility.QuotedString(PropertyFrom.Name) + ", " + CsUtility.QuotedString(PropertyTo.Name)
            };
            var invalidProperty = new InvalidDataMarkProperty2Info
            {
                InvalidData  = invalidData,
                MarkProperty = PropertyFrom
            };

            return(new IConceptInfo[] { itemFilter, invalidData, messageParameters, invalidProperty });
        }
Пример #2
0
        public IEnumerable <IConceptInfo> CreateNewConcepts(IEnumerable <IConceptInfo> existingConcepts)
        {
            string filterName = "SystemRequired" + Property.Name;

            var filter = new ItemFilterInfo
            {
                Source     = Property.DataStructure,
                FilterName = filterName,
                Expression = "item => item." + Property.Name + " == null"
            };
            var invalidData = new InvalidDataInfo
            {
                Source       = Property.DataStructure,
                FilterType   = filterName,
                ErrorMessage = "System required property {0} is not set."
            };
            var messageParameters = new InvalidDataMessageParametersConstantInfo
            {
                InvalidData       = invalidData,
                MessageParameters = CsUtility.QuotedString(Property.GetUserDescription())
            };
            var invalidProperty = new InvalidDataMarkProperty2Info
            {
                InvalidData  = invalidData,
                MarkProperty = Property
            };

            return(new IConceptInfo[] { filter, invalidData, messageParameters, invalidProperty });
        }
Пример #3
0
 public IEnumerable<IConceptInfo> CreateNewConcepts(IEnumerable<IConceptInfo> existingConcepts)
 {
     var itemFilter = new ItemFilterInfo
     {
         Expression = String.Format("item => item.{0} != null && item.{1} != null && item.{0} > item.{1}", PropertyFrom.Name, PropertyTo.Name),
         FilterName = PropertyFrom.Name + "_" + PropertyTo.Name + "_RangeFilter",
         Source = PropertyFrom.DataStructure
     };
     var invalidData = new InvalidDataInfo
     {
         Source = PropertyFrom.DataStructure,
         FilterType = itemFilter.FilterName,
         ErrorMessage = "Value of {0} has to be less than or equal to {1}."
     };
     var messageParameters = new InvalidDataMessageParametersConstantInfo
     {
         InvalidData = invalidData,
         MessageParameters = CsUtility.QuotedString(PropertyFrom.Name) + ", " + CsUtility.QuotedString(PropertyTo.Name)
     };
     var invalidProperty = new InvalidDataMarkProperty2Info
     {
         InvalidData = invalidData,
         MarkProperty = PropertyFrom
     };
     return new IConceptInfo[] { itemFilter, invalidData, messageParameters, invalidProperty };
 }
Пример #4
0
        public IEnumerable <IConceptInfo> CreateNewConcepts(IEnumerable <IConceptInfo> existingConcepts)
        {
            var itemFilter = new ItemFilterInfo
            {
                Expression = String.Format("item => !String.IsNullOrEmpty(item.{0}) && item.{0}.Length > {1}", Property.Name, Length),
                FilterName = Property.Name + "_MaxLengthFilter",
                Source     = Property.DataStructure
            };
            var invalidData = new InvalidDataInfo
            {
                Source       = Property.DataStructure,
                FilterType   = itemFilter.FilterName,
                ErrorMessage = "Maximum allowed length of {0} is {1} characters."
            };
            var messageParameters = new InvalidDataMessageParametersConstantInfo
            {
                InvalidData       = invalidData,
                MessageParameters = CsUtility.QuotedString(Property.Name) + ", " + Length
            };
            var invalidProperty = new InvalidDataMarkProperty2Info
            {
                InvalidData  = invalidData,
                MarkProperty = Property
            };

            return(new IConceptInfo[] { itemFilter, invalidData, messageParameters, invalidProperty });
        }
Пример #5
0
 public IEnumerable<IConceptInfo> CreateNewConcepts(IEnumerable<IConceptInfo> existingConcepts)
 {
     var itemFilter = new ItemFilterInfo
     {
         Expression = String.Format("item => !String.IsNullOrEmpty(item.{0}) && item.{0}.Length > {1}", Property.Name, Length),
         FilterName = Property.Name + "_MaxLengthFilter",
         Source = Property.DataStructure
     };
     var invalidData = new InvalidDataInfo
     {
         Source = Property.DataStructure,
         FilterType = itemFilter.FilterName,
         ErrorMessage = "Maximum allowed length of {0} is {1} characters."
     };
     var messageParameters = new InvalidDataMessageParametersConstantInfo
     {
         InvalidData = invalidData,
         MessageParameters = CsUtility.QuotedString(Property.Name) + ", " + Length
     };
     var invalidProperty = new InvalidDataMarkProperty2Info
     {
         InvalidData = invalidData,
         MarkProperty = Property
     };
     return new IConceptInfo[] { itemFilter, invalidData, messageParameters, invalidProperty };
 }
Пример #6
0
        public IEnumerable<IConceptInfo> CreateNewConcepts(IEnumerable<IConceptInfo> existingConcepts)
        {
            string filterName = "SystemRequired" + Property.Name;

            var filter = new ItemFilterInfo
            {
                Source = Property.DataStructure,
                FilterName = filterName,
                Expression = "item => item." + Property.Name + " == null"
            };

            var invalidData = new InvalidDataInfo
            {
                Source = Property.DataStructure,
                FilterType = filterName,
                ErrorMessage = "System required property {0} is not set."
            };
            var messageParameters = new InvalidDataMessageParametersConstantInfo
            {
                InvalidData = invalidData,
                MessageParameters = CsUtility.QuotedString(Property.GetUserDescription())
            };
            var invalidProperty = new InvalidDataMarkProperty2Info
            {
                InvalidData = invalidData,
                MarkProperty = Property
            };

            return new IConceptInfo[] { filter, invalidData, messageParameters, invalidProperty };
        }
Пример #7
0
        private static string CheckInvalidItemsSnippet(InvalidDataInfo info)
        {
            return string.Format(
@"            if (insertedNew.Count() > 0 || updatedNew.Count() > 0)
            {{
                {0}[] changedItems = inserted.Concat(updated).ToArray();
                var invalidItems = _domRepository.{0}.Filter(this.Query(changedItems.Select(item => item.ID)), new {1}());
                if (invalidItems.Count() > 0)
                    throw new Rhetos.UserException({2}, ""DataStructure:{0},ID:"" + invalidItems.First().ID.ToString(){3});
            }}
",
                info.Source.GetKeyProperties(),
                info.FilterType,
                CsUtility.QuotedString(info.ErrorMessage),
                UserMessageAppend.Evaluate(info));
        }
Пример #8
0
        private static string CheckInvalidItemsSnippet(InvalidDataInfo info)
        {
            return string.Format(
            @"            if (inserted.Length > 0 || updated.Length > 0)
            {{
                {0}[] changedItems = inserted.Concat(updated).ToArray();
                var invalidItems = _domRepository.{0}.Filter(changedItems.AsQueryable(), new {1}());
                if (invalidItems.Count() > 0)
                    throw new Rhetos.UserException({2}, ""DataStructure:{0},ID:"" + invalidItems.First().ID.ToString(){3});

                // Workaround to restore NH proxies if NHSession.Clear() is called inside filter.
                for (int i=0; i<inserted.Length; i++) inserted[i] = _executionContext.NHibernateSession.Load<{0}>(inserted[i].ID);
                for (int i=0; i<updated.Length; i++) updated[i] = _executionContext.NHibernateSession.Load<{0}>(updated[i].ID);
            }}
            ",
                info.Source.GetKeyProperties(),
                info.FilterType,
                CsUtility.QuotedString(info.ErrorMessage),
                UserMessageAppend.Evaluate(info));
        }
Пример #9
0
        public IEnumerable <IConceptInfo> CreateNewConcepts()
        {
            var filterParameter = new ParameterInfo
            {
                Module = Property.DataStructure.Module,
                Name   = Property.Name + "_RegExMatchFilter",
            };

            string filterExpression = string.Format(@"(source, parameter) =>
                {{
                    var items = source.Where(item => !string.IsNullOrEmpty(item.{0})).Select(item => new {{ item.ID, item.{0} }}).ToList();
                    var regex = new System.Text.RegularExpressions.Regex({1});
                    var invalidItemIds = items.Where(item => !regex.IsMatch(item.{0})).Select(item => item.ID).ToList();
                    return Filter(source, invalidItemIds);
                }}",
                                                    Property.Name,
                                                    CsUtility.QuotedString("^" + RegularExpression + "$"));

            var itemFilter = new QueryFilterExpressionInfo
            {
                Expression = filterExpression,
                Parameter  = filterParameter.Module.Name + "." + filterParameter.Name,
                Source     = Property.DataStructure
            };
            var invalidData = new InvalidDataInfo
            {
                Source       = Property.DataStructure,
                FilterType   = itemFilter.Parameter,
                ErrorMessage = ErrorMessage
            };
            var invalidProperty = new InvalidDataMarkProperty2Info
            {
                InvalidData  = invalidData,
                MarkProperty = Property
            };

            return(new IConceptInfo[] { filterParameter, itemFilter, invalidData, invalidProperty });
        }
Пример #10
0
        public void GetErrorMessageMethodName()
        {
            var tests = new ListOfTuples<string, string, string>()
            {
                { "Mod.Ent", "Filt", "GetErrorMessage_Filt" },
                { "Mod.Ent", "Mod.Filt", "GetErrorMessage_Filt" },
                { "Mod.Ent", "Mod2.Filt", "GetErrorMessage_Mod2_2E_Filt" },
                { "Mod.Ent", "Dictionary<List<System.Guid>, object[]>", "GetErrorMessage_Dictionary_3C_List_3C_System_2E_Guid_3E__2C__20_object_5B__5D__3E_" },
            };

            foreach (var test in tests)
            {
                Console.WriteLine("Input: " + test.Item1 + ", " + test.Item2 + ".");
                var dataStructureParts = test.Item1.Split('.');
                var invalidData = new InvalidDataInfo
                {
                    Source = new DataStructureInfo { Module = new ModuleInfo { Name = dataStructureParts[0] }, Name = dataStructureParts[1] },
                    FilterType = test.Item2,
                    ErrorMessage = "[Test]"
                };
                Assert.AreEqual(test.Item3, invalidData.GetErrorMessageMethodName());                    
            }
        }
Пример #11
0
        public IEnumerable <IConceptInfo> CreateNewConcepts(IEnumerable <IConceptInfo> existingConcepts)
        {
            string limitSnippet = LimitSnippetByType
                                  .Where(snippet => snippet.Key.IsAssignableFrom(Property.GetType()))
                                  .Select(snippet => snippet.Value.Invoke(Value))
                                  .Single();

            var filterParameter = new ParameterInfo
            {
                Module = Property.DataStructure.Module,
                Name   = Property.Name + "_MinValueFilter"
            };
            var filter = new ComposableFilterByInfo
            {
                Expression = String.Format(@"(items, repository, parameter) => {{ {1}; return items.Where(item => item.{0} != null && item.{0} < limit); }}", Property.Name, limitSnippet),
                Parameter  = filterParameter.Module.Name + "." + filterParameter.Name,
                Source     = Property.DataStructure
            };
            var invalidData = new InvalidDataInfo
            {
                Source       = Property.DataStructure,
                FilterType   = filter.Parameter,
                ErrorMessage = "Minimum value of {0} is {1}."
            };
            var messageParameters = new InvalidDataMessageParametersConstantInfo
            {
                InvalidData       = invalidData,
                MessageParameters = CsUtility.QuotedString(Property.Name) + ", " + CsUtility.QuotedString(Value)
            };
            var invalidProperty = new InvalidDataMarkProperty2Info
            {
                InvalidData  = invalidData,
                MarkProperty = Property
            };

            return(new IConceptInfo[] { filterParameter, filter, invalidData, messageParameters, invalidProperty });
        }
Пример #12
0
        public IEnumerable <IConceptInfo> CreateNewConcepts(IEnumerable <IConceptInfo> existingConcepts)
        {
            string filterName = "RequiredAllowSave" + Property.Name;

            string emptyStringOrCondition = (Property is ShortStringPropertyInfo || Property is LongStringPropertyInfo)
                ? "|| item." + Property.Name + " == \"\" "
                : "";

            var filter = new ItemFilterInfo
            {
                Source     = Property.DataStructure,
                FilterName = filterName,
                Expression = "item => item." + Property.Name + " == null " + emptyStringOrCondition + OrCondition.Evaluate(this)
            };
            var invalidData = new InvalidDataInfo
            {
                Source       = Property.DataStructure,
                FilterType   = filterName,
                ErrorMessage = "The required property {0} is not set."
            };
            var messageParameters = new InvalidDataMessageParametersConstantInfo
            {
                InvalidData       = invalidData,
                MessageParameters = CsUtility.QuotedString(Property.Name)
            };
            var invalidProperty = new InvalidDataMarkProperty2Info
            {
                InvalidData  = invalidData,
                MarkProperty = Property
            };
            var allowSave = new InvalidDataAllowSaveInfo
            {
                InvalidData = invalidData
            };

            return(new IConceptInfo[] { filter, invalidData, messageParameters, invalidProperty, allowSave });
        }
Пример #13
0
        public IEnumerable<IConceptInfo> CreateNewConcepts(IEnumerable<IConceptInfo> existingConcepts)
        {
            string limitSnippet = LimitSnippetByType
                .Where(snippet => snippet.Key.IsAssignableFrom(Property.GetType()))
                .Select(snippet => snippet.Value.Invoke(Value))
                .Single();

            var filterParameter = new ParameterInfo
            {
                Module = Property.DataStructure.Module,
                Name = Property.Name + "_MinValueFilter"
            };
            var filter = new ComposableFilterByInfo
            {
                Expression = String.Format(@"(items, repository, parameter) => {{ {1}; return items.Where(item => item.{0} != null && item.{0} < limit); }}", Property.Name, limitSnippet),
                Parameter = filterParameter.Module.Name + "." + filterParameter.Name,
                Source = Property.DataStructure
            };
            var invalidData = new InvalidDataInfo
            {
                Source = Property.DataStructure,
                FilterType = filter.Parameter,
                ErrorMessage = "Minimum value of {0} is {1}."
            };
            var messageParameters = new InvalidDataMessageParametersConstantInfo
            {
                InvalidData = invalidData,
                MessageParameters = CsUtility.QuotedString(Property.Name) + ", " + CsUtility.QuotedString(Value)
            };
            var invalidProperty = new InvalidDataMarkProperty2Info
            {
                InvalidData = invalidData,
                MarkProperty = Property
            };
            return new IConceptInfo[] { filterParameter, filter, invalidData, messageParameters, invalidProperty };
        }
Пример #14
0
        public IEnumerable <IConceptInfo> CreateNewConcepts(IEnumerable <IConceptInfo> existingConcepts)
        {
            var newConcepts = new List <IConceptInfo>();

            // Expand the base entity:
            var activeSinceProperty = new DateTimePropertyInfo {
                DataStructure = Entity, Name = "ActiveSince"
            };                                                                                                   // TODO: SystemRequired, Default 1.1.1900.
            var activeSinceHistory = new EntityHistoryPropertyInfo {
                Property = activeSinceProperty
            };

            newConcepts.AddRange(new IConceptInfo[] { activeSinceProperty, activeSinceHistory });

            // InvalidData for base entity: it is not allowed to save with ActiveSince older than last one used in History
            var denyFilter = new ComposableFilterByInfo {
                Parameter  = "Common.OlderThanHistoryEntries",
                Source     = Entity,
                Expression = String.Format(
                    @"(items, repository, parameter) => items.Where(item => 
                                repository.{0}.{1}_Changes.Subquery.Where(his => his.ActiveSince >= item.ActiveSince && his.Entity == item).Count() > 0)",
                    Entity.Module.Name,
                    Entity.Name)
            };
            var invalidDataValidation = new InvalidDataInfo {
                FilterType   = "Common.OlderThanHistoryEntries",
                Source       = Entity,
                ErrorMessage = "ActiveSince is not allowed to be older than last entry in history."
            };

            newConcepts.AddRange(new IConceptInfo[]
            {
                denyFilter,
                invalidDataValidation,
                new ParameterInfo {
                    Module = new ModuleInfo {
                        Name = "Common"
                    }, Name = "OlderThanHistoryEntries"
                },
                new InvalidDataMarkProperty2Info {
                    InvalidData = invalidDataValidation, MarkProperty = activeSinceProperty
                }
            });

            // Create a new entity for history data:
            var currentProperty = new ReferencePropertyInfo {
                DataStructure = Dependency_ChangesEntity, Name = "Entity", Referenced = Entity
            };
            var historyActiveSinceProperty = new DateTimePropertyInfo {
                DataStructure = Dependency_ChangesEntity, Name = activeSinceProperty.Name
            };

            newConcepts.AddRange(new IConceptInfo[] {
                currentProperty,
                new ReferenceDetailInfo {
                    Reference = currentProperty
                },
                new RequiredPropertyInfo {
                    Property = currentProperty
                },                                                       // TODO: SystemRequired
                new PropertyFromInfo {
                    Destination = Dependency_ChangesEntity, Source = activeSinceProperty
                },
                historyActiveSinceProperty,
                new UniqueMultiplePropertiesInfo {
                    DataStructure = Dependency_ChangesEntity, PropertyNames = $"{currentProperty.Name} {historyActiveSinceProperty.Name}"
                }
            });

            // InvalidData for history entity: it is not allowed to save with ActiveSince newer than current entity
            var denyFilterHistory = new ComposableFilterByInfo
            {
                Parameter  = "Common.NewerThanCurrentEntry",
                Source     = Dependency_ChangesEntity,
                Expression = @"(items, repository, parameter) => items.Where(item => item.ActiveSince > item.Entity.ActiveSince)"
            };
            var invalidDataValidationHistory = new InvalidDataInfo
            {
                FilterType   = "Common.NewerThanCurrentEntry",
                Source       = Dependency_ChangesEntity,
                ErrorMessage = "ActiveSince of history entry is not allowed to be newer than current entry."
            };

            newConcepts.AddRange(new IConceptInfo[]
            {
                denyFilterHistory,
                invalidDataValidationHistory,
                new ParameterInfo {
                    Module = new ModuleInfo {
                        Name = "Common"
                    }, Name = "NewerThanCurrentEntry"
                },
                new InvalidDataMarkProperty2Info {
                    InvalidData = invalidDataValidationHistory, MarkProperty = historyActiveSinceProperty
                }
            });

            // Create ActiveUntil SqlQueryable:
            var activeUntilSqlQueryable = new SqlQueryableInfo {
                Module = Entity.Module, Name = Entity.Name + "_ChangesActiveUntil", SqlSource = ActiveUntilSqlSnippet()
            };

            newConcepts.AddRange(new IConceptInfo[] {
                activeUntilSqlQueryable,
                new DateTimePropertyInfo {
                    DataStructure = activeUntilSqlQueryable, Name = "ActiveUntil"
                },
                new SqlDependsOnDataStructureInfo {
                    Dependent = activeUntilSqlQueryable, DependsOn = Dependency_ChangesEntity
                },
                new SqlDependsOnDataStructureInfo {
                    Dependent = activeUntilSqlQueryable, DependsOn = Entity
                },
                new DataStructureExtendsInfo {
                    Base = Dependency_ChangesEntity, Extension = activeUntilSqlQueryable
                }
            });

            // Configure History SqlQueryable:
            newConcepts.AddRange(new IConceptInfo[] {
                new SqlDependsOnDataStructureInfo {
                    Dependent = Dependency_HistorySqlQueryable, DependsOn = Entity
                },
                new SqlDependsOnDataStructureInfo {
                    Dependent = Dependency_HistorySqlQueryable, DependsOn = Dependency_ChangesEntity
                },
                new SqlDependsOnDataStructureInfo {
                    Dependent = Dependency_HistorySqlQueryable, DependsOn = activeUntilSqlQueryable
                },
                new DateTimePropertyInfo {
                    DataStructure = Dependency_HistorySqlQueryable, Name = "ActiveUntil"
                },
                new AllPropertiesFromInfo {
                    Source = Dependency_ChangesEntity, Destination = Dependency_HistorySqlQueryable
                }
            });

            // Configure AtTime SqlFunction:
            newConcepts.Add(new SqlDependsOnDataStructureInfo {
                Dependent = Dependency_AtTimeSqlFunction, DependsOn = Dependency_HistorySqlQueryable
            });

            return(newConcepts);
        }
Пример #15
0
        public IEnumerable<IConceptInfo> CreateNewConcepts(IEnumerable<IConceptInfo> existingConcepts)
        {
            var filterParameter = new ParameterInfo
            {
                Module = Property.DataStructure.Module,
                Name = Property.Name + "_RegExMatchFilter",
            };

            string filterExpression = string.Format(@"(source, repository, parameter) =>
                {{
                    var items = source.Where(item => !string.IsNullOrEmpty(item.{0})).Select(item => new {{ item.ID, item.{0} }}).ToList();
                    var regex = new System.Text.RegularExpressions.Regex({1});
                    var invalidItemIds = items.Where(item => !regex.IsMatch(item.{0})).Select(item => item.ID).ToList();
                    return Filter(source, invalidItemIds);
                }}",
                Property.Name,
                CsUtility.QuotedString("^" + RegularExpression + "$"));

            var itemFilter = new ComposableFilterByInfo
            {
                Expression = filterExpression,
                Parameter = filterParameter.Module.Name + "." + filterParameter.Name,
                Source = Property.DataStructure
            };
            var invalidData = new InvalidDataInfo
            {
                Source = Property.DataStructure,
                FilterType = itemFilter.Parameter,
                ErrorMessage = ErrorMessage
            };
            var invalidProperty = new InvalidDataMarkProperty2Info
            {
                InvalidData = invalidData,
                MarkProperty = Property
            };
            return new IConceptInfo[] { filterParameter, itemFilter, invalidData, invalidProperty };
        }