/// /// Copyright (c) 2022 Sensus Slovensko a.s. /// using System; using System.Linq; using log4net; using NHibernate; using SharedDatabase.Entities; namespace SharedDatabase { public class WorkflowSummary { private static readonly ILog log = LogManager.GetLogger(typeof(WorkflowSummary)); public Entities.Process Workflow; /// Selected production tracing workflow public string WorkstepName; /// Selected production tracing workstep public string PreviousWorkstepName; /// Previous workstep name public string Part1Name; /// 1st reference part name public string Part2Name; /// 2nd reference part name or null WorkflowSummary() { } public WorkflowSummary(Entities.Process workflow) { Workflow = workflow; } /// /// Read specified workflow and workstep from the production tracing database /// and set WorkflowSummary members accordingly. /// /// Workflow name /// Part of a workstep name (not case sensitive) /// Database session or null /// Workflow summary or null public static WorkflowSummary ReadFromDB(string workflowName, string workstepPattern = "test", ISession session = null) { if (string.IsNullOrEmpty(workflowName)) { log.ErrorFormat("ReadFromDB() ... workflowName argument is null or empty"); return null; } bool openAndCloseSession = (session == null) || !session.IsOpen; try { WorkflowSummary wSum = null; if (openAndCloseSession) session = TracingDB.SessionFactory.OpenSession(); var wflows = session.QueryOver() .Where(x => x.Name == workflowName) .And(x => (x.ReleaseStatus == ReleaseStatus.ToBeApproved || x.ReleaseStatus == ReleaseStatus.Released || x.ReleaseStatus == ReleaseStatus.ReleasedActive)) .List(); if (wflows.Count == 1) { Process wf = wflows[0]; wSum = new WorkflowSummary(wf); var workstep = wf.Worksteps.FirstOrDefault(x => x.Name.ToLower().Contains(workstepPattern.ToLower())); if (workstep != null) { wSum.WorkstepName = workstep.Name; int previousStepNr = workstep.WorkstepNr - 1; var previousStep = (previousStepNr < 1) ? null : wf.Worksteps.FirstOrDefault(x => x.WorkstepNr == previousStepNr); if (previousStep != null) wSum.PreviousWorkstepName = previousStep.Name; } var part1 = wf.Parts.FirstOrDefault(x => x.StepNumber == 1); var part2 = wf.Parts.FirstOrDefault(x => x.StepNumber == 2); if (part1 != null) wSum.Part1Name = part1.Name; if (part2 != null) wSum.Part2Name = part2.Name; } if (openAndCloseSession) session.Close(); log.InfoFormat("ReadFromDB({0}, {1}) returns {2}", (wSum != null) ? wSum.ToString() : ""); return wSum; } catch (Exception exc) { if (session != null && session.IsOpen) session.Close(); log.ErrorFormat("ReadFromDB({0}, {1}) failed: {2}", workflowName, workstepPattern, exc.Message); return null; } } /// /// Compares two workflows, determines whether they are compatible. /// Minimal requirement is Part1 and Part2 names are the same (both Part2 names might be null). /// /// Anothe workflow summary /// true = strict comparison /// true when compatible public bool IsCompatibleWith(WorkflowSummary wfs, bool strict = false) { if (strict) { return wfs != null && Part1Name == wfs.Part1Name && Part2Name == wfs.Part2Name && WorkstepName == wfs.WorkstepName && PreviousWorkstepName == wfs.PreviousWorkstepName && Workflow.Name == wfs.Workflow.Name; } else { return wfs != null && Part1Name == wfs.Part1Name && Part2Name == wfs.Part2Name; } } public override string ToString() { return string.Format("workflow={0} workstep={1} previousWS={2} part1={3} part2={4}", Workflow != null ? Workflow.Name : "", WorkstepName != null ? WorkstepName : "", PreviousWorkstepName != null ? PreviousWorkstepName : "", Part1Name != null ? Part1Name : "", Part2Name != null ? Part2Name : ""); } } }