Ejemplo n.º 1
0
        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
 }