worker.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. var util = require('util');
  2. var _ = require('lodash');
  3. var app = {};
  4. /**
  5. * Worker
  6. *
  7. * Attaches defined data to parameter which inherit the data.
  8. * It uses 2 functions, preProcess and postProcess (with the result of preProcess).
  9. *
  10. * preProcess Generates a list with [defineName][name][version] = value
  11. * postProcess Attach the preProcess data with the nearest version to the tree.
  12. *
  13. * @param {Object} _app
  14. */
  15. function Worker(_app) {
  16. var self = this;
  17. // global variables
  18. app = _app;
  19. // class variables
  20. this.workers = {};
  21. // load worker
  22. var workers = Object.keys(app.workers);
  23. workers.forEach(function(worker) {
  24. if (_.isObject( app.workers[worker] )) {
  25. app.log.debug('inject worker: ' + worker);
  26. self.addWorker(worker, app.workers[worker] );
  27. } else {
  28. var filename = app.workers[worker];
  29. app.log.debug('load worker: ' + worker + ', ' + filename);
  30. self.addWorker(worker, require(filename));
  31. }
  32. });
  33. }
  34. /**
  35. * Inherit
  36. */
  37. util.inherits(Worker, Object);
  38. /**
  39. * Exports
  40. */
  41. module.exports = Worker;
  42. /**
  43. * Add Worker
  44. */
  45. Worker.prototype.addWorker = function(name, worker) {
  46. this.workers[name] = worker;
  47. };
  48. /**
  49. * Execute worker
  50. *
  51. * @todo Add priority system (if needed), if a plugin need an other operation to be done before.
  52. */
  53. Worker.prototype.process = function(parsedFiles, parsedFilenames, packageInfos) {
  54. // some smaller operation that are not outsourced to extra workers
  55. // TODO: add priority system first and outsource them then
  56. parsedFiles.forEach(function(parsedFile, fileIndex) {
  57. parsedFile.forEach(function(block) {
  58. if (Object.keys(block.global).length === 0 && Object.keys(block.local).length > 0) {
  59. if ( ! block.local.type)
  60. block.local.type = '';
  61. if ( ! block.local.url)
  62. block.local.url = '';
  63. if ( ! block.local.version)
  64. block.local.version = packageInfos.defaultVersion;
  65. if ( ! block.local.filename)
  66. block.local.filename = parsedFilenames[fileIndex];
  67. // convert dir delimeter \\ to /
  68. block.local.filename = block.local.filename.replace(/\\/g, '/');
  69. }
  70. });
  71. });
  72. // process transformations and assignments for each @api-Parameter
  73. var preProcessResults = {};
  74. _.each(this.workers, function(worker, name) {
  75. if (worker.preProcess) {
  76. app.log.verbose('worker preProcess: ' + name);
  77. var result = worker.preProcess(parsedFiles, parsedFilenames, packageInfos);
  78. _.extend(preProcessResults, result);
  79. }
  80. });
  81. _.each(this.workers, function(worker, name) {
  82. if (worker.postProcess) {
  83. app.log.verbose('worker postProcess: ' + name);
  84. worker.postProcess(parsedFiles, parsedFilenames, preProcessResults, packageInfos);
  85. }
  86. });
  87. };