Explorar o código

Fix gh-2649 Configmgr - duplicate component
- Add 'Duplicate Componenet/Service' to context menu
- Duplicate components and assign unique name

Signed-off-by: Gleb Aronsky <gleb.aronsky@lexisnexis.com>

Gleb Aronsky %!s(int64=13) %!d(string=hai) anos
pai
achega
0ebadcaadd

+ 1 - 0
deployment/deploy/XMLTags.h

@@ -103,6 +103,7 @@
 #define XML_ATTR_COMPRESSD             "@compressD"
 #define XML_ATTR_COMPUTER              "@computer"
 #define XML_ATTR_COMPUTERTYPE          "@computerType"
+#define XML_ATTR_COMPTYPE              "@compType"
 #define XML_ATTR_COPYDIR               "@copyDir"
 #define XML_ATTR_COPYDLL               "@copyDLL"
 #define XML_ATTR_CREATEMODELFILE       "@createModelFile"

+ 37 - 8
esp/files/scripts/configmgr/navtree.js

@@ -706,13 +706,6 @@ function createNavigationTree(navTreeData) {
                 top.document.lastSelectedRow = temp1[0];
                 getWaitDlg().hide();
                 navDS.flushCache();
-                //                  var tid= YAHOO.util.Get.script('/esp/files/scripts/navtreedata.js',{ 
-                //                    onSuccess: function(obj) {
-                //                      var parsedResults = navDS.parseArrayData(o, navTreeData);
-                //                      navDS.handleResponse("", parsedResults.results, {   success:navDT.onDataReturnInitializeTable,
-                //                                                 scope:navDT}, this, 999);
-                //                      clickCurrentSelOrName(navDT, temp1[0]);
-                //                    }});
                 refreshNavTree(navDS, navDT, temp1[0])
               }
             }
@@ -732,6 +725,40 @@ function createNavigationTree(navTreeData) {
       },
         getFileName(true) + 'Operation=Delete&XmlArgs=' + xmlStr);
     }
+    else if (menuItemName ==="Duplicate Component/Service")
+    {
+      var targetRec;
+      xmlStr = navDT.selectionToXML(targetRec, navDT.getSelectedRows(), targetRec, "Components");
+
+      YAHOO.util.Connect.asyncRequest('POST', '/WsDeploy/HandleComponent', {
+        success: function(o) {
+          if (o.status === 200) {
+            if (o.responseText.indexOf("<?xml") === 0) {
+              var form = document.forms['treeForm'];
+              form.isChanged.value = "true";
+              var temp = o.responseText.split(/<CompName>/g);
+              var temp1 = temp[1].split(/<\/CompName>/g);
+              top.document.lastSelectedRow = temp1[0];
+              getWaitDlg().hide();
+              navDS.flushCache();
+              refreshNavTree(navDS, navDT)
+            }
+            else if (o.responseText.indexOf("<html") === 0) {
+              var temp = o.responseText.split(/td align=\"left\">/g);
+              var temp1 = temp[1].split(/<\/td>/g);
+              getWaitDlg().hide();
+              alert(temp1[0]);
+            }
+          }
+        },
+        failure: function(o) {
+          getWaitDlg().hide();
+          alert(o.statusText);
+        },
+        scope: this
+      },
+        getFileName(true) + 'Operation=Duplicate&XmlArgs=' + xmlStr);
+    }
     else {
       var xmlStr = "<Components><Component buildSet='" + menuItemName + "'/></Components>";
       YAHOO.util.Connect.asyncRequest('POST', '/WsDeploy/HandleComponent', {
@@ -1131,7 +1158,8 @@ function createNavigationTree(navTreeData) {
                                 },
                                 onclick: { fn: onMenuSWClick }
                               },
-                              { text: "Delete Component/Service", onclick: { fn: onMenuSWClick} }
+                              { text: "Delete Component/Service", onclick: { fn: onMenuSWClick} },
+                              { text: "Duplicate Component/Service", onclick: { fn: onMenuSWClick} }
                           ],
     "Columns": [
                               {
@@ -1201,6 +1229,7 @@ function createNavigationTree(navTreeData) {
 
       if (record.getData('Name') === 'Software' || record.getData('Name') === 'Directories'){
         this.getItem(2).cfg.setProperty("disabled", true);
+        this.getItem(3).cfg.setProperty("disabled", true);
       }
 
       if (record.getData('id') === 0) {

+ 33 - 0
esp/services/WsDeploy/WsDeployService.cpp

@@ -4170,6 +4170,39 @@ bool CWsDeployFileInfo::handleComponent(IEspContext &context, IEspHandleComponen
       }
     }
   }
+  else if (!strcmp(operation, "Duplicate"))
+  {
+    StringBuffer sbNewName;
+    StringBuffer xpath;
+    Owned<IPropertyTreeIterator> iterComp = pComponents->getElements("*");
+
+    ForEach(*iterComp)
+    {
+      IPropertyTree& pComp = iterComp->query();
+      const char* compName = pComp.queryProp(XML_ATTR_NAME);
+      const char* compType = pComp.queryProp(XML_ATTR_COMPTYPE);
+
+      sbNewName = compName;
+      xpath.clear().appendf("%s", compType);
+      getUniqueName(pEnvRoot, sbNewName, xpath.str(), XML_TAG_SOFTWARE);
+      xpath.clear().appendf("./%s/%s[%s=\"%s\"]", XML_TAG_SOFTWARE, compType, XML_ATTR_NAME, compName);
+      IPropertyTree* pCompTree = pEnvRoot->queryPropTree(xpath.str());
+      xpath.clear().appendf("./%s/%s[%s=\"%s\"]", XML_TAG_SOFTWARE, compType, XML_ATTR_NAME, sbNewName.str());
+
+      StringBuffer xml;
+      toXML(pCompTree, xml);
+
+      IPropertyTree *dupTree = createPTreeFromXMLString(xml.str());
+      dupTree->setProp(XML_ATTR_NAME, sbNewName.str());
+
+      if (pEnvRoot->addPropTree(xpath, dupTree))
+        resp.setStatus("true");
+      else
+        resp.setStatus("false");
+
+      resp.setCompName(XML_TAG_SOFTWARE);
+    }
+  }
 
   return true;
 }