var batchEntrySpec = selection[i].getUserData("batchEntrySpec");\r
slcExecMessage.addBatchEntrySpec(batchEntrySpec);\r
}\r
- var req = org.argeo.slc.ria.SlcApi.getNewSlcExecutionService(\r
- agentUuid, slcExecMessage.toXml());\r
- req.send();\r
- // Force logs refresh right now!\r
- qx.event.Timer.once(function() {\r
- var command = org.argeo.ria.event.CommandsManager\r
- .getInstance().getCommandById("reloadlogs");\r
- if (command) {\r
- command.execute();\r
- }\r
- }, this, 2000);\r
+ try{\r
+ var xmlMessage = slcExecMessage.toXml();\r
+ var req = org.argeo.slc.ria.SlcApi.getNewSlcExecutionService(\r
+ agentUuid, xmlMessage);\r
+ req.send();\r
+ // Force logs refresh right now!\r
+ qx.event.Timer.once(function() {\r
+ var command = org.argeo.ria.event.CommandsManager\r
+ .getInstance().getCommandById("reloadlogs");\r
+ if (command) {\r
+ command.execute();\r
+ }\r
+ }, this, 2000);\r
+ }catch(e){\r
+ this.error(e); \r
+ }\r
},\r
\r
clearBatchForAgentId : function(agentId){\r
this.setEnabled(true);\r
break;\r
case "org.argeo.ria.components.PersistentTreeFolder" :\r
- if (item.getTree().getRoot() == item)\r
+ if (item.getTree() && item.getTree().getRoot() == item)\r
break;\r
this.setEnabled(true);\r
break;\r
case "org.argeo.ria.components.DynamicTreeFolder" :\r
- if (item.getTree().getRoot() == item)\r
+ if (item.getTree() && item.getTree().getRoot() == item)\r
break; \r
if (item.getState() == "loaded")\r
this.setEnabled(true);\r
},\r
command : null\r
},\r
+ "reloadfull" : {\r
+ label : "Reload Agents",\r
+ icon : "org.argeo.slc.ria/view-refresh.png",\r
+ shortcut : "control+h",\r
+ enabled : true,\r
+ menu : "Launcher",\r
+ toolbar : "list",\r
+ callback : function(e) {\r
+ this.rootNode.reload();\r
+ },\r
+ command : null\r
+ }, \r
"reloadtree" : {\r
- label : "Reload",\r
+ label : "Reload Node",\r
icon : "org.argeo.slc.ria/view-refresh.png",\r
- shortcut : "Control+m",\r
+ shortcut : null,\r
enabled : false,\r
- menu : "Launcher",\r
- toolbar : "launcher",\r
+ menu : null,\r
+ toolbar : null,\r
callback : function(e) {\r
if (this.tree.isSelectionEmpty()) { return; } \r
var selected = this.tree.getSelection()[0];\r
}\r
},\r
\r
- statics : {\r
+ statics : { \r
/**\r
* Static loader for the "agent" level (first level)\r
* \r
req.addListener("completed", function(response) {\r
var xmlDoc = response.getContent();\r
var nodes = org.argeo.ria.util.Element.selectNodes(xmlDoc,\r
- "//slc:slc-agent-descriptor");\r
+ "/slc:object-list/slc:slc-agent-descriptor");\r
var modulesLoader = org.argeo.slc.ria.FlowsSelectorView.modulesLoader;\r
\r
for (var i = 0; i < nodes.length; i++) {\r
agents[uuid] = host;\r
if(newAgents) newAgents[uuid] = host;\r
var agentFolder = new org.argeo.ria.components.DynamicTreeFolder(\r
- host + ' (' + uuid + ')', modulesLoader,\r
- "Loading Modules...", folder.getDragData());\r
+ host, modulesLoader, "Loading Modules...", folder.getDragData());\r
+ org.argeo.slc.ria.FlowsSelectorView.attachToolTip(agentFolder, uuid);\r
+ agentFolder.setPersistentTreeID(folder.getPersistentTreeID()+"_"+uuid);\r
agentFolder.setUserData("agentUuid", uuid);\r
agentFolder.setIcon("org.argeo.slc.ria/computer.png");\r
folder.add(agentFolder);\r
req.addListener("completed", function(response) {\r
var descriptors = org.argeo.ria.util.Element.selectNodes(\r
response.getContent(),\r
- "slc:object-list/slc:execution-module-descriptor");\r
+ "slc:object-list/" + org.argeo.slc.ria.execution.Module.XPATH_ROOT);\r
var mods = {};\r
for (var i = 0; i < descriptors.length; i++) {\r
- var name = org.argeo.ria.util.Element.getSingleNodeText(\r
- descriptors[i], "slc:name");\r
- var version = org.argeo.ria.util.Element.getSingleNodeText(\r
- descriptors[i], "slc:version");\r
+ var tmpModule = new org.argeo.slc.ria.execution.Module();\r
+ try{ \r
+ tmpModule.setXmlNode(descriptors[i]);\r
+ }catch(e){\r
+ qx.log.Logger.error(e);\r
+ }\r
+ var name = tmpModule.getName();\r
+ var version = tmpModule.getVersion();\r
if (!mods[name])\r
mods[name] = [];\r
- mods[name].push(version);\r
+ mods[name].push(tmpModule);\r
}\r
var flowLoader = org.argeo.slc.ria.FlowsSelectorView.flowLoader;\r
for (var key in mods) {\r
for (var i = 0; i < mods[key].length; i++) {\r
+ var module = mods[key][i];\r
var versionFolder = new org.argeo.ria.components.DynamicTreeFolder(\r
- key + ' (' + mods[key][i] + ')', flowLoader,\r
+ module.getDescription(), flowLoader,\r
"Loading Flows", folder.getDragData());\r
versionFolder.setUserData("moduleData", {\r
name : key,\r
- version : mods[key][i]\r
+ version : module.getVersion()\r
});\r
versionFolder.setIcon("org.argeo.slc.ria/archive.png");\r
versionFolder.setUserData("agentUuid", agentId);\r
+ org.argeo.slc.ria.FlowsSelectorView.attachToolTip(versionFolder, key + ' (' + module.getVersion() + ')');\r
// Warning, we must add it AFTER setting the user data, \r
// because of the persistent loading mechanism.\r
folder.add(versionFolder);\r
var execFlows = executionModule.getExecutionFlows();\r
for (var key in execFlows) {\r
var file = new qx.ui.tree.TreeFile(key);\r
+ if(execFlows[key].getDescription() != ""){\r
+ org.argeo.slc.ria.FlowsSelectorView.attachToolTip(file, execFlows[key].getDescription());\r
+ }\r
file.setIcon("org.argeo.slc.ria/system.png");\r
var path = execFlows[key].getPath();\r
file.setUserData("executionModule", executionModule);\r
req.send();\r
},\r
\r
+ attachToolTip : function(nodeItem, description){\r
+ var tt = new qx.ui.tooltip.ToolTip(description);\r
+ tt.setShowTimeout(0);\r
+ nodeItem.setToolTip(tt); \r
+ },\r
+ \r
/**\r
* Parse a string path and search if there is a root node.\r
* \r
var valueObj = values[key];\r
var hidden = valueObj.getHidden();\r
var type = valueObj.getSpecType();\r
- if(type == "primitive" && !hidden){\r
+ if((type == "primitive" || type== "ref")&& !hidden){\r
metadata = {\r
key : key,\r
disabled : valueObj.getFrozen(),\r
type : type,\r
- subType : valueObj.getSpecSubType() \r
+ subType : valueObj.getSpecSubType(),\r
+ refList : (type=="ref"?valueObj.getRefList():[])\r
}\r
data.push([key, valueObj.getValue(), metadata]);\r
}\r
var valuesXml = '';\r
var values = this.getValues();\r
for(var key in values){\r
+ if(values[key].getValue() == null){\r
+ throw new Error("Cannot send empty values! (Parameter "+key+")");\r
+ }\r
valuesXml += values[key].toValueXml();\r
}\r
- var execFlowDescXML = '<slc:execution-flow-descriptor name="'+this.getFlow().getName()+'" executionSpec="'+this.getName()+'"><slc:values>'+valuesXml+'</slc:values></slc:execution-flow-descriptor>';\r
+ var execFlowDescXML = '<slc:execution-flow-descriptor name="'+this.getFlow().getName()+'" executionSpec="'+this.getName()+'">';\r
+ if(this.getFlow().getDescription()!=""){\r
+ execFlowDescXML += '<slc:description>'+this.getFlow().getDescription()+'</slc:description>';\r
+ }\r
+ execFlowDescXML += '<slc:values>'+valuesXml+'</slc:values></slc:execution-flow-descriptor>';\r
\r
var execSpecDescXML = this.getOriginalSpec().toXml();\r
\r
- var moduleData = '<slc:module-name>'+this.getModule().getName()+'</slc:module-name><slc:module-version>'+this.getModule().getVersion()+'</slc:module-version>';\r
+ var moduleData = this.getModule().moduleDataToXml();\r
\r
return '<slc:realized-flow>'+moduleData + execFlowDescXML + execSpecDescXML +'</slc:realized-flow>';\r
\r
instanceValues[key] = instValue;\r
}\r
this.setValues(instanceValues);\r
- //this.debug(instanceValues);\r
+ this.debug(instanceValues);\r
}\r
}\r
});
\ No newline at end of file
var metaData = rowData[2];
if (metaData.disabled) {
return null; // var cellEditor = new
- // qx.ui.table.celleditor.TextField();
- }
-
- var cellEditor = new qx.ui.form.TextField;
- cellEditor.setAppearance("table-editor-textfield");
- cellEditor.originalValue = cellInfo.value;
- if (cellInfo.value === null) {
- cellInfo.value = "";
- }
- cellEditor.setValue("" + cellInfo.value);
-
- cellEditor.addListener("appear", function() {
- cellEditor.selectAll();
- });
-
- var validationFunc;
- if (metaData.subType == "integer") {
- validationFunc = function(newValue, oldValue){
- var isNum = !isNaN(newValue * 1);
- if (!isNum) {
- alert("Warning, this field only accepts Integers!");
- return oldValue;
- }
- return newValue;
- };
+ // qx.ui.table.celleditor.TextField();
}
+ if(metaData.type == "primitive"){
+ var cellEditor = new qx.ui.form.TextField;
+ cellEditor.setAppearance("table-editor-textfield");
+ cellEditor.originalValue = cellInfo.value;
+ if (cellInfo.value === null) {
+ cellInfo.value = "";
+ }
+ cellEditor.setValue("" + cellInfo.value);
+
+ cellEditor.addListener("appear", function() {
+ cellEditor.selectAll();
+ });
+
+ var validationFunc;
+ if (metaData.subType == "integer") {
+ validationFunc = function(newValue, oldValue){
+ var isNum = !isNaN(newValue * 1);
+ if (!isNum) {
+ alert("Warning, this field only accepts Integers!");
+ return oldValue;
+ }
+ return newValue;
+ };
+ }
+ cellEditor.setUserData("validationFunc", validationFunc);
+ }else if(metaData.type == "ref"){
+ var cellEditor = new qx.ui.form.SelectBox().set({
+ appearance: "table-editor-selectbox"
+ });
+ cellEditor.setUserData("validationFunc", function(value, oldValue){
+ if(value == "__empty__"){
+ alert("Warning, value cannot be empty! You must select at least one option below.");
+ return oldValue;
+ }
+ return value;
+ });
+
+ var value = cellInfo.value;
+ cellEditor.originalValue = value;
+ // replace null values
+ if ( value === null ) {
+ value = "";
+ }
+ if(value == ""){
+ cellEditor.add(new qx.ui.form.ListItem("", null, "__empty__"));
+ }
+ var list = metaData.refList;
+ if (list)
+ {
+ var item;
- cellEditor.setUserData("validationFunc", validationFunc);
+ for (var i=0,l=list.length; i<l; i++)
+ {
+ var row = list[i];
+ if ( row instanceof Array ) {
+ // Array [key, description] where description can be null
+ item = new qx.ui.form.ListItem(row[0], null, row[0]);
+ if(row[1]){
+ item.setToolTip(new qx.ui.tooltip.ToolTip(row[1]));
+ }
+ } else {
+ item = new qx.ui.form.ListItem(row, null, row)
+ }
+ if(value == item.getValue()){
+ cellEditor.setSelected(item);
+ }
+ cellEditor.add(item);
+ };
+ }
+
+ cellEditor.setValue("" + value);
+ cellEditor.addListener("appear", function() {
+ cellEditor.open();
+ });
+ }
return cellEditor;
},
check : "String",\r
init : ""\r
},\r
+ description : {\r
+ check : "String",\r
+ init : ""\r
+ },\r
/**\r
* An optional path describing this flow\r
*/\r
* Xpath to the name \r
*/\r
XPATH_NAME : "@name",\r
+ /**\r
+ * Path to the description\r
+ */\r
+ XPATH_DESCRIPTION : "slc:description",\r
/**\r
* XPath to the ExecutionSpec name\r
*/\r
this.set({\r
name : org.argeo.ria.util.Element.getSingleNodeText(xmlNode, this.self(arguments).XPATH_NAME),\r
path : org.argeo.ria.util.Element.getSingleNodeText(xmlNode, this.self(arguments).XPATH_PATH),\r
+ description : org.argeo.ria.util.Element.getSingleNodeText(xmlNode, this.self(arguments).XPATH_DESCRIPTION) || "",\r
executionSpecName : org.argeo.ria.util.Element.getSingleNodeText(xmlNode, this.self(arguments).XPATH_EXEC_SPEC_NAME)\r
});\r
var values = org.argeo.ria.util.Element.selectNodes(xmlNode, this.self(arguments).XPATH_VALUES);\r
if(specType == "primitive"){\r
xpath = 'slc:value[@key="'+key+'"]/slc:primitive-value[@type="'+specSubType+'"]';\r
}else if(specType == "ref"){\r
- xpath = 'slc:value[@key="'+key+'"]/slc:ref-value/slc:label';\r
+ xpath = 'slc:value[@key="'+key+'"]/slc:ref-value/@ref';\r
}\r
return org.argeo.ria.util.Element.getSingleNodeText(this.getValues(), xpath);\r
}\r
check : "String",\r
init : ""\r
},\r
+ label : {\r
+ check : "String",\r
+ init : "" \r
+ },\r
+ description : {\r
+ check : "String",\r
+ init : "" \r
+ },\r
/**\r
* The version of the module\r
*/\r
},\r
\r
statics : {\r
- XPATH_NAME : "slc:execution-module-descriptor/slc:name",\r
- XPATH_VERSION : "slc:execution-module-descriptor/slc:version",\r
- XPATH_EXECUTION_FLOWS : "slc:execution-module-descriptor/slc:execution-flows/slc:execution-flow-descriptor",\r
- XPATH_EXECUTION_SPECS : "slc:execution-module-descriptor/slc:execution-specs/slc:default-execution-spec"\r
+ XPATH_ROOT : "slc:execution-module-descriptor", \r
+ XPATH_NAME : "slc:name",\r
+ XPATH_LABEL : "slc:label",\r
+ XPATH_DESCRIPTION : "slc:description",\r
+ XPATH_VERSION : "slc:version",\r
+ XPATH_EXECUTION_FLOWS : "slc:execution-flows/slc:execution-flow-descriptor",\r
+ XPATH_EXECUTION_SPECS : "slc:execution-specs/slc:default-execution-spec"\r
},\r
\r
construct : function(){\r
return this.getExecutionFlows()[name];\r
},\r
\r
+ moduleDataToXml : function(){\r
+ var xmlData = '<slc:module-name>'+this.getName()+'</slc:module-name>';\r
+ xmlData += '<slc:module-version>'+this.getVersion()+'</slc:module-version>';\r
+ return xmlData;\r
+ },\r
+ \r
/**\r
* An xml node containing the castor mapped description of this object\r
* @param xmlNode {Node}\r
*/\r
_applyXmlNode : function(xmlNode){\r
- // Parse now\r
- this.setName(org.argeo.ria.util.Element.getSingleNodeText(xmlNode, this.self(arguments).XPATH_NAME) || "Not Found");\r
- this.setVersion(org.argeo.ria.util.Element.getSingleNodeText(xmlNode, this.self(arguments).XPATH_VERSION));\r
+ var appendRoot = "";\r
+ if(xmlNode.nodeName != this.self(arguments).XPATH_ROOT){\r
+ appendRoot = this.self(arguments).XPATH_ROOT+"/";\r
+ }\r
+ // Parse now \r
+ this.setName(org.argeo.ria.util.Element.getSingleNodeText(xmlNode, appendRoot + this.self(arguments).XPATH_NAME) || "Not Found");\r
+ this.setVersion(org.argeo.ria.util.Element.getSingleNodeText(xmlNode, appendRoot + this.self(arguments).XPATH_VERSION));\r
+ this.setLabel(org.argeo.ria.util.Element.getSingleNodeText(xmlNode, appendRoot + this.self(arguments).XPATH_LABEL) || this.getName());\r
+ this.setDescription(org.argeo.ria.util.Element.getSingleNodeText(xmlNode, appendRoot + this.self(arguments).XPATH_DESCRIPTION) || "");\r
+ \r
// Parse Specs first\r
- var specs = org.argeo.ria.util.Element.selectNodes(xmlNode, this.self(arguments).XPATH_EXECUTION_SPECS);\r
- for(i=0; i< specs.length;i++){\r
- var execSpec = new org.argeo.slc.ria.execution.Spec();\r
- execSpec.setXmlNode(specs[i]);\r
- this.addExecutionSpec(execSpec);\r
+ var specs = org.argeo.ria.util.Element.selectNodes(xmlNode, appendRoot + this.self(arguments).XPATH_EXECUTION_SPECS);\r
+ if(specs){\r
+ for(i=0; i< specs.length;i++){\r
+ var execSpec = new org.argeo.slc.ria.execution.Spec();\r
+ execSpec.setXmlNode(specs[i]);\r
+ this.addExecutionSpec(execSpec);\r
+ }\r
}\r
- // Now parse Flows : to do AFTER specs\r
- var flows = org.argeo.ria.util.Element.selectNodes(xmlNode, this.self(arguments).XPATH_EXECUTION_FLOWS);\r
- for(var i=0;i<flows.length;i++){\r
- var execFlow = new org.argeo.slc.ria.execution.Flow();\r
- execFlow.setXmlNode(flows[i]);\r
- this.addExecutionFlow(execFlow);\r
+ // Now parse Flows : to do AFTER specs\r
+ var flows = org.argeo.ria.util.Element.selectNodes(xmlNode, appendRoot + this.self(arguments).XPATH_EXECUTION_FLOWS);\r
+ if(flows){\r
+ for(var i=0;i<flows.length;i++){\r
+ var execFlow = new org.argeo.slc.ria.execution.Flow();\r
+ execFlow.setXmlNode(flows[i]);\r
+ this.addExecutionFlow(execFlow);\r
+ }\r
}\r
}\r
\r
* @param xmlNode {Node} Castor representation of this object\r
*/ \r
_applyXmlNode : function(xmlNode){\r
- // Parse now\r
+ // Parse now \r
this.setName(org.argeo.ria.util.Element.getSingleNodeText(xmlNode, this.self(arguments).XPATH_NAME));\r
var values = org.argeo.ria.util.Element.selectNodes(xmlNode, this.self(arguments).XPATH_VALUES);\r
var parsedValues = {};\r
* @return {String} An XML String\r
*/\r
toXml : function(){\r
- var valuesXml = '';\r
- var values = this.getValues();\r
- for(var key in values){\r
- valuesXml += values[key].toAttributeXml();\r
- }\r
- return '<slc:default-execution-spec name="'+this.getName()+'"><slc:values>'+valuesXml+'</slc:values></slc:default-execution-spec>';\r
+ return org.argeo.ria.util.Element.getXMLString(this.getXmlNode());\r
}\r
} \r
\r
*/\r
xmlSpecNode : {\r
apply : "_applyXmlSpecNode"\r
+ },\r
+ refList : {\r
+ check : "Array"\r
}\r
},\r
\r
},\r
\r
construct : function(){\r
- this.base(arguments);\r
+ this.base(arguments); \r
},\r
\r
members : { \r
}else if(child.nodeName == "slc:ref-spec-attribute"){\r
this.setSpecType("ref");\r
this.setSpecSubType(org.argeo.ria.util.Element.getSingleNodeText(child, "@targetClassName")||"");\r
+ var choices = org.argeo.ria.util.Element.selectNodes(child, "slc:choices/slc:ref-value-choice");\r
+ var refList = []; \r
+ for(var k=0;k<choices.length;k++){\r
+ var choice = choices[k];\r
+ var name = org.argeo.ria.util.Element.getSingleNodeText(choice, "@name");\r
+ var description = org.argeo.ria.util.Element.getSingleNodeText(choice, "slc:description");\r
+ refList.push([name, (description||"")]);\r
+ }\r
+ this.setRefList(refList);\r
}\r
this.set({\r
parameter : (org.argeo.ria.util.Element.getSingleNodeText(child, "@isParameter")=="true"?true:false),\r
}); \r
}\r
},\r
- \r
- /**\r
- * Create an XML Representation of this value\r
- * @return {String} The XML String\r
- */\r
- toAttributeXml : function(){\r
- var valueTag = '';\r
- var specAttribute = '';\r
- if(this.getSpecType() == "primitive"){\r
- valueTag = (this.getValue()?this.getValue():'');\r
- specAttribute = '<slc:primitive-spec-attribute isParameter="'+(this.getParameter()?"true":"false")+'" isFrozen="'+(this.getFrozen()?"true":"false")+'" isHidden="'+(this.getHidden()?"true":"false")+'" type="'+this.getSpecSubType()+'">'+valueTag+'</slc:primitive-spec-attribute>';\r
- }else if(this.getSpecType() == "ref"){\r
- valueTag = (this.getValue()?'<slc:label>'+this.getValue()+'</slc:label>':'');\r
- specAttribute = '<slc:ref-spec-attribute isParameter="'+(this.getParameter()?"true":"false")+'" isFrozen="'+(this.getFrozen()?"true":"false")+'" isHidden="'+(this.getHidden()?"true":"false")+'" targetClassName="'+this.getSpecSubType()+'">'+valueTag+'</slc:ref-spec-attribute>';\r
- }\r
- return '<slc:value key="'+this.getKey()+'">'+specAttribute+'</slc:value>';\r
- },\r
- \r
+ \r
toValueXml : function(){\r
var valueTag = '';\r
var specAttribute = '';\r
valueTag = this.getValue();\r
specAttribute = '<slc:primitive-value type="'+this.getSpecSubType()+'">'+valueTag+'</slc:primitive-value>';\r
}else if(this.getSpecType() == "ref"){\r
- valueTag = '<slc:label>'+this.getValue()+'</slc:label>';\r
- specAttribute = '<slc:ref-value >'+valueTag+'</slc:ref-value>';\r
+ specAttribute = '<slc:ref-value ref="'+this.getValue()+'" />';\r
}\r
return '<slc:value key="'+this.getKey()+'">'+specAttribute+'</slc:value>'; \r
}\r