Преглед изворни кода

Merge pull request #2931 from garonsky/feature_duplicate_component

Configmgr- Add duplicate component option to context menu

Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman пре 13 година
родитељ
комит
45e356f891

+ 1 - 0
deployment/deploy/XMLTags.h

@@ -101,6 +101,7 @@
 #define XML_ATTR_COMPILERPATH          "@compilerPath"
 #define XML_ATTR_COMPRESSC             "@compressC"
 #define XML_ATTR_COMPRESSD             "@compressD"
+#define XML_ATTR_COMPTYPE              "@compType"
 #define XML_ATTR_COMPUTER              "@computer"
 #define XML_ATTR_COMPUTERTYPE          "@computerType"
 #define XML_ATTR_COPYDIR               "@copyDir"

+ 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) {

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

@@ -4170,7 +4170,46 @@ bool CWsDeployFileInfo::handleComponent(IEspContext &context, IEspHandleComponen
       }
     }
   }
+  else if (!strcmp(operation, "Duplicate"))
+  {
+    StringBuffer sbNewName;
+    StringBuffer xpath;
+    Owned<IPropertyTreeIterator> iterComp = pComponents->getElements("*");
+
+    if (iterComp->first() && iterComp->isValid())
+    {
+      IPropertyTree& pComp = iterComp->query();
+      const char* compName = pComp.queryProp(XML_ATTR_NAME);
+      const char* compType = pComp.queryProp(XML_ATTR_COMPTYPE);
+
+      sbNewName = compName;
+      xpath = 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());
+
+      if (pCompTree == NULL)
+        throw MakeStringException(-1,"XPATH: %s is invalid.", xpath.str());
 
+      StringBuffer xml;
+      toXML(pCompTree, xml);
+
+      IPropertyTree *dupTree = createPTreeFromXMLString(xml.str());
+      dupTree->setProp(XML_ATTR_NAME, sbNewName.str());
+
+      xpath.clear().appendf("./%s/%s[%s=\"%s\"]", XML_TAG_SOFTWARE, compType, XML_ATTR_NAME, sbNewName.str());
+
+      if (pEnvRoot->addPropTree(xpath, dupTree))
+        resp.setStatus("true");
+      else
+        resp.setStatus("false");
+    }
+    else
+    {
+      resp.setStatus("false");
+    }
+    resp.setCompName(XML_TAG_SOFTWARE);
+  }
   return true;
 }