Example #1
0
        /// <summary>
        /// Builds the code source.
        /// Depending on metadata type final class will implement different interfaces and thus will have different class body.
        /// 1. metadata is a DecisionMetadata - the final source class is going to implement IDecisionModule interface,
        /// 2. metadata is a LoopScopeMetadata - the final source class is going to implement ILoopDecisionModule interface
        /// </summary>
        /// <param name="metadata">The metadata.</param>
        /// <param name="typeDirectories">The type directories.</param>
        /// <param name="successorNodeLabelIdLookup">The successor node label id lookup.</param>
        /// <param name="predeccessorsOutputsNameTypeLookup">The predeccessors outputs name type lookup.</param>
        /// <param name="logger">The logger.</param>
        /// <param name="assembliesReferenceLocations">Output the list of assemblies locations that must be reference by DecisionCompilator</param>
        /// <returns></returns>
        public static string BuildCodeSource(IDecision metadata, List <string> typeDirectories, Dictionary <string, string> successorNodeLabelIdLookup,
                                             Dictionary <string, string> predeccessorsOutputsNameTypeLookup, ComponentLogger logger, out HashSet <string> assembliesReferenceLocations)
        {
            string bodyCode, moduleInterface;

            if (metadata is DecisionMetadata)
            {
                //parse the code written by user
                DecisionCodeParser codeParser = new DecisionCodeParser(metadata.DecisionCode, successorNodeLabelIdLookup, predeccessorsOutputsNameTypeLookup);
                string             userDecisionCodeSnippet = codeParser.ParseCode();
                bodyCode        = String.Format(DECISION_MODULE_BODY, userDecisionCodeSnippet);
                moduleInterface = typeof(IDecisionModule).FullName;
            }
            else
            {
                //append ';' to the end just in case so that user condition can be simplified
                string decisionCode = (metadata.DecisionCode.EndsWith(";")) ? metadata.DecisionCode : metadata.DecisionCode + ";";

                DecisionCodeParser codeParser = new DecisionCodeParser(decisionCode, successorNodeLabelIdLookup, predeccessorsOutputsNameTypeLookup);
                string             userDecisionCodeSnippet = codeParser.ParseCode();
                bodyCode        = String.Format(LOOP_DECISION_MODULE_BODY, userDecisionCodeSnippet);
                moduleInterface = typeof(ILoopDecisionModule).FullName;
            }

            //build the string of all usings of all namespace found in types assemblies
            string usingsNamespacesCodeSnippet = ReferenceTypesAssemblies(typeDirectories, logger, out assembliesReferenceLocations);

            return(BuildDecisionCodeSource(metadata.Classname, moduleInterface, bodyCode, usingsNamespacesCodeSnippet));
        }
        /// <summary>
        /// Builds the code source.
        /// Depending on metadata type final class will implement different interfaces and thus will have different class body.
        /// 1. metadata is a DecisionMetadata - the final source class is going to implement IDecisionModule interface,
        /// 2. metadata is a LoopScopeMetadata - the final source class is going to implement ILoopDecisionModule interface
        /// </summary>
        /// <param name="metadata">The metadata.</param>
        /// <param name="typeDirectories">The type directories.</param>
        /// <param name="successorNodeLabelIdLookup">The successor node label id lookup.</param>
        /// <param name="predeccessorsOutputsNameTypeLookup">The predeccessors outputs name type lookup.</param>
        /// <param name="logger">The logger.</param>
        /// <param name="assembliesReferenceLocations">Output the list of assemblies locations that must be reference by DecisionCompilator</param>
        /// <returns></returns>
        public static string BuildCodeSource(IDecision metadata, List<string> typeDirectories, Dictionary<string, string> successorNodeLabelIdLookup,
                                          Dictionary<string, string> predeccessorsOutputsNameTypeLookup, ComponentLogger logger, out HashSet<string> assembliesReferenceLocations)
        {   
            string bodyCode, moduleInterface;

            if (metadata is DecisionMetadata)
            {
                //parse the code written by user
                DecisionCodeParser codeParser = new DecisionCodeParser(metadata.DecisionCode, successorNodeLabelIdLookup, predeccessorsOutputsNameTypeLookup);
                string userDecisionCodeSnippet = codeParser.ParseCode();
                bodyCode = String.Format(DECISION_MODULE_BODY, userDecisionCodeSnippet);
                moduleInterface = typeof(IDecisionModule).FullName;
            }
            else
            {
                //append ';' to the end just in case so that user condition can be simplified
                string decisionCode = (metadata.DecisionCode.EndsWith(";")) ? metadata.DecisionCode : metadata.DecisionCode + ";";

                DecisionCodeParser codeParser = new DecisionCodeParser(decisionCode, successorNodeLabelIdLookup, predeccessorsOutputsNameTypeLookup);
                string userDecisionCodeSnippet = codeParser.ParseCode();
                bodyCode = String.Format(LOOP_DECISION_MODULE_BODY, userDecisionCodeSnippet);
                moduleInterface = typeof(ILoopDecisionModule).FullName;
            }

            //build the string of all usings of all namespace found in types assemblies
            string usingsNamespacesCodeSnippet = ReferenceTypesAssemblies(typeDirectories, logger, out assembliesReferenceLocations);

            return BuildDecisionCodeSource(metadata.Classname, moduleInterface, bodyCode, usingsNamespacesCodeSnippet);
        }