public void WhenGetAuditConfMultipleTimesThenDoesNotThrowsForDupicatedMappings()
        {
            var cfg = new Cfg.Configuration();

            cfg.Configure();

            cfg.AddXml(SimpleMapping);
            AuditConfiguration.GetFor(cfg);             //<< external call

            AuditConfiguration.SetConfigMetas(cfg, new AttributeConfiguration());
            var listeners = new[] { new AuditEventListener() };

            cfg.AppendListeners(ListenerType.PostInsert, listeners);
            cfg.AppendListeners(ListenerType.PostUpdate, listeners);
            cfg.AppendListeners(ListenerType.PostDelete, listeners);
            cfg.AppendListeners(ListenerType.PostCollectionRecreate, listeners);
            cfg.AppendListeners(ListenerType.PreCollectionRemove, listeners);
            cfg.AppendListeners(ListenerType.PreCollectionUpdate, listeners);

            Executing.This(() =>
            {
                using (cfg.BuildSessionFactory())
                {
                    // build the session factory to run initialization of listeners and be completelly sure
                    // there isn't problems
                }
            }).Should().NotThrow();
        }
        public void WhenCallIntegrationThenMappingsShouldBeAvailableImmediately()
        {
            var cfg = new Cfg.Configuration();

            cfg.Configure();
            cfg.AddXml(SimpleMapping);
            cfg.IntegrateWithEnvers();

            cfg.ClassMappings.Where(cm => cm.EntityName.Contains("SimpleAuiditableForConfEntity")).Should().Have.Count.EqualTo(2);
        }
Esempio n. 3
0
        public void WhenIntegrateThenBuildSessionFactoryDoesNotThrows()
        {
            var cfg = new Cfg.Configuration();

            cfg.Configure().OverrideSettingsFromEnvironmentVariables();
            cfg.AddXml(SimpleMapping);
            cfg.IntegrateWithEnvers();

            Executing.This(() =>
            {
                using (cfg.BuildSessionFactory())
                {
                    // build the session factory to run initialization of listeners and be completelly sure
                    // there isn't problems
                }
            }).Should().NotThrow();
        }
        public EntitiesConfigurations Configure(Cfg.Configuration cfg,
                                                IMetaDataStore metaDataStore,
                                                GlobalConfiguration globalCfg,
                                                AuditEntitiesConfiguration verEntCfg,
                                                XDocument revisionInfoXmlMapping,
                                                XElement revisionInfoRelationMapping)
        {
            // Creating a name register to capture all audit entity names created.
            var auditEntityNameRegister = new AuditEntityNameRegister();

            // Sorting the persistent class topologically - superclass always before subclass
            var classes = GraphTopologicalSort.Sort(new PersistentClassGraphDefiner(cfg));

            var classesAuditingData = new ClassesAuditingData();
            var xmlMappings         = new Dictionary <PersistentClass, EntityXmlMappingData>();

            // Reading metadata from annotations
            foreach (var pc in classes)
            {
                // Collecting information from annotations on the persistent class pc
                var annotationsMetadataReader = new AnnotationsMetadataReader(metaDataStore, globalCfg, pc);
                var auditData = annotationsMetadataReader.GetAuditData();

                classesAuditingData.AddClassAuditingData(pc, auditData);
            }

            // Now that all information is read we can update the calculated fields.
            classesAuditingData.UpdateCalculatedFields();

            var auditMetaGen = new AuditMetadataGenerator(metaDataStore, cfg, globalCfg, verEntCfg, revisionInfoRelationMapping, auditEntityNameRegister);

            // First pass
            foreach (var pcDatasEntry in classesAuditingData.AllClassAuditedData)
            {
                var pc        = pcDatasEntry.Key;
                var auditData = pcDatasEntry.Value;

                var xmlMappingData = new EntityXmlMappingData();
                if (auditData.IsAudited())
                {
                    if (!string.IsNullOrEmpty(auditData.AuditTable.Value))
                    {
                        verEntCfg.AddCustomAuditTableName(pc.EntityName, auditData.AuditTable.Value);
                    }

                    auditMetaGen.GenerateFirstPass(pc, auditData, xmlMappingData, true);
                }
                else
                {
                    auditMetaGen.GenerateFirstPass(pc, auditData, xmlMappingData, false);
                }

                xmlMappings.Add(pc, xmlMappingData);
            }

            // Second pass
            foreach (var pcDatasEntry in classesAuditingData.AllClassAuditedData)
            {
                var xmlMappingData = xmlMappings[pcDatasEntry.Key];

                if (pcDatasEntry.Value.IsAudited())
                {
                    auditMetaGen.GenerateSecondPass(pcDatasEntry.Key, pcDatasEntry.Value, xmlMappingData);

                    cfg.AddXml(xmlMappingData.MainXmlMapping.ToString());

                    foreach (var additionalMapping in xmlMappingData.AdditionalXmlMappings)
                    {
                        cfg.AddXml(additionalMapping.ToString());
                    }
                }
            }

            // Only if there are any versioned classes
            if (auditMetaGen.EntitiesConfigurations.Count > 0)
            {
                if (revisionInfoXmlMapping != null)
                {
                    cfg.AddXml(revisionInfoXmlMapping.ToString());
                }
            }

            return(new EntitiesConfigurations(auditMetaGen.EntitiesConfigurations,
                                              auditMetaGen.NotAuditedEntitiesConfigurations));
        }