Esempio n. 1
0
 /// <summary>
 /// Gets the assembly qualified name of the extension class name to be used for deserialization.
 /// </summary>
 /// <param name="extensionName">The name of the extension.</param>
 /// <returns>The assembly qualified name of the extension class name to be used for deserialization.</returns>
 protected virtual string GetExtensionClassAssemblyQualifiedName(string extensionName)
 {
     return(ExtensionsConventions.GetExtensionResourceClassAssemblyQualifiedName(
                extensionName,
                _resourceName,
                _resourceClassName));
 }
Esempio n. 2
0
        /// <summary>
        /// Registers an Ed-Fi entity extension type to enable the creation of aggregate extension entries during entity initialization.
        /// </summary>
        /// <param name="edFiStandardEntityType">The type of the Ed-Fi Standard entity.</param>
        /// <param name="aggregateExtensionEntity">The <see cref="Entity" /> representing the Ed-Fi extension entity added to an Ed-Fi standard aggregate.</param>
        public void RegisterAggregateExtensionEntity(Type edFiStandardEntityType, Entity aggregateExtensionEntity)
        {
            if (!edFiStandardEntityType.IsSubclassOf(typeof(EntityWithCompositeKey)))
            {
                throw new ArgumentException($"{nameof(edFiStandardEntityType)} is not an entity Type.", nameof(edFiStandardEntityType));
            }

            if (!aggregateExtensionEntity.IsAggregateExtension)
            {
                throw new Exception($"{nameof(aggregateExtensionEntity)} is not an aggregate extension entity.");
            }

            _aggregateExtensionEntityNamesByType.AddOrUpdate(
                edFiStandardEntityType,
                t => new List <string>
            {
                ExtensionsConventions.GetAggregateExtensionMemberName(aggregateExtensionEntity)
            },
                (t, n) =>
            {
                string extensionCollectionName = ExtensionsConventions.GetAggregateExtensionMemberName(aggregateExtensionEntity);
                n.Add(extensionCollectionName);
                return(n);
            });
        }
Esempio n. 3
0
        public AssemblyData CreateAssemblyData(string assemblyMetadataPath)
        {
            var assemblyMetadata = _jsonFileProvider.Load <AssemblyMetadata>(assemblyMetadataPath);

            bool isExtension = assemblyMetadata.AssemblyModelType.EqualsIgnoreCase(TemplateSetConventions.Extension);

            string assemblyName = GetAssemblyName(assemblyMetadataPath);

            var schemaName = isExtension
                ? ExtensionsConventions.GetProperCaseNameForLogicalName(
                _domainModelsDefinitionsProvidersByProjectName[assemblyName]
                .GetDomainModelDefinitions()
                .SchemaDefinition.LogicalName)
                : EdFiConventions.ProperCaseName;

            var assemblyData = new AssemblyData
            {
                AssemblyName = assemblyName,
                Path         = Path.GetDirectoryName(assemblyMetadataPath),
                TemplateSet  = assemblyMetadata.AssemblyModelType,
                IsProfile    = assemblyMetadata.AssemblyModelType.EqualsIgnoreCase(TemplateSetConventions.Profile),
                SchemaName   = schemaName,
                IsExtension  = isExtension
            };

            return(assemblyData);
        }
        public virtual void Install(IWindsorContainer container, IConfigurationStore store)
        {
            // Register extension assemblies based on naming convention
            var extensionAssemblies = Assemblies.Where(ExtensionsConventions.IsExtensionAssembly)
                                      .ToList();

            // Exclude any extension assemblies specified by configuration
            var excludedExtensionSourcesValue = container.Resolve <IConfigValueProvider>()
                                                .GetValue(ExcludedExtensionSourcesKey);

            if (!string.IsNullOrWhiteSpace(excludedExtensionSourcesValue))
            {
                extensionAssemblies = extensionAssemblies
                                      .Where(
                    a => !excludedExtensionSourcesValue.Split(',')
                    .Contains(
                        ExtensionsConventions.GetProperCaseNameFromAssemblyName(
                            a.GetName()
                            .Name)))
                                      .ToList();
            }

            // Ensure all the domain model definitions are registered before handling any other extension concerns
            extensionAssemblies.ForEach(a => RegisterIDomainModelDefinitionsProvider(a, container));

            extensionAssemblies.ForEach(
                a =>
            {
                RegisterExtensions(a, _registrar, container);
                RegisterExtensionNHibernateConfigurationProvider(a, container);
                RegisterControllers(a, container);
            }
                );
        }
        private Common.Models.Resource.Resource GetDomainResourceFor(Resource resource)
        {
            string schemaProperCaseNameOrDefault =
                ExtensionsConventions.GetProperCaseNameForLogicalName(resource.logicalSchema ?? EdFiConventions.ProperCaseName);

            bool IsSchemaMatch(ResourceClassBase r) => r.SchemaProperCaseName.EqualsIgnoreCase(schemaProperCaseNameOrDefault);
            bool IsNameMatch(ResourceClassBase r) => r.Name.EqualsIgnoreCase(resource.name);
            bool IsFullNameMatch(ResourceClassBase r) => IsSchemaMatch(r) && IsNameMatch(r);

            return(ResourceModel.GetAllResources()
                   .FirstOrDefault(IsFullNameMatch));
        }
