public TypedEntityPropertyAccessor(Type entityType)
            {
                Assert(entityType != null);

                var metadataStorage = default(MetadataStorage);

                BuildIdAccess(entityType,
                              ref metadataStorage,
                              out _idGetAccessor,
                              out _idSetAccessor);

                BuildConcurrencyTokenAccess(entityType,
                                            ref metadataStorage,
                                            out _concurrencyTokenGetAccessor,
                                            out _concurrencyTokenSetAccessor);
                BuildRevisionAccess(entityType,
                                    ref metadataStorage,
                                    out _revisionGetAccessor,
                                    out _revisionSetAccessor);

                BuildEventAccess(entityType,
                                 ref metadataStorage,
                                 out _uncommittedEventsGetAccessor,
                                 out _commitEventsInvoker,
                                 out _addEventAccessor);

                _metadataStorage = metadataStorage;
            }
            private static void BuildIdAccess(Type entityType,
                                              ref MetadataStorage metadataStorage,
                                              out Func <object, string> idGetAccessor,
                                              out Action <object, string> idSetAccessor)
            {
                var idMember = GetIdMember(entityType);

                if (idMember == null)
                {
                    var ms = metadataStorage = metadataStorage ?? new MetadataStorage();

                    string GetIdFromMetadata(object entity)
                    {
                        return(ms.GetMetadata(entity).GetId());
                    }

                    void SetIdToMetadata(object entity, string id)
                    {
                        ms.GetMetadata(entity).SetId(id);
                    }

                    idGetAccessor = GetIdFromMetadata;
                    idSetAccessor = SetIdToMetadata;
                    return;
                }

                // We could theoretically allow setting id to an entity,
                // but this will need support for transforming a stringified id back to its original representation.
                idSetAccessor = null;

                var idType          = DataPropertyHelper.GetIdType(entityType);
                var entityParameter = Expression.Parameter(typeof(object), "entity");
                var convertedEntity = Expression.Convert(entityParameter, entityType);

                var idAccess = default(Expression);

                if (idMember.MemberType == MemberTypes.Method)
                {
                    idAccess = Expression.Call(convertedEntity, (MethodInfo)idMember);
                }
                else if (idMember.MemberType == MemberTypes.Field || idMember.MemberType == MemberTypes.Property)
                {
                    idAccess = Expression.MakeMemberAccess(convertedEntity, idMember);
                }

                var toStringMethod = idType.GetMethod(nameof(ToString), BindingFlags.Public | BindingFlags.Instance, Type.DefaultBinder, Type.EmptyTypes, null);

                Assert(toStringMethod != null);

                if (idAccess != null)
                {
                    var toStringCall = Expression.Call(idAccess, toStringMethod);
                    idGetAccessor = Expression.Lambda <Func <object, string> >(toStringCall, entityParameter).Compile();
                }
                else
                {
                    idGetAccessor = null;
                }
            }
        public void Counting(string fileName, Dictionary <string, int> stencils, int widthImage)
        {
            var metaData      = new MetadataStorage();
            var imageMetaData = new ImageMetadata();

            CountImages++;

            var xmlFile = Path.Combine(Path.ChangeExtension(fileName, "xml"));

            if (File.Exists(xmlFile))
            {
                imageMetaData = metaData.LoadMetadata(xmlFile);

                if (imageMetaData.HumanChecked)
                {
                    Marked++;
                }
                else
                {
                    Unplaced++;
                }

                if (imageMetaData.Brightness == ImageBrightness.Light)
                {
                    CountLightImages++;
                }
                else
                {
                    CountDarkImages++;
                }

                if (imageMetaData.Plates == null)
                {
                    return;
                }

                switch (imageMetaData.Plates.Length)
                {
                case 1:
                    CountOneNumber++;
                    break;

                case 2:
                    CountTwoNumber++;
                    break;

                case 3:
                    CountMoreTwoNumber++;
                    break;
                }

                CountingInfoAboutPlate(imageMetaData.Plates, stencils, widthImage);
            }
            else
            {
                Unplaced++;
            }
        }
            private static void BuildEventAccess(Type entityType,
                                                 ref MetadataStorage metadataStorage,
                                                 out Func <object, IEnumerable <object> > uncommittedEventsGetAccessor,
                                                 out Action <object> commitEventsInvoker,
                                                 out Action <object, object> addEventAccessor)
            {
                var uncommittedEventsProperty = GetUncommittedEventsProperty(entityType);
                var commitEventsMethod        = GetCommitEventsMethod(entityType);

                if (uncommittedEventsProperty == null ||
                    commitEventsMethod == null)
                {
                    var ms = metadataStorage = metadataStorage ?? new MetadataStorage();

                    IEnumerable <object> GetUncommittedEventsFromMetadata(object entity)
                    {
                        return(ms.GetMetadata(entity).GetUncommittedEvents());
                    }

                    void CommitEventsInMetadata(object entity)
                    {
                        ms.GetMetadata(entity).CommitEvents();
                    }

                    void AddEventToMetadata(object entity, object evt)
                    {
                        ms.GetMetadata(entity).AddEvent(evt);
                    }

                    uncommittedEventsGetAccessor = GetUncommittedEventsFromMetadata;
                    commitEventsInvoker          = CommitEventsInMetadata;
                    addEventAccessor             = AddEventToMetadata;
                    return;
                }

                var entityParameter = Expression.Parameter(typeof(object), "entity");
                var convertedEntity = Expression.Convert(entityParameter, entityType);
                var uncommittedEventsPropertyAccess = Expression.Property(convertedEntity, uncommittedEventsProperty);

                uncommittedEventsGetAccessor = Expression.Lambda <Func <object, IEnumerable <object> > >(
                    uncommittedEventsPropertyAccess,
                    entityParameter).Compile();

                var commitEventsMethodCall = Expression.Call(convertedEntity, commitEventsMethod);

                commitEventsInvoker = Expression.Lambda <Action <object> >(commitEventsMethodCall, entityParameter).Compile();

                addEventAccessor = null;
            }
            private static void BuildConcurrencyTokenAccess(Type entityType,
                                                            ref MetadataStorage metadataStorage,
                                                            out Func <object, string> concurrencyTokenGetAccessor,
                                                            out Action <object, string> concurrencyTokenSetAccessor)
            {
                var concurrencyTokenProperty = GetConcurrencyTokenProperty(entityType);

                if (concurrencyTokenProperty == null)
                {
                    var ms = metadataStorage = metadataStorage ?? new MetadataStorage();

                    string GetConcurrencyTokenFromMetadata(object entity)
                    {
                        return(ms.GetMetadata(entity).GetConcurrencyToken());
                    }

                    void SetConcurrencyTokenToMetadata(object entity, string concurrencyToken)
                    {
                        ms.GetMetadata(entity).SetConcurrencyToken(concurrencyToken);
                    }

                    concurrencyTokenGetAccessor = GetConcurrencyTokenFromMetadata;
                    concurrencyTokenSetAccessor = SetConcurrencyTokenToMetadata;

                    return;
                }

                var entityParameter = Expression.Parameter(typeof(object), "entity");
                var convertedEntity = Expression.Convert(entityParameter, entityType);
                var concurrencyTokenPropertyAccess = Expression.Property(convertedEntity, concurrencyTokenProperty);

                Expression concurrencyTokenAccess = concurrencyTokenPropertyAccess;

                if (concurrencyTokenProperty.PropertyType != typeof(string))
                {
                    concurrencyTokenAccess = Expression.Convert(concurrencyTokenAccess, typeof(string));
                }

                concurrencyTokenGetAccessor = Expression.Lambda <Func <object, string> >(concurrencyTokenAccess, entityParameter)
                                              .Compile();

                var concurrencyTokenParameter      = Expression.Parameter(typeof(string), "concurrencyToken");
                var concurrencyTokenPropertyAssign = Expression.Assign(concurrencyTokenPropertyAccess, concurrencyTokenParameter);

                concurrencyTokenSetAccessor = Expression.Lambda <Action <object, string> >(concurrencyTokenPropertyAssign,
                                                                                           entityParameter,
                                                                                           concurrencyTokenParameter)
                                              .Compile();
            }
        public void Counting_FileName_CorrectResultStatistics()
        {
            var fileName = Path.Combine(TestContext.CurrentContext.TestDirectory, "sample1.xml");
            var storage  = new MetadataStorage();
            var metadata = new ImageMetadata
            {
                Description = "Описание",
                Brightness  = ImageBrightness.Dark,
                Plates      = new[]
                {
                    new PlateMetadata()
                    {
                        Number = "T288EC98", Quality = PlateQuality.Low, Stencil = "RU_N01_a000aa00"
                    },
                    new PlateMetadata()
                    {
                        Number = "C534YX177", Quality = PlateQuality.Normal, Stencil = "RU_N02_a000aa100"
                    },
                },
            };

            metadata.Plates[0].Coordinates[0] = new Point(111, 45);
            storage.SaveMetadata(fileName, metadata);
            var dictionary = new Dictionary <string, int>
            {
                { "RU_N01_a000aa00", 0 },
                { "RU_N01_a000aa100", 0 },
            };
            var stat = new DirectoryStatistics();

            stat.Counting(fileName, dictionary, 1000);

            Assert.That(stat.CountImages, Is.EqualTo(1));
            Assert.That(stat.CountDarkImages, Is.EqualTo(1));
            Assert.That(stat.CountLightImages, Is.Zero);
            Assert.That(stat.CountLargeNumber, Is.Zero);
            Assert.That(stat.CountMediumNumber, Is.EqualTo(1));
            Assert.That(stat.CountSmallNumber, Is.Zero);
            Assert.That(stat.CountHighQuality, Is.Zero);
            Assert.That(stat.CountMediumQuality, Is.EqualTo(1));
            Assert.That(stat.CountLowQuality, Is.EqualTo(1));
            Assert.That(stat.CountOneNumber, Is.Zero);
            Assert.That(stat.CountTwoNumber, Is.EqualTo(1));
            Assert.That(stat.CountMoreTwoNumber, Is.Zero);
            Assert.That(stat.Marked, Is.Zero);
            Assert.That(stat.Unplaced, Is.EqualTo(1));
        }
            private static void BuildRevisionAccess(Type entityType,
                                                    ref MetadataStorage metadataStorage,
                                                    out Func <object, long> revisionGetAccessor,
                                                    out Action <object, long> revisionSetAccessor)
            {
                var revisionProperty = GetRevisionProperty(entityType);

                if (revisionProperty == null)
                {
                    var ms = metadataStorage = metadataStorage ?? new MetadataStorage();

                    long GetRevisionFromMetadata(object entity)
                    {
                        return(ms.GetMetadata(entity).GetRevision());
                    }

                    void SetRevisionToMetadata(object entity, long revision)
                    {
                        ms.GetMetadata(entity).SetRevision(revision);
                    }

                    revisionGetAccessor = GetRevisionFromMetadata;
                    revisionSetAccessor = SetRevisionToMetadata;

                    return;
                }

                var entityParameter        = Expression.Parameter(typeof(object), "entity");
                var convertedEntity        = Expression.Convert(entityParameter, entityType);
                var revisionPropertyAccess = Expression.Property(convertedEntity, revisionProperty);

                revisionGetAccessor = Expression.Lambda <Func <object, long> >(revisionPropertyAccess, entityParameter)
                                      .Compile();

                var revisionParameter      = Expression.Parameter(typeof(long), "revision");
                var revisionPropertyAssign = Expression.Assign(revisionPropertyAccess, revisionParameter);

                revisionSetAccessor = Expression.Lambda <Action <object, long> >(revisionPropertyAssign,
                                                                                 entityParameter,
                                                                                 revisionParameter)
                                      .Compile();
            }
