예제 #1
0
        private AddRoadSegmentToNationalRoad Translate(Messages.AddRoadSegmentToNationalRoad command, IRequestedChangeIdentityTranslator translator)
        {
            var permanent = _nextNationalRoadAttributeId();
            var temporary = new AttributeId(command.TemporaryAttributeId);

            var           segmentId = new RoadSegmentId(command.SegmentId);
            RoadSegmentId?temporarySegmentId;

            if (translator.TryTranslateToPermanent(segmentId, out var permanentSegmentId))
            {
                temporarySegmentId = segmentId;
                segmentId          = permanentSegmentId;
            }
            else
            {
                temporarySegmentId = null;
            }

            var number = NationalRoadNumber.Parse(command.Ident2);

            return(new AddRoadSegmentToNationalRoad
                   (
                       permanent,
                       temporary,
                       segmentId,
                       temporarySegmentId,
                       number
                   ));
        }
        public void TranslateWithRecordsReturnsExpectedResult()
        {
            var records = _fixture
                          .CreateMany <NationalRoadChangeDbaseRecord>(new Random().Next(1, 5))
                          .Select((record, index) =>
            {
                record.NW_OIDN.Value    = index + 1;
                record.RECORDTYPE.Value = (short)RecordType.Added.Translation.Identifier;
                return(record);
            })
                          .ToArray();
            var enumerator = records.ToDbaseRecordEnumerator();

            var result = _sut.Translate(_entry, enumerator, TranslatedChanges.Empty);

            var expected = records.Aggregate(
                TranslatedChanges.Empty,
                (changes, current) => changes.Append(
                    new Uploads.AddRoadSegmentToNationalRoad(
                        new AttributeId(current.NW_OIDN.Value),
                        new RoadSegmentId(current.WS_OIDN.Value),
                        NationalRoadNumber.Parse(current.IDENT2.Value)))
                );

            Assert.Equal(expected, result, new TranslatedChangeEqualityComparer());
        }
 public AddRoadSegmentToNationalRoad(
     AttributeId temporaryAttributeId,
     RoadSegmentId segmentId,
     NationalRoadNumber number)
 {
     TemporaryAttributeId = temporaryAttributeId;
     SegmentId            = segmentId;
     Number = number;
 }
        public TranslatedChanges Translate(ZipArchiveEntry entry, IDbaseRecordEnumerator <NationalRoadChangeDbaseRecord> records, TranslatedChanges changes)
        {
            if (entry == null)
            {
                throw new ArgumentNullException(nameof(entry));
            }
            if (records == null)
            {
                throw new ArgumentNullException(nameof(records));
            }
            if (changes == null)
            {
                throw new ArgumentNullException(nameof(changes));
            }

            while (records.MoveNext())
            {
                var record = records.Current;
                if (record != null)
                {
                    switch (record.RECORDTYPE.Value)
                    {
                    case RecordType.AddedIdentifier:
                        changes = changes.Append(
                            new AddRoadSegmentToNationalRoad(
                                new AttributeId(record.NW_OIDN.Value),
                                new RoadSegmentId(record.WS_OIDN.Value),
                                NationalRoadNumber.Parse(record.IDENT2.Value)
                                )
                            );
                        break;
                    }
                }
            }

            return(changes);
        }
        public ZipArchiveProblems Validate(ZipArchiveEntry entry, IDbaseRecordEnumerator <NationalRoadChangeDbaseRecord> records)
        {
            if (entry == null)
            {
                throw new ArgumentNullException(nameof(entry));
            }
            if (records == null)
            {
                throw new ArgumentNullException(nameof(records));
            }

            var problems = ZipArchiveProblems.None;

            try
            {
                var identifiers = new Dictionary <AttributeId, RecordNumber>();
                var moved       = records.MoveNext();
                if (moved)
                {
                    while (moved)
                    {
                        var recordContext = entry.AtDbaseRecord(records.CurrentRecordNumber);
                        var record        = records.Current;
                        if (record != null)
                        {
                            if (!record.RECORDTYPE.HasValue)
                            {
                                problems += recordContext.RequiredFieldIsNull(record.RECORDTYPE.Field);
                            }
                            else
                            {
                                if (!RecordType.ByIdentifier.ContainsKey(record.RECORDTYPE.Value))
                                {
                                    problems += recordContext.RecordTypeMismatch(record.RECORDTYPE.Value);
                                }
                            }
                            if (record.NW_OIDN.HasValue)
                            {
                                if (record.NW_OIDN.Value == 0)
                                {
                                    problems += recordContext.IdentifierZero();
                                }
                                else
                                {
                                    var identifier = new AttributeId(record.NW_OIDN.Value);
                                    if (identifiers.TryGetValue(identifier, out var takenByRecordNumber))
                                    {
                                        problems += recordContext.IdentifierNotUnique(
                                            identifier,
                                            takenByRecordNumber
                                            );
                                    }
                                    else
                                    {
                                        identifiers.Add(identifier, records.CurrentRecordNumber);
                                    }
                                }
                            }
                            else
                            {
                                problems += recordContext.RequiredFieldIsNull(record.NW_OIDN.Field);
                            }

                            if (record.IDENT2.Value == null)
                            {
                                problems += recordContext.RequiredFieldIsNull(record.IDENT2.Field);
                            }
                            else if (!NationalRoadNumber.CanParse(record.IDENT2.Value))
                            {
                                problems += recordContext.NotNationalRoadNumber(record.IDENT2.Value);
                            }

                            if (!record.WS_OIDN.HasValue)
                            {
                                problems += recordContext.RequiredFieldIsNull(record.WS_OIDN.Field);
                            }
                            else if (!RoadSegmentId.Accepts(record.WS_OIDN.Value))
                            {
                                problems += recordContext.RoadSegmentIdOutOfRange(record.WS_OIDN.Value);
                            }

                            moved = records.MoveNext();
                        }
                    }
                }
                else
                {
                    problems += entry.HasNoDbaseRecords(true);
                }
            }
            catch (Exception exception)
            {
                problems += entry.AtDbaseRecord(records.CurrentRecordNumber).HasDbaseRecordFormatError(exception);
            }

            return(problems);
        }