protected override void ValidateApplicationModel(ApplicationValidationResultMutable result) { // Detect cyclic layer dependencies // Perform DFS for each layer var violatingLayers = new HashSet <LayerModel>(); foreach (var layerModel in this.AllLayers) { var seen = new HashSet <LayerModel>(); var stk = new Stack <LayerModel>(); stk.Push(layerModel); while (stk.Any()) { LayerModel current = stk.Pop(); seen.Add(current); var allUsed = current.UsedLayerModels; foreach (LayerModel used in allUsed) { if (seen.Contains(used)) { // Loop detected violatingLayers.Add(layerModel); stk.Clear(); break; } else { stk.Push(used); } } if (!allUsed.Any()) { seen.Remove(current); } } } foreach (var violatingLayer in violatingLayers) { result.StructureValidationErrors.Add(ValidationErrorFactory.NewStructureError("The following layer has cyclic dependencies: " + violatingLayer.LayerName + ".", this)); } }
protected override void ValidateApplicationModel(ApplicationValidationResultMutable result) { // Nothing to do }