Ejemplo n.º 1
0
        private static void ProcessParallel(string datasetId, VehicleIdsResponse vehicleIdsResponse)
        {
            // Use ConcurrentQueue to enable safe enqueueing from multiple threads.
            var exceptions = new ConcurrentQueue <Exception>();

            // Execute the complete loop and capture all exceptions.
            Parallel.ForEach(vehicleIdsResponse.VehicleIds, vehicleId =>
            {
                if (vehicleId.HasValue)
                {
                    try
                    {
                        VehicleAndDealerAsync(datasetId, vehicleId.Value).Wait();
                    }
                    // Store the exception and continue with the loop.
                    catch (Exception e)
                    {
                        exceptions.Enqueue(e);
                    }
                }
            });

            // Throw the exceptions here after the loop completes.
            if (exceptions.Count > 0)
            {
                throw new AggregateException(exceptions);
            }
        }
        /// <summary>
        /// Vehicle Factory
        /// Gets list of vehicles using passed dataset ID
        /// creates task factory and task for each vehicle ID, once tasks complete, format answer
        /// </summary>
        /// <param name="datasetId">string</param>
        /// <returns></returns>
        public async Task <List <DealerAnswer> > GetListOfVehicles(string datasetId)
        {
            List <DealerAnswer> dealerAnswers     = new List <DealerAnswer>();
            VehicleIdsResponse  vehicleIdResponse = vehiclesApi.GetIds(datasetId);

            if (vehicleIdResponse?.VehicleIds != null)
            {
                var taskList = new List <Task>();
                SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
                //get data for each vehicle
                foreach (int vehicleId in vehicleIdResponse.VehicleIds)
                {
                    //create new task factory and add to task list for each vehicle returned in dataset
                    taskList.Add(
                        Task.Factory.StartNew(async() =>
                    {
                        return(await GetVehicleResponseTask(datasetId, vehicleId));
                    })
                        .ContinueWith((t1) => dealersFactory.GetDealerResponseTask(datasetId, (int)t1.Result.Result.DealerId),
                                      TaskScheduler.FromCurrentSynchronizationContext())
                        );
                }

                //wait for all tasks to finish before formatting final answer
                Task.WaitAll(taskList.ToArray());
                dealerAnswers = dealersFactory.FormatAnswer(vehicles);
            }
            else
            {
                throw new ApiException(404, "No vehicle IDs found.");
            }

            return(dealerAnswers);
        }
Ejemplo n.º 3
0
        public async Task <List <int> > GetVehiclesListAsync(string datasetId)
        {
            var response = await _httpclient.GetAsync($"{_baseUrl}/{datasetId}/vehicles");

            VehicleIdsResponse vehicles = await response.Content.ReadAsAsync <VehicleIdsResponse>();

            return(vehicles.vehicleIds);
        }
        public static async Task <VehicleIdsResponse> GetVehicleIdsAsync(string dataSetId)
        {
            HttpResponseMessage response = await client.GetAsync(client.BaseAddress.AbsoluteUri + string.Format("/api/{0}/vehicles", dataSetId));

            VehicleIdsResponse vehicleIds = null;

            if (response.IsSuccessStatusCode)
            {
                vehicleIds = await response.Content.ReadAsAsync <VehicleIdsResponse>();
            }
            else
            {
                throw new Exception(string.Format("Unabled to retrieve data vehicle ids.\n\n{0}", response.ReasonPhrase));
            }
            return(vehicleIds);
        }
Ejemplo n.º 5
0
        private async Task CreateVehicleTasksAsync(string datasetId, VehicleIdsResponse responseVehicleIds)
        {
            List <Task <VehicleResponse> > vTaskList = new List <Task <VehicleResponse> >();

            foreach (int id in responseVehicleIds.VehicleIds)
            {
                Task <VehicleResponse> vResponse = ProcessURLVehicleAsync(datasetId, (int)id);
                vTaskList.Add(vResponse);
            }

            // Await each task.
            for (int i = 0; i < vTaskList.Count; i++)
            {
                VehicleResponse vr = await vTaskList[i];
                vehicleList.Add(vr);
            }
        }
        static async Task RunAsync()
        {
            try
            {
                VAutoClient.Initialize();

                Console.WriteLine("Retreiving data set id...");
                DatasetIdResponse datasetIdResponse = await VAutoClient.GetDataSetIdAsync();

                string dataSetId = datasetIdResponse.datasetId;
                Console.WriteLine("Done.");

                Console.WriteLine("Retreiving vehicle ids...");
                VehicleIdsResponse vehicleIds = await VAutoClient.GetVehicleIdsAsync(dataSetId);

                Console.WriteLine("Done.");

                Console.WriteLine("Purging vehicle id duplicates...");
                IEnumerable <int> vehicleIdList = vehicleIds.vehicleIds.Distinct();   //ensure duplicate calls for vehicle data are not performed.
                Console.WriteLine("Done.");

                Console.WriteLine("Retreiving vehicle and dealer data...");
                List <Task <VehicleResponse> > vehicleDataTasks = new List <Task <VehicleResponse> >();
                List <Task <DealersResponse> > dealerDataTasks  = new List <Task <DealersResponse> >();
                await GetVehicleAndDealerData(dataSetId, vehicleIdList, vehicleDataTasks, dealerDataTasks);

                Console.WriteLine("Done.");

                Console.WriteLine("Building answer...");
                Answer answer = BuildAnswer(dealerDataTasks, vehicleDataTasks);
                Console.WriteLine("Done.");

                Console.WriteLine("Posting answer...");
                AnswerResponse answerResponse = await VAutoClient.PostAnswer(dataSetId, answer);

                Console.WriteLine("Done.");

                Console.WriteLine("Result: {0}\nMessage: {1}\nMilliseconds: {2}", answerResponse.success, answerResponse.message, answerResponse.totalMilliseconds);
            }
            catch (Exception e)
            {
                Console.WriteLine("\n\nException: {0}\n\nStackTrace: {1}", e.Message, e.StackTrace);
            }
        }
