Questetra-Model-XML file, Extract Definitions
Questetra-Model-XMLファイル, 定義情報の抽出
Extracts the step names and the data item names (variable names) of the Workflow App. The Model-XML file is parsed to extract information such as whether it is a human task or an automated task, what the type of data item is, and so on.
Configs for this Auto Step
- SelectConfA
- A: Select FILES DATA for Model-XML (Multiple not supported) *
- SelectConfB
- B: Select STRING DATA that stores StepsVars in MARKDOWN (update)
- SelectConfC
- C: Select STRING DATA that stores Step Names in TSV (update)
- SelectConfC2
- C2: Select STRING DATA that stores Step Names in HTML (update)
- SelectConfC3
- C3: Select NUMERIC DATA for Number of Steps (update)
- SelectConfD
- D: Select STRING DATA that stores Var Names in TSV (update)
- SelectConfD2
- D2: Select STRING DATA that stores Var Names in HTML (update)
- SelectConfD3
- D3: Select FILES DATA for ImportFile (Append)
- SelectConfD4
- D4: Select NUMERIC DATA for Number of Vars (update)
- SelectConfE
- E: Select STRING DATA that stores SwimlaneNames in HTML (update)
- SelectConfE2
- E2: Select NUMERIC DATA for Number of Swimlanes (update)
- SelectConfF1
- F1: Select STRING that stores Required Edition β (update)
Script (click to open)
// GraalJS Script (engine type: 3)
//////// START "main()" /////////////////////////////////////////////////////////////////
main();
function main(){
//// == Config Retrieving / 工程コンフィグの参照 ==
const filesPocketModel = configs.getObject( "SelectConfA" ); /// REQUIRED
const strPocketMarkdown = configs.getObject( "SelectConfB" ); // NotRequired
const strPocketIconsTsv = configs.getObject( "SelectConfC" ); // NotRequired
const strPocketIconsHtml = configs.getObject( "SelectConfC2"); // NotRequired
const numPocketNumIcons = configs.getObject( "SelectConfC3"); // NotRequired 202108 enhanced
const strPocketVarsTsv = configs.getObject( "SelectConfD" ); // NotRequired
const strPocketVarsHtml = configs.getObject( "SelectConfD2"); // NotRequired
const filesPocketImport = configs.getObject( "SelectConfD3"); // NotRequired
const numPocketNumVars = configs.getObject( "SelectConfD4"); // NotRequired 202108 enhanced
const strPocketSwimHtml = configs.getObject( "SelectConfE" ); // NotRequired 202108 enhanced
const numPocketNumSwims = configs.getObject( "SelectConfE2"); // NotRequired 202108 enhanced
const strRequiredEdition = configs.getObject( "SelectConfF1"); // NotRequired 202108 enhanced beta
//// == Data Retrieving / ワークフローデータの参照 ==
let fileModel = engine.findData( filesPocketModel );
// java.util.ArrayList
if( fileModel === null ) {
throw new Error( "\n AutomatedTask UnexpectedFilesError:" +
" Files {A} not found \n" );
}
if ( fileModel.size() > 1) {
throw new Error( "\n AutomatedTask UnexpectedFilesError:" +
" Files {A} must be single: " +
fileModel.size() + " files attached \n" );
}
let filesImport = engine.findData( filesPocketImport );
if( filesImport === null ){
filesImport = new java.util.ArrayList();
// java.util.ArrayList
// - com.questetra.bpms.core.event.scripttask.QfileView
}
//// == Calculating / 演算 ==
/// load text (XML)
let strModelXml = '';
let numLineCounter = 0;
fileRepository.readFile( fileModel.get(0), "UTF-8", function(line) {
// com.questetra.bpms.core.event.scripttask.FileRepositoryWrapper
// https://questetra.zendesk.com/hc/ja/articles/360024574471-R2300#FileRepositoryWrapper
strModelXml += line + '\n';
numLineCounter ++;
});
engine.log( " AutomatedTask FileLoaded: Number of lines = " + numLineCounter );
/// parse XML
// com.questetra.bpms.core.event.scripttask.XPathWrapper
// - https://questetra.zendesk.com/hc/ja/articles/360024574471-R2300#XPathWrapper
// com.questetra.bpms.core.event.scripttask.XPathWrapper.NodeWrapper
// com.questetra.bpms.core.event.scripttask.XPathWrapper.NodeListWrapper
/// for Markdown Output
let strMarkdown = ""; // for Icons-Vars in Markdown
/// extract Swimlane info
let xpathSwimlane = "/processModel/swimlanes/swimlane";
const xmlSwimlane = xpath.findNodeList( strModelXml, xpathSwimlane );
engine.log( " AutomatedTask XmlParsed: NumOf 'Swimlanes' = " +
xmlSwimlane.getLength() );
// store Swimlane-properties in array
let arrObjSwimlanes = new Array( xmlSwimlane.getLength() );
for( let i = 0; i < xmlSwimlane.getLength(); i++ ){
let xpathSwimlane = "/processModel/swimlanes/swimlane[" + (i+1) + "]";
arrObjSwimlanes[i] = {};
arrObjSwimlanes[i].name = xpath.findNodeText( strModelXml, xpathSwimlane + "/name" );
arrObjSwimlanes[i].type = xpath.findNodeText( strModelXml, xpathSwimlane + "/swimlane-type" );
arrObjSwimlanes[i].note = "";
if( xpath.findNodeList( strModelXml, xpathSwimlane + "/note" ).getLength() !== 0 ){
arrObjSwimlanes[i].note = xpath.findNodeText( strModelXml, xpathSwimlane + "/note" ).replace(/\n/g,"");
}
let strChildXml = xpath.findNodeText( strModelXml, xpathSwimlane + "/graph" );
arrObjSwimlanes[i].y = xpath.findNodeText( strChildXml, "/graph/y" );
}
// sort swimlanes by y-value
function compareObjY(a, b) {
let numTmpA = parseFloat( a.y );
let numTmpB = parseFloat( b.y );
if( numTmpA > numTmpB ) return 1;
if( numTmpA < numTmpB ) return -1;
return 0;
}
arrObjSwimlanes.sort(compareObjY);
engine.log( " AutomatedTask Sorted by Y-axis" );
// describe Swimlanes in markdown
strMarkdown += "### Swimlanes\n";
for( let i = 0; i < xmlSwimlane.getLength(); i++ ){
if( arrObjSwimlanes[i].type === "0" ){
strMarkdown += "- SOLO **";
}else{
strMarkdown += "- COLLAB **";
}
strMarkdown += (arrObjSwimlanes[i].name ?
encodeHTML(arrObjSwimlanes[i].name) : '<span style="font-style:italic;">(no name)</span>');
strMarkdown += "** " + encodeHTML(arrObjSwimlanes[i].note) + "\n";
}
// describe Swimlanes in html
let strHtmlSwimlanes = "";
for( let i = 0; i < xmlSwimlane.getLength(); i++ ){
strHtmlSwimlanes += '<li><span class="fa-li"><span class="fa-layers fa-fw">';
if( arrObjSwimlanes[i].type === "0" ){ // Solo Swimlane
strHtmlSwimlanes += '<i class="fas fa-user fa-lg" style="color:#333333;"></i>';
}else{ // Collab Swimlane (Team)
strHtmlSwimlanes += '<i class="fas fa-users fa-sm" style="color:#333333;"></i>';
}
strHtmlSwimlanes += '</span></span> ';
strHtmlSwimlanes += '<strong>';
strHtmlSwimlanes += arrObjSwimlanes[i].name ? encodeHTML(arrObjSwimlanes[i].name) :
'<span style="font-style:italic;">(no name)</span>';
strHtmlSwimlanes += '</strong> ';
if( arrObjSwimlanes[i].note !== "" ){
strHtmlSwimlanes += '<ul style="list-style-type:none"><li>';
strHtmlSwimlanes += encodeHTML(arrObjSwimlanes[i].note);
strHtmlSwimlanes += '</li></ul>';
}
strHtmlSwimlanes += '</li>\n';
}
/// extract BpmnIcon (Bpmn node) info
let xpathBpmnIcon = "/processModel/nodes/node";
const xmlNodesBpmnIcon = xpath.findNodeList( strModelXml, xpathBpmnIcon );
engine.log( " AutomatedTask XmlParsed: NumOf 'BpmnIcons' = " +
xmlNodesBpmnIcon.getLength() );
// store Icon-properties in array
let arrObjIcons = new Array( xmlNodesBpmnIcon.getLength() );
for( let i = 0; i < xmlNodesBpmnIcon.getLength(); i++ ){
let xpathIcon = "/processModel/nodes/node[" + (i+1) + "]";
arrObjIcons[i] = {};
arrObjIcons[i].number = xpath.findNodeText( strModelXml, xpathIcon + "/@number" );
arrObjIcons[i].type = xpath.findNodeText( strModelXml, xpathIcon + "/nodeType" );
arrObjIcons[i].name = xpath.findNodeText( strModelXml, xpathIcon + "/name" );
arrObjIcons[i].note = "";
if( xpath.findNodeList( strModelXml, xpathIcon + "/note" ).getLength() !== 0 ){
arrObjIcons[i].note = xpath.findNodeText( strModelXml, xpathIcon + "/note" ).replace(/\n/g,"");
}
}
// sort node-properties by name unicode
function compareObjNames(a, b) {
if(a.name > b.name) return 1;
if(a.name < b.name) return -1;
return 0;
}
arrObjIcons.sort(compareObjNames);
engine.log( " AutomatedTask Sorted by NODE NAME " );
// describe BpmnIcons in tsv (and markdown)
let boolAdvancedRequired = false; // 202108
let boolProfessionalRequired = false; // 202108
let strTsvBpmnIcons = "";
strMarkdown += "### BPMN Nodes\n";
for( let i = 0; i < xmlNodesBpmnIcon.getLength(); i++ ){
strTsvBpmnIcons += arrObjIcons[i].number + "\t";
if( arrObjIcons[i].type === "0" ){ // HumanTask
strTsvBpmnIcons += "HUMAN\t";
strMarkdown += "- HUMAN **" + (arrObjIcons[i].name ?
encodeHTML(arrObjIcons[i].name) : '<span style="font-style:italic;">(no name)</span>');
strMarkdown += "** " + encodeHTML(arrObjIcons[i].note) + "\n";
}else if(arrObjIcons[i].type === "3" || arrObjIcons[i].type === "4" || arrObjIcons[i].type === "5"){ // AutomatedTask
boolAdvancedRequired = true;
if( arrObjIcons[i].type === "4" ){ boolProfessionalRequired = true;}
if( arrObjIcons[i].type === "5" ){ boolProfessionalRequired = true;}
strTsvBpmnIcons += "SYSTEM\t";
strMarkdown += "- SYSTEM **" + (arrObjIcons[i].name ?
encodeHTML(arrObjIcons[i].name) : '<span style="font-style:italic;">(no name)</span>');
strMarkdown += "** " + encodeHTML(arrObjIcons[i].note) + "\n";
}else if( arrObjIcons[i].type === "1" ){
strTsvBpmnIcons += "EVENT\t";
}else{
strTsvBpmnIcons += "XMISC\t";
}
strTsvBpmnIcons += arrObjIcons[i].name + "\t";
strTsvBpmnIcons += arrObjIcons[i].note;
if( i !== xmlNodesBpmnIcon.getLength() - 1 ){
strTsvBpmnIcons += "\n";
}
}
// describe BpmnIcons in html
let strHumanTasks = ""; // type:0
let strAutomatedTasks = ""; // type:3,4(Script),5(Webhook)
let strEvents = ""; // type:1
let strGateways = ""; // type:2 etc
for( let i = 0; i < xmlNodesBpmnIcon.getLength(); i++ ){
if( arrObjIcons[i].type === "0" ){
strHumanTasks += '<li><span class="fa-li">';
strHumanTasks += '<span class="fa-layers fa-fw">';
strHumanTasks += '<i class="far fa-rectangle-landscape fa-lg" style="color:#4a86e8;"></i>';
strHumanTasks += '<span class="fa-layers-text" data-fa-transform="shrink-8">';
strHumanTasks += arrObjIcons[i].number;
strHumanTasks += '</span>';
strHumanTasks += '</span>';
strHumanTasks += '</span> <strong>';
strHumanTasks += arrObjIcons[i].name ? encodeHTML(arrObjIcons[i].name) :
'<span style="font-style:italic;">(no name)</span>';
strHumanTasks += '</strong> ';
if( arrObjIcons[i].note !== "" ){
strHumanTasks += '<ul style="list-style-type:none"><li>';
strHumanTasks += encodeHTML(arrObjIcons[i].note);
strHumanTasks += '</li></ul>';
}
strHumanTasks += '</li>\n';
}else if(arrObjIcons[i].type === "3" || arrObjIcons[i].type === "4" || arrObjIcons[i].type === "5"){
strAutomatedTasks += '<li><span class="fa-li">';
strAutomatedTasks += '<span class="fa-layers fa-fw">';
strAutomatedTasks += '<i class="fal fa-rectangle-landscape fa-lg" style="color:#666666;"></i>';
strAutomatedTasks += '<span class="fa-layers-text" data-fa-transform="shrink-8">';
strAutomatedTasks += arrObjIcons[i].number;
strAutomatedTasks += '</span>';
strAutomatedTasks += '</span>';
strAutomatedTasks += '</span> <strong>';
strAutomatedTasks += arrObjIcons[i].name ? encodeHTML(arrObjIcons[i].name) :
'<span style="font-style:italic;">(no name)</span>';
strAutomatedTasks += '</strong> ';
if( arrObjIcons[i].note !== "" ){
strAutomatedTasks += '<ul style="list-style-type:none"><li>';
strAutomatedTasks += encodeHTML(arrObjIcons[i].note);
strAutomatedTasks += '</li></ul>';
}
strAutomatedTasks += '</li>\n';
}else if( arrObjIcons[i].type === "1" ){
strEvents += '<li><span class="fa-li">';
strEvents += '<span class="fa-layers fa-fw">';
strEvents += '<i class="far fa-circle fa-lg" style="color:#741b47;"></i>';
strEvents += '<span class="fa-layers-text" data-fa-transform="shrink-8">';
strEvents += arrObjIcons[i].number;
strEvents += '</span>';
strEvents += '</span>';
strEvents += '</span> <strong>';
strEvents += arrObjIcons[i].name ? encodeHTML(arrObjIcons[i].name) :
'<span style="font-style:italic;">(no name)</span>';
strEvents += '</strong> ';
if( arrObjIcons[i].note !== "" ){
strEvents += '<ul style="list-style-type:none"><li>';
strEvents += encodeHTML(arrObjIcons[i].note);
strEvents += '</li></ul>';
}
strEvents += '</li>\n';
}else{ // "2"
strGateways += '<li><span class="fa-li">';
strGateways += '<span class="fa-layers fa-fw">';
strGateways += '<i class="far fa-diamond fa-lg" style="color:#38761d;"></i>';
strGateways += '<span class="fa-layers-text" data-fa-transform="shrink-8">';
strGateways += arrObjIcons[i].number;
strGateways += '</span>';
strGateways += '</span>';
strGateways += '</span> <strong>';
strGateways += arrObjIcons[i].name ? encodeHTML(arrObjIcons[i].name) :
'<span style="font-style:italic;">(no name)</span>';
strGateways += '</strong> ';
if( arrObjIcons[i].note !== "" ){
strGateways += '<ul style="list-style-type:none"><li>';
strGateways += encodeHTML(arrObjIcons[i].note);
strGateways += '</li></ul>';
}
strGateways += '</li>\n';
}
}
let strHtmlBpmnIcons = "";
strHtmlBpmnIcons += strHumanTasks;
strHtmlBpmnIcons += strAutomatedTasks;
// Comment in if Events and Gateway are needed.
// strHtmlBpmnIcons += strEvents;
// strHtmlBpmnIcons += strGateways;
/// extract Variable Definition info
let xpathVarsDef = "/processModel/process-data-definitions/process-data-definition";
const xmlNodesVar = xpath.findNodeList( strModelXml, xpathVarsDef );
engine.log( " AutomatedTask XmlParsed: NumOf 'Variable Defs' = " +
xmlNodesVar.getLength() );
// store Variable-properties in array
let arrObjVars = new Array( xmlNodesVar.getLength() );
for( let i = 0; i < xmlNodesVar.getLength(); i++ ){
let xpathVar = "/processModel/process-data-definitions/process-data-definition[" + (i+1) + "]";
arrObjVars[i] = {};
arrObjVars[i].order = parseInt( xpath.findNodeText( strModelXml, xpathVar + "/view-order" ), 10);
arrObjVars[i].number = xpath.findNodeText( strModelXml, xpathVar + "/@number" );
arrObjVars[i].name = xpath.findNodeText( strModelXml, xpathVar + "/name" );
arrObjVars[i].field = "";
if( xpath.findNodeList( strModelXml, xpathVar + "/var-name" ).getLength() == 1 ){
arrObjVars[i].field = xpath.findNodeText( strModelXml, xpathVar + "/var-name" );
}
arrObjVars[i].note = xpath.findNodeText( strModelXml, xpathVar + "/note" );
arrObjVars[i].initval= xpath.findNodeText( strModelXml, xpathVar + "/init-value" );
engine.log( " initval: " + arrObjVars[i].initval );
arrObjVars[i].type = xpath.findNodeText( strModelXml, xpathVar + "/data-type" );
arrObjVars[i].type2 = "";
arrObjVars[i].required = "0";
if( arrObjVars[i].type === "0" ){ /// STRING
engine.log( "node " + i + ": type " + arrObjVars[i].type + " -- string " );
arrObjVars[i].type2 = xpath.findNodeText( strModelXml, xpathVar + "/form-type" );
if( arrObjVars[i].type2 === "0" ){ /// STRING_TEXTFIELD
if( xpath.findNodeText( strModelXml, xpathVar +
"/process-data-definition-detail:string-detail" +
"/process-data-definition-detail:required" ) === "true" ){
arrObjVars[i].required= "1";
}
}else if( arrObjVars[i].type2 === "1" ){ /// STRING_TEXTAREA
if( xpath.findNodeText( strModelXml, xpathVar +
"/process-data-definition-detail:string-detail" +
"/process-data-definition-detail:required" ) === "true" ){
arrObjVars[i].required= "1";
}
}
}else if( arrObjVars[i].type === "12" ){ /// DECIMAL
engine.log( "node " + i + ": type " + arrObjVars[i].type + " -- decimal " );
if( xpath.findNodeText( strModelXml, xpathVar +
"/process-data-definition-detail:decimal-detail" +
"/process-data-definition-detail:required" ) === "true" ){
arrObjVars[i].required= "1";
}
}else if( arrObjVars[i].type === "11" ){ /// SELECT ("select-detail" → "*")
engine.log( "node " + i + ": type " + arrObjVars[i].type + " -- select " );
arrObjVars[i].type2 = xpath.findNodeText( strModelXml, xpathVar + "/form-type" );
if( arrObjVars[i].type2 === "2" ){ /// SELECT_RADIO
if( xpath.findNodeText( strModelXml, xpathVar +
"/process-data-definition-detail:*" +
"/process-data-definition-detail:required" ) === "true" ){
arrObjVars[i].required= "1";
}
}else if( arrObjVars[i].type2 === "4" ){ /// SELECT_SELECT
if( xpath.findNodeText( strModelXml, xpathVar +
"/process-data-definition-detail:*" +
"/process-data-definition-detail:required" ) === "true" ){
arrObjVars[i].required= "1";
}
}else if( arrObjVars[i].type2 === "5" ){ /// SELECT_SELECT_QUERY
if( xpath.findNodeText( strModelXml, xpathVar +
"/process-data-definition-detail:*" +
"/process-data-definition-detail:required" ) === "true" ){
arrObjVars[i].required= "1";
}
}else if( arrObjVars[i].type2 === "3" ){ /// SELECT_CHECKBOX
if( xpath.findNodeText( strModelXml, xpathVar +
"/process-data-definition-detail:*" +
"/process-data-definition-detail:required" ) === "true" ){
arrObjVars[i].required= "1";
}
}
}else if( arrObjVars[i].type === "5" ){ /// DATE
engine.log( "node " + i + ": type " + arrObjVars[i].type + " -- date " );
arrObjVars[i].type2 = xpath.findNodeText( strModelXml, xpathVar + "/sub-type" );
if( arrObjVars[i].type2 === "0" ){ /// DATE_YMD
if( xpath.findNodeText( strModelXml, xpathVar +
"/process-data-definition-detail:basic-detail" +
"/process-data-definition-detail:required" ) === "true" ){
arrObjVars[i].required= "1";
}
}else if( arrObjVars[i].type2 === "1" ){ /// DATE_YM
if( xpath.findNodeText( strModelXml, xpathVar +
"/process-data-definition-detail:basic-detail" +
"/process-data-definition-detail:required" ) === "true" ){
arrObjVars[i].required= "1";
}
}else if( arrObjVars[i].type2 === "2" ){ /// DATE_Y
if( xpath.findNodeText( strModelXml, xpathVar +
"/process-data-definition-detail:basic-detail" +
"/process-data-definition-detail:required" ) === "true" ){
arrObjVars[i].required= "1";
}
}else if( arrObjVars[i].type2 === "3" ){ /// DATE_MD
if( xpath.findNodeText( strModelXml, xpathVar +
"/process-data-definition-detail:basic-detail" +
"/process-data-definition-detail:required" ) === "true" ){
arrObjVars[i].required= "1";
}
}
}else if( arrObjVars[i].type === "10" ){ /// DATETIME
engine.log( "node " + i + ": type " + arrObjVars[i].type + " -- datetime " );
if( xpath.findNodeText( strModelXml, xpathVar +
"/process-data-definition-detail:basic-detail" +
"/process-data-definition-detail:required" ) === "true" ){
arrObjVars[i].required= "1";
}
}else if( arrObjVars[i].type === "14" ){ /// FILE
engine.log( "node " + i + ": type " + arrObjVars[i].type + " -- file " );
if( xpath.findNodeText( strModelXml, xpathVar +
"/process-data-definition-detail:file-detail" +
"/process-data-definition-detail:required" ) === "true" ){
arrObjVars[i].required= "1";
}
}else if( arrObjVars[i].type === "8" ){ /// QUSER
engine.log( "node " + i + ": type " + arrObjVars[i].type + " -- quser " );
// ★20210127★ supports Older Format (no "form-type")
// <view-order>37</view-order><data-type>8</data-type><description></description>
// ... parsed as QUSER_SELECT_QUERY "5"
if( xpath.findNodeList( strModelXml, xpathVar + "/form-type" ).getLength() == 0 ){
arrObjVars[i].type2 = "5";
}else{
arrObjVars[i].type2 = xpath.findNodeText( strModelXml, xpathVar + "/form-type" );
}
if( arrObjVars[i].type2 === "4" ){ /// QUSER
if( xpath.findNodeText( strModelXml, xpathVar +
"/process-data-definition-detail:basic-detail" +
"/process-data-definition-detail:required" ) === "true" ){
arrObjVars[i].required= "1";
}
}else if( arrObjVars[i].type2 === "5" ){ /// QUSER_SELECT_QUERY
if( xpath.findNodeText( strModelXml, xpathVar +
"/process-data-definition-detail:basic-detail" +
"/process-data-definition-detail:required" ) === "true" ){
arrObjVars[i].required= "1";
}
}
}else if( arrObjVars[i].type === "16" ){ /// QGROUP
engine.log( "node " + i + ": type " + arrObjVars[i].type + " -- qgroup " );
if( xpath.findNodeText( strModelXml, xpathVar +
"/process-data-definition-detail:basic-detail" +
"/process-data-definition-detail:required" ) === "true" ){
arrObjVars[i].required= "1";
}
}else if( arrObjVars[i].type === "9" ){ /// DISCUSSION
engine.log( "node " + i + ": type " + arrObjVars[i].type + " -- discuss " );
}else if( arrObjVars[i].type === "13" ){ /// LIST
engine.log( "node " + i + ": type " + arrObjVars[i].type + " -- list " );
if( xpath.findNodeText( strModelXml, xpathVar +
"/process-data-definition-detail:list-detail" +
"/process-data-definition-detail:required" ) === "true" ){
arrObjVars[i].required= "1";
}
}else if( arrObjVars[i].type === "15" ){ /// HTML_PANEL
engine.log( "node " + i + ": type " + arrObjVars[i].type + " -- panel " );
}else{
engine.log( "node " + i + ": type ERROR" );
}
}
// sort data-properties by Order
function compareObjOrders(a, b) {
return a.order - b.order;
}
arrObjVars.sort(compareObjOrders);
engine.log( " AutomatedTask Sorted by VIEW ORDER" );
// describe Vars in tsv (and markdown)
let strVarsTsv = "";
strMarkdown += "\n### Variables\n";
for( let i = 0; i < xmlNodesVar.getLength(); i++ ){
// name (Item Name)
strVarsTsv += arrObjVars[i].name + "\t";
strMarkdown += "- **" + encodeHTML(arrObjVars[i].name) + "** ";
strMarkdown += arrObjVars[i].field + " " + arrObjVars[i].number;
if( arrObjVars[i].required == "1" ){
strMarkdown += " *" ;
}
// type (Data Type)
if( arrObjVars[i].type === "0" && arrObjVars[i].type2 === "0" ){
strVarsTsv += "STRING_TEXTFIELD\t";
strMarkdown += " - STRING_TEXTFIELD\n";
}else if( arrObjVars[i].type === "0" && arrObjVars[i].type2 === "1" ){
strVarsTsv += "STRING_TEXTAREA\t";
strMarkdown += " - STRING_TEXTAREA\n";
}else if( arrObjVars[i].type === "12" ){
strVarsTsv += "DECIMAL\t";
strMarkdown += " - DECIMAL\n";
}else if( arrObjVars[i].type === "11" && arrObjVars[i].type2 === "2" ){
strVarsTsv += "SELECT_RADIO\t";
strMarkdown += " - SELECT_RADIO\n";
}else if( arrObjVars[i].type === "11" && arrObjVars[i].type2 === "4" ){
strVarsTsv += "SELECT_SELECT\t";
strMarkdown += " - SELECT_SELECT\n";
}else if( arrObjVars[i].type === "11" && arrObjVars[i].type2 === "5" ){
strVarsTsv += "SELECT_SELECT_QUERY\t";
strMarkdown += " - SELECT_SELECT_QUERY\n";
}else if( arrObjVars[i].type === "11" && arrObjVars[i].type2 === "3" ){
strVarsTsv += "SELECT_CHECKBOX\t";
strMarkdown += " - SELECT_CHECKBOX\n";
}else if( arrObjVars[i].type === "5" && arrObjVars[i].type2 === "0" ){
strVarsTsv += "DATE_YMD\t";
strMarkdown += " - DATE_YMD\n";
}else if( arrObjVars[i].type === "5" && arrObjVars[i].type2 === "1" ){
strVarsTsv += "DATE_YM\t";
strMarkdown += " - DATE_YM\n";
}else if( arrObjVars[i].type === "5" && arrObjVars[i].type2 === "2" ){
strVarsTsv += "DATE_Y\t";
strMarkdown += " - DATE_Y\n";
}else if( arrObjVars[i].type === "5" && arrObjVars[i].type2 === "3" ){
strVarsTsv += "DATE_MD\t";
strMarkdown += " - DATE_MD\n";
}else if( arrObjVars[i].type === "10" ){
strVarsTsv += "DATETIME\t";
strMarkdown += " - DATETIME\n";
}else if( arrObjVars[i].type === "14" ){
strVarsTsv += "FILE\t";
strMarkdown += " - FILE\n";
}else if( arrObjVars[i].type === "8" && arrObjVars[i].type2 === "4" ){
strVarsTsv += "QUSER\t";
strMarkdown += " - QUSER\n";
}else if( arrObjVars[i].type === "8" && arrObjVars[i].type2 === "5" ){
strVarsTsv += "QUSER\t"; // "QUSER_SELECT_QUERY\t";
strMarkdown += " - QUSER_SELECT_QUERY\n";
}else if( arrObjVars[i].type === "16" ){
strVarsTsv += "QGROUP\t";
strMarkdown += " - QGROUP\n";
}else if( arrObjVars[i].type === "9" ){
strVarsTsv += "DISCUSSION\t";
strMarkdown += " - DISCUSSION\n";
}else if( arrObjVars[i].type === "13" ){
strVarsTsv += "LIST\t";
strMarkdown += " - LIST\n";
}else if( arrObjVars[i].type === "15" ){
strVarsTsv += "HTML_PANEL\t";
strMarkdown += " - HTML_PANEL\n";
}
// Field Name
strVarsTsv += arrObjVars[i].field + "\t";
// Required
strVarsTsv += arrObjVars[i].required;
if( arrObjVars[i].note !== "" ){
strMarkdown += " - note) " + encodeHTML(arrObjVars[i].note) + "\n";
}
if( arrObjVars[i].initval !== "" ){
strMarkdown += " - init) " + encodeHTML(arrObjVars[i].initval) + "\n";
}
// (tsv line feed)
if( i !== xmlNodesVar.getLength() - 1 ){
strVarsTsv += "\n";
}
}
// import file
let strImport = "Item Name\tData Type\tField Name\tRequired\n";
strImport += strVarsTsv;
filesImport.add(
new com.questetra.bpms.core.event.scripttask.NewQfile(
(fileModel.get(0).getName().slice(0, -4) + ".csv"),
"text/tab-separated-values; charset=x-UTF-16LE-BOM", strImport
)
);
// describe Vars in html
let strVarsHtml = "";
for( let i = 0; i < xmlNodesVar.getLength(); i++ ){
strVarsHtml += '<li><span class="fa-li">';
if( arrObjVars[i].type === "0" && arrObjVars[i].type2 === "0" ){
strVarsHtml += '<i class="fal fa-font fa-lg" style="color:#B40404;" title="String (Text Box single line)"></i>';
}else if( arrObjVars[i].type === "0" && arrObjVars[i].type2 === "1" ){
strVarsHtml += '<i class="fal fa-font fa-lg" style="color:#B40404;" title="String (Text Box multiple lines)"></i>';
}else if( arrObjVars[i].type === "12" ){
strVarsHtml += '<i class="fal fa-percent fa-lg" style="color:#B45F04;" title="Numeric"></i>';
}else if( arrObjVars[i].type === "11" && arrObjVars[i].type2 === "2" ){
strVarsHtml += '<i class="fal fa-list-alt fa-lg" style="color:#AEB404;" title="Select (Radio Button)"></i>';
}else if( arrObjVars[i].type === "11" && arrObjVars[i].type2 === "4" ){
strVarsHtml += '<i class="fal fa-list-alt fa-lg" style="color:#AEB404;" title="Select (Select Box)"></i>';
}else if( arrObjVars[i].type === "11" && arrObjVars[i].type2 === "5" ){
strVarsHtml += '<i class="fal fa-list-alt fa-lg" style="color:#AEB404;" title="Select (Search Select Box)"></i>';
}else if( arrObjVars[i].type === "11" && arrObjVars[i].type2 === "3" ){
strVarsHtml += '<i class="fal fa-list-alt fa-lg" style="color:#AEB404;" title="Select (Check Box)"></i>';
}else if( arrObjVars[i].type === "5" && arrObjVars[i].type2 === "0" ){
strVarsHtml += '<i class="fal fa-calendar-alt fa-lg" style="color:#5FB404;" title="Date (Y/M/D)"></i>';
}else if( arrObjVars[i].type === "5" && arrObjVars[i].type2 === "1" ){
strVarsHtml += '<i class="fal fa-calendar-alt fa-lg" style="color:#5FB404;" title="Date (Y/M)"></i>';
}else if( arrObjVars[i].type === "5" && arrObjVars[i].type2 === "2" ){
strVarsHtml += '<i class="fal fa-calendar-alt fa-lg" style="color:#5FB404;" title="Date (M/D)"></i>';
}else if( arrObjVars[i].type === "5" && arrObjVars[i].type2 === "3" ){
strVarsHtml += '<i class="fal fa-calendar-alt fa-lg" style="color:#5FB404;" title="Date (Y)"></i>';
}else if( arrObjVars[i].type === "10" ){
strVarsHtml += '<i class="fal fa-clock fa-lg" style="color:#5FB404;" title="Datetime"></i>';
}else if( arrObjVars[i].type === "14" ){
strVarsHtml += '<i class="fal fa-copy fa-lg" style="color:#04B404;" title="File"></i>';
}else if( arrObjVars[i].type === "8" && arrObjVars[i].type2 === "4" ){
strVarsHtml += '<i class="fal fa-user fa-lg" style="color:#04B45F;" title="User (Select Box)"></i>';
}else if( arrObjVars[i].type === "8" && arrObjVars[i].type2 === "5" ){
strVarsHtml += '<i class="fal fa-user fa-lg" style="color:#04B45F;" title="User (Search Select Box)"></i>';
}else if( arrObjVars[i].type === "16" ){
strVarsHtml += '<i class="fal fa-sitemap fa-lg" style="color:#04B4AE;" title="Organization"></i>';
}else if( arrObjVars[i].type === "9" ){
strVarsHtml += '<i class="fal fa-comments fa-lg" style="color:#045FB4;" title="Discussion"></i>';
}else if( arrObjVars[i].type === "13" ){
strVarsHtml += '<i class="fal fa-table fa-lg" style="color:#0404B4;" title="Table"></i>';
}else if( arrObjVars[i].type === "15" ){
strVarsHtml += '<i class="fal fa-info fa-lg" style="color:#5F04B4;" title="Guide Panel"></i>';
}else{
strVarsHtml += '?';
}
strVarsHtml += '</span> <strong>';
strVarsHtml += arrObjVars[i].name ? encodeHTML(arrObjVars[i].name) :
'<span style="font-style:italic;">(no name)</span>';
strVarsHtml += '</strong> <span style="font-style:italic; color:#009900">' + arrObjVars[i].field;
strVarsHtml += '</span> <code>' + arrObjVars[i].number + '</code> ';
if( arrObjVars[i].required === "1" ){
strVarsHtml += '<span style="color:#990000;">*</span>';
}
// strVarsHtml += ': ' + encodeHTML(arrObjVars[i].note);
// if( arrObjVars[i].initval != "" ){
// strVarsHtml += ' <span style="color:#9DCCE0;">' + encodeHTML(arrObjVars[i].initval) + '</span>';
// }
if( arrObjVars[i].note !== "" ){
strVarsHtml += '<ul style="list-style-type:none"><li>';
strVarsHtml += encodeHTML(arrObjVars[i].note);
strVarsHtml += '</li></ul>';
}
if( arrObjVars[i].initval !== "" ){
strVarsHtml += '<ul style="list-style-type:none"><li>';
strVarsHtml += ' <span style="color:#9DCCE0;">' + encodeHTML(arrObjVars[i].initval) + '</span>';
strVarsHtml += '</li></ul>';
}
strVarsHtml += '</li>\n';
}
//// == Data Updating / ワークフローデータへの代入 ==
if( strPocketMarkdown !== null ){
engine.setData( strPocketMarkdown, strMarkdown );
}
if( strPocketIconsTsv !== null ){
engine.setData( strPocketIconsTsv, strTsvBpmnIcons );
}
if( strPocketIconsHtml !== null ){
engine.setData( strPocketIconsHtml, strHtmlBpmnIcons );
}
if( numPocketNumIcons !== null ){
engine.setData( numPocketNumIcons, new java.math.BigDecimal( xmlNodesBpmnIcon.getLength() ) );
}
if( strPocketVarsTsv !== null ){
engine.setData( strPocketVarsTsv, strVarsTsv );
}
if( strPocketVarsHtml !== null ){
engine.setData( strPocketVarsHtml, strVarsHtml );
}
if( filesPocketImport !== null ){
engine.setData( filesPocketImport, filesImport );
}
if( numPocketNumVars !== null ){
engine.setData( numPocketNumVars, new java.math.BigDecimal( xmlNodesVar.getLength() ) );
}
if( strPocketSwimHtml !== null ){
engine.setData( strPocketSwimHtml, strHtmlSwimlanes );
}
if( numPocketNumSwims !== null ){
engine.setData( numPocketNumSwims, new java.math.BigDecimal( xmlSwimlane.getLength() ) );
}
if( strRequiredEdition !== null ){
if( boolProfessionalRequired === true ){
// engine.setData( strRequiredEdition, "Professional" ); // -> Professional Required
engine.setData( strRequiredEdition, "This archive contains the BPMN icon, which is only available in the Professional edition." );
}else if( boolAdvancedRequired === true ){
// engine.setData( strRequiredEdition, "Advanced" ); // -> Basic unavailable
engine.setData( strRequiredEdition, "This archive contains the BPMN icons that are not available in the Basic edition." );
}else{
// engine.setData( strRequiredEdition, "all" ); // -> maybe (check timer etc)
engine.setData( strRequiredEdition, "This archive can be imported as a Workflow App on BPMS." );
}
}
} //////// END "main()" /////////////////////////////////////////////////////////////////
function encodeHTML( str ){
return str.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
/*
Notes:
- ModelXML is one file in the compressed folder QAR.
- Ends with an error, if the number of files is not one.
- Step Names (Nodes info)
- /processModel/nodes/node[i]
- /{@number,nodeType,name,note}
- DataItem Names (Variables info)
- /processModel/process-data-definitions/process-data-definition[i]
- /{@number,data-type,name,var-name,note,init-value}
- /*/ns2:required='true'
- Markdown, TSV or LI-html (with fontawesome5 icons) will be output.
- Escape processing and template processing are required for website HTML code.
- M227: Auto Executing Data Binding, Arithmetic Operations
- https://questetra.zendesk.com/hc/en-us/articles/360002260571-M227
- An import file (TSV) will be also generated.
- Data definition in similar apps or downstream apps becomes easier.
- OUTPUT: Item Name, Data Type, Field Name, Required
- The file entity consists of tab-separated-values (utf-16le-bom)
Notes(ja):
- ModelXML は、圧縮フォルダ QAR 内の1ファイルです。
- ファイルの数が1でない場合、エラー終了します
- 工程名(BPMNアイコン情報)
- /processModel/nodes/node[i]
- /{@number,nodeType,name,note}
- 変数名(データ定義の名前)
- /processModel/process-data-definitions/process-data-definition[i]
- /{@number,data-type,name,var-name,note,init-value}
- /*/ns2:required='true'
- MarkdownもしくはTSVもしくは箇条書HTML(fontawesome5 icons)で出力されます
- メモ等の文章はHTMLエスケープされます
- 抽出情報をもとにWebサイト原稿を生成したい場合、テンプレ挿入を後置します
- M227: 業務データの結合や四則演算が自動実行されるように設定する
- https://questetra.zendesk.com/hc/ja/articles/360002260571-M227
- あわせてインポート用ファイル(TSV)の生成も可能です。
- 類似アプリ・下流アプリにおけるデータ定義が一括処理できるようになります。
- 出力4項目: Item Name, Data Type, Field Name, Required
- ファイル実体は tab-separated-values (utf-16le-bom) です
*/
Download
- Questetra-Model-Xml-File-Extract-Definitions-202308.xml
- 2023-08-03 (C) Questetra, Inc. (MIT License)
(Installing Addon Auto-Steps are available only on the Professional edition.)
Notes
- ModelXML is one file in the compressed folder QAR.
- Ends with an error, if the number of files is not one.
- Step Names (Nodes info)
- /processModel/nodes/node[i]
- /{@number,nodeType,name,note}
- /processModel/nodes/node[i]
- DataItem Names (Variables info)
- /processModel/process-data-definitions/process-data-definition[i]
- /{@number,data-type,name,var-name,note,init-value}
- /*/ns2:required=’true’
- /processModel/process-data-definitions/process-data-definition[i]
- Markdown, TSV or LI-html (with fontawesome5 icons) will be output.
- Escape processing and template processing are required for website HTML code.
- M227: Auto Executing Data Binding, Arithmetic Operations
- https://questetra.zendesk.com/hc/en-us/articles/360002260571-M227
- An import file (TSV) will be also generated.
- Data definition in similar apps or downstream apps becomes easier.
- OUTPUT: Item Name, Data Type, Field Name, Required
- The file entity consists of tab-separated-values (utf-16le-bom)
Capture
