Example #1
0
        private static BackgroundVerificationService CreateVerificationService(
            IBackgroundVerificationInputs backgroundVerificationInputs,
            ConcurrentBag <IssueMsg> issueCollection,
            Action <VerificationResponse> writeAction, ITrackCancel trackCancel)
        {
            var qaService = new BackgroundVerificationService(
                backgroundVerificationInputs.DomainTransactions,
                backgroundVerificationInputs.DatasetLookup)
            {
                CustomErrorFilter = backgroundVerificationInputs.CustomErrorFilter
            };

            var currentProgress = new VerificationProgressMsg();

            qaService.IssueFound +=
                (sender, args) =>
                issueCollection.Add(CreateIssueProto(args, backgroundVerificationInputs));

            qaService.Progress += (sender, args) =>
                                  SendProgress(
                sender, args, issueCollection,
                currentProgress, writeAction, trackCancel);

            return(qaService);
        }
Example #2
0
 public BackgroundVerificationService(
     [NotNull] IBackgroundVerificationInputs backgroundVerificationInputs)
     : this(backgroundVerificationInputs.DomainTransactions,
            backgroundVerificationInputs.DatasetLookup)
 {
     CustomErrorFilter = backgroundVerificationInputs.CustomErrorFilter;
 }
Example #3
0
        private QualitySpecification PrepareQualitySpecificationTx(
            IBackgroundVerificationInputs backgroundVerificationInputs)
        {
            QualitySpecification qualitySpecification =
                backgroundVerificationInputs.QualitySpecification.Match(
                    qs => qualitySpecification = qs,
                    lbqs =>
            {
                qualitySpecification =
                    lbqs.QualitySpecification;
                SetLocationBasedQualitySpecification(lbqs);
                return(qualitySpecification);
            });

            if (DistributedTestRunner != null)
            {
                DistributedTestRunner.QualitySpecification = qualitySpecification;
            }

            // Not needed as long as VerifyEditableDatasets() is used:
            //if (backgroundVerificationInputs.VerifiedDatasets != null)
            //{
            //	DisableUninvolvedConditions(
            //		qualitySpecification, backgroundVerificationInputs.VerifiedDatasets);
            //}

            InitializeTestParameterValuesTx(qualitySpecification, _domainTransactions);

            return(qualitySpecification);
        }
Example #4
0
        public QualityVerification Verify(
            [NotNull] IBackgroundVerificationInputs backgroundVerificationInputs,
            [CanBeNull] ITrackCancel trackCancel)
        {
            QualitySpecification qualitySpecification = null;

            _backgroundVerificationInputs = backgroundVerificationInputs;

            _domainTransactions.UseTransaction(
                delegate
            {
                backgroundVerificationInputs.LoadInputsTx(
                    _domainTransactions, trackCancel, OnProgress);

                qualitySpecification =
                    PrepareQualitySpecificationTx(backgroundVerificationInputs);
            });

            IVerificationContext verificationContext =
                Assert.NotNull(backgroundVerificationInputs.VerificationContext);

            VerificationServiceParameters parameters =
                Assert.NotNull(backgroundVerificationInputs.VerificationParameters);

            QualityVerification verification = Verify(
                verificationContext, qualitySpecification, parameters,
                backgroundVerificationInputs.VerifiedObjects);

            if (parameters.SaveVerificationStatistics && !verification.Cancelled)
            {
                backgroundVerificationInputs.SaveVerification(verification, _domainTransactions);
            }

            return(verification);
        }
Example #5
0
        private ServiceCallStatus VerifyQualityCore(
            VerificationRequest request,
            IServerStreamWriter <VerificationResponse> responseStream,
            ITrackCancel trackCancel)
        {
            SetupUserNameProvider(request);

            void SendResponse(VerificationResponse r) => responseStream.WriteAsync(r);

            BackgroundVerificationService qaService = null;
            List <GdbObjRefMsg>           deletableAllowedErrorRefs = new List <GdbObjRefMsg>();
            QualityVerification           verification = null;
            var    issueCollection     = new ConcurrentBag <IssueMsg>();
            string cancellationMessage = null;

            try
            {
                // TODO: Separate long-lived objects, such as datasetLookup, domainTransactions (add to this class) from
                // short-term objects (request) -> add to background verification inputs
                IBackgroundVerificationInputs backgroundVerificationInputs =
                    _verificationInputsFactoryMethod(request);

                qaService = CreateVerificationService(backgroundVerificationInputs, issueCollection,
                                                      SendResponse, trackCancel);

                int maxParallelRequested = request.MaxParallelProcessing;

                if (backgroundVerificationInputs.WorkerClient != null &&
                    maxParallelRequested > 1)
                {
                    // allow directly adding issues found by client processes:
                    qaService.DistributedTestRunner = new DistributedTestRunner(
                        backgroundVerificationInputs.WorkerClient, request, issueCollection);
                }

                verification = qaService.Verify(backgroundVerificationInputs, trackCancel);

                deletableAllowedErrorRefs.AddRange(
                    GetDeletableAllowedErrorRefs(request.Parameters, qaService));
            }
            catch (Exception e)
            {
                _msg.Error($"Error checking quality for request {request}", e);
                cancellationMessage = $"Server error: {e.Message}";

                if (!EnvironmentUtils.GetBooleanEnvironmentVariableValue(
                        "PROSUITE_QA_SERVER_KEEP_SERVING_ON_ERROR"))
                {
                    SetUnhealthy();
                }
            }

            ServiceCallStatus result = SendFinalResponse(
                verification, cancellationMessage ?? qaService.CancellationMessage, issueCollection,
                deletableAllowedErrorRefs, qaService?.VerifiedPerimeter, SendResponse);

            return(result);
        }
