Explorar el Código

HPCC-12686 Use 3 enumerations in ws_dfu/ws_fs/ws_wu ecm files

1. in ws_dfu.ecm, change DFUArrayActionRequest.type to ESPenum;
2. in ws_fs.ecm, change DFUWorkunitsActionRequest.type to ESPenum;
3. in ws_workunits.ecm, change WUActionRequest.ActionType to ESPenum;
4. refactor the CFileSprayEx::onDFUWorkunitsAction().

Signed-off-by: wangkx <kevin.wang@lexisnexis.com>
wangkx hace 10 años
padre
commit
d0917f3b05

+ 7 - 1
esp/scm/ws_dfu.ecm

@@ -18,6 +18,12 @@
 #include "xslprocessor.hpp" 
 //  ===========================================================================
 
+ESPenum DFUArrayActions : string
+{
+    Delete("Delete"),
+    AddToSuperfile("Add To Superfile"),
+};
+
 ESPStruct SpaceItem
 {
     string Name;
@@ -243,7 +249,7 @@ ESPrequest
 ]
 DFUArrayActionRequest
 {
-    DFUActionType Type;
+    ESPenum DFUArrayActions Type;
     bool NoDelete;
     [min_ver("1.04")] string BackToPage;
     ESParray<string> LogicalFiles;

+ 9 - 1
esp/scm/ws_fs.ecm

@@ -15,6 +15,14 @@
     limitations under the License.
 ############################################################################## */
 
+ESPenum DFUWUActions : string
+{
+    Delete("Delete"),
+    Protect("Protect"),
+    Unprotect("Unprotect"),
+    Restore("Restore"),
+    SetToFailed("SetToFailed"),
+};
 
 ESPStruct [nil_remove] DFUWorkunit
 {
@@ -245,7 +253,7 @@ DeleteDFUWorkunitsResponse
 ESPrequest DFUWorkunitsActionRequest
 {
     ESParray<string> wuids;
-    string Type;
+    ESPenum DFUWUActions Type;
 };
 
 ESPresponse [exceptions_inline] DFUWorkunitsActionResponse

+ 16 - 1
esp/scm/ws_workunits.ecm

@@ -20,6 +20,21 @@
 
 EspInclude(common);
 
+ESPenum ECLWUActions : string
+{
+    Abort("Abort"),
+    Delete("Delete"),
+    EventDeschedule("Deschedule"),
+    EventReschedule("Reschedule"),
+    Pause("Pause"),
+    PauseNow("PauseNow"),
+    Protect("Protect"),
+    Unprotect("Unprotect"),
+    Restore("Restore"),
+    Resume("Resume"),
+    SetToFailed("SetToFailed"),
+};
+
 ESPStruct [nil_remove] ECLException
 {
     string Source;
@@ -453,7 +468,7 @@ ESPresponse [exceptions_inline] WUDeleteResponse
 ESPrequest [nil_remove] WUActionRequest
 {
     ESParray<string> Wuids;
-    string ActionType;
+    ESPenum ECLWUActions ActionType;
 
     string Cluster;
     string Owner;

+ 27 - 73
esp/services/ws_dfu/ws_dfuService.cpp

@@ -1331,6 +1331,10 @@ bool CWsDfuEx::onDFUArrayAction(IEspContext &context, IEspDFUArrayActionRequest
         if (!context.validateFeatureAccess(FEATURE_URL, SecAccess_Write, false))
             throw MakeStringException(ECLWATCH_DFU_ACCESS_DENIED, "Failed to update Logical Files. Permission denied.");
 
+        CDFUArrayActions action = req.getType();
+        if (action == DFUArrayActions_Undefined)
+            throw MakeStringException(ECLWATCH_INVALID_INPUT,"Action not defined.");
+
         double version = context.getClientVersion();
         if (version > 1.03)
         {
@@ -1344,31 +1348,10 @@ bool CWsDfuEx::onDFUArrayAction(IEspContext &context, IEspDFUArrayActionRequest
             }
         }
 
-        if (strcmp(req.getType(), Action_Delete) == 0)
-        {
-            /*StringArray roxieQueries;
-            checkRoxieQueryFilesOnDelete(req, roxieQueries);
-            if (roxieQueries.length() > 0)
-            {
-                returnStr.append("<Message><Value>Cannot delete the files because of the following roxie queries: ");
-                for(int i = 0; i < roxieQueries.length();i++)
-                {
-                    const char* query = roxieQueries.item(i);
-                    if(!query || !*query)
-                        continue;
-
-                    if (i==0)
-                        returnStr.append(query);
-                    else
-                        returnStr.appendf(",%s", query);
-                }
-                returnStr.append("</Value></Message>");
-                resp.setDFUArrayActionResult(returnStr.str());
-                return true;
-            }*/
+        if (action == CDFUArrayActions_Delete)
             return  DFUDeleteFiles(context, req, resp);
-        }
 
+        //the code below is only for legacy ECLWatch. Other application should use AddtoSuperfile.
         StringBuffer username;
         context.getUserID(username);
 
@@ -1380,7 +1363,7 @@ bool CWsDfuEx::onDFUArrayAction(IEspContext &context, IEspDFUArrayActionRequest
             userdesc->set(username.str(), passwd);
         }
 
-        StringBuffer returnStr;
+        StringBuffer errorStr, subfiles;
         for(unsigned i = 0; i < req.getLogicalFiles().length();i++)
         {
             const char* file = req.getLogicalFiles().item(i);
@@ -1401,47 +1384,45 @@ bool CWsDfuEx::onDFUArrayAction(IEspContext &context, IEspDFUArrayActionRequest
             strncpy(curfile, file, len);
             curfile[len] = 0;
             
-            DBGLOG("CWsDfuEx::onDFUArrayAction User=%s Action=%s File=%s",username.str(),req.getType(), file);
             try
             {
-                onDFUAction(userdesc.get(), curfile, cluster, req.getType(), returnStr);
+                Owned<IDistributedFile> df = queryDistributedFileDirectory().lookup(curfile, userdesc.get(), true);
+                if (df)
+                {
+                    if (subfiles.length() > 0)
+                        subfiles.append(",");
+                    subfiles.append(curfile);
+                }
+                else
+                    errorStr.appendf("<Message><Value>%s not found</Value></Message>", curfile);
             }
             catch(IException* e)
             {
                 StringBuffer emsg;
                 e->errorMessage(emsg);
-                if((e->errorCode() == DFSERR_CreateAccessDenied) && (req.getType() != NULL))
-                {
-                    if (strcmp(req.getType(), Action_AddtoSuperfile) == 0)
-                    {
-                        emsg.replaceString("Create ", "AddtoSuperfile ");               
-                    }
-                }
+                if (e->errorCode() == DFSERR_CreateAccessDenied)
+                    emsg.replaceString("Create ", "AddtoSuperfile ");
 
-                returnStr.appendf("<Message><Value>%s</Value></Message>", emsg.str());
+                errorStr.appendf("<Message><Value>%s for %s</Value></Message>", emsg.str(), curfile);
                 e->Release();
             }
             catch(...)
             {
-                returnStr.appendf("<Message><Value>Unknown exception onDFUArrayAction %s</Value></Message>", curfile);
+                errorStr.appendf("<Message><Value>Unknown exception for %s</Value></Message>", curfile);
             }
             delete [] curfile;
         }
 
-        if (strcmp(Action_AddtoSuperfile ,req.getType()) == 0)
+        if (errorStr.length())
         {
-            returnStr.replaceString("#", "%23");
-            if (version < 1.18)
-                resp.setRedirectUrl(StringBuffer("/WsDFU/AddtoSuperfile?Subfiles=").append(returnStr.str()));
-            else
-            {
-                resp.setRedirectTo(returnStr.str());
-            }
+            resp.setDFUArrayActionResult(errorStr.str());
+            return false;
         }
+
+        if (version < 1.18)
+            resp.setRedirectUrl(StringBuffer("/WsDFU/AddtoSuperfile?Subfiles=").append(subfiles.str()));
         else
-        {
-            resp.setDFUArrayActionResult(returnStr.str());
-        }
+            resp.setRedirectTo(subfiles.str());
     }
     catch(IException* e)
     {   
@@ -1450,33 +1431,6 @@ bool CWsDfuEx::onDFUArrayAction(IEspContext &context, IEspDFUArrayActionRequest
     return true;
 }
 
-bool CWsDfuEx::onDFUAction(IUserDescriptor* udesc, const char* LogicalFileName, const char* ClusterName, const char* ActionType, StringBuffer& returnStr)
-{
-    //No 'try/catch' is needed for this method since it will be called internally.
-    if (strcmp(Action_Delete ,ActionType) == 0)
-    {
-        LogicFileWrapper Logicfile;
-        if (!Logicfile.doDeleteFile(LogicalFileName,ClusterName, returnStr, udesc))
-            return false;
-    }
-    else if (strcmp(Action_AddtoSuperfile ,ActionType) == 0)
-    {
-        Owned<IDistributedFile> df = queryDistributedFileDirectory().lookup(LogicalFileName, udesc, true);
-        if (df)
-        {
-            if (returnStr.length() > 0)
-                returnStr.appendf(",%s", LogicalFileName);
-            else
-                returnStr.appendf("%s", LogicalFileName);
-            return false;
-        }
-    }
-    else
-        DBGLOG("Unknown Action type:%s\n",ActionType);
-    
-    return true;
-}
-
 bool CWsDfuEx::onDFUDefFile(IEspContext &context,IEspDFUDefFileRequest &req, IEspDFUDefFileResponse &resp)
 {
     try

+ 0 - 2
esp/services/ws_dfu/ws_dfuService.hpp

@@ -109,10 +109,8 @@ private:
     void getAPageOfSortedLogicalFile(IEspContext &context, IUserDescriptor* udesc, IEspDFUQueryRequest & req, IEspDFUQueryResponse & resp);
     void getDefFile(IUserDescriptor* udesc, const char* FileName,StringBuffer& returnStr);
     void xsltTransformer(const char* xsltPath,StringBuffer& source,StringBuffer& returnStr);
-    bool onDFUAction(IUserDescriptor* udesc, const char* LogicalFileName, const char* ClusterName, const char* ActionType, StringBuffer& returnStr);
     bool checkFileContent(IEspContext &context, IUserDescriptor* udesc, const char * logicalName, const char * cluster);
     void getRoxieClusterConfig(char const * clusterType, char const * clusterName, char const * processName, StringBuffer& netAddress, int& port);
-    //bool getRoxieQueriesForFile(const char* logicalName, const char* cluster, StringArray& roxieQueries);
     bool checkRoxieQueryFilesOnDelete(IEspDFUArrayActionRequest &req, StringArray& roxieQueries);
     bool DFUDeleteFiles(IEspContext &context, IEspDFUArrayActionRequest &req, IEspDFUArrayActionResponse &resp);
 

+ 73 - 173
esp/services/ws_fs/ws_fsService.cpp

@@ -1531,6 +1531,9 @@ bool markWUFailed(IDFUWorkUnitFactory *f, const char *wuid)
     return false;
 }
 
+static unsigned NumOfDFUWUActionNames = 5;
+static const char *DFUWUActionNames[] = { "Delete", "Protect" , "Unprotect" , "Restore" , "SetToFailed" };
+
 bool CFileSprayEx::onDFUWorkunitsAction(IEspContext &context, IEspDFUWorkunitsActionRequest &req, IEspDFUWorkunitsActionResponse &resp)
 {
     try
@@ -1538,49 +1541,22 @@ bool CFileSprayEx::onDFUWorkunitsAction(IEspContext &context, IEspDFUWorkunitsAc
         if (!context.validateFeatureAccess(DFU_WU_URL, SecAccess_Write, false))
             throw MakeStringException(ECLWATCH_DFU_WU_ACCESS_DENIED, "Failed to update DFU workunit. Permission denied.");
 
-        bool bAllSuccess = true;
-        IArrayOf<IEspDFUActionResult> results;
-        const char* action = req.getType();
-        if(!action || !*action || !strcmp(action, "Delete"))
-        {
-            Owned<IDFUWorkUnitFactory> factory = getDFUWorkUnitFactory();
-            StringArray & wuids = req.getWuids();
-            for(unsigned i = 0; i < wuids.ordinality(); ++i)
-            {
-                Owned<IEspDFUActionResult> res = createDFUActionResult("", "");
-                res->setID(wuids.item(i));
-                res->setAction("Delete");
-                res->setResult("Success");
-
-                try
-                {
-                    if (markWUFailed(factory, wuids.item(i)))
-                    {
-                        if (!factory->deleteWorkUnit(wuids.item(i)))
-                            throw MakeStringException(ECLWATCH_CANNOT_DELETE_WORKUNIT, "Failed in deleting workunit %s.", wuids.item(i));
-                    }
-                }
-                catch (IException *e)
-                {
-                    bAllSuccess = false;
-                    StringBuffer eMsg;
-                    eMsg = e->errorMessage(eMsg);
-                    e->Release();
+        CDFUWUActions action = req.getType();
+        if (action == DFUWUActions_Undefined)
+            throw MakeStringException(ECLWATCH_INVALID_INPUT, "Action not defined.");
 
-                    StringBuffer failedMsg = "Failed: ";
-                    failedMsg.append(eMsg);
-                    res->setResult(failedMsg.str());
-                }
+        StringArray& wuids = req.getWuids();
+        if (!wuids.ordinality())
+            throw MakeStringException(ECLWATCH_INVALID_INPUT, "Workunit not defined.");
 
-                results.append(*res.getLink());
-            }
-        }
-        else if (!strcmp(action, "Restore"))
+        Owned<INode> node;
+        Owned<ISashaCommand> cmd;
+        StringBuffer sashaAddress;
+        if (action == CDFUWUActions_Restore)
         {
-            StringBuffer sashaAddress;
             IArrayOf<IConstTpSashaServer> sashaservers;
             CTpWrapper dummy;
-            dummy.getTpSashaServers(sashaservers);  
+            dummy.getTpSashaServers(sashaservers);
             ForEachItemIn(i, sashaservers)
             {
                 IConstTpSashaServer& sashaserver = sashaservers.item(i);
@@ -1593,155 +1569,79 @@ bool CFileSprayEx::onDFUWorkunitsAction(IEspContext &context, IEspDFUWorkunitsAc
             }
 
             SocketEndpoint ep(sashaAddress.str(), DEFAULT_SASHA_PORT);
-            Owned<INode> node = createINode(ep);
-            Owned<ISashaCommand> cmd = createSashaCommand();
+            node.setown(createINode(ep));
+            cmd.setown(createSashaCommand());
             cmd->setAction(SCA_RESTORE);
-            cmd->setDFU(true);  
-
-            StringArray & wuids = req.getWuids();
-            for(unsigned ii = 0; ii < wuids.ordinality(); ++ii)
-            {
-                StringBuffer msg;
-                const char *wuid = wuids.item(ii);
-                cmd->addId(wuid);
-
-                if (!cmd->send(node,1*60*1000)) 
-                {
-                    throw MakeStringException(ECLWATCH_CANNOT_CONNECT_ARCHIVE_SERVER,"Cannot connect to archive server at %s.",sashaAddress.str());
-                }
-                if (cmd->numIds()==0) 
-                {
-                    bAllSuccess = false;
-
-                    msg.appendf("Restore failed for %s", wuid);
-                }
-                else
-                {
-                    StringBuffer reply;
-                    cmd->getId(0,reply);
-                    msg.appendf("Restore: %s, reply: %s", wuid, reply.str());
-                }
-
-                Owned<IEspDFUActionResult> res = createDFUActionResult("", "");
-                res->setID(wuid);
-                res->setAction("Restore");
-                res->setResult(msg.str());
-
-                results.append(*res.getLink());
-            }
+            cmd->setDFU(true);
         }
-        else if(!strcmp(action, "Protect"))
-        {
-            Owned<IDFUWorkUnitFactory> factory = getDFUWorkUnitFactory();
-            StringArray & wuids = req.getWuids();
-            for(unsigned i = 0; i < wuids.ordinality(); ++i)
-            {
-                Owned<IEspDFUActionResult> res = createDFUActionResult("", "");
-                res->setID(wuids.item(i));
-                res->setAction("Protect");
-                res->setResult("Success");
-
-                try
-                {
-                    Owned<IDFUWorkUnitFactory> factory = getDFUWorkUnitFactory();
-                    Owned<IDFUWorkUnit> wu = factory->updateWorkUnit(wuids.item(i));
-                    if(!wu.get())
-                        continue;
-
-                    wu->protect(true);
-                    wu->commit();
-                }
-                catch (IException *e)
-                {
-                    bAllSuccess = false;
-                    StringBuffer eMsg;
-                    eMsg = e->errorMessage(eMsg);
-                    e->Release();
 
-                    StringBuffer failedMsg = "Failed: ";
-                    failedMsg.append(eMsg);
-                    res->setResult(failedMsg.str());
-                }
-
-                results.append(*res.getLink());
-            }
-        }
-        else if(!strcmp(action, "Unprotect"))
+        IArrayOf<IEspDFUActionResult> results;
+        Owned<IDFUWorkUnitFactory> factory = getDFUWorkUnitFactory();
+        for(unsigned i = 0; i < wuids.ordinality(); ++i)
         {
-            Owned<IDFUWorkUnitFactory> factory = getDFUWorkUnitFactory();
-            StringArray & wuids = req.getWuids();
-            for(unsigned i = 0; i < wuids.ordinality(); ++i)
-            {
-                Owned<IEspDFUActionResult> res = createDFUActionResult("", "");
-                res->setID(wuids.item(i));
-                res->setAction("Unprotect");
-                res->setResult("Success");
-
-                try
-                {
-                    Owned<IDFUWorkUnitFactory> factory = getDFUWorkUnitFactory();
-                    Owned<IDFUWorkUnit> wu = factory->updateWorkUnit(wuids.item(i));
-                    if(!wu.get())
-                        continue;
-
-                    wu->protect(false);
-                    wu->commit();
-                }
-                catch (IException *e)
-                {
-                    bAllSuccess = false;
-                    StringBuffer eMsg;
-                    eMsg = e->errorMessage(eMsg);
-                    e->Release();
+            const char* wuid = wuids.item(i);
 
-                    StringBuffer failedMsg = "Failed: ";
-                    failedMsg.append(eMsg);
-                    res->setResult(failedMsg.str());
-                }
+            Owned<IEspDFUActionResult> res = createDFUActionResult("", "");
+            res->setID(wuid);
+            res->setAction((action < NumOfDFUWUActionNames) ? DFUWUActionNames[action] : "Unknown");
 
-                results.append(*res.getLink());
-            }
-        }
-        else if(!strcmp(action, "SetToFailed"))
-        {
-            Owned<IDFUWorkUnitFactory> factory = getDFUWorkUnitFactory();
-            StringArray & wuids = req.getWuids();
-            for(unsigned i = 0; i < wuids.ordinality(); ++i)
+            try
             {
-                Owned<IEspDFUActionResult> res = createDFUActionResult("", "");
-                res->setID(wuids.item(i));
-                res->setAction("SetToFailed");
-                res->setResult("Success");
-
-                try
+                switch (action)
                 {
-                    Owned<IDFUWorkUnit> wu = factory->updateWorkUnit(wuids.item(i));
-                    if(wu)
+                case CDFUWUActions_Delete:
+                    if (!markWUFailed(factory, wuid))
+                        throw MakeStringException(ECLWATCH_CANNOT_DELETE_WORKUNIT, "Failed to mark workunit failed.");
+                    if (!factory->deleteWorkUnit(wuid))
+                        throw MakeStringException(ECLWATCH_CANNOT_DELETE_WORKUNIT, "Failed in deleting workunit.");
+                    res->setResult("Success");
+                    break;
+                case CDFUWUActions_Restore:
+                    cmd->addId(wuid);
+                    if (!cmd->send(node,1*60*1000))
+                        throw MakeStringException(ECLWATCH_CANNOT_CONNECT_ARCHIVE_SERVER,"Cannot connect to archive server at %s.",sashaAddress.str());
+                    {
+                        StringBuffer reply = "Restore ID: ";
+                        if (!cmd->getId(0, reply))
+                            throw MakeStringException(ECLWATCH_CANNOT_UPDATE_WORKUNIT, "Failed to get ID.");
+                        res->setResult(reply.str());
+                    }
+                    break;
+                case CDFUWUActions_Protect:
+                case CDFUWUActions_Unprotect:
+                case CDFUWUActions_SetToFailed:
+                    Owned<IDFUWorkUnit> wu = factory->updateWorkUnit(wuid);
+                    if(!wu.get())
+                        throw MakeStringException(ECLWATCH_CANNOT_UPDATE_WORKUNIT, "Failed in calling updateWorkUnit().");
+                    switch (action)
                     {
+                    case CDFUWUActions_Protect:
+                        wu->protect(true);
+                        break;
+                    case CDFUWUActions_Unprotect:
+                        wu->protect(false);
+                        break;
+                    case CDFUWUActions_SetToFailed:
                         IDFUprogress *prog = wu->queryUpdateProgress();
-                        if (prog)
-                        {
-                            prog->setState(DFUstate_failed);
-                            wu->commit();
-                        }
+                        if (!prog)
+                            throw MakeStringException(ECLWATCH_CANNOT_UPDATE_WORKUNIT, "Failed in calling queryUpdateProgress().");
+                        prog->setState(DFUstate_failed);
+                        break;
                     }
+                    wu->commit();
+                    res->setResult("Success");
+                    break;
                 }
-                catch (IException *e)
-                {
-                    bAllSuccess = false;
-                    StringBuffer eMsg;
-                    eMsg = e->errorMessage(eMsg);
-                    e->Release();
-
-                    StringBuffer failedMsg = "Failed: ";
-                    failedMsg.append(eMsg);
-                    res->setResult(failedMsg.str());
-                }
-                results.append(*res.getLink());
             }
+            catch (IException *e)
+            {
+                StringBuffer eMsg, failedMsg("Failed: ");
+                res->setResult(failedMsg.append(e->errorMessage(eMsg)).str());
+                e->Release();
+            }
+
+            results.append(*res.getLink());
         }
-        else
-            throw MakeStringException(ECLWATCH_INVALID_ACTION, "Unknown action type %s", action);
 
         resp.setDFUActionResults(results);
     }

+ 34 - 130
esp/services/ws_workunits/ws_workunitsService.cpp

@@ -70,84 +70,16 @@ public:
     StringAttr query;
 };
 
-typedef enum _WuActionType
-{
-    ActionDelete=0,
-    ActionProtect,
-    ActionAbort,
-    ActionRestore,
-    ActionEventSchedule,
-    ActionEventDeschedule,
-    ActionChangeState,
-    ActionPause,
-    ActionPauseNow,
-    ActionResume,
-    ActionUnknown
-} WsWuActionType;
-
-void setActionResult(const char* wuid, int action, const char* result, StringBuffer& strAction, IArrayOf<IConstWUActionResult>* results)
+static unsigned NumOfECLWUActionNames = 11;
+static const char *ECLWUActionNames[] = { "Abort", "Delete", "EventDeschedule", "Pause", "PauseNow" ,
+        "Protect" , "Unprotect" , "EventReschedule" , "Restore" , "Resume" , "SetToFailed" };
+
+void setActionResult(const char* wuid, CECLWUActions action, const char* result, StringBuffer& strAction, IArrayOf<IConstWUActionResult>* results)
 {
     if (!results || !wuid || !*wuid || !result || !*result)
         return;
 
-    switch(action)
-    {
-    case ActionDelete:
-    {
-        strAction = "Delete";
-        break;
-    }
-    case ActionProtect:
-    {
-        strAction = "Protect";
-        break;
-    }
-    case ActionAbort:
-    {
-        strAction = "Abort";
-        break;
-    }
-    case ActionRestore:
-    {
-        strAction = "Restore";
-        break;
-    }
-    case ActionEventSchedule:
-    {
-        strAction = "EventSchedule";
-        break;
-    }
-    case ActionEventDeschedule:
-    {
-        strAction = "EventDeschedule";
-        break;
-    }
-    case ActionChangeState:
-    {
-        strAction = "ChangeState";
-        break;
-    }
-    case ActionPause:
-    {
-        strAction = "Pause";
-        break;
-    }
-    case ActionPauseNow:
-    {
-        strAction = "PauseNow";
-        break;
-    }
-    case ActionResume:
-    {
-        strAction = "Resume";
-        break;
-    }
-    default:
-    {
-        strAction = "Unknown";
-        break;
-    }
-    }
+    strAction = (action < NumOfECLWUActionNames) ? ECLWUActionNames[action] : "Unknown";
 
     Owned<IEspWUActionResult> res = createWUActionResult("", "");
     res->setWuid(wuid);
@@ -156,7 +88,7 @@ void setActionResult(const char* wuid, int action, const char* result, StringBuf
     results->append(*res.getClear());
 }
 
-bool doAction(IEspContext& context, StringArray& wuids, int action, IProperties* params, IArrayOf<IConstWUActionResult>* results)
+bool doAction(IEspContext& context, StringArray& wuids, CECLWUActions action, IProperties* params, IArrayOf<IConstWUActionResult>* results)
 {
     if (!wuids.length())
         return true;
@@ -180,11 +112,11 @@ bool doAction(IEspContext& context, StringArray& wuids, int action, IProperties*
             if (!looksLikeAWuid(wuid, 'W'))
                 throw MakeStringException(ECLWATCH_INVALID_INPUT, "Invalid Workunit ID: %s", wuid);
 
-            if ((action == ActionRestore) || (action == ActionEventDeschedule))
+            if ((action == CECLWUActions_Restore) || (action == CECLWUActions_EventDeschedule))
             {
                 switch(action)
                 {
-                case ActionRestore:
+                case CECLWUActions_Restore:
                 {
                     SocketEndpoint ep;
                     if (params->hasProp("sashaServerIP"))
@@ -214,7 +146,7 @@ bool doAction(IEspContext& context, StringArray& wuids, int action, IProperties*
                     ensureWsWorkunitAccess(context, wuid, SecAccess_Write);
                     break;
                 }
-                case ActionEventDeschedule:
+                case CECLWUActions_EventDeschedule:
                     if (!context.validateFeatureAccess(OWN_WU_ACCESS, SecAccess_Full, false)
                         || !context.validateFeatureAccess(OTHERS_WU_ACCESS, SecAccess_Full, false))
                         ensureWsWorkunitAccess(context, wuid, SecAccess_Full);
@@ -230,33 +162,33 @@ bool doAction(IEspContext& context, StringArray& wuids, int action, IProperties*
                 if(!cw)
                     throw MakeStringException(ECLWATCH_CANNOT_OPEN_WORKUNIT,"Cannot open workunit %s.",wuid);
 
-                if ((action == ActionDelete) && (cw->getState() == WUStateWait))
+                if ((action == CECLWUActions_Delete) && (cw->getState() == WUStateWait))
                     throw MakeStringException(ECLWATCH_CANNOT_DELETE_WORKUNIT,"Cannot delete a workunit which is in a 'Wait' status.");
 
                 switch(action)
                 {
-                case ActionPause:
+                case CECLWUActions_Pause:
                 {
                     ensureWsWorkunitAccess(context, *cw, SecAccess_Full);
                     WorkunitUpdate wu(&cw->lock());
                     wu->setAction(WUActionPause);
                     break;
                 }
-                case ActionPauseNow:
+                case CECLWUActions_PauseNow:
                 {
                     ensureWsWorkunitAccess(context, *cw, SecAccess_Full);
                     WorkunitUpdate wu(&cw->lock());
                     wu->setAction(WUActionPauseNow);
-                   break;
+                    break;
                 }
-                case ActionResume:
+                case CECLWUActions_Resume:
                 {
                     ensureWsWorkunitAccess(context, *cw, SecAccess_Full);
                     WorkunitUpdate wu(&cw->lock());
                     wu->setAction(WUActionResume);
-                   break;
+                    break;
                 }
-                case ActionDelete:
+                case CECLWUActions_Delete:
                     ensureWsWorkunitAccess(context, *cw, SecAccess_Full);
                     {
                         cw.clear();
@@ -264,7 +196,7 @@ bool doAction(IEspContext& context, StringArray& wuids, int action, IProperties*
                         AuditSystemAccess(context.queryUserId(), true, "Deleted %s", wuid);
                     }
                     break;
-                case ActionAbort:
+                case CECLWUActions_Abort:
                     ensureWsWorkunitAccess(context, *cw, SecAccess_Full);
                     {
                         if (cw->getState() == WUStateWait)
@@ -278,25 +210,19 @@ bool doAction(IEspContext& context, StringArray& wuids, int action, IProperties*
                         AuditSystemAccess(context.queryUserId(), true, "Aborted %s", wuid);
                     }
                     break;
-                case ActionProtect:
-                    cw->protect(!params || params->getPropBool("Protect",true));
+                case CECLWUActions_Protect:
+                case CECLWUActions_Unprotect:
+                    cw->protect((action == CECLWUActions_Protect) ? true:false);
                     AuditSystemAccess(context.queryUserId(), true, "Updated %s", wuid);
                     break;
-                case ActionChangeState:
+                case CECLWUActions_SetToFailed:
                     {
-                        if (params)
-                        {
-                            WUState state = (WUState) params->getPropInt("State");
-                            if (state > WUStateUnknown && state < WUStateSize)
-                            {
-                                WorkunitUpdate wu(&cw->lock());
-                                wu->setState(state);
-                                AuditSystemAccess(context.queryUserId(), true, "Updated %s", wuid);
-                            }
-                        }
+                        WorkunitUpdate wu(&cw->lock());
+                        wu->setState(WUStateFailed);
+                        AuditSystemAccess(context.queryUserId(), true, "Updated %s", wuid);
                     }
                     break;
-                case ActionEventSchedule:
+                case CECLWUActions_EventReschedule:
                     {
                         WorkunitUpdate wu(&cw->lock());
                         wu->schedule();
@@ -382,8 +308,6 @@ static void checkUpdateQuerysetLibraries()
     }
 }
 
-MapStringTo<int> wuActionTable;
-
 void CWsWorkunitsEx::init(IPropertyTree *cfg, const char *process, const char *service)
 {
     if (!daliClientActive())
@@ -411,18 +335,6 @@ void CWsWorkunitsEx::init(IPropertyTree *cfg, const char *process, const char *s
             envLocalAddress.append(*finger++);
     }
 
-    wuActionTable.setValue("delete", ActionDelete);
-    wuActionTable.setValue("abort", ActionAbort);
-    wuActionTable.setValue("pausenow", ActionPauseNow);
-    wuActionTable.setValue("pause", ActionPause);
-    wuActionTable.setValue("resume", ActionResume);
-    wuActionTable.setValue("protect", ActionProtect);
-    wuActionTable.setValue("unprotect", ActionProtect);
-    wuActionTable.setValue("restore", ActionRestore);
-    wuActionTable.setValue("reschedule", ActionEventSchedule);
-    wuActionTable.setValue("deschedule", ActionEventDeschedule);
-    wuActionTable.setValue("settofailed", ActionChangeState);
-
     awusCacheMinutes = AWUS_CACHE_MIN_DEFAULT;
     VStringBuffer xpath("Software/EspProcess[@name=\"%s\"]/EspService[@name=\"%s\"]/AWUsCacheMinutes", process, service);
     cfg->getPropInt(xpath.str(), awusCacheMinutes);
@@ -704,28 +616,20 @@ bool CWsWorkunitsEx::onWUAction(IEspContext &context, IEspWUActionRequest &req,
 {
     try
     {
-        StringBuffer sAction(req.getActionType());
-        if (!sAction.length())
+        CECLWUActions action = req.getActionType();
+        if (action == ECLWUActions_Undefined)
             throw MakeStringException(ECLWATCH_INVALID_INPUT,"Action not defined.");
 
-        int *action=wuActionTable.getValue(sAction.toLowerCase().str());
-        if (!action)
-            throw MakeStringException(ECLWATCH_INVALID_INPUT,"Invalid Action '%s'.", sAction.str());
-
         Owned<IProperties> params = createProperties(true);
         params->setProp("BlockTillFinishTimer", req.getBlockTillFinishTimer());
-        if (*action==ActionProtect)
-            params->setProp("Protect", streq(sAction.str(), "protect"));
-        if (*action==ActionChangeState && streq(sAction.str(), "settofailed"))
-            params->setProp("State",4);
-        if ((*action==ActionRestore) && !sashaServerIp.isEmpty())
+        if ((action == CECLWUActions_Restore) && !sashaServerIp.isEmpty())
         {
             params->setProp("sashaServerIP", sashaServerIp.get());
             params->setProp("sashaServerPort", sashaServerPort);
         }
 
         IArrayOf<IConstWUActionResult> results;
-        if (doAction(context, req.getWuids(), *action, params, &results) && *action!=ActionDelete && checkRedirect(context))
+        if (doAction(context, req.getWuids(), action, params, &results) && (action != CECLWUActions_Delete) && checkRedirect(context))
         {
             StringBuffer redirect;
             if(req.getPageFrom() && strieq(req.getPageFrom(), "wuid"))
@@ -773,7 +677,7 @@ bool CWsWorkunitsEx::onWUDelete(IEspContext &context, IEspWUDeleteRequest &req,
         Owned<IProperties> params = createProperties(true);
         params->setProp("BlockTillFinishTimer", req.getBlockTillFinishTimer());
 
-        if (!doAction(context,req.getWuids(), ActionDelete, params, &results))
+        if (!doAction(context,req.getWuids(), CECLWUActions_Delete, params, &results))
             resp.setActionResults(results);
     }
     catch(IException* e)
@@ -790,7 +694,7 @@ bool CWsWorkunitsEx::onWUAbort(IEspContext &context, IEspWUAbortRequest &req, IE
         IArrayOf<IConstWUActionResult> results;
         Owned<IProperties> params = createProperties(true);
         params->setProp("BlockTillFinishTimer", req.getBlockTillFinishTimer());
-        if (!doAction(context,req.getWuids(), ActionAbort, params, &results))
+        if (!doAction(context,req.getWuids(), CECLWUActions_Abort, params, &results))
             resp.setActionResults(results);
     }
     catch(IException* e)
@@ -806,10 +710,10 @@ bool CWsWorkunitsEx::onWUProtect(IEspContext &context, IEspWUProtectRequest &req
     {
         IArrayOf<IConstWUActionResult> results;
         Owned<IProperties> params(createProperties(true));
-        params->setProp("Protect", req.getProtect());
         params->setProp("BlockTillFinishTimer", 0);
 
-        if (!doAction(context,req.getWuids(), ActionProtect, params, &results))
+        CECLWUActions action = req.getProtect() ? CECLWUActions_Protect : CECLWUActions_Unprotect;
+        if (!doAction(context,req.getWuids(), action, params, &results))
             resp.setActionResults(results);
     }
     catch(IException* e)