Esempio n. 6
0
            protected override void Act()
            {
                var domainModel =
                    new DomainModelProvider(
                        new IDomainModelDefinitionsProvider[]
                {
                    new DomainModelDefinitionsProvider(), new EdFiDomainModelDefinitionsProvider()
                }).GetDomainModel();

                ExtensionsConventions.GetAggregateExtensionMemberName(
                    domainModel.Entities.FirstOrDefault(e => e.Name == "StaffLeaveExtension"));
            }
Esempio n. 7
0
            protected override void Act()
            {
                _expectedResult = "TestExtension_StaffLeaveReasons";

                var domainModel =
                    new DomainModelProvider(
                        new IDomainModelDefinitionsProvider[]
                {
                    new DomainModelDefinitionsProvider(), new EdFiDomainModelDefinitionsProvider()
                }).GetDomainModel();

                _actualResult = ExtensionsConventions.GetAggregateExtensionMemberName(
                    domainModel.Entities.FirstOrDefault(e => e.Name == "StaffLeaveReason"));
            }
 private List <IDomainModelDefinitionsProvider> GetDomainModelDefinitionProviders(string schemaName)
 {
     return(_domainModelDefinitionProviders
            .Value
            .Where(
                x => schemaName
                .EqualsIgnoreCase(
                    ExtensionsConventions.GetProperCaseNameForLogicalName(
                        x.GetDomainModelDefinitions()
                        .SchemaDefinition.LogicalName)) ||
                x.GetDomainModelDefinitions()
                .SchemaDefinition.LogicalName.EqualsIgnoreCase(EdFiConventions.LogicalName))
            .ToList());
 }
            public virtual void Should_return_correctly_constructed_aggregate_extension_dictionary_when_CreateAggregateExtensions_is_called()
            {
                var expectedAggregateExtensionMemberName =
                    ExtensionsConventions.GetAggregateExtensionMemberName(_aggregateExtensionEntity);

                AssertHelper.All(
                    () =>
                    Assert.That(
                        _aggregateExtensionInstances.Keys.First(),
                        Is.EqualTo(expectedAggregateExtensionMemberName),
                        $"Aggregate extension dictionary key does not match expected value: {expectedAggregateExtensionMemberName}"),
                    () =>
                    Assert.That(
                        (IList)_aggregateExtensionInstances[expectedAggregateExtensionMemberName],
                        Is.EquivalentTo(new List <object>()),
                        "Aggregate extension dictionary does not contain empty List<object>."));
            }
Esempio n. 10
0
        private static object DoCreateTargetExtensionObject(Type targetType, string extensionName)
        {
            // Get target extension type
            var targetExtensionType = _extensionTypeByExtensionKey.GetOrAdd(
                new ExtensionKey(targetType, extensionName),
                key =>
            {
                string assemblyQualifiedName =
                    ExtensionsConventions.GetExtensionClassAssemblyQualifiedName(key.EdFiStandardType, key.ExtensionName);

                return(Type.GetType(assemblyQualifiedName));
            });

            // Create the target extension object
            return(targetExtensionType != null
                ? Activator.CreateInstance(targetExtensionType)
                : null);
        }
