예제 #1
0
        //methods
        public virtual bool Execute()
        {
            IEntityDescription entityDescription = EntityContext.Description;
            IGenerator         generator         = _setup.GetGenerator(entityDescription);
            List <IModifier>   modifiers         = _setup.GetModifiers(entityDescription);

            var context = new GeneratorContext
            {
                Description      = entityDescription,
                EntityContexts   = _entityContexts,
                TargetCount      = EntityContext.EntityProgress.TargetCount,
                CurrentCount     = EntityContext.EntityProgress.CurrentCount,
                RequiredEntities = GetRequiredEntities(),
            };

            IList entities = generator.Generate(context);

            _setup.Validator.CheckGeneratedCount(entities, entityDescription.Type, generator);

            foreach (IModifier modifier in modifiers)
            {
                entities = modifier.Modify(context, entities);
                _setup.Validator.CheckModifiedCount(entities, entityDescription.Type, modifier);
            }

            _setup.TemporaryStorage.InsertToTemporary(EntityContext, entities);
            _setup.Supervisor.HandleGenerateCompleted(EntityContext, entities);

            return(true);
        }
        protected void AddDescription(CodeTypeMember type, IEntityDescription description)
        {
            if (String.IsNullOrWhiteSpace(description.Description))
                return;

            AddAttribute(type, "Description", description.Description);
        }
예제 #3
0
 public Entity(IIdentity identity, IEntityDescription description, IEnumerable<IObservable> observables, IEnumerable<IActionable> actionables)
 {
     Identity = identity;
     Description = description;
     Observables = (observables ?? Enumerable.Empty<IObservable>()).ToArray();
     Actionables = (actionables ?? Enumerable.Empty<IActionable>()).ToArray();
 }
예제 #4
0
 protected static void ValidateAlias(IEntityDescription description)
 {
     if (String.IsNullOrWhiteSpace(description.Alias))
     {
         throw new Exception("Cannot generate entity with alias null or empty");
     }
 }
예제 #5
0
        protected virtual List <Type> FindCircularDependency(IEntityDescription entity,
                                                             List <Type> requiredEntities, Dictionary <Type, IEntityDescription> allEntityDescriptions)
        {
            requiredEntities = requiredEntities ?? new List <Type>();

            bool isCircle = requiredEntities.Contains(entity.Type);

            requiredEntities.Add(entity.Type);
            if (isCircle)
            {
                return(requiredEntities);
            }

            //return null if no circle dependencies found
            if (entity.Required == null)
            {
                return(null);
            }

            foreach (RequiredEntity required in entity.Required)
            {
                List <Type>        dependenciesBranch   = new List <Type>(requiredEntities);
                IEntityDescription requiredEntity       = allEntityDescriptions[required.Type];
                List <Type>        circleOfDependencies = FindCircularDependency
                                                              (requiredEntity, dependenciesBranch, allEntityDescriptions);
                if (circleOfDependencies != null)
                {
                    return(circleOfDependencies);
                }
            }

            //return null if no circle dependencies found
            return(null);
        }
