1 /** * * Class variables */
2 // include all Eos command's info.
3 // For seaching with O(n), the object key name is command name.
4 var db = require('./DB.js').instance;
5 var commandList = require(__dirname + '/../../user-specific-files/OptionControlFile/command_list.json');
8 commandList.forEach(function(c) {
9 ocfReference[c.name] = require(__dirname + '/../../user-specific-files/OptionControlFile/commands/' + c.name);
11 var spawn = require('child_process').spawn;
14 function hasOneProperty(options) {
15 return new Promise(function(resolve, reject) {
16 if(options.length === 0) {
17 var errorMsg = 'At least one option is required.';
18 throw new Error(errorMsg);
25 function matchOption(options, ocf) {
26 return new Promise(function(resolve, reject) {
28 var notIncludingRequiredOptions = [];
29 options.forEach(function(o) {
30 ok[o.name] = o.arguments;
32 ocf.forEach(function(o) {
33 if(o.optionProperties && !ok[o.option]) {
34 notIncludingRequiredOptions.push(o.option);
38 // check whether all required option exist
39 if(notIncludingRequiredOptions.length > 0) {
40 var errorMsg = 'Option ' + notIncludingRequiredOptions.toString() + ' are required';
41 reject(new Error(errorMsg));
48 function validArgumentsNumber(options, ocfObj) {
49 return new Promise(function(resolve, reject) {
50 options.forEach(function(o) {
52 var expectNum = ocfObj[o.name].optionNumber;
53 var actualNum = o.arguments.length;
54 if(expectNum !== actualNum) {
55 reject(new Error('Invalid arguments number'));
62 function validArgumentsType(options, ocfObj, workspace) {
63 return new Promise(function(resolve, reject) {
64 options.forEach(function(o) {
65 o.arguments.forEach(function(arg,i) {
67 var formType = ocfObj[o.name].arg[i].formType
68 if(formType === 'select') { // This argument is filename
69 var exist = workspace.indexOf(arg) > -1;
71 reject(new Error(arg + ' doesn\'t exist.'));
74 var expectType = formType === 'text' ? 'string' : 'number';
75 var actualType = typeof arg;
76 if(expectType !== actualType) {
77 reject(new Error('argType is invalid'));
86 function validOutfileName(options, ocfObj, workspace) {
87 return new Promise(function(resolve, reject) {
89 var outRegExp = /out|append/;
91 options.forEach(function(o) {
92 o.arguments.forEach(function(arg,i) {
94 if(outRegExp.test(ocfObj[o.name].arg[i].argType)) {
95 if(workspace.indexOf(o.arguments[i]) > -1) {
96 reject(new Error('Invalid outfile name.'));
110 * @returns {valid: boolean, message: string}
112 function validate(command, options, workspaceId) {
113 return new Promise(function(resolve, reject) {
116 if(ocfReference[command]) {
117 ocf = ocfReference[command];
119 var errorMsg = 'Command name is invalid';
120 reject(new Error(errorMsg));
124 ocf.forEach(function(o) {
125 ocfObj[o.option] = o;
129 if(Array.isArray(options)) {
130 options.forEach(function(o) {
131 if(o.name && o.arguments) {
132 if(Array.isArray(o.arguments)) {
133 optionsObj[o.name] = o.arguments;
135 var errorMsg = 'Each "arguments" properties needs to be Array';
136 reject(new Error(errorMsg));
139 var errorMsg = 'Options need to include Object which have properties "name" and "arguments"';
140 reject(new Error(errorMsg));
144 var errorMsg = 'Options need to be Array';
145 reject(new Error(errorMsg));
148 getFiles(workspaceId)
149 .then(function(workspace) {
153 promises.push(hasOneProperty(options));
154 promises.push(matchOption(options, ocf));
155 promises.push(validArgumentsNumber(options, ocfObj));
156 promises.push(validArgumentsType(options, ocfObj, workspace));
157 promises.push(validOutfileName(options, ocfObj, workspace));
160 return Promise.all(promises)
162 .catch(function(error) {
178 function toExecString(command, options, workspaceId) {
179 var ocf = ocfReference[command]; // Array
180 var finalOptions = {};
181 //var execStr = '/Users/hiratakengo/Eos/bin/X86MAC64/'+command + ' ';
182 var execStr = command + ' ';
184 ocf.forEach(function(o) {
185 ocfObj[o.option] = o;
189 if(workspaceId === "1f83f620-c1ed-11e5-9657-7942989daa00") { // root
190 var root = __dirname + '/../../user-specific-files/workspace/';
193 // set default parameters
194 ocf.forEach(function(o) {
195 o.arg.forEach(function(arg) {
196 if(!(arg.initialValue === "") && arg.initialValue) {
197 if(!(finalOptions[o.option])) {
198 finalOptions[o.option] = [];
199 finalOptions[o.option].push(arg.initialValue);
201 finalOptions[o.option].push(arg.initialValue);
207 // set user setting parameters
208 options.forEach(function(o) {
210 var outRegExp = /out|append/;
211 o.arguments.forEach(function(arg, i) {
212 if(ocfObj[o.name].arg[i].formType === 'select' || outRegExp.test(ocfObj[o.name].arg[i].argType)) {
218 finalOptions[o.name] = s;
221 // set execution string
222 Object.keys(finalOptions).forEach(function(key) {
223 execStr += key + ' ';
224 finalOptions[key].forEach(function(arg) {
225 execStr += arg + ' ';
230 execStr = execStr.slice(0,execStr.length-1);
241 function toExecArray(command, options, workspaceId) {
242 return new Promise(function(resolve, reject) {
243 var ocf = ocfReference[command]; // Array
244 var finalOptions = {};
246 ocf.forEach(function(o) {
247 ocfObj[o.option] = o;
250 // set default parameters
251 ocf.forEach(function(o) {
252 o.arg.forEach(function(arg) {
253 if(!(arg.initialValue === "") && arg.initialValue) {
254 if(!(finalOptions[o.option])) {
255 finalOptions[o.option] = [];
256 finalOptions[o.option].push(arg.initialValue);
258 finalOptions[o.option].push(arg.initialValue);
264 getUUIDs(workspaceId)
265 .then(function(uuids) {
266 // set user setting parameters
267 options.forEach(function(o) {
269 var outRegExp = /out|append/;
270 o.arguments.forEach(function(arg, i) {
271 if(ocfObj[o.name].arg[i].formType === 'select') {
277 finalOptions[o.name] = s;
279 var array = Object.keys(finalOptions).reduce(function(a,b) {
281 finalOptions[b].forEach(function(v) {
298 function execute(command, optionsArray) {
299 return new Promise(function(resolve, reject) {
301 if(process.env.NODE_ENV === 'debug') {
302 workspace = __dirname + '/../../user-specific-files/workspace.debug';
304 workspace = _dirname + '/../../user-specific-files/workspace';
310 //var runner = spawn('/Users/hiratakengo/Eos/bin/X86MAC64/'+command,optionsArray,config);
311 var runner = spawn(command,optionsArray,config);
312 //var runner = spawn(command,optionsArray);
313 //commandRet = spawn('ls', ['-lh', '/usr']);
314 //commandRet = spawn(command, ['-h']);
316 var commandRet = runner;
318 commandRet.stdout.on('data', function (data) {
319 console.log('stdout: ' + data);
322 commandRet.stderr.on('data', function (data) {
323 console.log('stderr: ' + data);
326 runner.on('close', function() {
335 * @returns {promise} resolve(Array)
337 function getFiles(fileId) {
338 return new Promise(function(resolve, reject) {
339 if(process.env.NODE_ENV === 'test') {
340 resolve(['file1.txt', 'file2.txt']);
344 var workspace = r.map(function(f) { return f.name });
354 * @returns {object} key: filename, value: uuid
356 function getUUIDs(fileId) {
357 return new Promise(function(resolve) {
361 r.forEach(function(v) {
362 uuids[v.dataValues.name] = v.dataValues.fileId;
370 * Eosコマンドをエミュレートするクラス
373 * function execute(command, params) {
377 toExecString: toExecString,
381 toExecArray: toExecArray
384 module.exports = { instance: eos };