/// <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); }