예제 #6
0
파일: IEntity.cs 프로젝트: ibebbs/Harmonize
 public Entity(IIdentity identity, IEntityDescription description, IEnumerable <IObservable> observables, IEnumerable <IActionable> actionables)
 {
     Identity    = identity;
     Description = description;
     Observables = (observables ?? Enumerable.Empty <IObservable>()).ToArray();
     Actionables = (actionables ?? Enumerable.Empty <IActionable>()).ToArray();
 }
 protected static void AddDisplayNameIfDifferent(CodeAttributeDeclaration attribute, IEntityDescription description)
 {
     var name = description.Name;
     if (String.Compare(name, description.Alias, IgnoreCase) == 0 ||
         String.Compare(name, description.Alias.SplitPascalCase(), IgnoreCase) == 0)
         return;
     AddAttributePrimitiveArgument(attribute, "DisplayName", name);
 }
 protected static void AddDisplayNameIfDifferent(CodeTypeMember type, IEntityDescription description)
 {
     var name = description.Name;
     if (String.Compare(name, description.Alias, IgnoreCase) == 0 ||
         String.Compare(name, description.Alias.SplitPascalCase(), IgnoreCase) == 0)
         return;
     AddAttribute(type, "DisplayName", name);
 }
        protected void AddDescription(CodeTypeMember type, IEntityDescription description)
        {
            if (String.IsNullOrWhiteSpace(description.Description))
            {
                return;
            }

            AddAttribute(type, "Description", description.Description);
        }
        protected static void AddDisplayNameIfDifferent(CodeTypeMember type, IEntityDescription description)
        {
            var name = description.Name;

            if (String.Compare(name, description.Alias, IgnoreCase) == 0 ||
                String.Compare(name, description.Alias.SplitPascalCase(), IgnoreCase) == 0)
            {
                return;
            }
            AddAttribute(type, "DisplayName", name);
        }
        protected virtual InMemoryStorage SetMemoryStorage(GeneratorSetup setup, Dictionary <Type, long> dataAmmounts)
        {
            var storage = new InMemoryStorage();

            foreach (Type type in dataAmmounts.Keys)
            {
                IEntityDescription entityDescription = GetEntityDescription(setup, type);
                entityDescription.PersistentStorages = entityDescription.PersistentStorages ?? new List <IPersistentStorage>();
                entityDescription.PersistentStorages.Add(storage);
            }
            return(storage);
        }
예제 #12
0
        public virtual IEntityDescription GetEntityDescription(Type entityType)
        {
            bool isEntityRegistered = EntityDescriptions.ContainsKey(entityType);

            if (!isEntityRegistered || EntityDescriptions[entityType] == null)
            {
                throw new KeyNotFoundException($"Entity type [{entityType.FullName}] is not registered. Use {nameof(RegisterEntity)} method first.");
            }

            IEntityDescription entityDescription = EntityDescriptions[entityType];

            return(entityDescription);
        }
예제 #13
0
        internal virtual IFlushStrategy GetFlushTrigger(IEntityDescription entityDescription)
        {
            if (entityDescription.FlushTrigger != null)
            {
                return(entityDescription.FlushTrigger);
            }

            if (DefaultFlushStrategy != null)
            {
                return(DefaultFlushStrategy);
            }

            throw new NullReferenceException($"Type {entityDescription.Type.FullName} did not have {nameof(IFlushStrategy)} configured and {nameof(DefaultFlushStrategy)} also was not provided.");
        }
예제 #14
0
        internal virtual List <IPersistentStorage> GetPersistentStorages(IEntityDescription entityDescription)
        {
            if (entityDescription.PersistentStorages != null && entityDescription.PersistentStorages.Count > 0)
            {
                return(entityDescription.PersistentStorages);
            }

            if (DefaultPersistentStorages != null && DefaultPersistentStorages.Count > 0)
            {
                return(DefaultPersistentStorages);
            }

            throw new NullReferenceException($"Type {entityDescription.Type.FullName} did not have {nameof(IPersistentStorage)} configured and {nameof(DefaultPersistentStorages)} also was not provided.");
        }
예제 #15
0
        internal virtual ISpreadStrategy GetSpreadStrategy(IEntityDescription entityDescription, RequiredEntity requiredEntity)
        {
            if (requiredEntity.SpreadStrategy != null)
            {
                return(requiredEntity.SpreadStrategy);
            }

            if (DefaultSpreadStrategy != null)
            {
                return(DefaultSpreadStrategy);
            }

            throw new NullReferenceException($"Type {entityDescription.Type.FullName} for required entity {requiredEntity.Type} did not have an {nameof(ISpreadStrategy)} configured and {nameof(DefaultSpreadStrategy)} also was not provided.");
        }
예제 #16
0
        internal virtual IQuantityProvider GetQuantityProvider(IEntityDescription entityDescription)
        {
            if (entityDescription.QuantityProvider != null)
            {
                return(entityDescription.QuantityProvider);
            }

            if (DefaultQuantityProvider != null)
            {
                return(DefaultQuantityProvider);
            }

            throw new NullReferenceException($"Type {entityDescription.Type.FullName} did not have {nameof(IQuantityProvider)} configured and {nameof(DefaultQuantityProvider)} also was not provided.");
        }
