8 /** * * Class variables */
9 >>>>>>> 6b2b2b88511733893d2c6e7848c389abfcd53ba6
10 // include all Eos command's info.
11 // For seaching with O(n), the object key name is command name.
12 var db = require('./DB.js').instance;
13 var commandList = require(__dirname + '/../../user-specific-files/OptionControlFile/command_list.json');
14 var ocfReference = {};
16 commandList.forEach(function(c) {
17 ocfReference[c.name] = require(__dirname + '/../../user-specific-files/OptionControlFile/commands/' + c.name);
19 var spawn = require('child_process').spawn;
22 function hasOneProperty(options) {
23 return new Promise(function(resolve, reject) {
24 if(options.length === 0) {
25 var errorMsg = 'At least one option is required.';
26 throw new Error(errorMsg);
33 function matchOption(options, ocf) {
34 return new Promise(function(resolve, reject) {
36 var notIncludingRequiredOptions = [];
37 options.forEach(function(o) {
38 ok[o.name] = o.arguments;
40 ocf.forEach(function(o) {
41 if(o.optionProperties && !ok[o.option]) {
42 notIncludingRequiredOptions.push(o.option);
46 // check whether all required option exist
47 if(notIncludingRequiredOptions.length > 0) {
48 var errorMsg = 'Option ' + notIncludingRequiredOptions.toString() + ' are required';
49 reject(new Error(errorMsg));
56 function validArgumentsNumber(options, ocfObj) {
57 return new Promise(function(resolve, reject) {
58 options.forEach(function(o) {
60 var expectNum = ocfObj[o.name].optionNumber;
61 var actualNum = o.arguments.length;
62 if(expectNum !== actualNum) {
63 reject(new Error('Invalid arguments number'));
70 function validArgumentsType(options, ocfObj, workspace) {
71 return new Promise(function(resolve, reject) {
72 options.forEach(function(o) {
73 o.arguments.forEach(function(arg,i) {
75 var formType = ocfObj[o.name].arg[i].formType
76 if(formType === 'select') { // This argument is filename
77 var exist = workspace.indexOf(arg) > -1;
79 reject(new Error(arg + ' doesn\'t exist.'));
82 var expectType = formType === 'text' ? 'string' : 'number';
83 var actualType = typeof arg;
84 if(expectType !== actualType) {
85 reject(new Error('argType is invalid'));
94 function validOutfileName(options, ocfObj, workspace) {
95 return new Promise(function(resolve, reject) {
97 var outRegExp = /out|append/;
99 options.forEach(function(o) {
100 o.arguments.forEach(function(arg,i) {
102 if(outRegExp.test(ocfObj[o.name].arg[i].argType)) {
103 if(workspace.indexOf(o.arguments[i]) > -1) {
104 reject(new Error('Invalid outfile name.'));
118 * @returns {valid: boolean, message: string}
120 function validate(command, options, workspaceId) {
121 return new Promise(function(resolve, reject) {
124 if(ocfReference[command]) {
125 ocf = ocfReference[command];
127 var errorMsg = 'Command name is invalid';
128 reject(new Error(errorMsg));
132 ocf.forEach(function(o) {
133 ocfObj[o.option] = o;
137 if(Array.isArray(options)) {
138 options.forEach(function(o) {
139 if(o.name && o.arguments) {
140 if(Array.isArray(o.arguments)) {
141 optionsObj[o.name] = o.arguments;
143 var errorMsg = 'Each "arguments" properties needs to be Array';
144 reject(new Error(errorMsg));
147 var errorMsg = 'Options need to include Object which have properties "name" and "arguments"';
148 reject(new Error(errorMsg));
152 var errorMsg = 'Options need to be Array';
153 reject(new Error(errorMsg));
156 getFiles(workspaceId)
157 .then(function(workspace) {
161 promises.push(hasOneProperty(options));
162 promises.push(matchOption(options, ocf));
163 promises.push(validArgumentsNumber(options, ocfObj));
164 promises.push(validArgumentsType(options, ocfObj, workspace));
165 promises.push(validOutfileName(options, ocfObj, workspace));
168 return Promise.all(promises)
170 .catch(function(error) {
186 function toExecString(command, options, workspaceId) {
187 var ocf = ocfReference[command]; // Array
188 var finalOptions = {};
191 //var execStr = '/Users/hiratakengo/Eos/bin/X86MAC64/'+command + ' ';
192 >>>>>>> 6b2b2b88511733893d2c6e7848c389abfcd53ba6
193 var execStr = command + ' ';
195 ocf.forEach(function(o) {
196 ocfObj[o.option] = o;
200 if(workspaceId === "1f83f620-c1ed-11e5-9657-7942989daa00") { // root
201 var root = __dirname + '/../../user-specific-files/workspace/';
204 // set default parameters
205 ocf.forEach(function(o) {
206 o.arg.forEach(function(arg) {
207 if(!(arg.initialValue === "") && arg.initialValue) {
208 if(!(finalOptions[o.option])) {
209 finalOptions[o.option] = [];
210 finalOptions[o.option].push(arg.initialValue);
212 finalOptions[o.option].push(arg.initialValue);
218 // set user setting parameters
219 options.forEach(function(o) {
221 var outRegExp = /out|append/;
222 o.arguments.forEach(function(arg, i) {
223 if(ocfObj[o.name].arg[i].formType === 'select' || outRegExp.test(ocfObj[o.name].arg[i].argType)) {
229 finalOptions[o.name] = s;
232 // set execution string
233 Object.keys(finalOptions).forEach(function(key) {
234 execStr += key + ' ';
235 finalOptions[key].forEach(function(arg) {
236 execStr += arg + ' ';
241 execStr = execStr.slice(0,execStr.length-1);
252 function toExecArray(command, options, workspaceId) {
253 return new Promise(function(resolve, reject) {
254 var ocf = ocfReference[command]; // Array
255 var finalOptions = {};
257 ocf.forEach(function(o) {
258 ocfObj[o.option] = o;
261 // set default parameters
262 ocf.forEach(function(o) {
263 o.arg.forEach(function(arg) {
264 if(!(arg.initialValue === "") && arg.initialValue) {
265 if(!(finalOptions[o.option])) {
266 finalOptions[o.option] = [];
267 finalOptions[o.option].push(arg.initialValue);
269 finalOptions[o.option].push(arg.initialValue);
275 getUUIDs(workspaceId)
276 .then(function(uuids) {
277 // set user setting parameters
278 options.forEach(function(o) {
280 var outRegExp = /out|append/;
281 o.arguments.forEach(function(arg, i) {
282 if(ocfObj[o.name].arg[i].formType === 'select') {
286 console.log('input:' + uuids[arg]);
288 //s.push(uuids[arg]);
290 >>>>>>> 6b2b2b88511733893d2c6e7848c389abfcd53ba6
295 finalOptions[o.name] = s;
297 var array = Object.keys(finalOptions).reduce(function(a,b) {
299 finalOptions[b].forEach(function(v) {
316 function execute(command, optionsArray) {
317 return new Promise(function(resolve, reject) {
319 if(process.env.NODE_ENV === 'debug') {
320 workspace = __dirname + '/../../user-specific-files/workspace.debug';
323 workspace = __dirname + '/../../user-specific-files/workspace';
325 workspace = _dirname + '/../../user-specific-files/workspace';
326 >>>>>>> 6b2b2b88511733893d2c6e7848c389abfcd53ba6
333 var runner = spawn(command,optionsArray,config);
334 //var runner = spawn(command,optionsArray,'/');
335 console.log('spawn');
337 //var runner = spawn('/Users/hiratakengo/Eos/bin/X86MAC64/'+command,optionsArray,config);
338 var runner = spawn(command,optionsArray,config);
339 //var runner = spawn(command,optionsArray);
340 //commandRet = spawn('ls', ['-lh', '/usr']);
341 //commandRet = spawn(command, ['-h']);
343 var commandRet = runner;
345 commandRet.stdout.on('data', function (data) {
346 console.log('stdout: ' + data);
349 commandRet.stderr.on('data', function (data) {
350 console.log('stderr: ' + data);
352 >>>>>>> 6b2b2b88511733893d2c6e7848c389abfcd53ba6
354 runner.on('close', function() {
363 * @returns {promise} resolve(Array)
365 function getFiles(fileId) {
366 return new Promise(function(resolve, reject) {
367 if(process.env.NODE_ENV === 'test') {
368 resolve(['file1.txt', 'file2.txt']);
372 var workspace = r.map(function(f) { return f.name });
382 * @returns {object} key: filename, value: uuid
384 function getUUIDs(fileId) {
385 return new Promise(function(resolve) {
389 r.forEach(function(v) {
390 uuids[v.dataValues.name] = v.dataValues.fileId;
398 * Eosコマンドをエミュレートするクラス
401 * function execute(command, params) {
405 toExecString: toExecString,
409 toExecArray: toExecArray
412 module.exports = { instance: eos };