6 * function execute(command, params) {
10 toExecString: toExecString,
21 // include all Eos command's info.
22 // For seaching with O(n), the object key name is command name.
23 var db = require('./DB.js').instance;
24 var commandList = require(__dirname + '/../../user-specific-files/OptionControlFile/command_list.json');
25 var ocfReference = {};
27 commandList.forEach(function(c) {
28 ocfReference[c.name] = require(__dirname + '/../../user-specific-files/OptionControlFile/commands/' + c.name);
40 function hasOneProperty(options) {
41 return new Promise(function(resolve, reject) {
42 if(options.length === 0) {
43 var errorMsg = 'At least one option is required.';
44 throw new Error(errorMsg);
51 function matchOption(options, ocf) {
52 return new Promise(function(resolve, reject) {
54 var notIncludingRequiredOptions = [];
55 options.forEach(function(o) {
56 ok[o.name] = o.arguments;
58 ocf.forEach(function(o) {
59 if(o.optionProperties && !ok[o.option]) {
60 notIncludingRequiredOptions.push(o.option);
64 // check whether all required option exist
65 if(notIncludingRequiredOptions.length > 0) {
66 var errorMsg = 'Option ' + notIncludingRequiredOptions.toString() + ' are required';
67 reject(new Error(errorMsg));
74 function validArgumentsNumber(options, ocfObj) {
75 return new Promise(function(resolve, reject) {
76 options.forEach(function(o) {
78 var expectNum = ocfObj[o.name].optionNumber;
79 var actualNum = o.arguments.length;
80 if(expectNum !== actualNum) {
81 reject(new Error('Invalid arguments number'));
88 function validArgumentsType(options, ocfObj, workspace) {
89 return new Promise(function(resolve, reject) {
90 options.forEach(function(o) {
91 o.arguments.forEach(function(arg,i) {
93 var formType = ocfObj[o.name].arg[i].formType
94 if(formType === 'select') { // This argument is filename
95 var exist = workspace.indexOf(arg) > -1;
97 reject(new Error(arg + ' doesn\'t exist.'));
100 var expectType = formType === 'text' ? 'string' : 'number';
101 var actualType = typeof arg;
102 if(expectType !== actualType) {
103 reject(new Error('argType is invalid'));
112 function validOutfileName(options, ocfObj, workspace) {
113 return new Promise(function(resolve, reject) {
114 // output file Regexp
115 var outRegExp = /out|append/;
117 options.forEach(function(o) {
118 o.arguments.forEach(function(arg,i) {
120 if(outRegExp.test(ocfObj[o.name].arg[i].argType)) {
121 if(workspace.indexOf(o.arguments[i]) > -1) {
122 reject(new Error('Invalid outfile name.'));
136 * @returns {valid: boolean, message: string}
138 function validate(command, options, workspaceId) {
139 return new Promise(function(resolve, reject) {
142 if(ocfReference[command]) {
143 ocf = ocfReference[command];
145 var errorMsg = 'Command name is invalid';
146 reject(new Error(errorMsg));
150 ocf.forEach(function(o) {
151 ocfObj[o.option] = o;
155 if(Array.isArray(options)) {
156 options.forEach(function(o) {
157 if(o.name && o.arguments) {
158 if(Array.isArray(o.arguments)) {
159 optionsObj[o.name] = o.arguments;
161 var errorMsg = 'Each "arguments" properties needs to be Array';
162 reject(new Error(errorMsg));
165 var errorMsg = 'Options need to include Object which have properties "name" and "arguments"';
166 reject(new Error(errorMsg));
170 var errorMsg = 'Options need to be Array';
171 reject(new Error(errorMsg));
174 getFiles(workspaceId)
175 .then(function(workspace) {
179 promises.push(hasOneProperty(options));
180 promises.push(matchOption(options, ocf));
181 promises.push(validArgumentsNumber(options, ocfObj));
182 promises.push(validArgumentsType(options, ocfObj, workspace));
183 promises.push(validOutfileName(options, ocfObj, workspace));
186 return Promise.all(promises)
188 .catch(function(error) {
204 function toExecString(command, options, workspaceId) {
205 var ocf = ocfReference[command]; // Array
206 var finalOptions = {};
207 var execStr = command + ' ';
209 ocf.forEach(function(o) {
210 ocfObj[o.option] = o;
214 if(workspaceId === "1f83f620-c1ed-11e5-9657-7942989daa00") { // root
215 var root = __dirname + '/../../user-specific-files/workspace/';
218 // set default parameters
219 ocf.forEach(function(o) {
220 o.arg.forEach(function(arg) {
221 if(!(arg.initialValue === "") && arg.initialValue) {
222 if(!(finalOptions[o.option])) {
223 finalOptions[o.option] = [];
224 finalOptions[o.option].push(arg.initialValue);
226 finalOptions[o.option].push(arg.initialValue);
232 // set user setting parameters
233 options.forEach(function(o) {
235 var outRegExp = /out|append/;
236 o.arguments.forEach(function(arg, i) {
237 if(ocfObj[o.name].arg[i].formType === 'select' || outRegExp.test(ocfObj[o.name].arg[i].argType)) {
243 finalOptions[o.name] = s;
246 // set execution string
247 Object.keys(finalOptions).forEach(function(key) {
248 execStr += key + ' ';
249 finalOptions[key].forEach(function(arg) {
250 execStr += arg + ' ';
255 execStr = execStr.slice(0,execStr.length-1);
268 function execute(command, options) {
269 var result = validate(command, options);
270 if(!result.hasDone) {
272 var str = toExecString(command, options);
279 * @returns {promise} resolve(Array)
281 function getFiles(fileId) {
282 return new Promise(function(resolve, reject) {
283 if(process.env.NODE_ENV === 'test') {
284 resolve(['file1.txt', 'file2.txt']);
288 var workspace = r.map(function(f) { return f.name });
295 module.exports = { instance: eos };