예제 #17
0
        internal virtual List <IModifier> GetModifiers(IEntityDescription entityDescription)
        {
            if (entityDescription.Modifiers != null &&
                entityDescription.Modifiers.Count > 0)
            {
                return(entityDescription.Modifiers);
            }

            if (DefaultModifiers != null)
            {
                return(DefaultModifiers);
            }

            return(new List <IModifier>());
        }
예제 #18
0
        protected virtual void CheckDuplicates(Type[] paramsTypes, IEntityDescription entity, Type whereFound)
        {
            List <string> actualParamsDuplicates = paramsTypes
                                                   .GroupBy(x => x)
                                                   .Where(g => g.Count() > 1)
                                                   .Select(y => y.Key.FullName)
                                                   .ToList();

            if (actualParamsDuplicates.Count > 0)
            {
                string duplicates = string.Join(", ", actualParamsDuplicates);
                string message    = $"Entity {entity.Type.FullName} {whereFound.FullName} contains duplicate parameter(s) with type: {duplicates}.";
                throw new NotSupportedException(message);
            }
        }
예제 #19
0
        public FacetsBuilder(IEntityDescription <TEntity> entityDescription)
        {
            if (entityDescription == null)
            {
                throw new ArgumentNullException(nameof(entityDescription));
            }

            if (string.IsNullOrWhiteSpace(entityDescription.EntityId))
            {
                throw new ArgumentException(
                          nameof(entityDescription.EntityId) + " can't be null, empty or whitespace.",
                          nameof(entityDescription)
                          );
            }

            if (entityDescription.EntityProperties == null || !entityDescription.EntityProperties.Any())
            {
                throw new ArgumentException(
                          $"The \"{nameof(entityDescription.EntityProperties)}\" dictionary "
                          + "contains no elements or is null.",
                          nameof(entityDescription)
                          );
            }

            if (entityDescription.JoinedEntitiesInfo != null)
            {
                if (!entityDescription.JoinedEntitiesInfo.Any())
                {
                    throw new ArgumentException(
                              $"The \"{nameof(entityDescription.JoinedEntitiesInfo)}\" list "
                              + "contains no elements.",
                              nameof(entityDescription)
                              );
                }

                if (entityDescription.JoinedEntitiesProperties == null ||
                    !entityDescription.JoinedEntitiesProperties.Any())
                {
                    throw new ArgumentException(
                              $"The \"{nameof(entityDescription.JoinedEntitiesProperties)}\" dictionary "
                              + "contains no elements or is null.",
                              nameof(entityDescription)
                              );
                }
            }

            EntityDescription = entityDescription;
        }
예제 #20
0
        //Get registered entity
        public virtual EntityDescription <TEntity> GetEntityDescription <TEntity>()
            where TEntity : class
        {
            Type entityType = typeof(TEntity);

            IEntityDescription entityDescription = GetEntityDescription(entityType);

            if (!(entityDescription is EntityDescription <TEntity>))
            {
                Type descriptionActualType = entityDescription.GetType();
                Type descriptionBaseType   = typeof(EntityDescription <>);
                throw new TypeAccessException($"Entity type [{entityType.FullName}] was registered with description of type [{descriptionActualType.FullName}]. Not able to cast description to type [{descriptionBaseType.FullName}]. Use {nameof(EntityDescriptions)} property instead.");
            }

            return((EntityDescription <TEntity>)entityDescription);
        }
        //prepare settings
        protected virtual void SetDataAmounts(GeneratorSetup setup, Dictionary <Type, long> dataAmmounts)
        {
            foreach (Type type in dataAmmounts.Keys)
            {
                IEntityDescription entityDescription = GetEntityDescription(setup, type);
                long ammount = dataAmmounts[type];

                PropertyInfo quantityPropInfo = entityDescription.GetType()
                                                .GetProperty(nameof(entityDescription.QuantityProvider));
                quantityPropInfo.SetValue(entityDescription, new StrictQuantityProvider(ammount));

                PropertyInfo flushTriggerPropInfo = entityDescription.GetType()
                                                    .GetProperty(nameof(entityDescription.FlushTrigger));
                flushTriggerPropInfo.SetValue(entityDescription, new LimitedCapacityFlushStrategy(ammount));
            }
        }
