public static int ReportDuplicates(
            [NotNull] IRow row1, int tableIndex1,
            [NotNull] IRow row2, int tableIndex2,
            [NotNull] IErrorReporting errorReporting,
            [CanBeNull] IssueCode issueCode,
            [CanBeNull] IValidRelationConstraint validRelationConstraint)
        {
            Assert.ArgumentNotNull(row1, nameof(row1));
            Assert.ArgumentNotNull(row2, nameof(row2));
            Assert.ArgumentNotNull(errorReporting, nameof(errorReporting));

            string errorDescription;

            if (!AreDuplicates(row1, tableIndex1,
                               row2, tableIndex2,
                               validRelationConstraint,
                               out errorDescription))
            {
                return(_noError);
            }

            IGeometry errorGeometry = ((IFeature)row1).ShapeCopy;

            const bool reportIndividualParts = false;

            return(errorReporting.Report(errorDescription,
                                         errorGeometry, issueCode,
                                         reportIndividualParts,
                                         row1, row2));
        }
        public static int ReportIntersections(
            [NotNull] IRow row1, int tableIndex1,
            [NotNull] IRow row2, int tableIndex2,
            [NotNull] IErrorReporting errorReporting,
            [CanBeNull] IssueCode issueCode,
            [CanBeNull] IValidRelationConstraint validRelationConstraint,
            bool reportIndividualParts,
            [CanBeNull] GeometryConstraint validIntersectionGeometryConstraint = null,
            GeometryComponent geomComponent1 = GeometryComponent.EntireGeometry,
            GeometryComponent geomComponent2 = GeometryComponent.EntireGeometry)
        {
            Assert.ArgumentNotNull(row1, nameof(row1));
            Assert.ArgumentNotNull(row2, nameof(row2));
            Assert.ArgumentNotNull(errorReporting, nameof(errorReporting));

            if (row1 == row2)
            {
                return(_noError);
            }

            string errorDescription;

            if (HasFulfilledConstraint(row1, tableIndex1,
                                       row2, tableIndex2,
                                       validRelationConstraint, "Features intersect",
                                       out errorDescription))
            {
                return(_noError);
            }

            IGeometry shape1 = ((IFeature)row1).Shape;
            IGeometry shape2 = ((IFeature)row2).Shape;

            var g1 = GeometryComponentUtils.GetGeometryComponent(shape1, geomComponent1);
            var g2 = GeometryComponentUtils.GetGeometryComponent(shape2, geomComponent2);

            var errorCount = 0;

            if (g1 != null && g2 != null)
            {
                foreach (IGeometry errorGeometry in
                         IntersectionUtils.GetAllIntersections(g1, g2))
                {
                    if (validIntersectionGeometryConstraint == null ||
                        !validIntersectionGeometryConstraint.IsFulfilled(errorGeometry))
                    {
                        errorCount += errorReporting.Report(errorDescription,
                                                            errorGeometry,
                                                            issueCode, reportIndividualParts,
                                                            row1, row2);
                    }
                }
            }

            return(errorCount);
        }
        public VertexCoincidenceChecker(
            [NotNull] IErrorReporting errorReporting,
            [NotNull] Func <double, string, double, string, string> formatComparisonFunction,
            double maximumXYTolerance)
        {
            Assert.ArgumentNotNull(errorReporting, nameof(errorReporting));
            Assert.ArgumentNotNull(formatComparisonFunction, nameof(formatComparisonFunction));
            Assert.ArgumentCondition(maximumXYTolerance > 0, "maximum xy tolerance must be > 0");

            _errorReporting           = errorReporting;
            _formatComparisonFunction = formatComparisonFunction;
            _maximumXYTolerance       = maximumXYTolerance;
        }
 public ZDifferenceStrategyBoundingBox(double minimumZDifference,
                                       [CanBeNull] string minimumZDifferenceExpression,
                                       double maximumZDifference,
                                       [CanBeNull] string maximumZDifferenceExpression,
                                       [CanBeNull] string zRelationConstraint,
                                       bool expressionCaseSensitivity,
                                       [NotNull] IErrorReporting errorReporting,
                                       [NotNull] Func <double, string, double, string, string>
                                       formatComparisonFunction)
     : base(minimumZDifference, minimumZDifferenceExpression,
            maximumZDifference, maximumZDifferenceExpression,
            zRelationConstraint, expressionCaseSensitivity,
            errorReporting, formatComparisonFunction)
 {
 }
 public ZDifferenceStrategyIntersectionPoints(
     double minimumZDifference, [CanBeNull] string minimumZDifferenceExpression,
     double maximumZDifference, [CanBeNull] string maximumZDifferenceExpression,
     [CanBeNull] string zRelationConstraint, bool expressionCaseSensitivity,
     [NotNull] IErrorReporting errorReporting,
     [NotNull] Func <double, string, double, string, string> formatComparisonFunction,
     Func <int, bool> useDistanceFromPlane = null,
     double coplanarityTolerance           = 0,
     bool ignoreNonCoplanarReferenceRings  = false)
     : base(minimumZDifference, minimumZDifferenceExpression,
            maximumZDifference, maximumZDifferenceExpression,
            zRelationConstraint, expressionCaseSensitivity,
            errorReporting, formatComparisonFunction)
 {
     _useDistanceFromPlane            = useDistanceFromPlane;
     _coplanarityTolerance            = coplanarityTolerance;
     _ignoreNonCoplanarReferenceRings = ignoreNonCoplanarReferenceRings;
 }
        protected ZDifferenceStrategy(
            double minimumZDifference, [CanBeNull] string minimumZDifferenceExpression,
            double maximumZDifference, [CanBeNull] string maximumZDifferenceExpression,
            [CanBeNull] string zRelationConstraint, bool expressionCaseSensitivity,
            [NotNull] IErrorReporting errorReporting,
            [NotNull] Func <double, string, double, string, string> formatComparisonFunction)
        {
            Assert.ArgumentNotNaN(minimumZDifference, nameof(minimumZDifference));
            Assert.ArgumentNotNaN(maximumZDifference, nameof(maximumZDifference));
            Assert.ArgumentNotNull(errorReporting, nameof(errorReporting));
            Assert.ArgumentNotNull(formatComparisonFunction,
                                   nameof(formatComparisonFunction));

            _minimumZDifference = minimumZDifference;
            _maximumZDifference = maximumZDifference;

            if (StringUtils.IsNotEmpty(minimumZDifferenceExpression))
            {
                _minimumZDifferenceExpression = new ZDifferenceBoundExpression(
                    minimumZDifferenceExpression, expressionCaseSensitivity);
            }

            if (StringUtils.IsNotEmpty(maximumZDifferenceExpression))
            {
                _maximumZDifferenceExpression = new ZDifferenceBoundExpression(
                    maximumZDifferenceExpression, expressionCaseSensitivity);
            }

            ErrorReporting            = errorReporting;
            _formatComparisonFunction = formatComparisonFunction;

            if (zRelationConstraint != null &&
                zRelationConstraint.IndexOf(_zDifferenceColumn,
                                            StringComparison
                                            .InvariantCultureIgnoreCase) >= 0)
            {
                _zDifferenceColumnValue = new Dictionary <string, object>();
            }

            _zRelationCondition = new ZRelationCondition(
                zRelationConstraint,
                expressionCaseSensitivity);
        }
        public static int ReportOverlaps(
            [NotNull] IRow row1, int tableIndex1,
            [NotNull] IRow row2, int tableIndex2,
            [NotNull] IErrorReporting errorReporting,
            [CanBeNull] IssueCode issueCode,
            [CanBeNull] IValidRelationConstraint validRelationConstraint,
            bool reportIndividualParts)
        {
            Assert.ArgumentNotNull(row1, nameof(row1));
            Assert.ArgumentNotNull(row2, nameof(row2));
            Assert.ArgumentNotNull(errorReporting, nameof(errorReporting));
            if (row1 == row2)
            {
                return(_noError);
            }

            IGeometry g1 = ((IFeature)row1).Shape;
            IGeometry g2 = ((IFeature)row2).Shape;

            string errorDescription;

            if (HasFulfilledConstraint(row1, tableIndex1,
                                       row2, tableIndex2,
                                       validRelationConstraint, "Features overlap",
                                       out errorDescription))
            {
                return(_noError);
            }

            IGeometry intersection = TestUtils.GetOverlap(g1, g2);

            if (intersection.IsEmpty)
            {
                Marshal.ReleaseComObject(intersection);
                return(_noError);
            }

            return(errorReporting.Report(errorDescription,
                                         intersection, issueCode,
                                         reportIndividualParts,
                                         row1, row2));
        }
