From 9bcf7e789cfa59fdc05b3538d9d77d581bcef59b Mon Sep 17 00:00:00 2001
From: Recolic K <bensl@microsoft.com>
Date: Mon, 17 May 2021 14:31:44 +0800
Subject: [PATCH] update demo

---
 activity.hpp         |  7 +++--
 web/demo.cc          | 68 +++++++++++++++++++++++++++++---------------
 workflows/another.cc | 52 ++++++++++++++++++++++++++++++---
 xaml-template.hpp    |  2 +-
 4 files changed, 98 insertions(+), 31 deletions(-)

diff --git a/activity.hpp b/activity.hpp
index d9e559c..6d23d02 100644
--- a/activity.hpp
+++ b/activity.hpp
@@ -87,8 +87,8 @@ namespace CIS {
 
     class ManualOperation : public ActivityBase {
     public:
-        explicit ManualOperation(string displayName, string message = "", string entityName = "")
-            : displayName(Utility::HtmlEscapeString(displayName)), messageInCSharp(Utility::HtmlEscapeString("\"" + message + "\"")), entityName(entityName), taskId(Utility::GenUUID()) {}
+        explicit ManualOperation(string displayName, string message = "", string teamId = "", string entityName = "")
+            : displayName(Utility::HtmlEscapeString(displayName)), messageInCSharp(Utility::HtmlEscapeString("\"" + message + "\"")), teamId(teamId), entityName(entityName), taskId(Utility::GenUUID()) {}
         ManualOperation(const ManualOperation &another)
             : displayName(another.displayName), messageInCSharp(another.messageInCSharp), entityName(another.entityName), taskId(Utility::GenUUID()) {}
         ManualOperation(ManualOperation &&) = default;
@@ -99,12 +99,13 @@ namespace CIS {
         }
 
     private:
-        string displayName, messageInCSharp, entityName;
+        string displayName, messageInCSharp, teamId, entityName;
         string taskId;
         virtual rlib::string generateXaml() const override {
             rlib::string xamlCode = templates::MANUAL_OPERATION_XAML;
             xamlCode.replace_once("__TEMPLATE_ARG_DisplayName", displayName);
             xamlCode.replace_once("__TEMPLATE_ARG_TaskId", this->taskId);
+            xamlCode.replace_once("__TEMPLATE_ARG_TeamId", this->teamId);
             xamlCode.replace_once("__TEMPLATE_ARG_CodeLines", messageInCSharp);
 
             auto entityXaml = this->entityName == "" ? "" : rlib::string(templates::ENTITY_DEF_TEMPLATE).replace("__TEMPLATE_ARG_EntityName", this->entityName);
diff --git a/web/demo.cc b/web/demo.cc
index e44657e..90c061e 100644
--- a/web/demo.cc
+++ b/web/demo.cc
@@ -1,33 +1,55 @@
 
 // This is a DEMO. You may use any C++17 syntax here. 
 
-// 先演示一下定义一个Activity的正常语法。
+// 先演示一下定义一个Activity和ManualOperation的正常语法。
 //                  (ActivityName,   ClassName_In_Our_Code            , DependencyEntityName)
 Activity HaveASleep ("HaveASleep", "FleetAGC.Activities.DelayActivity", "");
 HaveASleep.addInputSetting("Timespan", "60");
+//                           (DisplayName   ,   Message             , DependencyEntityName)
+ManualOperation AlertSomeone ("AlertSomeone", "This is some message", "");
+// 但是如果你要定义很多很多Activity,建议下面的方法偷懒。
 
-// 但是如果你要定义很多很多Activity,建议用这种方法偷懒。
-#define DEFINE_ACTIVITY(name, entityName) \
-        Activity name (#name, "FleetAGC.Activities.DelayActivity", entityName); \
-        name.addInputSetting("Timespan", "60");
-    
-// 使用刚刚定义的偷懒宏。
-DEFINE_ACTIVITY(GridManager, "M365Poc.SPO.GridManager")
-DEFINE_ACTIVITY(AuthAndProvision, "M365Poc.SPO.AuthProvisioning")
-DEFINE_ACTIVITY(FarmsAndTennats, "")
-DEFINE_ACTIVITY(CSC , "")
-DEFINE_ACTIVITY(FastSearch , "")
-DEFINE_ACTIVITY(Microservices, "M365Poc.SPO.MicroServices")
-DEFINE_ACTIVITY(MonitorAndAlert, "M365Poc.SPO.MonitoringAlerting")
-DEFINE_ACTIVITY(SPOTooling, "M365Poc.SPO.SPOTooling")
-DEFINE_ACTIVITY(UXCDNFailover, "M365Poc.SPO.UXCDNFailover")
-DEFINE_ACTIVITY(ODFBSyncClient, "M365Poc.SPO.ODFBSyncClient")
+////////////////////////////////////////////////////////////////////////////////////////////////
 
-// 把定义好的Activity组合一下,其中箭头表示串行,竖线表示并行。
-auto block1 = GridManager >> FarmsAndTennats >> (CSC | FastSearch);
-auto block2 = Microservices | MonitorAndAlert;
-auto completeFlow = block1 | AuthAndProvision | block2 >> SPOTooling | UXCDNFailover | ODFBSyncClient;
+{ // 偷懒方案1
+    // 这里假设你想用FleetAGC.Activities.DelayActivity,并且想给他一个TimeSpan参数。
+    #define AC(name, entityName) \
+            auto name = Activity(#name, "FleetAGC.Activities.DelayActivity", entityName).addInputSetting("Timespan", "60");
+       
+    // 使用刚刚定义的偷懒宏。
+    AC(GridManager, "M365Poc.SPO.GridManager")
+    AC(AuthAndProvision, "M365Poc.SPO.AuthProvisioning")
+    AC(FarmsAndTennats, "")
+    AC(CSC , "")
+    AC(FastSearch , "")
+    AC(Microservices, "M365Poc.SPO.MicroServices")
+    AC(MonitorAndAlert, "M365Poc.SPO.MonitoringAlerting")
+    AC(SPOTooling, "M365Poc.SPO.SPOTooling")
+    AC(UXCDNFailover, "M365Poc.SPO.UXCDNFailover")
+    AC(ODFBSyncClient, "M365Poc.SPO.ODFBSyncClient")
+    
+    // 把定义好的Activity组合一下,其中箭头表示串行,竖线表示并行。
+    auto block1 = GridManager >> FarmsAndTennats >> (CSC | FastSearch);
+    auto block2 = Microservices | MonitorAndAlert;
+    auto completeFlow = block1 | AuthAndProvision | block2 >> SPOTooling | UXCDNFailover | ODFBSyncClient;
+    
+    // 最后指定一下workflow的名字就可以了。
+    println(completeFlow.generateXaml("FleetAGC.Workflows.SPOBuildoutPOCWorkflow"));
+}
 
-// 最后指定一下workflow的名字就可以了。
-println(completeFlow.generateXaml("FleetAGC.Workflows.SPOBuildoutPOCWorkflow"));
+////////////////////////////////////////////////////////////////////////////////////////////////
 
+if constexpr(false) { // 偷懒方案2
+    #define A_2(name, entityName) (Activity(#name, "FleetAGC.Activities.DelayActivity", #entityName).addInputSetting("Timespan", "60"))
+    #define A_1(name) A_2(name, )
+    #define A_proxy(x, Arg1, Arg2, FUNC, ...) FUNC
+    #define A(...) A_proxy(, ##__VA_ARGS__, A_2(__VA_ARGS__), A_1(__VA_ARGS__))
+    
+    // 和上一个例子一样的语法,只不过这次更懒了。
+    auto block1 = A(GridManager, M365Poc.SPO.GridManager) >> A(FarmsAndTennats) >> (A(CSC) | A(FastSearch));
+    auto block2 = A(Microservices, M365Poc.SPO.MicroServices) | A(MonitorAndAlert, M365Poc.SPO.MonitoringAlerting);
+    auto completeFlow = block1 | A(AuthAndProvision, M365Poc.SPO.AuthProvisioning) | block2 | A(SPOTooling, M365Poc.SPO.SPOTooling) | A(UXCDNFailover, M365Poc.SPO.UXCDNFailover) | A(ODFBSyncClient, M365Poc.SPO.ODFBSyncClient);
+    
+    // 最后指定一下workflow的名字就可以了。
+    println(completeFlow.generateXaml("FleetAGC.Workflows.SPOBuildoutPOCWorkflow"));
+}
diff --git a/workflows/another.cc b/workflows/another.cc
index d0a01ae..86e7cdc 100644
--- a/workflows/another.cc
+++ b/workflows/another.cc
@@ -1,15 +1,59 @@
 #include <cis-workflow-gen/quick-include.hpp>
 
 int main() {
+// This is a DEMO. You may use any C++17 syntax here. 
+
+// 先演示一下定义一个Activity和ManualOperation的正常语法。
+//                  (ActivityName,   ClassName_In_Our_Code            , DependencyEntityName)
+Activity HaveASleep ("HaveASleep", "FleetAGC.Activities.DelayActivity", "");
+HaveASleep.addInputSetting("Timespan", "60");
+//                           (DisplayName   ,   Message             ,  TeamId to alert   , DependencyEntityName)
+ManualOperation AlertSomeone ("AlertSomeone", "This is some message", "AzDNetDeployments", "");
+// 但是如果你要定义很多很多Activity,建议下面的方法偷懒。
+
+////////////////////////////////////////////////////////////////////////////////////////////////
+
+{ // 偷懒方案1
+    // 这里假设你想用FleetAGC.Activities.DelayActivity,并且想给他一个TimeSpan参数。
+    #define AC(name, entityName) \
+            auto name = Activity(#name, "FleetAGC.Activities.DelayActivity", entityName).addInputSetting("Timespan", "60");
+       
+    // 使用刚刚定义的偷懒宏。
+    AC(GridManager, "M365Poc.SPO.GridManager")
+    AC(AuthAndProvision, "M365Poc.SPO.AuthProvisioning")
+    AC(FarmsAndTennats, "")
+    AC(CSC , "")
+    AC(FastSearch , "")
+    AC(Microservices, "M365Poc.SPO.MicroServices")
+    AC(MonitorAndAlert, "M365Poc.SPO.MonitoringAlerting")
+    AC(SPOTooling, "M365Poc.SPO.SPOTooling")
+    AC(UXCDNFailover, "M365Poc.SPO.UXCDNFailover")
+    AC(ODFBSyncClient, "M365Poc.SPO.ODFBSyncClient")
+    
+    // 把定义好的Activity组合一下,其中箭头表示串行,竖线表示并行。
+    auto block1 = GridManager >> FarmsAndTennats >> (CSC | FastSearch);
+    auto block2 = Microservices | MonitorAndAlert;
+    auto completeFlow = block1 | AuthAndProvision | block2 >> SPOTooling | UXCDNFailover | ODFBSyncClient;
+    
+    // 最后指定一下workflow的名字就可以了。
+    println(completeFlow.generateXaml("FleetAGC.Workflows.SPOBuildoutPOCWorkflow"));
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////
+
+if constexpr(false) { // 偷懒方案2
     #define A_2(name, entityName) (Activity(#name, "FleetAGC.Activities.DelayActivity", #entityName).addInputSetting("Timespan", "60"))
-    #define A_1(name) A_2(name, "")
+    #define A_1(name) A_2(name, )
     #define A_proxy(x, Arg1, Arg2, FUNC, ...) FUNC
     #define A(...) A_proxy(, ##__VA_ARGS__, A_2(__VA_ARGS__), A_1(__VA_ARGS__))
- 
+    
+    // 和上一个例子一样的语法,只不过这次更懒了。
     auto block1 = A(GridManager, M365Poc.SPO.GridManager) >> A(FarmsAndTennats) >> (A(CSC) | A(FastSearch));
     auto block2 = A(Microservices, M365Poc.SPO.MicroServices) | A(MonitorAndAlert, M365Poc.SPO.MonitoringAlerting);
     auto completeFlow = block1 | A(AuthAndProvision, M365Poc.SPO.AuthProvisioning) | block2 | A(SPOTooling, M365Poc.SPO.SPOTooling) | A(UXCDNFailover, M365Poc.SPO.UXCDNFailover) | A(ODFBSyncClient, M365Poc.SPO.ODFBSyncClient);
- 
-    println(to_file("SPOBuildoutPOCWorkflow.xaml"), completeFlow.generateXaml("FleetAGC.Workflows.SPOBuildoutPOCWorkflow"));
+    
+    // 最后指定一下workflow的名字就可以了。
+    println(completeFlow.generateXaml("FleetAGC.Workflows.SPOBuildoutPOCWorkflow"));
 }
 
+}
\ No newline at end of file
diff --git a/xaml-template.hpp b/xaml-template.hpp
index a849878..3cbd406 100644
--- a/xaml-template.hpp
+++ b/xaml-template.hpp
@@ -96,7 +96,7 @@ constexpr auto STD_XAML_TAIL = "</Activity>";
 
 
 constexpr auto MANUAL_OPERATION_XAML = 
-R"XAML(    <mwcwa:ManualOperation DeprecatedTaskId="{x:Null}" TaskId="__TEMPLATE_ARG_TaskId" DisplayName="__TEMPLATE_ARG_DisplayName" MonitoringSystems="icm" WaitUntilFinish="True" __TEMPLATE_ARG_EntityDefPlaceholder>
+R"XAML(    <mwcwa:ManualOperation TaskId="__TEMPLATE_ARG_TaskId" DisplayName="__TEMPLATE_ARG_DisplayName" MonitoringSystems="icm" WaitUntilFinish="True" mwcwcc:OwningTeamPropertyBinder.OwningTeamId="__TEMPLATE_ARG_TeamId" __TEMPLATE_ARG_EntityDefPlaceholder>
       <mwcwa:ManualOperation.AdditionalContent>
         <InArgument x:TypeArguments="x:String">
           <mca:CSharpValue x:TypeArguments="x:String">__TEMPLATE_ARG_CodeLines</mca:CSharpValue>
-- 
GitLab