Esempio n. 11
0
        private SchemaNameMap CreateNameMap(string logicalName, string physicalName)
        {
            if (string.IsNullOrWhiteSpace(logicalName))
            {
                throw new ArgumentException($"{nameof(logicalName)} must contain a non-zero length string.", nameof(logicalName));
            }

            if (string.IsNullOrWhiteSpace(physicalName))
            {
                throw new ArgumentException($"{nameof(physicalName)} must contain a non-zero length string.", nameof(physicalName));
            }

            return(new SchemaNameMap(
                       logicalName,
                       physicalName,
                       CreateUriSegment(logicalName),
                       ExtensionsConventions.GetProperCaseNameForLogicalName(logicalName)));
        }
        public IEnumerable <AssemblyData> Get()
        {
            // Convention based location of extensions (backwards compatibility)
            var legacyExtensionPath = _codeRepositoryProvider.GetResolvedCodeRepositoryByName(
                CodeRepositoryConventions.Implementation,
                CodeRepositoryConventions.Application);

            var assemblyData = Directory.GetFiles(
                legacyExtensionPath,
                ExtensionsSearchString,
                SearchOption.AllDirectories)
                               .Select(
                x =>
            {
                string assemblyName = _assemblyDataHelper.GetAssemblyName(x);

                string schemaName = ExtensionsConventions.GetProperCaseNameForLogicalName(
                    _domainModelsDefinitionsProvidersByProjectName[assemblyName]
                    .GetDomainModelDefinitions()
                    .SchemaDefinition
                    .LogicalName);

                return(new AssemblyData
                {
                    Path = Path.GetDirectoryName(x),
                    TemplateSet = TemplateSetConventions.Extension,
                    AssemblyName = assemblyName,
                    IsExtension = true,
                    IsProfile = false,
                    SchemaName = schemaName
                });
            }).ToList();

            assemblyData.ForEach(x => _logger.Debug($"Found file matching '{ExtensionsSearchString}' at '{x.Path}'"));

            return(assemblyData);
        }
Esempio n. 13
0
            protected override void Act()
            {
                string logicalName = "Ed-Fi";

                _actualResult = ExtensionsConventions.GetProperCaseNameForLogicalName(logicalName);
            }
Esempio n. 14
0
            protected override void Act()
            {
                string extensionName = "GrandBend";

                _actualResult = ExtensionsConventions.GetProperCaseNameForLogicalName(extensionName);
            }
Esempio n. 15
0
 protected override void Act()
 {
     _actualResult = ExtensionsConventions.GetExtensionClassAssemblyQualifiedName(typeof(StaffResource), "GrandBend");
 }
        private void RegisterExtensions(Assembly assembly, IEntityExtensionRegistrar registrar, IWindsorContainer container)
        {
            string extensionAssemblyName = assembly.GetName()
                                           .Name;

            var extensionSchemaProperCaseName = ExtensionsConventions.GetProperCaseNameFromAssemblyName(extensionAssemblyName);

            var domainModel = container.Resolve <IDomainModelProvider>()
                              .GetDomainModel();

            string schemaPhysicalName = domainModel.SchemaNameMapProvider
                                        .GetSchemaMapByProperCaseName(extensionSchemaProperCaseName)
                                        .PhysicalName;

            var extensionsByStandardEntity = domainModel
                                             .Entities
                                             .Where(e => e.Schema.Equals(schemaPhysicalName) && (e.IsEntityExtension || e.IsAggregateExtensionTopLevelEntity))
                                             .Select(
                e => new
            {
                Parent            = e.Parent, Entity = e, IsAggregateExtension = e.IsAggregateExtension,
                IsEntityExtension = e.IsEntityExtension
            })
                                             .GroupBy(x => x.Parent, x => x)
                                             .ToList();

            var aggregateExtensionEntities = extensionsByStandardEntity
                                             .SelectMany(x => x)
                                             .Where(x => x.IsAggregateExtension)
                                             .Select(x => x.Entity);

            var entityExtensions = extensionsByStandardEntity
                                   .SelectMany(x => x)
                                   .Where(x => x.IsEntityExtension)
                                   .Select(
                x => new
            {
                Entity     = x.Entity,
                IsRequired = x.Entity.ParentAssociation.Association.Cardinality == Cardinality.OneToOneExtension
            });

            // Register aggregate extensions
            foreach (var aggregateExtensionEntity in aggregateExtensionEntities)
            {
                string standardTypeName = aggregateExtensionEntity.Parent.EntityTypeFullName(EdFiConventions.ProperCaseName);
                var    standardType     = Type.GetType($"{standardTypeName}, {Namespaces.Standard.BaseNamespace}");

                registrar.RegisterAggregateExtensionEntity(standardType, aggregateExtensionEntity);
            }

            // Register explicit entity extensions
            foreach (var entityExtension in entityExtensions)
            {
                string standardTypeName = entityExtension.Entity.EdFiStandardEntity.EntityTypeFullName(EdFiConventions.ProperCaseName);
                var    standardType     = Type.GetType($"{standardTypeName}, {Namespaces.Standard.BaseNamespace}");

                string extensionTypeName = entityExtension.Entity.EntityTypeFullName(extensionSchemaProperCaseName);
                var    extensionType     = Type.GetType($"{extensionTypeName}, {extensionAssemblyName}");

                registrar.RegisterEntityExtensionType(standardType, extensionSchemaProperCaseName, extensionType, entityExtension.IsRequired);
            }

            // Register implicit entity extensions
            // Filter down to just the standard entities that have aggregate extensions, but no entity extensions (need implicit extension classes registered)
            var implicitlyExtendedEntities = extensionsByStandardEntity
                                             .Where(p => p.Any(x => x.IsAggregateExtension) && !p.Any(x => x.IsEntityExtension));

            foreach (var implicitlyExtendedEntity in implicitlyExtendedEntities)
            {
                string standardTypeName = implicitlyExtendedEntity.Key.EntityTypeFullName(EdFiConventions.ProperCaseName);
                var    standardType     = Type.GetType($"{standardTypeName}, {Namespaces.Standard.BaseNamespace}");

                string extensionClassAssemblyQualifiedName =
                    ExtensionsConventions.GetExtensionClassAssemblyQualifiedName(standardType, extensionSchemaProperCaseName);

                var extensionType = Type.GetType(extensionClassAssemblyQualifiedName);

                registrar.RegisterEntityExtensionType(standardType, extensionSchemaProperCaseName, extensionType, isRequired: true);
            }
        }
