/// <summary> /// Validate the architecture /// </summary> /// <param name="graph">The graph</param> public void ValidateArchitecture(Graph graph) { if (graph == null) { throw new ArgumentNullException("graph"); } // Uncomment the line below to debug this extension during validation // System.Windows.Forms.MessageBox.Show("Attach to GraphCmd.exe with process id " + System.Diagnostics.Process.GetCurrentProcess().Id); // Get the graph schema GraphSchema schema = graph.DocumentSchema; // Get the category for our custom property GraphProperty customPropertyCategory = schema.FindProperty(Validator1Property.FullName); if (customPropertyCategory == null) { // The property has not been used in the layer diagram. No need to validate further return; } // Get all layers on the diagram foreach (GraphNode layer in graph.Nodes.GetByCategory("Dsl.Layer")) { // Get the required regex property from the layer node string regexPattern = layer[customPropertyCategory] as string; if (!string.IsNullOrEmpty(regexPattern)) { Regex regEx = new Regex(regexPattern); // Get all referenced types in this layer including those from nested layers so each // type is validated against all containing layer constraints. foreach (GraphNode containedType in layer.FindDescendants().Where(node => node.HasCategory("CodeSchema_Type"))) { // Check the type name against the required regex CodeGraphNodeIdBuilder builder = new CodeGraphNodeIdBuilder(containedType.Id, graph); string typeName = builder.Type.Name; if (!regEx.IsMatch(typeName)) { // Log an error string message = string.Format(CultureInfo.CurrentCulture, Resources.InvalidTypeNameMessage, typeName); this.LogValidationError(graph, typeName + "TypeNameError", message, GraphErrorLevel.Error, layer, new GraphNode[] { containedType }); } } } } }