Пример #1
0
		public static void Verify(VerificationContext context, ASTNode node)
		{
			try
			{
				var verifier = NodeVerifierFactory.GetHandler(node.NodeType);

				// Traversal occurs within the verify, because traversal may happen differently depending on the operation.
				verifier.Verify(context, node);
			}
			catch (Exception e)
			{
                context.ReportMessage(e, node);
			}
		}
Пример #2
0
        public static void Verify(VerificationContext context, ASTNode node)
        {
            try
            {
                var verifier = NodeVerifierFactory.GetHandler(node.NodeType);

                // Traversal occurs within the verify, because traversal may happen differently depending on the operation.
                verifier.Verify(context, node);
            }
            catch (Exception e)
            {
                context.ReportMessage(e, node);
            }
        }
Пример #3
0
        public IEnumerable <VerificationException> Verify(Library library)
        {
            // Parameters must be validated without access to parameter definitions, or expression definitions
            var initialContext = new VerificationContext(library.Models, library.Libraries, null, null, null, null, null);

            // Resolve parameter types and verify default expressions
            foreach (var parameter in library.Parameters)
            {
                try
                {
                    parameter.ParameterType = initialContext.ResolveType(parameter.TypeName);

                    if (parameter.Default != null)
                    {
                        Verifier.Verify(initialContext, parameter.Default);
                        initialContext.VerifyType(parameter.Default.ResultType, parameter.ParameterType);
                    }
                }
                catch (Exception e)
                {
                    initialContext.ReportMessage(new VerificationException(String.Format("Exceptions occurred verifying parameter {0}.", parameter.Name), e), null);
                }
            }

            var context = new VerificationContext(library.Models, library.Libraries, library.Parameters, library.Expressions, library.CodeSystems, library.ValueSets, initialContext.Messages);

            // Verify expressions
            foreach (var expression in library.Expressions)
            {
                // If the result type is already set, this expression ref has already been resolved.
                if (expression.Expression.ResultType == null)
                {
                    Verifier.Verify(context, expression.Expression);
                }
            }

            return(context.Messages);
        }
		public IEnumerable<VerificationException> Verify(Library library)
		{
			// Parameters must be validated without access to parameter definitions, or expression definitions
			var initialContext = new VerificationContext(library.Models, library.Libraries, null, null, null, null, null);

			// Resolve parameter types and verify default expressions
			foreach (var parameter in library.Parameters)
			{
				try
				{
					parameter.ParameterType = initialContext.ResolveType(parameter.TypeName);

					if (parameter.Default != null)
					{
						Verifier.Verify(initialContext, parameter.Default);
					    initialContext.VerifyType(parameter.Default.ResultType, parameter.ParameterType);
					}
				}
				catch (Exception e)
				{
					initialContext.ReportMessage(new VerificationException(String.Format("Exceptions occurred verifying parameter {0}.", parameter.Name), e), null);
				}
			}

			var context = new VerificationContext(library.Models, library.Libraries, library.Parameters, library.Expressions, library.CodeSystems, library.ValueSets, initialContext.Messages);

			// Verify expressions
			foreach (var expression in library.Expressions)
			{
				// If the result type is already set, this expression ref has already been resolved.
				if (expression.Expression.ResultType == null)
				{
					Verifier.Verify(context, expression.Expression);
				}
			}

            return context.Messages;
		}
Пример #5
0
        public IEnumerable <VerificationException> Verify(Artifact artifact)
        {
            // Parameters must be validated without access to parameter definitions, or expression definitions
            var initialContext = new VerificationContext(artifact.Models, null, null, null);

            // Resolve parameter types and verify default expressions
            foreach (var parameter in artifact.Parameters)
            {
                try
                {
                    parameter.ParameterType = initialContext.ResolveType(parameter.TypeName);

                    if (parameter.Default != null)
                    {
                        Verifier.Verify(initialContext, parameter.Default);
                        initialContext.VerifyType(parameter.Default.ResultType, parameter.ParameterType);
                    }
                }
                catch (Exception e)
                {
                    initialContext.ReportMessage(new VerificationException(String.Format("Exceptions occurred verifying parameter {0}.", parameter.Name), e), null);
                }
            }

            var context = new VerificationContext(artifact.Models, artifact.Parameters, artifact.Expressions, initialContext.Messages);

            // Verify expressions
            foreach (var expression in artifact.Expressions)
            {
                // If the result type is already set, this expression ref has already been resolved.
                if (expression.Expression.ResultType == null)
                {
                    Verifier.Verify(context, expression.Expression);
                }
            }

            // Verify conditions
            foreach (var condition in artifact.Conditions)
            {
                Verifier.Verify(context, condition);

                if (!DataTypes.Equal(condition.ResultType, DataTypes.Boolean))
                {
                    context.ReportMessage(new InvalidOperationException("Condition must evaluate to a value of type boolean."), condition);
                }
            }

            // Verify trigger expressions
            foreach (var trigger in artifact.Triggers)
            {
                VerifyExpressionNodes(context, trigger);
            }

            // Verify action conditions
            if (artifact.ActionGroup != null)
            {
                var containers = new Dictionary <string, ParameterDef>();

                // Verify documentation template conditions and binding expressions
                VerifyResponseBindings(context, artifact.ActionGroup, containers);

                foreach (var parameter in containers.Values)
                {
                    context.AddParameterDef(parameter);
                }

                VerifyExpressionNodes(context, artifact.ActionGroup);
            }

            return(context.Messages);
        }
