瀏覽代碼

Merge pull request #10342 from rpastrana/HPCC-18145-bindinginfo-642

HPCC-18145 ESDL bindings and definitions to keep publish info

Reviewed-By: Kevin Wang <kevin.wang@lexisnexis.com>
Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 7 年之前
父節點
當前提交
8502b8c6b4

+ 11 - 1
esp/services/esdl_svc_engine/esdl_binding.cpp

@@ -128,7 +128,17 @@ IPropertyTree * fetchESDLBindingFromDali(const char *process, const char *bindin
         //There shouldn't be multiple entries here, but if so, we'll use the first one
         VStringBuffer xpath("%s[@id='%s.%s'][1]", ESDL_BINDING_ENTRY, process, bindingName);
 
-        return esdlBindings->getPropTree(xpath);
+        if (conn->queryRoot()->hasProp(xpath))
+            return createPTreeFromIPT(conn->queryRoot()->queryPropTree(xpath));
+        else
+            return nullptr;
+
+    }
+    catch (IException *E)
+    {
+        VStringBuffer message("ESDL Binding: Error fetching ESDL Binding %s[@EspProcess='%s'][@EspBinding='%s'][1] from Dali.", ESDL_BINDING_ENTRY, process, bindingName);
+        EXCLOG(E, message);
+        E->Release();
     }
     catch(...)
     {

+ 82 - 6
esp/services/ws_esdlconfig/ws_esdlconfigservice.cpp

@@ -232,25 +232,60 @@ void CWsESDLConfigEx::addESDLDefinition(IPropertyTree * queryRegistry, const cha
             newSeq = thisSeq + 1;
     }
 
+    StringBuffer origTimestamp;
+    StringBuffer origOwner;
+
     if (deleteprev && newSeq > 1)
     {
         if (!isESDLDefinitionBound(lcName, newSeq -1))
         {
             newSeq--;
-            queryRegistry->removeTree(queryRegistry->queryPropTree(xpath.appendf("[@seq='%d']", newSeq)));
+            xpath.appendf("[@seq='%d']", newSeq);
+
+            IPropertyTree * definition = queryRegistry->queryPropTree(xpath);
+            if (definition)
+            {
+                origTimestamp.set(definition->queryProp("@created"));
+                origOwner.set(definition->queryProp("@publishedBy"));
+                queryRegistry->removeTree(definition);
+            }
+            else
+            {
+                DBGLOG("Could not overwrite Definition: '%s.%d'", name, newSeq);
+                return;
+            }
         }
         else
         {
             DBGLOG("Will not delete previous ESDL definition version because it is referenced in an ESDL binding.");
+            return;
         }
     }
 
+    CDateTime dt;
+    dt.setNow();
+    StringBuffer str;
+
     newId.set(lcName).append(".").append(newSeq);
     definitionInfo->setProp("@name", lcName);
     definitionInfo->setProp("@id", newId);
     definitionInfo->setPropInt("@seq", newSeq);
-    if (userid && *userid)
-        definitionInfo->setProp("@publishedBy", userid);
+    if (origOwner.length())
+    {
+        definitionInfo->setProp("@lastEditedBy", (userid && *userid) ? userid : "Anonymous") ;
+        definitionInfo->setProp("@publishedBy", origOwner.str()) ;
+    }
+    else
+        definitionInfo->setProp("@publishedBy", (userid && *userid) ? userid : "Anonymous") ;
+
+    if (origTimestamp.length())
+    {
+        definitionInfo->setProp("@created", origTimestamp.str());
+        definitionInfo->setProp("@lastEdit",dt.getString(str).str());
+    }
+    else
+        definitionInfo->setProp("@created",dt.getString(str).str());
+
     queryRegistry->addPropTree(ESDL_DEF_ENTRY, LINK(definitionInfo));
 }
 