Exemple #8
0
        public static ZDifferenceStrategy CreateStrategy(
            ZComparisonMethod zComparisonMethod,
            double minimumZDifference,
            string minimumZDifferenceExpression,
            double maximumZDifference,
            string maximumZDifferenceExpression,
            [CanBeNull] string zRelationConstraint,
            bool caseSensitivity,
            [NotNull] Func <double, string, double, string, string> formatComparisonFunction,
            [NotNull] IErrorReporting errorReporting,
            Func <int, bool> useDistanceFromPlane = null,
            double coplanarityTolerance           = 0,
            bool ignoreNonCoplanarReferenceRings  = false)
        {
            switch (zComparisonMethod)
            {
            case ZComparisonMethod.BoundingBox:
                return(new ZDifferenceStrategyBoundingBox(
                           minimumZDifference, minimumZDifferenceExpression,
                           maximumZDifference, maximumZDifferenceExpression,
                           zRelationConstraint, caseSensitivity,
                           errorReporting, formatComparisonFunction));

            case ZComparisonMethod.IntersectionPoints:
                return(new ZDifferenceStrategyIntersectionPoints(
                           minimumZDifference, minimumZDifferenceExpression,
                           maximumZDifference, maximumZDifferenceExpression,
                           zRelationConstraint, caseSensitivity,
                           errorReporting, formatComparisonFunction,
                           useDistanceFromPlane, coplanarityTolerance,
                           ignoreNonCoplanarReferenceRings
                           ));

            default:
                throw new ArgumentOutOfRangeException(
                          nameof(zComparisonMethod), zComparisonMethod,
                          $@"Unsupported ZComparisonMethod: {zComparisonMethod}");
            }
        }
        /// <summary>
        /// Prepares the return value for the GetRequest method in the event of an exception.
        /// </summary>
        /// <param name="ex">The exception that forms the basis of the error response.  Must not be null.</param>
        /// <param name="request">The incoming HTTP request.  Must not be null.</param>
        /// <param name="incomingMessage">The incoming message.  May be null in the case that it was malformed.</param>
        /// <returns>
        /// Either the <see cref="IRequest"/> to return to the host site or null to indicate no response could be reasonably created and that the caller should rethrow the exception.
        /// </returns>
        private IRequest GetErrorResponse(ProtocolException ex, HttpRequestMessage request, IDirectedProtocolMessage incomingMessage)
        {
            Requires.NotNull(ex, "ex");
            Requires.NotNull(request, "request");

            Logger.OpenId.ErrorException("An exception was generated while processing an incoming OpenID request.", ex);
            IErrorMessage errorMessage;

            // We must create the appropriate error message type (direct vs. indirect)
            // based on what we see in the request.
            string returnTo = HttpUtility.ParseQueryString(request.RequestUri.Query)[Protocol.Default.openid.return_to];

            if (returnTo != null)
            {
                // An indirect request message from the RP
                // We need to return an indirect response error message so the RP can consume it.
                // Consistent with OpenID 2.0 section 5.2.3.
                var indirectRequest = incomingMessage as SignedResponseRequest;
                if (indirectRequest != null)
                {
                    errorMessage = new IndirectErrorResponse(indirectRequest);
                }
                else
                {
                    errorMessage = new IndirectErrorResponse(Protocol.Default.Version, new Uri(returnTo));
                }
            }
            else if (request.Method == HttpMethod.Post)
            {
                // A direct request message from the RP
                // We need to return a direct response error message so the RP can consume it.
                // Consistent with OpenID 2.0 section 5.1.2.2.
                errorMessage = new DirectErrorResponse(Protocol.Default.Version, incomingMessage);
            }
            else
            {
                // This may be an indirect request from an RP that was so badly
                // formed that we cannot even return an error to the RP.
                // The best we can do is display an error to the user.
                // Returning null cues the caller to "throw;"
                return(null);
            }

            errorMessage.ErrorMessage = ex.ToStringDescriptive();

            // Allow host to log this error and issue a ticket #.
            // We tear off the field to a local var for thread safety.
            IErrorReporting hostErrorHandler = this.ErrorReporting;

            if (hostErrorHandler != null)
            {
                errorMessage.Contact   = hostErrorHandler.Contact;
                errorMessage.Reference = hostErrorHandler.LogError(ex);
            }

            if (incomingMessage != null)
            {
                return(new AutoResponsiveRequest(incomingMessage, errorMessage, this.SecuritySettings));
            }
            else
            {
                return(new AutoResponsiveRequest(errorMessage, this.SecuritySettings));
            }
        }
        public int ReportErrors([NotNull] IFeature feature1, int tableIndex1,
                                [NotNull] IFeature feature2, int tableIndex2,
                                [NotNull] IErrorReporting reportError,
                                [CanBeNull] IssueCode issueCode,
                                bool reportIndividualErrors)
        {
            Assert.ArgumentNotNull(feature1, nameof(feature1));
            Assert.ArgumentNotNull(feature2, nameof(feature2));
            Assert.ArgumentNotNull(reportError, nameof(reportError));

            if (feature1 == feature2)
            {
                return(0);
            }

            string conditionMessage;

            if (IsFulfilled(feature1, tableIndex1,
                            feature2, tableIndex2,
                            out conditionMessage))
            {
                // currently: no error, even if intersection geometry constraint would be violated
                // (parameter for constraint combination operation could be added)
                return(0);
            }

            // geometries of multiple dimensions possible
            var errorCount = 0;

            foreach (IGeometry geometry in GetIntersections(feature1, feature2))
            {
                foreach (IGeometry reportableGeometry in GetGeometries(geometry,
                                                                       reportIndividualErrors))
                {
                    if (_validIntersectionDimensions != null &&
                        _validIntersectionDimensions.Contains(reportableGeometry.Dimension))
                    {
                        continue;
                    }

                    if (_intersectionGeometryConstraint != null)
                    {
                        if (_intersectionGeometryConstraint.IsFulfilled(reportableGeometry))
                        {
                            continue;
                        }

                        string displayValues =
                            _intersectionGeometryConstraint.FormatValues(reportableGeometry,
                                                                         CultureInfo.CurrentCulture)
                            .Replace("$", string.Empty);
                        string rawValues =
                            _intersectionGeometryConstraint.FormatValues(reportableGeometry,
                                                                         CultureInfo
                                                                         .InvariantCulture);

                        // format for display to the user (current culture)
                        string description = GetErrorDescription(
                            conditionMessage,
                            _intersectionGeometryConstraint.Constraint.Replace("$", string.Empty),
                            displayValues);

                        errorCount += reportError.Report(description, reportableGeometry,
                                                         issueCode, null,
                                                         new object[] { rawValues },
                                                         feature1, feature2);
                    }
                    else
                    {
                        string description = GetErrorDescription(conditionMessage);

                        errorCount += reportError.Report(description, reportableGeometry,
                                                         issueCode, null,
                                                         feature1, feature2);
                    }
                }
            }

            return(errorCount);
        }
        public static int ReportCrossings(
            [NotNull] IRow row1, int tableIndex1,
            [NotNull] IRow row2, int tableIndex2,
            [NotNull] IErrorReporting errorReporting,
            [CanBeNull] IssueCode issueCode,
            [CanBeNull] IValidRelationConstraint validRelationConstraint,
            bool reportIndividualParts)
        {
            Assert.ArgumentNotNull(row1, nameof(row1));
            Assert.ArgumentNotNull(row2, nameof(row2));
            Assert.ArgumentNotNull(errorReporting, nameof(errorReporting));

            if (row1 == row2)
            {
                return(_noError);
            }

            IGeometry g1 = ((IFeature)row1).Shape;
            IGeometry g2 = ((IFeature)row2).Shape;

            string errorDescription;

            if (HasFulfilledConstraint(row1, tableIndex1,
                                       row2, tableIndex2,
                                       validRelationConstraint, "Features cross",
                                       out errorDescription))
            {
                return(_noError);
            }

            var errorCount = 0;

            foreach (IGeometry errorGeometry in GetCrossings(g1, g2))
            {
                if (errorGeometry.IsEmpty)
                {
                    continue;
                }

                errorCount += errorReporting.Report(errorDescription,
                                                    errorGeometry, issueCode,
                                                    reportIndividualParts,
                                                    row1, row2);
            }

            return(errorCount);

            //const bool overlap = false;
            //IGeometry intersection = TestUtils.GetIntersection(g1, g2, overlap);

            //// TODO remove boundary

            //try
            //{
            //    if (intersection.IsEmpty)
            //    {
            //        return _noError;
            //    }

            //    return errorReporting.Report("Features cross",
            //                                 intersection, reportIndividualParts,
            //                                 row1, row2);
            //}
            //finally
            //{
            //    Marshal.ReleaseComObject(intersection);
            //}
        }
        public static int ReportTouches(
            [NotNull] IRow row1, int tableIndex1,
            [NotNull] IRow row2, int tableIndex2,
            [NotNull] IErrorReporting errorReporting,
            [CanBeNull] IssueCode issueCode,
            [CanBeNull] IValidRelationConstraint validRelationConstraint,
            [CanBeNull] GeometryConstraint validTouchGeometryConstraint,
            bool reportIndividualParts = false)
        {
            Assert.ArgumentNotNull(row1, nameof(row1));
            Assert.ArgumentNotNull(row2, nameof(row2));
            Assert.ArgumentNotNull(errorReporting, nameof(errorReporting));

            if (row1 == row2)
            {
                return(_noError);
            }

            IGeometry g1 = ((IFeature)row1).Shape;
            IGeometry g2 = ((IFeature)row2).Shape;

            string errorDescription;

            if (HasFulfilledConstraint(row1, tableIndex1,
                                       row2, tableIndex2,
                                       validRelationConstraint, "Geometries touch",
                                       out errorDescription))
            {
                return(_noError);
            }

            var errorCount = 0;

            foreach (IGeometry geometry in GetTouches(g1, g2))
            {
                if (geometry.IsEmpty)
                {
                    continue;
                }

                if (reportIndividualParts)
                {
                    foreach (IGeometry part in GeometryUtils.Explode(geometry))
                    {
                        if (part.IsEmpty ||
                            validTouchGeometryConstraint != null &&
                            validTouchGeometryConstraint.IsFulfilled(part))
                        {
                            continue;
                        }

                        errorCount += errorReporting.Report(errorDescription,
                                                            part, issueCode,
                                                            false,                         // already exploded
                                                            row1, row2);
                    }
                }
                else
                {
                    if (validTouchGeometryConstraint != null &&
                        validTouchGeometryConstraint.IsFulfilled(geometry))
                    {
                        continue;
                    }

                    errorCount += errorReporting.Report(errorDescription,
                                                        geometry, issueCode,
                                                        false,
                                                        row1, row2);
                }
            }

            return(errorCount);
        }