Пример #6
0
        private void VerifyResponseBindings(VerificationContext context, Node node, Dictionary <string, ParameterDef> containers)
        {
            // foreach action
            // If DeclareResponseAction
            // Create a parameter with that name
            // If CollectInformationAction
            // Create a property on the appropriate parameter with the correct type
            // Name = responseBinding.property
            // Type = responseCardinality = Single ? responseDataType : List<responseDataType>

            try
            {
                switch (node.NodeType.GetLocalName())
                {
                case "DeclareResponseAction":
                {
                    var containerName = node.GetAttribute <string>("name");
                    var container     = new ParameterDef {
                        Name = containerName, ParameterType = new ObjectType(containerName + "Type", new List <PropertyDef> {
                            })
                    };
                    containers.Add(container.Name, container);
                }
                break;

                case "CollectInformationAction":
                {
                    var responseBinding = node.Children.FirstOrDefault(c => c.Name == "responseBinding");
                    if (responseBinding != null)
                    {
                        var containerName = responseBinding.GetAttribute <string>("container");
                        if (String.IsNullOrEmpty(containerName))
                        {
                            containerName = "Responses";
                        }

                        if (!containers.ContainsKey(containerName))
                        {
                            throw new InvalidOperationException(String.Format("Could not resolve response container name {0}.", containerName));
                        }

                        var container     = containers[containerName];
                        var containerType = (ObjectType)container.ParameterType;

                        DataType responseType         = null;
                        var      responseName         = responseBinding.GetAttribute <string>("property");
                        var      documentationConcept = node.Children.FirstOrDefault(c => c.Name == "documentationConcept");
                        if (documentationConcept != null)
                        {
                            var responseDataType = documentationConcept.Children.FirstOrDefault(c => c.Name == "responseDataType");
                            if (responseDataType != null)
                            {
                                responseType = context.ResolveType(responseDataType.GetAttribute <string>("value"));
                            }
                            else
                            {
                                responseType = DataTypes.String;
                            }

                            var responseCardinality = documentationConcept.Children.FirstOrDefault(c => c.Name == "responseCardinality");
                            if (responseCardinality != null)
                            {
                                if (responseCardinality.GetAttribute <string>("value") == "Multiple")
                                {
                                    responseType = new ListType(responseType);
                                }
                            }
                        }

                        if (responseType == null)
                        {
                            responseType = DataTypes.String;
                        }

                        if (containerType.Properties.FirstOrDefault(pd => pd.Name == responseName) != null)
                        {
                            throw new InvalidOperationException(String.Format("The response container {0} already has a response named {1}.", container.Name, responseName));
                        }

                        containerType.Properties.Add(new PropertyDef(responseName, responseType));
                    }
                }
                break;
                }
            }
            catch (Exception e)
            {
                context.ReportMessage(e, node);
            }

            foreach (var child in node.Children)
            {
                VerifyResponseBindings(context, child, containers);
            }
        }
