private Assembly BuildAssembly(JsonCalculationRequestModel calculationRequestModel) { var sourceCode = BuildAssemblySourceCode(calculationRequestModel); var assembly = _objectBuilder.BuildAssembly(sourceCode); return(assembly); }
public HttpResponseMessage Calculate(JsonCalculationRequestModel calculationRequest) { try { var calculationModelResponse = _calculationServiceAdapter.Calculate(calculationRequest); return(Request.CreateResponse(HttpStatusCode.OK, calculationModelResponse)); } catch (Exception e) { Console.WriteLine(e); return(Request.CreateResponse(HttpStatusCode.InternalServerError, new { Error = e.Message })); } }
private string BuildAssemblySourceCode(JsonCalculationRequestModel calculationRequestModel) { var sourceCodeBuilder = new JsonSourceCodeBuilder(); foreach (var calculationObject in calculationRequestModel.CalculationObjects) { var schema = calculationObject.Schema; if (string.IsNullOrWhiteSpace(schema)) { var dataJson = calculationObject.Data.ToString(Formatting.None); sourceCodeBuilder.AddJsonData(calculationObject.RootClassName, dataJson); } else { sourceCodeBuilder.AddJsonSchema(calculationObject.RootClassName, calculationObject.Schema); } } var sourceCode = sourceCodeBuilder.Build(); return(sourceCode); }
public CalculationModelResponse Calculate(JsonCalculationRequestModel calculationRequestModel) { var assembly = BuildAssembly(calculationRequestModel); var objectInfos = new List <CalculationObjectInfo>(); List <object> calculationObjects = new List <object>(); foreach (var calculationObject in calculationRequestModel.CalculationObjects) { var objectType = assembly.GetType($"Theia.{calculationObject.RootClassName}"); if (calculationObject.Data is JArray) { Type genericListType = typeof(List <>).MakeGenericType(objectType); var listType = Activator.CreateInstance(genericListType).GetType(); calculationObjects.AddRange(((IList)calculationObject.Data.ToObject(listType)).Cast <object>()); } else if (calculationObject.Data is JObject) { calculationObjects.Add(calculationObject.Data.ToObject(objectType)); } objectInfos.Add(new CalculationObjectInfo(calculationObject.RootClassName, objectType)); } var types = objectInfos.Select(x => x.Type).ToList(); var countExequtedRules = Calculate(assembly, types, calculationRequestModel.Rules, calculationObjects); var response = new CalculationModelResponse { FiredRules = countExequtedRules }; foreach (var objectInfo in objectInfos) { var data = calculationObjects.OfType(objectInfo.Type).ToList(); response.CalculationObjects.Add(new CalculationObjectModel <object> { Data = data, RootClassName = objectInfo.RootClassName }); } return(response); }