Questetra-Model-XML file, Extract Definitions
Questetra-Model-XML file, Extract Definitions
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
  • A: Select FILES DATA for Model-XML (Multiple not supported) *
  • B: Select STRING DATA that stores StepsVars in MARKDOWN (update)
  • C: Select STRING DATA that stores Step Names in TSV (update)
  • C2: Select STRING DATA that stores Step Names in HTML (update)
  • D: Select STRING DATA that stores Var Names in TSV (update)
  • D2: Select STRING DATA that stores Var Names in HTML (update)
  • D3: Select FILES DATA for ImportFile (Append)
Script (click to open)
// GraalJS Script (engine type: 2)

/*
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) です
*/

//////// START "main()" /////////////////////////////////////////////////////////////////
main();
function main(){ 

//// == Config Retrieving / 工程コンフィグの参照 ==
const filesPocketModel   = configs.getObject( "SelectConfA" ); // required
const strPocketMarkdown  = configs.getObject( "SelectConfB" );
const strPocketIconsTsv  = configs.getObject( "SelectConfC" );
const strPocketIconsHtml = configs.getObject( "SelectConfC2");
const strPocketVarsTsv   = configs.getObject( "SelectConfD" );
const strPocketVarsHtml  = configs.getObject( "SelectConfD2" );
const filesPocketImport  = configs.getObject( "SelectConfD3" );


//// == 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

let strMarkdown = ""; // for Icons-Vars in Markdown

/// 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 strTsvBpmnIcons = "";
    strMarkdown += "### BPMN Nodes\n";
for( let i = 0; i < xmlNodesBpmnIcon.getLength(); i++ ){
  strTsvBpmnIcons += arrObjIcons[i].number + "\t";
  if( arrObjIcons[i].type === "0" ){
    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"){
    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> ' + encodeHTML(arrObjIcons[i].note) + '</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> ' + encodeHTML(arrObjIcons[i].note) + '</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> ' + encodeHTML(arrObjIcons[i].note) + '</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> ' + encodeHTML(arrObjIcons[i].note) + '</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 " );
    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;">' + arrObjVars[i].field;
  strVarsHtml += ' ' + arrObjVars[i].number + '</span>';
  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>';
  }
  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( strPocketVarsTsv !== null ){
  engine.setData( strPocketVarsTsv, strVarsTsv );
}
if( strPocketVarsHtml !== null ){
  engine.setData( strPocketVarsHtml, strVarsHtml );
}
if( filesPocketImport !== null ){
  engine.setData( filesPocketImport, filesImport );
}

} //////// END "main()" /////////////////////////////////////////////////////////////////


function encodeHTML( str ){
  return str.replace(/&/g, '&')
            .replace(/</g, '<')
            .replace(/>/g, '>')
            .replace(/"/g, '"')
            .replace(/'/g, ''');
}

Download

2020-09-24 (C) Questetra, Inc. (MIT License)
https://support.questetra.com/addons/questetra-model-xml-file-extract-definitions/
The Addon-import feature is available with 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}
  • 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.
  • 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

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.

See also

2 thoughts on “Questetra-Model-XML file, Extract Definitions”

  1. Pingback: Questetra-Addon-XML file, Extract Configs – Questetra Support

  2. Pingback: Questetra-Model-XML Extract Definition – Questetra Support

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: