private static void AddPayloadLinesToJobInImmediateDBEnv(ExtValidationJobs job, ServiceContext ctx) { using (var x = SuiteEntitiesUtility.GetODataValidationSuiteEntities()) { var j = x.ExtValidationJobs; j.AddObject(job); if (ctx.PayloadType == PayloadType.RawValue && ctx.ContentType == PayloadFormat.Image) { PayloadLine payloadLine = new PayloadLine(); payloadLine.ID = Guid.NewGuid(); payloadLine.LineNumber = 1; payloadLine.LineText = "( Image data )"; job.PayloadLines.Add(payloadLine); } else { PayloadLine payloadLine; int lineNumber = 0; foreach (var responseLine in ctx.GetPayloadLines()) { payloadLine = new PayloadLine(); payloadLine.ID = Guid.NewGuid(); payloadLine.LineNumber = ++lineNumber; payloadLine.LineText = responseLine; job.PayloadLines.Add(payloadLine); } } x.SaveChanges(); } }
private JobGroup CreateJobGroupItem(string format, Guid masterJobId, ServiceContext ctx, JobType jobType, List <string> ruleNameList = null, bool insertJobToDB = true) { RuleEngine.IResultProvider resultProvider = new DatabaseResultProvider(ctx.JobId, jobType); ILogger logger = resultProvider as ILogger; RuleEngineWrapper ruleEngine = new RuleEngineWrapper(ctx, resultProvider, logger, ruleNameList); // start the validation workflow on the backend threadpool thread this.InitJobState(ruleEngine, ctx.JobId); if (insertJobToDB) { // insert validation job entry, and insert payload lines, to underlying DB ExtValidationJobs extJob = new ExtValidationJobs(); extJob.ID = ctx.JobId; extJob.Complete = false; extJob.CreatedDate = DateTime.Now; extJob.Uri = ctx.Destination.OriginalString; extJob.Format = format; extJob.RuleCount = ruleEngine.RuleCount; extJob.ResourceType = ctx.PayloadType.ToString(); extJob.ServiceType = ctx.ServiceType.ToString(); foreach (var levelType in ctx.LevelTypes) { extJob.LevelTypes += Enum.GetName(typeof(ConformanceLevelType), levelType).ToString() + ','; } extJob.LevelTypes = extJob.LevelTypes.TrimEnd(','); if (ctx.RequestHeaders != null && ctx.RequestHeaders.Any()) { var headers = ""; foreach (var p in ctx.RequestHeaders) { if (p.Key.Equals("Authorization")) { continue; } headers += p.Key + ":" + p.Value + ";"; } extJob.ReqHeaders = headers; } AddPayloadLinesToJobInImmediateDBEnv(extJob, ctx); LogJobRespHeaders(extJob, ctx); } // populate the data to return JobGroup item = JobGroup.CreateJobGroup(masterJobId, ctx.PayloadType.ToString(), ruleEngine.RuleCount, ctx.Destination.OriginalString); item.DerivativeJobId = ctx.JobId; return(item); }
/// <summary> /// Logs response Http headers for the interop validation context to persistent storage /// </summary> /// <param name="job">The validation job object</param> /// <param name="ctx">The interop validation context</param> private static void LogJobRespHeaders(ExtValidationJobs job, ServiceContext ctx) { if (!string.IsNullOrEmpty(ctx.ResponseHttpHeaders)) { using (var x = SuiteEntitiesUtility.GetODataValidationSuiteEntities()) { var j = x.JobData; JobData jobData = new JobData(); jobData.ID = Guid.NewGuid(); jobData.RespHeaders = ctx.ResponseHttpHeaders; jobData.JobID = job.ID; j.AddObject(jobData); x.SaveChanges(); } } }
/// <summary>Create the ServiceContext based on the ValidationJob</summary> /// <param name="job">Row of ValidationJob in the SQL table</param> /// <returns>ServiceContext class</returns> private static ServiceContext CreateRuleEngineContext(ExtValidationJobs job) { if (!string.IsNullOrEmpty(job.Uri)) { // an online validation return(ServiceContextFactory.Create(job.Uri, job.Format, job.ID, MaxPayloadByteCount, ToHeaderCollection(job.ReqHeaders))); } else { // an offline validation if (job.PayloadText.Length > MaxPayloadByteCount || job.MetadataText.Length > MaxPayloadByteCount) { throw new DataServiceException(509, "Content exceeds the allowed maximum size. Please copy and paste smaller content and retry."); } string payloadText = SanitizeXmlLiteral(job.PayloadText); string metadataText = SanitizeXmlLiteral(job.MetadataText); return(ServiceContextFactory.Create(payloadText, metadataText, job.ID, job.ReqHeaders, ToHeaderCollection(job.ReqHeaders))); } }
public void OnInsertJob(ExtValidationJobs job, UpdateOperations op) { if (job == null) { throw new ArgumentNullException("job"); } // ensure only insert ops are allowed ValidateOperationType(op); // limit total size of validation job queue CheckValidationJobQueueSize(); job.Complete = false; job.CreatedDate = DateTime.Now; job.ID = Guid.NewGuid(); // instantiate validation engine var ctx = CreateRuleEngineContext(job); IResultProvider resultProvider = new DatabaseResultProvider(job.ID); ILogger logger = resultProvider as ILogger; RuleEngineWrapper ruleEngine = new RuleEngineWrapper(ctx, resultProvider, logger); // set total # of rules to execute for the given URI & format job.RuleCount = ruleEngine.RuleCount; job.ResourceType = ctx.PayloadType.ToString(); job.ServiceType = ctx.ServiceType.ToString(); foreach (var levelType in ctx.LevelTypes) { job.LevelTypes += Enum.GetName(typeof(ConformanceLevelType), levelType).ToString() + ','; } job.LevelTypes.TrimEnd(','); LogJobRespHeaders(job, ctx); AddPayloadLinesToJob(job, ctx); // state object is used to start the validation workflow on a threadpool thread this.InitJobState(ruleEngine, job.ID); }
/// <summary>Add the payload lines to the PayloadLines table</summary> /// <param name="job">Row of ValidationJob</param> /// <param name="ctx">ServiceContext</param> private static void AddPayloadLinesToJob(ExtValidationJobs job, ServiceContext ctx) { if (ctx.PayloadType == PayloadType.RawValue && ctx.ContentType == PayloadFormat.Image) { PayloadLine payloadLine = new PayloadLine(); payloadLine.ID = Guid.NewGuid(); payloadLine.LineNumber = 1; payloadLine.LineText = "( Image data )"; job.PayloadLines.Add(payloadLine); } else { PayloadLine payloadLine; int lineNumber = 0; foreach (var responseLine in ctx.GetPayloadLines()) { payloadLine = new PayloadLine(); payloadLine.ID = Guid.NewGuid(); payloadLine.LineNumber = ++lineNumber; payloadLine.LineText = responseLine; job.PayloadLines.Add(payloadLine); } } }