Exemple #13
0
        /// <summary>
        /// Prepares the return value for the GetRequest method in the event of an exception.
        /// </summary>
        /// <param name="ex">The exception that forms the basis of the error response.  Must not be null.</param>
        /// <param name="httpRequestInfo">The incoming HTTP request.  Must not be null.</param>
        /// <param name="incomingMessage">The incoming message.  May be null in the case that it was malformed.</param>
        /// <returns>
        /// Either the <see cref="IRequest"/> to return to the host site or null to indicate no response could be reasonably created and that the caller should rethrow the exception.
        /// </returns>
        private IRequest GetErrorResponse(ProtocolException ex, HttpRequestInfo httpRequestInfo, IDirectedProtocolMessage incomingMessage)
        {
            ErrorUtilities.VerifyArgumentNotNull(ex, "ex");
            ErrorUtilities.VerifyArgumentNotNull(httpRequestInfo, "httpRequestInfo");

            Logger.Error("An exception was generated while processing an incoming OpenID request.", ex);
            IErrorMessage errorMessage;

            // We must create the appropriate error message type (direct vs. indirect)
            // based on what we see in the request.
            if (httpRequestInfo.QueryString[Protocol.Default.openid.return_to] != null)
            {
                // An indirect request message from the RP
                // We need to return an indirect response error message so the RP can consume it.
                // Consistent with OpenID 2.0 section 5.2.3.
                var indirectRequest = incomingMessage as SignedResponseRequest;
                if (indirectRequest != null)
                {
                    errorMessage = new IndirectErrorResponse(indirectRequest);
                }
                else
                {
                    errorMessage = new IndirectErrorResponse(Protocol.Default.Version, new Uri(httpRequestInfo.QueryString[Protocol.Default.openid.return_to]));
                }
            }
            else if (httpRequestInfo.HttpMethod == "POST")
            {
                // A direct request message from the RP
                // We need to return a direct response error message so the RP can consume it.
                // Consistent with OpenID 2.0 section 5.1.2.2.
                errorMessage = new DirectErrorResponse(Protocol.Default.Version, incomingMessage);
            }
            else
            {
                // This may be an indirect request from an RP that was so badly
                // formed that we cannot even return an error to the RP.
                // The best we can do is display an error to the user.
                // Returning null cues the caller to "throw;"
                return(null);
            }

            errorMessage.ErrorMessage = ex.GetAllMessages();

            // Allow host to log this error and issue a ticket #.
            // We tear off the field to a local var for thread safety.
            IErrorReporting hostErrorHandler = this.ErrorReporting;

            if (hostErrorHandler != null)
            {
                errorMessage.Contact   = hostErrorHandler.Contact;
                errorMessage.Reference = hostErrorHandler.LogError(ex);
            }

            if (incomingMessage != null)
            {
                return(new AutoResponsiveRequest(this, incomingMessage, errorMessage));
            }
            else
            {
                return(new AutoResponsiveRequest(this, errorMessage));
            }
        }