Ejemplo n.º 7
0
        public AnswerResponse VehiclePostAnswerTest()
        {
            dsInstance      = new DataSetApi();
            vehicleInstance = new VehiclesApi();
            dealerInstance  = new DealersApi();

            Answer answer = new Answer();

            // Get DataSet ID
            string            datasetId         = "";
            DatasetIdResponse responseDataSetId = dsInstance.DataSetGetDataSetId();

            datasetId = responseDataSetId.DatasetId;

            // Get the Dealers and Vehicles for the given DataSetID

            // Get VehicleIds
            VehicleIdsResponse responseVehicleIds = new VehicleIdsResponse();

            responseVehicleIds = vehicleInstance.VehiclesGetIds(datasetId);



            /////////////////////////  CHEAT /////////////////////////////////////////////////
            answer = dsInstance.DataSetGetCheat(datasetId);   //// CHEAT answer
            /////////////////////////////////////////////////////////////////////////////////


            // Post the response answer
            //var response = dsInstance.DataSetPostAnswer(datasetId, answer);
            AnswerResponse ansResponse = dsInstance.DataSetPostAnswer(datasetId, answer);

            Assert.IsInstanceOf <AnswerResponse>(ansResponse, "response is AnswerResponse");

            return(ansResponse);
        }
Ejemplo n.º 8
0
        private async void startButton_Click(object sender, RoutedEventArgs e)
        {
            resultsTextBox.Clear();
            vehicleList.Clear();
            dealerList.Clear();

            dsInstance      = new DataSetApi();
            vehicleInstance = new VehiclesApi();
            dealerInstance  = new DealersApi();

            Answer answer = new Answer();

            // Get DataSet ID
            string            datasetId         = "";
            DatasetIdResponse responseDataSetId = dsInstance.DataSetGetDataSetId();

            datasetId = responseDataSetId.DatasetId;

            // Get the Dealers and Vehicles for the given DataSetID

            // Get VehicleIds
            VehicleIdsResponse responseVehicleIds = new VehicleIdsResponse();

            responseVehicleIds = vehicleInstance.VehiclesGetIds(datasetId);

            //Get Vechicle details for each VehicleId
            VehicleResponse responseVehicle = new VehicleResponse();

            await CreateVehicleTasksAsync(datasetId, responseVehicleIds);

            // For the vehicles, get the dealers
            var        Ids       = vehicleList.Select(v => (int)v.DealerId).ToList().Distinct();
            List <int> dealerIds = Ids.ToList();

            await CreateDealerTasksAsync(datasetId, dealerIds);

            // Once Vehicle list and Dealer list are done, build the answer
            List <DealerAnswer> dealerAnswers = new List <DealerAnswer>();

            foreach (DealersResponse dealer in dealerList)
            {
                DealerAnswer dealerAnswer = new DealerAnswer();
                dealerAnswer.DealerId = dealer.DealerId;
                dealerAnswer.Name     = dealer.Name;

                List <VehicleAnswer>   dealerVehicles = new List <VehicleAnswer>();
                List <VehicleResponse> vehicles       = vehicleList.Where(v => v.DealerId == dealer.DealerId).ToList();

                foreach (VehicleResponse res in vehicles)
                {
                    VehicleAnswer vehicle = new VehicleAnswer();
                    vehicle.VehicleId = res.VehicleId;
                    vehicle.Make      = res.Make;
                    vehicle.Model     = res.Model;
                    vehicle.Year      = res.Year;
                    dealerVehicles.Add(vehicle);
                }

                dealerAnswer.Vehicles = dealerVehicles;
                dealerAnswers.Add(dealerAnswer);
            }

            answer.Dealers = dealerAnswers;

            // Post the response answer
            AnswerResponse ansResponse = dsInstance.DataSetPostAnswer(datasetId, answer);

            string results = ansResponse.Message + "\r\n\r\n" + ansResponse.Success + "\r\n\r\nTime(seconds): " + ansResponse.TotalMilliseconds / 1000.00;

            foreach (DealerAnswer d in answer.Dealers)
            {
                results += "\r\n\r\n----------------------------------------------------------------\r\n\r\n" + d.Name;
                results += "\r\n\r\n-------------------------";
                foreach (VehicleAnswer v in d.Vehicles)
                {
                    //results += "\r\n\r\n";
                    results += "\r\n\r\n" + v.Make + "  " + v.Model + " " + v.Year;
                }
            }
            resultsTextBox.Text = results;
        }