Пример #7
0
        public IEnumerable<VerificationException> Verify(Artifact artifact)
        {
            // Parameters must be validated without access to parameter definitions, or expression definitions
            var initialContext = new VerificationContext(artifact.Models, null, null, null);

            // Resolve parameter types and verify default expressions
            foreach (var parameter in artifact.Parameters)
            {
                try
                {
                    parameter.ParameterType = initialContext.ResolveType(parameter.TypeName);

                    if (parameter.Default != null)
                    {
                        Verifier.Verify(initialContext, parameter.Default);
                        initialContext.VerifyType(parameter.Default.ResultType, parameter.ParameterType);
                    }
                }
                catch (Exception e)
                {
                    initialContext.ReportMessage(new VerificationException(String.Format("Exceptions occurred verifying parameter {0}.", parameter.Name), e), null);
                }
            }

            var context = new VerificationContext(artifact.Models, artifact.Parameters, artifact.Expressions, initialContext.Messages);

            // Verify expressions
            foreach (var expression in artifact.Expressions)
            {
                // If the result type is already set, this expression ref has already been resolved.
                if (expression.Expression.ResultType == null)
                {
                    Verifier.Verify(context, expression.Expression);
                }
            }

            // Verify conditions
            foreach (var condition in artifact.Conditions)
            {
                Verifier.Verify(context, condition);

                if (!DataTypes.Equal(condition.ResultType, DataTypes.Boolean))
                {
                    context.ReportMessage(new InvalidOperationException("Condition must evaluate to a value of type boolean."), condition);
                }
            }

            // Verify trigger expressions
            foreach (var trigger in artifact.Triggers)
            {
                VerifyExpressionNodes(context, trigger);
            }

            // Verify action conditions
            if (artifact.ActionGroup != null)
            {
                var containers = new Dictionary<string, ParameterDef>();

                // Verify documentation template conditions and binding expressions
                VerifyResponseBindings(context, artifact.ActionGroup, containers);

                foreach (var parameter in containers.Values)
                {
                    context.AddParameterDef(parameter);
                }

                VerifyExpressionNodes(context, artifact.ActionGroup);
            }

            return context.Messages;
        }
Пример #8
0
        private void VerifyResponseBindings(VerificationContext context, Node node, Dictionary<string, ParameterDef> containers)
        {
            // foreach action
                // If DeclareResponseAction
                    // Create a parameter with that name
                // If CollectInformationAction
                    // Create a property on the appropriate parameter with the correct type
                        // Name = responseBinding.property
                        // Type = responseCardinality = Single ? responseDataType : List<responseDataType>

            try
            {
                switch (node.NodeType.GetLocalName())
                {
                    case "DeclareResponseAction" :
                    {
                        var containerName = node.GetAttribute<string>("name");
                        var container = new ParameterDef { Name = containerName, ParameterType = new ObjectType(containerName + "Type", new List<PropertyDef> { }) };
                        containers.Add(container.Name, container);
                    }
                    break;

                    case "CollectInformationAction" :
                    {
                        var responseBinding = node.Children.FirstOrDefault(c => c.Name == "responseBinding");
                        if (responseBinding != null)
                        {
                            var containerName = responseBinding.GetAttribute<string>("container");
                            if (String.IsNullOrEmpty(containerName))
                            {
                                containerName = "Responses";
                            }

                            if (!containers.ContainsKey(containerName))
                            {
                                throw new InvalidOperationException(String.Format("Could not resolve response container name {0}.", containerName));
                            }

                            var container = containers[containerName];
                            var containerType = (ObjectType)container.ParameterType;

                            DataType responseType = null;
                            var responseName = responseBinding.GetAttribute<string>("property");
                            var documentationConcept = node.Children.FirstOrDefault(c => c.Name == "documentationConcept");
                            if (documentationConcept != null)
                            {
                                var responseDataType = documentationConcept.Children.FirstOrDefault(c => c.Name == "responseDataType");
                                if (responseDataType != null)
                                {
                                    responseType = context.ResolveType(responseDataType.GetAttribute<string>("value"));
                                }
                                else
                                {
                                    responseType = DataTypes.String;
                                }

                                var responseCardinality = documentationConcept.Children.FirstOrDefault(c => c.Name == "responseCardinality");
                                if (responseCardinality != null)
                                {
                                    if (responseCardinality.GetAttribute<string>("value") == "Multiple")
                                    {
                                        responseType = new ListType(responseType);
                                    }
                                }
                            }

                            if (responseType == null)
                            {
                                responseType = DataTypes.String;
                            }

                            if (containerType.Properties.FirstOrDefault(pd => pd.Name == responseName) != null)
                            {
                                throw new InvalidOperationException(String.Format("The response container {0} already has a response named {1}.", container.Name, responseName));
                            }

                            containerType.Properties.Add(new PropertyDef(responseName, responseType));
                        }
                    }
                    break;
                }
            }
            catch (Exception e)
            {
                context.ReportMessage(e, node);
            }

            foreach (var child in node.Children)
            {
                VerifyResponseBindings(context, child, containers);
            }
        }