/* a simple hello world plugin... it listens for "POST /hello" requests... requests are received by "csworker" and forwarded to "asworker"... both respond with their __worker\'s id and with a counter of the number of handled requests */ const { __errorContinuable, __httpReq, __wHttpReq, __postInternalErrorMsg, __postMessage, __sequenceNumber, __successContinuable, __uri_to_id } = require("../__worker"); const _do = require("../___do"); const _utils = require('../utils'); const _mmmk = require("../mmmk"); const _fs = _do.convert(require('fs'), ['readFile', 'writeFile', 'readdir']); const _fspp = _do.convert(require('../___fs++'), ['mkdirs']); module.exports = { 'interfaces' : [{'method':'POST', 'url=':'/pnml'}], 'csworker' : function(resp,method,uri,reqData,wcontext) { //console.log('Inside PNML'); var self = this, actions = [__wHttpReq('GET','/current.model?wid='+wcontext.__aswid)]; //console.log(reqData); _do.chain(actions)( function(asdata) { var sn = asdata['sequence#']; if( self.__nextASWSequenceNumber - 1 > sn ) self['PUT *.model'](resp,urin); else if( self.__nextASWSequenceNumber - 1 < sn ) setTimeout(self['PUT *.model'], 200, resp, urin); else { if( (res = _mmmk.read())['$err'] ) __postInternalErrorMsg(resp,res['$err']); else { var ts = Math.round((new Date()).getTime() / 1000); head = ''; head += ''; head +='\n'; var cs = _utils.jsonp(res); var as = _utils.jsonp(asdata['data']); let addPlace = function(name,id,x,y,initial) { var file='\n'; file+='\n'; file +='"'+name+'"\n'; file +=' \n'; //graphics with offset later file+='\n'; file+=' \n'; if (initial) { file+='\n'+initial+'\n'; file+=' \n\n'; } file+='\n'; return file; }; let addTrans = function(name,id,x,y) { var file='\n '+name+'\n'; file+=' \n'; file+='\n \n\n'; return file; }; let addArc = function(from,to) { var file='\n'; file+=' 1 \n'; return file; }; var mData = { 'csm':_utils.jsonp(res), 'asm':_utils.jsonp(asdata['data'])}, path = reqData['fname']; dir = _path.dirname(path).replace(/"/g,'\\"'), writeActions = [//_cp.exec('mkdir -p "'+dir+'"'), function() { var cs = mData['csm']; var as = mData['asm']; var tp = []; for (key in as.nodes) { var id = key; var x=0; var y=0; var initial = 0; var name = ''; var tokens = 0; if (as.nodes[key]['$type'].indexOf('Transition') != -1) { x = cs.nodes[key]['position']['value'][0]; y = cs.nodes[key]['position']['value'][1]; name = as.nodes[key]['name']['value']; head+=addTrans(name,id,x,y); tp.push(key); } else if (as.nodes[key]['$type'].indexOf('Place') != -1) { x = cs.nodes[key]['position']['value'][0]; y = cs.nodes[key]['position']['value'][1]; name = as.nodes[key]['name']['value']; tokens = as.nodes[key]['nbTokens']['value']; head+=addPlace(name,id,x,y,tokens); tp.push(key); } } var to = new Array(); var from = new Array(); for (key in as.edges) { //console.log(as.edges[key]['src']); if (tp.indexOf(as.edges[key]['src'] ) !=-1 ) { from[as.edges[key]['dest']]=as.edges[key]['src']; } else { to[as.edges[key]['src']] = as.edges[key]['dest']; } } for (key in from) { head += addArc(from[key],to[key]); } head+=' \n \n '; console.log(path+".pnml"); _fs.open(path+".pnml",'w',function (err, fd) { console.log(fd); _fs.write(fd,head); _fs.close(fd); }); return true; }]; _do.chain(writeActions)( function() { __postMessage( {'statusCode':204, 'respIndex':resp}); }, function(writeErr) { __postInternalErrorMsg(resp,writeErr); } ); } } }, function(err) {__postInternalErrorMsg(resp,err);} ); }, 'asworker' : function(resp,method,uri,reqData,wcontext) { this.localcontext.counter++; __postMessage( {'statusCode':200, 'changelog': [{'op':'SYSOUT', 'text':'Hello #'+this.localcontext.counter+' from asworker #'+__wid}], 'sequence#':__sequenceNumber(), 'respIndex':resp}); } };