//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); }
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 ValidateAlias(IEntityDescription description) { if (String.IsNullOrWhiteSpace(description.Alias)) { throw new Exception("Cannot generate entity with alias null or empty"); } }
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); }
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); }
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); }
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."); }
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."); }
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."); }
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."); }
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>()); }
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); } }
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; }
//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)); } }
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); }
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); } }
protected static void ValidateAlias(IEntityDescription description) { if (String.IsNullOrWhiteSpace(description.Alias)) throw new Exception("Cannot generate entity with alias null or empty"); }
public virtual GeneratorSetup RegisterEntity(IEntityDescription entityDescription) { EntityDescriptions.Add(entityDescription.Type, entityDescription); return(this); }
protected abstract void SetName(CodeTypeMember type, IEntityDescription description);
protected abstract void SetName(CodeTypeMember type, IEntityDescription description);
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); }
public ProcessEntityBeforeWriteVisitor(IEntityDescription entityDescription, Entity entity) { _entityDescription = entityDescription; _entity = entity; }
protected static void SetName(CodeTypeMember type, IEntityDescription description) { type.Name = description.Alias.PascalCase(); }
protected static void SetName(CodeTypeMember type, IEntityDescription description) { type.Name = description.Alias.PascalCase(); }
protected override void SetName(CodeTypeMember type, IEntityDescription description) { type.Name = "I" + description.Alias.PascalCase(); }