public string wmDeleteTaskParam(string sType, string sID, string sParamID) { dataAccess dc = new dataAccess(); acUI.acUI ui = new acUI.acUI(); FunctionTemplates.HTMLTemplates ft = new FunctionTemplates.HTMLTemplates(); string sErr = ""; string sSQL = ""; string sTable = ""; if (sType == "ecosystem") sTable = "ecosystem"; else if (sType == "task") sTable = "task"; if (!string.IsNullOrEmpty(sParamID) && ui.IsGUID(sID)) { // need the name and values for logging string sXML = ""; sSQL = "select parameter_xml" + " from " + sTable + " where " + sType + "_id = '" + sID + "'"; if (!dc.sqlGetSingleString(ref sXML, sSQL, ref sErr)) throw new Exception("Unable to get parameter_xml. " + sErr); if (sXML != "") { XDocument xd = XDocument.Parse(sXML); if (xd == null) throw new Exception("XML parameter data is invalid."); XElement xName = xd.XPathSelectElement("//parameter[@id = \"" + sParamID + "\"]/name"); string sName = (xName == null ? "" : xName.Value); XElement xValues = xd.XPathSelectElement("//parameter[@id = \"" + sParamID + "\"]/values"); string sValues = (xValues == null ? "" : xValues.ToString()); // add security log ui.WriteObjectDeleteLog(Globals.acObjectTypes.Parameter, "", sID, ""); if (sType == "task") { ui.WriteObjectChangeLog(Globals.acObjectTypes.Task, sID, "Deleted Parameter:[" + sName + "]", sValues); }; if (sType == "ecosystem") { ui.WriteObjectChangeLog(Globals.acObjectTypes.Ecosystem, sID, "Deleted Parameter:[" + sName + "]", sValues); }; } //do the whack ft.RemoveNodeFromXMLColumn(sTable, "parameter_xml", sType + "_id = '" + sID + "'", "//parameter[@id = \"" + sParamID + "\"]"); return ""; } else { throw new Exception("Invalid or missing Task or Parameter ID."); } }
public string wmUpdateTaskParam(string sType, string sID, string sParamID, string sName, string sDesc, string sRequired, string sPrompt, string sEncrypt, string sPresentAs, string sValues) { dataAccess dc = new dataAccess(); acUI.acUI ui = new acUI.acUI(); FunctionTemplates.HTMLTemplates ft = new FunctionTemplates.HTMLTemplates(); if (!ui.IsGUID(sID)) throw new Exception("Invalid or missing ID."); string sErr = ""; string sSQL = ""; //we encoded this in javascript before the ajax call. //the safest way to unencode it is to use the same javascript lib. //(sometimes the javascript and .net libs don't translate exactly, google it.) sDesc = ui.unpackJSON(sDesc).Trim(); //normalize and clean the values sRequired = (dc.IsTrue(sRequired) ? "true" : "false"); sPrompt = (dc.IsTrue(sPrompt) ? "true" : "false"); sEncrypt = (dc.IsTrue(sEncrypt) ? "true" : "false"); sName = sName.Trim().Replace("'", "''"); string sTable = ""; string sXML = ""; string sParameterXPath = "//parameter[@id = \"" + sParamID + "\"]"; //using this to keep the code below cleaner. if (sType == "ecosystem") sTable = "ecosystem"; else if (sType == "task") sTable = "task"; bool bParamAdd = false; //bool bParamUpdate = false; //if sParamID is empty, we are adding if (string.IsNullOrEmpty(sParamID)) { sParamID = "p_" + ui.NewGUID(); sParameterXPath = "//parameter[@id = \"" + sParamID + "\"]"; //reset this if we had to get a new id //does the task already have parameters? sSQL = "select parameter_xml from " + sTable + " where " + sType + "_id = '" + sID + "'"; if (!dc.sqlGetSingleString(ref sXML, sSQL, ref sErr)) throw new Exception(sErr); string sAddXML = "<parameter id=\"" + sParamID + "\" required=\"" + sRequired + "\" prompt=\"" + sPrompt + "\" encrypt=\"" + sEncrypt + "\">" + "<name>" + sName + "</name>" + "<desc>" + sDesc + "</desc>" + "</parameter>"; if (string.IsNullOrEmpty(sXML)) { //XML doesn't exist at all, add it to the record sAddXML = "<parameters>" + sAddXML + "</parameters>"; sSQL = "update " + sTable + " set " + " parameter_xml = '" + sAddXML + "'" + " where " + sType + "_id = '" + sID + "'"; if (!dc.sqlExecuteUpdate(sSQL, ref sErr)) throw new Exception(sErr); bParamAdd = true; } else { //XML exists, add the node to it ft.AddNodeToXMLColumn(sTable, "parameter_xml", sType + "_id = '" + sID + "'", "//parameters", sAddXML); bParamAdd = true; } } else { //update the node values ft.SetNodeValueinXMLColumn(sTable, "parameter_xml", sType + "_id = '" + sID + "'", sParameterXPath + "/name", sName); ft.SetNodeValueinXMLColumn(sTable, "parameter_xml", sType + "_id = '" + sID + "'", sParameterXPath + "/desc", sDesc); //and the attributes ft.SetNodeAttributeinXMLColumn(sTable, "parameter_xml", sType + "_id = '" + sID + "'", sParameterXPath, "required", sRequired); ft.SetNodeAttributeinXMLColumn(sTable, "parameter_xml", sType + "_id = '" + sID + "'", sParameterXPath, "prompt", sPrompt); ft.SetNodeAttributeinXMLColumn(sTable, "parameter_xml", sType + "_id = '" + sID + "'", sParameterXPath, "encrypt", sEncrypt); bParamAdd = false; } // not clean at all handling both tasks and ecosystems in the same method, but whatever. if (bParamAdd) { if (sType == "task") { ui.WriteObjectAddLog(Globals.acObjectTypes.Task, sID, "Parameter", "Added Parameter:" + sName ); }; if (sType == "ecosystem") { ui.WriteObjectAddLog(Globals.acObjectTypes.Ecosystem, sID, "Parameter", "Added Parameter:" + sName); }; } else { // would be a lot of trouble to add the from to, why is it needed you have each value in the log, just scroll back // so just add a changed message to the log if (sType == "task") { dc.addSecurityLog(ui.GetSessionUserID(), Globals.SecurityLogTypes.Object, Globals.SecurityLogActions.ObjectModify, Globals.acObjectTypes.Task, sID, "Parameter Changed:[" + sName + "]", ref sErr); }; if (sType == "ecosystem") { dc.addSecurityLog(ui.GetSessionUserID(), Globals.SecurityLogTypes.Object, Globals.SecurityLogActions.ObjectModify, Globals.acObjectTypes.Ecosystem, sID, "Parameter Changed:[" + sName + "]", ref sErr); }; } //update the values string[] aValues = sValues.Split('|'); string sValueXML = ""; foreach (string sVal in aValues) { string sReadyValue = ""; //if encrypt is true we MIGHT want to encrypt this value. //but it might simply be a resubmit of an existing value in which case we DON'T //if it has oev: as a prefix, it needs no additional work if (dc.IsTrue(sEncrypt)) { if (sVal.IndexOf("oev:") > -1) sReadyValue = sVal.Replace("oev:", ""); else sReadyValue = dc.EnCrypt(ui.unpackJSON(sVal)); } else { sReadyValue = ui.unpackJSON(sVal); } sValueXML += "<value id=\"pv_" + ui.NewGUID() + "\">" + sReadyValue + "</value>"; } sValueXML = "<values present_as=\"" + sPresentAs + "\">" + sValueXML + "</values>"; //whack-n-add ft.RemoveNodeFromXMLColumn(sTable, "parameter_xml", sType + "_id = '" + sID + "'", sParameterXPath + "/values"); ft.AddNodeToXMLColumn(sTable, "parameter_xml", sType + "_id = '" + sID + "'", sParameterXPath, sValueXML); return ""; }
public void wmFnNodeArrayRemove(string sStepID, string sXPathToDelete) { FunctionTemplates.HTMLTemplates ft = new FunctionTemplates.HTMLTemplates(); try { //string sErr = ""; ////gotta have a valid index //if (iIndex < 1) // throw new Exception("Unable to modify step. Invalid index."); if (sStepID.Length > 0) { if (sXPathToDelete != "") { ////so, let's get the XML for this step... //string sXML = ft.GetStepCommandXML(sStepID, ref sErr); //if (sErr != "") throw new Exception(sErr); string sNodeToRemove = "//" + sXPathToDelete; //validate it //XDocument xd = XDocument.Parse(sXML); //if (xd == null) throw new Exception("Error: Unable to parse Function XML."); ft.RemoveNodeFromXMLColumn("task_step", "function_xml", "step_id = '" + sStepID + "'", sNodeToRemove); } } } catch (Exception ex) { throw ex; } }
public string wmGetMergedParameterXML(string sType, string sID, string sEcosystemID) { dataAccess dc = new dataAccess(); acUI.acUI ui = new acUI.acUI(); taskMethods tm = new taskMethods(); FunctionTemplates.HTMLTemplates ft = new FunctionTemplates.HTMLTemplates(); if (string.IsNullOrEmpty(sID)) throw new Exception("ID required to look up default Parameter values."); string sErr = ""; //what is the task associated with this action? //and get the XML for it string sSQL = ""; string sDefaultsXML = ""; string sTaskID = ""; if (sType == "action") { sDefaultsXML = tm.wmGetObjectParameterXML(sType, sID, ""); sSQL = "select t.task_id" + " from ecotemplate_action ea" + " join task t on ea.original_task_id = t.original_task_id" + " and t.default_version = 1" + " where ea.action_id = '" + sID + "'"; } else if (sType == "instance") { sDefaultsXML = tm.wmGetObjectParameterXML(sType, sID, sEcosystemID); //IMPORTANT!!! if the ID is not a guid, it's a specific instance ID, and we'll need to get the task_id //but if it is a GUID, but the type is "instance", taht means the most recent INSTANCE for this TASK_ID if (ui.IsGUID(sID)) sTaskID = sID; else sSQL = "select task_id" + " from task_instance" + " where task_instance = '" + sID + "'"; } else if (sType == "plan") { sDefaultsXML = tm.wmGetObjectParameterXML(sType, sID, ""); sSQL = "select task_id" + " from action_plan" + " where plan_id = '" + sID + "'"; } else if (sType == "schedule") { sDefaultsXML = tm.wmGetObjectParameterXML(sType, sID, ""); sSQL = "select task_id" + " from action_schedule" + " where schedule_id = '" + sID + "'"; } //if we didn't get a task id directly, use the SQL to look it up if (string.IsNullOrEmpty(sTaskID)) if (!dc.sqlGetSingleString(ref sTaskID, sSQL, ref sErr)) throw new Exception(sErr); if (!ui.IsGUID(sTaskID)) throw new Exception("Unable to find Task ID for record."); XDocument xTPDoc = new XDocument(); XDocument xDefDoc = new XDocument(); //get the parameter XML from the TASK string sTaskParamXML = tm.wmGetParameterXML("task", sTaskID, ""); if (!string.IsNullOrEmpty(sTaskParamXML)) { xTPDoc = XDocument.Parse(sTaskParamXML); if (xTPDoc == null) throw new Exception("Task Parameter XML data is invalid."); XElement xTPParams = xTPDoc.XPathSelectElement("/parameters"); if (xTPParams == null) throw new Exception("Task Parameter XML data does not contain 'parameters' root node."); } //we populated this up above too if (!string.IsNullOrEmpty(sDefaultsXML)) { xDefDoc = XDocument.Parse(sDefaultsXML); if (xDefDoc == null) throw new Exception("Defaults XML data is invalid."); XElement xDefParams = xDefDoc.XPathSelectElement("/parameters"); if (xDefParams == null) throw new Exception("Defaults XML data does not contain 'parameters' root node."); } //spin the nodes in the DEFAULTS xml, then dig in to the task XML and UPDATE the value if found. //(if the node no longer exists, delete the node from the defaults xml IF IT WAS AN ACTION) //and default "values" take precedence over task values. foreach (XElement xDefault in xDefDoc.XPathSelectElements("//parameter")) { //nothing to do if it's empty if (xDefault == null) break; //look it up in the task param xml XElement xDefName = xDefault.XPathSelectElement("name"); string sDefName = (xDefName == null ? "" : xDefName.Value); XElement xDefValues = xDefault.XPathSelectElement("values"); //nothing to do if there is no values node... if (xDefValues == null) break; //or if it contains no values. if (!xDefValues.HasElements) break; //or if there is no parameter name if (string.IsNullOrEmpty(sDefName)) break; //so, we have some valid data in the defaults xml... let's merge! //we have the name of the parameter... go find it in the TASK param XML XElement xTaskParam = xTPDoc.XPathSelectElement("//parameter/name[. = '" + sDefName + "']/.."); //NOTE! the /.. gets the parent of the name node! //if it doesn't exist in the task params, remove it from this document, permanently //but only for action types... instance data is historical and can't be munged if (xTaskParam == null && sType == "action") { ft.RemoveNodeFromXMLColumn("ecotemplate_action", "parameter_defaults", "action_id = '" + sID + "'", "//parameter/name[. = '" + sDefName + "']/.."); continue; } //is this an encrypted parameter? string sEncrypt = ""; if (xTaskParam.Attribute("encrypt") != null) sEncrypt = xTaskParam.Attribute("encrypt").Value; //and the "values" collection will be the 'next' node XElement xTaskParamValues = xTaskParam.XPathSelectElement("values"); string sPresentAs = xTaskParamValues.Attribute("present_as").Value; if (sPresentAs == "dropdown") { //dropdowns get a "selected" indicator string sValueToSelect = xDefValues.XPathSelectElement("value").Value; //find the right one by value and give it the "selected" attribute. XElement xVal = xTaskParamValues.XPathSelectElement("value[. = '" + sValueToSelect + "']"); if (xVal != null) xVal.SetAttributeValue("selected", "true"); } else if (sPresentAs == "list") { //first, a list gets ALL the values replaced... xTaskParamValues.ReplaceNodes(xDefValues); } else { //IMPORTANT NOTE: //remember... both these XML documents came from wmGetObjectParameterXML... //so any encrypted data IS ALREADY OBFUSCATED and base64'd in the oev attribute. //it's a single value, so just replace it with the default. XElement xVal = xTaskParamValues.XPathSelectElement("value[1]"); if (xVal != null) { //if this is an encrypted parameter, we'll be replacing (if a default exists) the oev attribute //AND the value... don't want them to get out of sync! if (dc.IsTrue(sEncrypt)) { if (xDefValues.XPathSelectElement("value") != null) if (xDefValues.XPathSelectElement("value").Attribute("oev") != null) { xVal.SetAttributeValue("oev", xDefValues.XPathSelectElement("value").Attribute("oev").Value); xVal.Value = xDefValues.XPathSelectElement("value").Value; } } else { //not encrypted, just replace the value. if (xDefValues.XPathSelectElement("value") != null) xVal.Value = xDefValues.XPathSelectElement("value").Value; } } } } return xTPDoc.ToString(SaveOptions.DisableFormatting); ; }
public void wmDeleteRegistryNode(string sObjectID, string sXPath) { FunctionTemplates.HTMLTemplates ft = new FunctionTemplates.HTMLTemplates(); //fail on missing values if (string.IsNullOrEmpty(sXPath)) throw new Exception("Missing XPath to add to."); if (sObjectID == "global") sObjectID = "1"; ft.RemoveNodeFromXMLColumn("object_registry", "registry_xml", "object_id = '" + sObjectID + "'", sXPath); return; }