Example #6
0
        private static IssueMsg CreateIssueProto(
            [NotNull] IssueFoundEventArgs args,
            [NotNull] IBackgroundVerificationInputs backgroundVerificationInputs)
        {
            QualityCondition qualityCondition =
                args.QualitySpecificationElement.QualityCondition;

            IssueMsg issueProto = new IssueMsg();

            issueProto.ConditionId   = qualityCondition.Id;
            issueProto.Allowable     = args.IsAllowable;
            issueProto.StopCondition = args.Issue.StopCondition;

            CallbackUtils.DoWithNonNull(
                args.Issue.Description, s => issueProto.Description = s);

            IssueCode issueCode = args.Issue.IssueCode;

            if (issueCode != null)
            {
                CallbackUtils.DoWithNonNull(
                    issueCode.ID, s => issueProto.IssueCodeId = s);

                CallbackUtils.DoWithNonNull(
                    issueCode.Description, s => issueProto.IssueCodeDescription = s);
            }

            CallbackUtils.DoWithNonNull(
                args.Issue.AffectedComponent,
                (value) => issueProto.AffectedComponent = value);

            issueProto.InvolvedTables.AddRange(GetInvolvedTableMessages(args.Issue.InvolvedTables));

            CallbackUtils.DoWithNonNull(
                args.LegacyInvolvedObjectsString,
                (value) => issueProto.LegacyInvolvedRows = value);

            IVerificationContext verificationContext =
                Assert.NotNull(backgroundVerificationInputs.VerificationContext);

            var supportedGeometryTypes =
                GetSupportedErrorRepoGeometryTypes(verificationContext).ToList();

            // create valid Error geometry (geometry type, min dimensions) if possible
            IGeometry geometry = ErrorRepositoryUtils.GetGeometryToStore(
                args.ErrorGeometry,
                verificationContext.SpatialReferenceDescriptor.SpatialReference,
                supportedGeometryTypes);

            issueProto.IssueGeometry =
                ProtobufGeometryUtils.ToShapeMsg(geometry);

            // NOTE: Multipatches are not restored from byte arrays in EsriShape (10.6.1)
            ShapeMsg.FormatOneofCase format =
                geometry?.GeometryType == esriGeometryType.esriGeometryMultiPatch
                                        ? ShapeMsg.FormatOneofCase.Wkb
                                        : ShapeMsg.FormatOneofCase.EsriShape;

            issueProto.IssueGeometry =
                ProtobufGeometryUtils.ToShapeMsg(geometry, format);

            issueProto.CreationDateTimeTicks = DateTime.Now.Ticks;

            //issueProto.IsInvalidException = args.us;

            //if (args.IsAllowed)
            //{
            //	issueProto.ExceptedObjRef = new GdbObjRefMsg()
            //	                            {
            //		                            ClassHandle = args.AllowedErrorRef.ClassId,
            //		                            ObjectId = args.AllowedErrorRef.ObjectId
            //	                            };
            //}

            return(issueProto);
        }
Example #7
0
        private ServiceCallStatus VerifyDataQualityCore(
            [NotNull] DataVerificationRequest initialRequest,
            Func <DataVerificationResponse, DataVerificationRequest> moreDataRequest,
            IServerStreamWriter <DataVerificationResponse> responseStream,
            ITrackCancel trackCancel)
        {
            var request = initialRequest.Request;

            SetupUserNameProvider(request);

            void SendResponse(VerificationResponse r) => responseStream.WriteAsync(
                new DataVerificationResponse {
                Response = r
            });

            BackgroundVerificationService qaService = null;
            List <GdbObjRefMsg>           deletableAllowedErrorRefs = new List <GdbObjRefMsg>();
            QualityVerification           verification = null;
            var    issueCollection     = new ConcurrentBag <IssueMsg>();
            string cancellationMessage = null;

            try
            {
                // TODO: Separate long-lived objects, such as datasetLookup, domainTransactions (add to this class) from
                // short-term objects (request) -> add to background verification inputs
                IBackgroundVerificationInputs backgroundVerificationInputs =
                    _verificationInputsFactoryMethod(request);

                if (initialRequest.Schema != null)
                {
                    backgroundVerificationInputs.SetGdbSchema(
                        ProtobufConversionUtils.CreateSchema(initialRequest.Schema.ClassDefinitions,
                                                             initialRequest
                                                             .Schema.RelclassDefinitions,
                                                             moreDataRequest));
                }
                else if (moreDataRequest != null)
                {
                    backgroundVerificationInputs.SetRemoteDataAccess(moreDataRequest);
                }

                qaService = CreateVerificationService(backgroundVerificationInputs, issueCollection,
                                                      SendResponse, trackCancel);

                verification = qaService.Verify(backgroundVerificationInputs, trackCancel);

                deletableAllowedErrorRefs.AddRange(
                    GetDeletableAllowedErrorRefs(request.Parameters, qaService));
            }
            catch (Exception e)
            {
                _msg.Error($"Error checking quality for request {request}", e);
                cancellationMessage = $"Server error: {e.Message}";

                SetUnhealthy();
            }

            ServiceCallStatus result = SendFinalResponse(
                verification, cancellationMessage ?? qaService.CancellationMessage, issueCollection,
                deletableAllowedErrorRefs, qaService?.VerifiedPerimeter, SendResponse);

            return(result);
        }