Переглянути джерело

HPCC-18145 ESDL bindings and definitions to keep publish info

- Adds timestamps and owner information to bindings and definitions
- Retains preexisting time and owner info and adds lastedit info

Signed-off-by: Rodrigo Pastrana <rodrigo.pastrana@lexisnexis.com>
Rodrigo Pastrana 7 роки тому
батько
коміт
60d99ded8e

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

+ 61 - 5
esp/services/ws_esdlconfig/ws_esdlconfigservice.cpp

@@ -232,12 +232,19 @@ 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);
+            origTimestamp.set(queryRegistry->queryPropTree(xpath)->queryProp("@created"));
+            origOwner.set(queryRegistry->queryPropTree(xpath)->queryProp("@publishedBy"));
+
+            queryRegistry->removeTree(queryRegistry->queryPropTree(xpath));
         }
         else
         {
@@ -245,12 +252,30 @@ void CWsESDLConfigEx::addESDLDefinition(IPropertyTree * queryRegistry, const cha
         }
     }
 
+    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 +573,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 +608,17 @@ int CWsESDLConfigEx::publishESDLBinding(const char * bindingName,
 
     bool duplicateBindings = bindings->hasProp(xpath.str());
 
+    StringBuffer origTimestamp;
+    StringBuffer origOwner;
+
     if (duplicateBindings)
     {
         if(overwrite)
+        {
+           origTimestamp.set(bindings->queryPropTree(xpath)->queryProp("@created"));
+           origOwner.set(bindings->queryPropTree(xpath)->queryProp("@publishedBy"));
            bindings->removeTree(bindings->queryPropTree(xpath));
+        }
         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 +633,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 +660,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 +816,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);