示例#1
0
        /// <summary>
        /// Provides solve operation.
        /// </summary>
        /// <param name="request">Request to solver.</param>
        /// <param name="cancelTracker">Cancel tracker.</param>
        /// <returns>Function returning BatchRouteSolveResponse.</returns>
        /// <exception cref="ESRI.ArcLogistics.Routing.RouteException">If get
        /// directions operation error occurs.</exception>
        public Func <SolveOperationResult <BatchRouteSolveRequest> > Solve(
            BatchRouteSolveRequest request,
            ICancelTracker cancelTracker)
        {
            Debug.Assert(request != null);
            Debug.Assert(request.Requests != null);

            try
            {
                List <RouteSolveResponse> responses = new List <RouteSolveResponse>();
                foreach (RouteSolveRequest req in request.Requests)
                {
                    responses.Add(_context.RouteService.Solve(req,
                                                              RouteRequestBuilder.JsonTypes));
                }

                var response = new BatchRouteSolveResponse(responses.ToArray());

                return(() => new SolveOperationResult <BatchRouteSolveRequest>
                {
                    SolveResult = _ProcessSolveResult(response),
                    NextStepOperation = null,
                });
            }
            catch (RestException e)
            {
                throw SolveHelper.ConvertServiceException(
                          Properties.Messages.Error_GetDirections, e);
            }
        }
示例#2
0
        /// <summary>
        /// Processing results of solve operation.
        /// </summary>
        /// <param name="batchResponse">Response from solver.</param>
        /// <returns>SolveResult.</returns>
        /// <exception cref="RouteException">In case of invalid GPFeature mapping.
        /// </exception>
        private SolveResult _ProcessSolveResult(BatchRouteSolveResponse batchResponse)
        {
            Debug.Assert(batchResponse != null);
            Debug.Assert(batchResponse.Responses != null);

            List <RouteMessage> messages = new List <RouteMessage>();

            foreach (RouteSolveResponse resp in batchResponse.Responses)
            {
                if (resp.Directions != null &&
                    resp.Directions.Length > 0)
                {
                    // We use one request per route, so we get first directions element.
                    RouteDirections routeDirs = resp.Directions[0];

                    // Route id.
                    Guid routeId = new Guid(routeDirs.RouteName);

                    // Find route.
                    Route route = _FindRoute(routeId);
                    if (route == null)
                    {
                        throw new RouteException(Properties.Messages.Error_InvalidGPFeatureMapping);
                    }

                    // Set directions.
                    _SetDirections(route.Stops, routeDirs.Features);
                }

                if (resp.Messages != null)
                {
                    messages.AddRange(resp.Messages);
                }
            }

            return(_CreateSolveResult(messages.ToArray()));
        }