public async Task <BeContractReturn> CallAsync(AdapterServer ads, BeContractCall call)
        {
            BeContractReturn res = null;

            using (var client = new HttpClient())
            {
                try
                {
                    //Use the ads.Url as baseaddress, don't send this to Be-Road !
                    client.BaseAddress = new Uri(ads.Url);
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                    var httpContent = new StringContent(JsonConvert.SerializeObject(call), Encoding.UTF8, "application/json");
                    HttpResponseMessage response = await client.PostAsync(ads.Root + "/" + call.Id, httpContent);

                    if (response.IsSuccessStatusCode)
                    {
                        res = await response.Content.ReadAsAsync <BeContractReturn>();
                    }
                }
                catch (Exception ex)
                {
                    throw new BeContractException("Cannot call the Adapter Server: " + ex.Message);
                }
            }

            return(res);
        }
예제 #2
0
        private BeContractReturn HandleGetOwnerIdByDogId(BeContractCall call)
        {
            var ret = new BeContractReturn()
            {
                Id      = call.Id,
                Outputs = new Dictionary <string, dynamic>()
            };

            if ((call.Inputs["DogID"] as string).Equals("D-123"))
            {
                ret.Outputs.Add("OwnerIDOfTheDog", "Wilson !");
            }
            return(ret);
        }
예제 #3
0
        public void ValidateBeContractReturn(BeContract contract, BeContractReturn ret)
        {
            if (!contract.Id.Equals(ret.Id))
            {
                throw new BeContractException("Contract's do not have the same ID")
                      {
                          BeContract       = contract,
                          BeContractReturn = ret
                      };
            }

            //Test outputs
            contract.Outputs?.ForEach(output =>
            {
                if (ret.Outputs.TryGetValue(output.Key, out dynamic value))
                {
                    //Check if the dynamic is a int64
                    if (value.GetType() == typeof(Int64))
                    {
                        value = (int)value;
                        ret.Outputs[output.Key] = value;
                    }


                    //Check the types
                    if (value.GetType().Name != output.Type)
                    {
                        throw new BeContractException($"The contract expects {output.Type} but {value.GetType().Name} was found")
                        {
                            BeContract       = contract,
                            BeContractReturn = ret
                        };
                    }
                }
                else
                {
                    //Key isn't find
                    throw new BeContractException($"No key was found for {output.Key}")
                    {
                        BeContract       = contract,
                        BeContractReturn = ret
                    };
                }
            });
        }
예제 #4
0
        public async Task TestCallPassAsync()
        {
            var ads = await asService.FindASAsync(call.ISName);

            var returnsActual = await asService.CallAsync(ads, call);

            var returnsExpected = new BeContractReturn()
            {
                Id      = "GetOwnerIdByDogId",
                Outputs = new Dictionary <string, dynamic>()
                {
                    { "OwnerIDOfTheDog", "Wilson !" }
                }
            };

            CollectionAssert.AreEqual(returnsExpected.Outputs, returnsActual.Outputs);
            Assert.AreEqual(returnsExpected.Id, returnsActual.Id);
        }
예제 #5
0
        public async Task <BeContractReturn> CallAsync(AdapterServer ads, BeContractCall call)
        {
            BeContractReturn ret = null;
            await Task.Run(() =>
            {
                switch (ads.ISName)
                {
                case "Doggies": ret = VeterinaryMock.GetOwnerId(call); break;

                case "MathLovers": ret = MathematicsMock.GetSumFunction(call); break;

                case "CitizenDatabank": ret = AddressMock.GetAddressByOwnerId(call); break;

                default: ret = new BeContractReturn(); break;
                }
            });

            return(ret);
        }
예제 #6
0
        /// <summary>
        /// Call a contract
        /// </summary>
        /// <param name="call">The inputs for the contract call</param>
        /// <returns></returns>
        public async Task <Dictionary <int, BeContractReturn> > CallAsync(BeContractCall call)
        {
            if (call == null)
            {
                throw new BeContractException("Contract call is null");
            }

            var contract = await BcService.FindBeContractByIdAsync(call.Id);

            Console.WriteLine($"Calling contract {contract?.Id}");
            //Filter to only give the correct outputs
            var notFiltredReturns = await CallAndLoopQueriesAsync(call, contract);

            var filtredReturns = new Dictionary <int, BeContractReturn>();
            var groupedOutputs = contract.Outputs?.GroupBy(output => output.LookupInputId);

            groupedOutputs.ToList().ForEach(group =>
            {
                var beContractReturn = new BeContractReturn
                {
                    Outputs = new Dictionary <string, dynamic>()
                };
                group.ToList().ForEach(output =>
                {
                    var ret             = notFiltredReturns[output.LookupInputId].Outputs.FirstOrDefault(o => o.Key.Equals(output.Key));
                    beContractReturn.Id = notFiltredReturns[output.LookupInputId].Id;
                    beContractReturn.Outputs.Add(ret.Key, ret.Value);
                });
                filtredReturns.Add(group.Key, beContractReturn);
            });

            filtredReturns.ToList().ForEach(ret =>
            {
                Console.WriteLine($"At LookupInputId {ret.Key} for contract {ret.Value.Id}");
                ret.Value.Outputs.ToList().ForEach(output =>
                {
                    Console.WriteLine($"\t{output.Key} - {output.Value}");
                });
            });

            return(filtredReturns);
        }
예제 #7
0
        /// <summary>
        /// Call the contract with the specified inputs to a specified service
        /// </summary>
        /// <param name="contract">Contract that will be called</param>
        /// <param name="call">The inputs for the contract</param>
        /// <returns>Returns the outputs for that specific contract</returns>
        private async Task <BeContractReturn> CallServiceAsync(BeContract contract, BeContractCall call)
        {
            //Get the ads for this call
            var ads = await AsService.FindASAsync(call.Id);

            if (ads == null)
            {
                throw new BeContractException($"No service found for {call.Id}")
                      {
                          BeContractCall = call
                      }
            }
            ;

            //Check if the caller has the permission
            if (!(await AuthService.CanInformationSystemUseContract(call.ISName, contract)))
            {
                throw new BeContractException($"The caller {call.ISName} does not have the permission to use {call.Id}")
                      {
                          BeContractCall = call,
                          BeContract     = contract
                      }
            }
            ;

            //If everything is fine, call the service
            BeContractReturn returns = await AsService.CallAsync(ads, call);

            //TODO:
            //  -Send error to the service
            if (returns != null)
            {
                validators.ValidateBeContractReturn(contract, returns);
            }

            return(returns);
        }