Exemple #8
0
 public Core()
 {
     _metadataStorage = new MetadataStorage();
 }
        public void SaveAndLoadMetadata()
        {
            var filename = Path.Combine(TestContext.CurrentContext.TestDirectory, "sample1.xml");
            var storage  = new MetadataStorage();
            var metadata = new ImageMetadata()
            {
                Description = "Описание",
                Brightness  = ImageBrightness.Dark,
                DongleId    = "1000DF",
                Plates      = new[]
                {
                    new PlateMetadata()
                    {
                        Number           = "T288EC98",
                        Quality          = PlateQuality.Low,
                        Stencil          = "RU_N01_a000aa00",
                        Confidence       = 1,
                        PlateDataSymbols = new[]
                        {
                            new PlateDataSymbol()
                            {
                                Value = "1"
                            },
                            new PlateDataSymbol()
                            {
                                Value = "E", Confidence = 0.5, Coordinates = new[] { new Point(11, 45) }
                            },
                        },
                    },
                    new PlateMetadata()
                    {
                        Number           = "C534YX177",
                        Quality          = PlateQuality.Normal,
                        Stencil          = "RU_N02_a000aa100",
                        PlateDataSymbols = new[]
                        {
                            new PlateDataSymbol()
                            {
                                Value = "A", Confidence = 0,
                            },
                            new PlateDataSymbol()
                            {
                                Value = "D", Confidence = 1
                            },
                        },
                    },
                },
            };

            metadata.Plates[0].Coordinates[0] = new Point(111, 45);


            storage.SaveMetadata(filename, metadata);

            var loadedMetadata = storage.LoadMetadata(filename);

            Assert.That(loadedMetadata.HumanChecked, Is.EqualTo(metadata.HumanChecked));
            Assert.That(loadedMetadata.Brightness, Is.EqualTo(metadata.Brightness));
            Assert.That(loadedMetadata.Description, Is.EqualTo(metadata.Description));
            Assert.That(loadedMetadata.DongleId, Is.EqualTo(metadata.DongleId));
            Assert.That(loadedMetadata.Plates.Length, Is.EqualTo(metadata.Plates.Length));
            Assert.That(loadedMetadata.Plates[0].Number, Is.EqualTo(metadata.Plates[0].Number));
            Assert.That(loadedMetadata.Plates[0].Stencil, Is.EqualTo(metadata.Plates[0].Stencil));
            Assert.That(loadedMetadata.Plates[0].Quality, Is.EqualTo(metadata.Plates[0].Quality));
            Assert.That(loadedMetadata.Plates[0].Confidence, Is.EqualTo(metadata.Plates[0].Confidence));
            Assert.That(loadedMetadata.Plates[0].Coordinates[0], Is.EqualTo(metadata.Plates[0].Coordinates[0]));
            Assert.That(loadedMetadata.Plates[0].PlateDataSymbols[0].Value, Is.EqualTo(metadata.Plates[0].PlateDataSymbols[0].Value));
            Assert.That(loadedMetadata.Plates[0].PlateDataSymbols[0].Confidence, Is.EqualTo(metadata.Plates[0].PlateDataSymbols[0].Confidence));
            Assert.That(loadedMetadata.Plates[0].PlateDataSymbols[0].Coordinates[0], Is.EqualTo(metadata.Plates[0].PlateDataSymbols[0].Coordinates[0]));
        }