예제 #22
0
        public virtual Task InvokeInsert(IPersistentStorage storage,
                                         IEntityDescription description, IList itemsList)
        {
            Type       targetType = description.Type;
            MethodInfo insertMethod;

            if (!_insertMethods.ContainsKey(targetType))
            {
                Type generatorType = typeof(IPersistentStorage);
                insertMethod = generatorType.GetMethods()
                               .First(x => x.Name == nameof(IPersistentStorage.Insert));
                insertMethod = insertMethod.MakeGenericMethod(targetType);
                _insertMethods.Add(targetType, insertMethod);
            }

            insertMethod = _insertMethods[targetType];
            object result = insertMethod.Invoke(storage, new object[] { itemsList });

            return((Task)result);
        }
예제 #23
0
        protected virtual void CompareToRequiredParams(List <Type> requiredParams, Type[] actualParams,
                                                       IEntityDescription entity, Type whereFound)
        {
            string[] extraParams = requiredParams.Except(actualParams)
                                   .Select(x => x.FullName)
                                   .ToArray();
            if (extraParams.Length > 0)
            {
                string paramsJoined = string.Join(", ", extraParams);
                string message      = $"Entity {entity.Type.FullName} {whereFound.FullName} contains less parameters than configured in Entities's Required. Those are missing parameters: {paramsJoined}.";
                throw new NotSupportedException(message);
            }

            extraParams = actualParams.Except(requiredParams)
                          .Select(x => x.FullName)
                          .ToArray();
            if (extraParams.Length > 0)
            {
                string paramsJoined = string.Join(", ", extraParams);
                string message      = $"Entity {entity.Type.FullName} {whereFound.FullName} contains more parameters than configured in Entities's Required. Those are extra parameters: {paramsJoined}.";
                throw new NotSupportedException(message);
            }
        }
예제 #24
0
 protected static void ValidateAlias(IEntityDescription description)
 {
     if (String.IsNullOrWhiteSpace(description.Alias))
         throw new Exception("Cannot generate entity with alias null or empty");
 }
예제 #25
0
 public virtual GeneratorSetup RegisterEntity(IEntityDescription entityDescription)
 {
     EntityDescriptions.Add(entityDescription.Type, entityDescription);
     return(this);
 }
예제 #26
0
 protected abstract void SetName(CodeTypeMember type, IEntityDescription description);
예제 #27
0
 protected abstract void SetName(CodeTypeMember type, IEntityDescription description);
예제 #28
0
        protected static void AddDisplayNameIfDifferent(CodeAttributeDeclaration attribute, IEntityDescription description)
        {
            var name = description.Name;

            if (String.Compare(name, description.Alias, IgnoreCase) == 0 ||
                String.Compare(name, description.Alias.SplitPascalCase(), IgnoreCase) == 0)
            {
                return;
            }
            AddAttributePrimitiveArgument(attribute, "DisplayName", name);
        }
예제 #29
0
 public ProcessEntityBeforeWriteVisitor(IEntityDescription entityDescription, Entity entity)
 {
     _entityDescription = entityDescription;
     _entity            = entity;
 }
예제 #30
0
 protected static void SetName(CodeTypeMember type, IEntityDescription description)
 {
     type.Name = description.Alias.PascalCase();
 }
예제 #31
0
 protected static void SetName(CodeTypeMember type, IEntityDescription description)
 {
     type.Name = description.Alias.PascalCase();
 }
예제 #32
0
 protected override void SetName(CodeTypeMember type, IEntityDescription description)
 {
     type.Name = "I" + description.Alias.PascalCase();
 }