6 // include all Eos command's info.
7 // For seaching with O(n), the object key name is command name.
8 var db = require('./DB.js').instance;
9 var commandList = require(__dirname + '/../../user-specific-files/OptionControlFile/command_list.json');
10 var ocfReference = {};
12 commandList.forEach(function(c) {
13 ocfReference[c.name] = require(__dirname + '/../../user-specific-files/OptionControlFile/commands/' + c.name);
15 var spawn = require('child_process').spawn;
18 function hasOneProperty(options) {
19 return new Promise(function(resolve, reject) {
20 if(options.length === 0) {
21 var errorMsg = 'At least one option is required.';
22 throw new Error(errorMsg);
29 function matchOption(options, ocf) {
30 return new Promise(function(resolve, reject) {
32 var notIncludingRequiredOptions = [];
33 options.forEach(function(o) {
34 ok[o.name] = o.arguments;
36 ocf.forEach(function(o) {
37 if(o.optionProperties && !ok[o.option]) {
38 notIncludingRequiredOptions.push(o.option);
42 // check whether all required option exist
43 if(notIncludingRequiredOptions.length > 0) {
44 var errorMsg = 'Option ' + notIncludingRequiredOptions.toString() + ' are required';
45 reject(new Error(errorMsg));
52 function validArgumentsNumber(options, ocfObj) {
53 return new Promise(function(resolve, reject) {
54 options.forEach(function(o) {
56 var expectNum = ocfObj[o.name].optionNumber;
57 var actualNum = o.arguments.length;
58 if(expectNum !== actualNum) {
59 reject(new Error('Invalid arguments number'));
66 function validArgumentsType(options, ocfObj, workspace) {
67 return new Promise(function(resolve, reject) {
68 options.forEach(function(o) {
69 o.arguments.forEach(function(arg,i) {
71 var formType = ocfObj[o.name].arg[i].formType
72 if(formType === 'select') { // This argument is filename
73 var exist = workspace.indexOf(arg) > -1;
75 reject(new Error(arg + ' doesn\'t exist.'));
78 var expectType = formType === 'text' ? 'string' : 'number';
79 var actualType = typeof arg;
80 if(expectType !== actualType) {
81 reject(new Error('argType is invalid'));
90 function validOutfileName(options, ocfObj, workspace) {
91 return new Promise(function(resolve, reject) {
93 var outRegExp = /out|append/;
95 options.forEach(function(o) {
96 o.arguments.forEach(function(arg,i) {
98 if(outRegExp.test(ocfObj[o.name].arg[i].argType)) {
99 if(workspace.indexOf(o.arguments[i]) > -1) {
100 reject(new Error('Invalid outfile name.'));
114 * @returns {valid: boolean, message: string}
116 function validate(command, options, workspaceId) {
117 return new Promise(function(resolve, reject) {
120 if(ocfReference[command]) {
121 ocf = ocfReference[command];
123 var errorMsg = 'Command name is invalid';
124 reject(new Error(errorMsg));
128 ocf.forEach(function(o) {
129 ocfObj[o.option] = o;
133 if(Array.isArray(options)) {
134 options.forEach(function(o) {
135 if(o.name && o.arguments) {
136 if(Array.isArray(o.arguments)) {
137 optionsObj[o.name] = o.arguments;
139 var errorMsg = 'Each "arguments" properties needs to be Array';
140 reject(new Error(errorMsg));
143 var errorMsg = 'Options need to include Object which have properties "name" and "arguments"';
144 reject(new Error(errorMsg));
148 var errorMsg = 'Options need to be Array';
149 reject(new Error(errorMsg));
152 getFiles(workspaceId)
153 .then(function(workspace) {
157 promises.push(hasOneProperty(options));
158 promises.push(matchOption(options, ocf));
159 promises.push(validArgumentsNumber(options, ocfObj));
160 promises.push(validArgumentsType(options, ocfObj, workspace));
161 promises.push(validOutfileName(options, ocfObj, workspace));
164 return Promise.all(promises)
166 .catch(function(error) {
182 function toExecString(command, options, workspaceId) {
183 var ocf = ocfReference[command]; // Array
184 var finalOptions = {};
185 var execStr = command + ' ';
187 ocf.forEach(function(o) {
188 ocfObj[o.option] = o;
192 if(workspaceId === "1f83f620-c1ed-11e5-9657-7942989daa00") { // root
193 var root = __dirname + '/../../user-specific-files/workspace/';
196 // set default parameters
197 ocf.forEach(function(o) {
198 o.arg.forEach(function(arg) {
199 if(!(arg.initialValue === "") && arg.initialValue) {
200 if(!(finalOptions[o.option])) {
201 finalOptions[o.option] = [];
202 finalOptions[o.option].push(arg.initialValue);
204 finalOptions[o.option].push(arg.initialValue);
210 // set user setting parameters
211 options.forEach(function(o) {
213 var outRegExp = /out|append/;
214 o.arguments.forEach(function(arg, i) {
215 if(ocfObj[o.name].arg[i].formType === 'select' || outRegExp.test(ocfObj[o.name].arg[i].argType)) {
221 finalOptions[o.name] = s;
224 // set execution string
225 Object.keys(finalOptions).forEach(function(key) {
226 execStr += key + ' ';
227 finalOptions[key].forEach(function(arg) {
228 execStr += arg + ' ';
233 execStr = execStr.slice(0,execStr.length-1);
244 function toExecArray(command, options, workspaceId) {
245 return new Promise(function(resolve, reject) {
246 var ocf = ocfReference[command]; // Array
247 var finalOptions = {};
249 ocf.forEach(function(o) {
250 ocfObj[o.option] = o;
253 // set default parameters
254 ocf.forEach(function(o) {
255 o.arg.forEach(function(arg) {
256 if(!(arg.initialValue === "") && arg.initialValue) {
257 if(!(finalOptions[o.option])) {
258 finalOptions[o.option] = [];
259 finalOptions[o.option].push(arg.initialValue);
261 finalOptions[o.option].push(arg.initialValue);
267 getUUIDs(workspaceId)
268 .then(function(uuids) {
269 // set user setting parameters
270 options.forEach(function(o) {
272 var outRegExp = /out|append/;
273 o.arguments.forEach(function(arg, i) {
274 if(ocfObj[o.name].arg[i].formType === 'select') {
280 finalOptions[o.name] = s;
282 var array = Object.keys(finalOptions).reduce(function(a,b) {
284 finalOptions[b].forEach(function(v) {
301 function execute(command, optionsArray) {
302 return new Promise(function(resolve, reject) {
304 if(process.env.NODE_ENV === 'debug') {
305 workspace = __dirname + '/../../user-specific-files/workspace.debug';
307 workspace = _dirname + '/../../user-specific-files/workspace';
313 var runner = spawn(command,optionsArray,config);
315 runner.on('close', function() {
324 * @returns {promise} resolve(Array)
326 function getFiles(fileId) {
327 return new Promise(function(resolve, reject) {
328 if(process.env.NODE_ENV === 'test') {
329 resolve(['file1.txt', 'file2.txt']);
333 var workspace = r.map(function(f) { return f.name });
343 * @returns {object} key: filename, value: uuid
345 function getUUIDs(fileId) {
346 return new Promise(function(resolve) {
350 r.forEach(function(v) {
351 uuids[v.dataValues.name] = v.dataValues.fileId;
359 * Eosコマンドをエミュレートするクラス
362 * function execute(command, params) {
366 toExecString: toExecString,
370 toExecArray: toExecArray
373 module.exports = { instance: eos };