Esempio n. 17
0
            protected override void Act()
            {
                string extensionAssemblyName = $"{Namespaces.Extensions.BaseNamespace}.GrandBend";

                _actualResult = ExtensionsConventions.GetProperCaseNameFromAssemblyName(extensionAssemblyName);
            }
Esempio n. 18
0
 /// <summary>
 /// Gets the name, by convention, that would be used for an entity extension of the entity.
 /// </summary>
 /// <param name="entity">The Entity whose entity extension class name is to be constructed, by convention.</param>
 /// <returns>The entity extension class name.</returns>
 public static string GetExtensionClassName(this Entity entity)
 {
     return(ExtensionsConventions.GetExtensionClassName(entity.Name));
 }
Esempio n. 19
0
            protected override void Act()
            {
                _expectedResult = "StaffExtension";

                _actualResult = ExtensionsConventions.GetExtensionClassName("Staff");
            }
Esempio n. 20
0
        public override void ApplyConfigurationSpecificRegistrations(ContainerBuilder builder)
        {
            var installedExtensionAssemblies =
                AssemblyLoadContext.Default.Assemblies
                .Where(
                    a => a.IsExtensionAssembly() &&
                    !ApiSettings.ExcludedExtensions.Contains(
                        ExtensionsConventions.GetProperCaseNameFromAssemblyName(a.GetName().Name), StringComparer.InvariantCultureIgnoreCase))
                .Distinct(new AssemblyComparer())
                .ToList();

            builder.RegisterType <EntityExtensionsFactory>()
            .As <IEntityExtensionsFactory>()
            .SingleInstance();

            builder.RegisterType <EntityExtensionRegistrar>()
            .WithParameter(new TypedParameter(typeof(IEnumerable <Assembly>), installedExtensionAssemblies))
            .As <IEntityExtensionRegistrar>()
            .SingleInstance();

            installedExtensionAssemblies.ForEach(
                assembly =>
            {
                var assemblyName = assembly.GetName().Name;

                builder.RegisterType <DomainModelDefinitionsJsonEmbeddedResourceProvider>()
                .WithParameter("sourceAssembly", assembly)
                .As <IDomainModelDefinitionsProvider>()
                .SingleInstance();

                builder.RegisterType <ExtensionNHibernateConfigurationProvider>()
                .WithParameter("assemblyName", assemblyName)
                .As <IExtensionNHibernateConfigurationProvider>()
                .SingleInstance();

                var relationshipContextDataProviderTypes = assembly.GetTypes()
                                                           .Where(
                    t => !t.IsAbstract && typeof(IRelationshipsAuthorizationContextDataProvider <,>).IsAssignableFromGeneric(t))
                                                           .ToList();

                var contextDataType = typeof(RelationshipsAuthorizationContextData);
                foreach (var providerType in relationshipContextDataProviderTypes)
                {
                    var partiallyClosedInterfaceType =
                        providerType.GetInterfaces()
                        .SingleOrDefault(i => i.Name == typeof(IRelationshipsAuthorizationContextDataProvider <,>).Name);

                    var modelType = partiallyClosedInterfaceType?.GetGenericArguments()[0];

                    var closedInterfaceType =
                        typeof(IRelationshipsAuthorizationContextDataProvider <,>)
                        .MakeGenericType(modelType, contextDataType);

                    var closedServiceType =
                        providerType
                        .MakeGenericType(contextDataType);

                    builder.RegisterType(closedServiceType).As(closedInterfaceType)
                    .SingleInstance();
                }
            });
        }
Esempio n. 21
0
            protected override void Act()
            {
                string extensionName = "Staff";

                _actualResult = ExtensionsConventions.GetExtensionResourceClassAssemblyQualifiedName(extensionName, "TalentMgmt", "TestStaff");
            }