@@ -548,7 +583,8 @@ int CWsESDLConfigEx::publishESDLBinding(const char * bindingName,
                                          int esdlDefinitionVersion,
                                          const char * esdlServiceName,
                                          StringBuffer & message,
-                                         bool overwrite)
+                                         bool overwrite,
+                                         const char * user)
 {
     if (!esdlDefinitionName || !*esdlDefinitionName)
     {
@@ -582,10 +618,27 @@ int CWsESDLConfigEx::publishESDLBinding(const char * bindingName,
 
     bool duplicateBindings = bindings->hasProp(xpath.str());
 
+    StringBuffer origTimestamp;
+    StringBuffer origOwner;
+
     if (duplicateBindings)
     {
         if(overwrite)
-           bindings->removeTree(bindings->queryPropTree(xpath));
+        {
+            IPropertyTree * binding = bindings->queryPropTree(xpath);
+            if (binding)
+            {
+                origTimestamp.set(binding->queryProp("@created"));
+                origOwner.set(binding->queryProp("@publishedBy"));
+                bindings->removeTree(binding);
+            }
+            else
+            {
+                message.setf("Could not overwrite binding '%s.%s'!", espProcName, bindingName);
+                conn->close(false);
+                return -1;
+            }
+        }
         else
         {
            message.setf("Could not configure Service '%s' because this service has already been configured for binding '%s' on ESP Process '%s'", esdlServiceName, bindingName, espProcName);
@@ -600,6 +653,26 @@ int CWsESDLConfigEx::publishESDLBinding(const char * bindingName,
     bindingtree->setProp("@espbinding", bindingName);
     bindingtree->setProp("@id", qbindingid.str());
 
+    CDateTime dt;
+    dt.setNow();
+    StringBuffer str;
+
+    if (origTimestamp.length())
+    {
+        bindingtree->setProp("@created", origTimestamp.str());
+        bindingtree->setProp("@lastEdit", dt.getString(str).str());
+    }
+    else
+        bindingtree->setProp("@created",  dt.getString(str).str());
+
+    if (origOwner.length())
+    {
+        bindingtree->setProp("@publisheBy", origOwner.str()) ;
+        bindingtree->setProp("@lastEditedBy", (user && *user) ? user : "Anonymous");
+    }
+    else
+        bindingtree->setProp("@publishedBy", (user && *user) ? user : "Anonymous") ;
+
     if (esdlDefinitionVersion <= 0)
         esdlDefinitionVersion = 1;
 
@@ -607,10 +680,12 @@ int CWsESDLConfigEx::publishESDLBinding(const char * bindingName,
     newId.set(lcName).append(".").append(esdlDefinitionVersion);
 
     Owned<IPropertyTree> esdldeftree  = createPTree();
+
     esdldeftree->setProp("@name", lcName);
     esdldeftree->setProp("@id", newId);
     esdldeftree->setProp("@esdlservice", esdlServiceName);
 
+
     esdldeftree->addPropTree("Methods", LINK(methodsConfig));
 
     bindingtree->addPropTree(ESDL_DEF_ENTRY, LINK(esdldeftree));
@@ -761,7 +836,8 @@ bool CWsESDLConfigEx::onPublishESDLBinding(IEspContext &context, IEspPublishESDL
                                                            esdlver,
                                                            esdlServiceName.str(),
                                                            msg,
-                                                           overwrite
+                                                           overwrite,
+                                                           username.str()
                                                            ));
 
             if (ver >= 1.2)

+ 1 - 1
esp/services/ws_esdlconfig/ws_esdlconfigservice.hpp

@@ -41,7 +41,7 @@ public:
     static bool existsESDLDefinition(const char * servicename, unsigned ver);
     static bool existsESDLDefinition(const char * definitionid);
     static bool existsESDLMethodDef(const char * esdlDefinitionName, unsigned ver, StringBuffer & esdlServiceName, const char * methodName);
-    static int publishESDLBinding(const char * bindingName, IPropertyTree * methodsConfig, const char * espProcName, const char * espPort, const char * esdlDefinitionName, int esdlDefinitionVersion, const char * esdlServiceName, StringBuffer & message, bool overwrite);
+    static int publishESDLBinding(const char * bindingName, IPropertyTree * methodsConfig, const char * espProcName, const char * espPort, const char * esdlDefinitionName, int esdlDefinitionVersion, const char * esdlServiceName, StringBuffer & message, bool overwrite, const char * user);
     static IPropertyTree * getEspProcessRegistry(const char * espprocname, const char * espbingingport, const char * servicename);
     static IPropertyTree * getESDLDefinitionRegistry(const char * wsEclId, bool readonly);
     static void addESDLDefinition(IPropertyTree * queryRegistry, const char * name, IPropertyTree * definitionInfo, StringBuffer &newId, unsigned &newSeq, const char *userid, bool deleteprev);