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(); }
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])); }