module.exports = function()

in grunt-config/custom-tasks/rat/tasks/rat.js [20:153]


module.exports = function (grunt) {
  grunt.registerMultiTask('rat', 'Run Apache Rat', function () {
    var async = require("async");
    var chalk = require('chalk');
    var childProcess = require('child_process');
    var path = require('path');
    var fs = require('fs');
    var xml2js = require('xml2js');

    var globalCB = this.async();
    
    var ratJarFile =  path.resolve(__dirname,'./../_extern-tools/apache-rat-0.11/apache-rat-0.11.jar');
    var options = this.options({ xml : true, dest : './_dist/tmp'});

    //check output directory
    if(!fs.existsSync(options.dest)){
      grunt.file.mkdir(options.dest,0766);
    }
    
    //collect directories which should be checked
    var checkDirs = [];
    for(var i = 0; i < this.files.length; i++) {
      for(var ii = 0; ii < this.files[i].src.length; ii++) {
        var checkDir = {
          dir : this.files[i].src[ii],
          options : {
            xml : options.xml,
            dest : options.dest,
            tag : this.files[i].options.tag,
            exclude : options.exclude || this.files[i].options.exclude
          }
        };
        checkDirs.push(checkDir);
      }
    }

    var processDirectory = function processDirectory(data,cb) {
      var checkDir = data.dir; 
      var options = data.options;
      var outPutFile = options.dest + '/'+ 'rat_' + (options.tag ? options.tag:'') + (options.xml ? '.xml' : '.txt');
      
      //sample command java -jar apache-rat-0.10.jar -x -d ./src > ./_dist/tmp/rat.txt
      var cmd = 'java -jar ' + ratJarFile+ ' ';
      cmd += options.xml ? ' -x' : '';
      cmd += ' --force -d ' + checkDir;
      //cmd += ' -E ./grunt-config/custom-tasks/rat/.rat-excludes'
      if (options.exclude)  {
        for (var i = 0;  i< options.exclude.length; i ++) {
          cmd += ' -e '+ options.exclude[i];
        }
      }
      cmd +=  ' > ' + outPutFile;

      grunt.verbose.writeln('Command:', chalk.yellow(cmd));
      var cp = childProcess.exec(cmd, options.execOptions, function (error, stdout, stderr) {
        if (error) {
          grunt.fail.warn('rat --> ' + error, 1); //exit grunt with error code 1
        }
        checkOutFile(outPutFile,data,cb);
      });
    };

    var checkOutFile = function(outFile,data,cb) {
      //check out files
      if (path.extname(outFile) !== '.xml') {
        //grunt.log.writeln(chalk.yellow('\nrat --> ' + 'No XML output: ('+outFile+') skipped!\n'));
        cb();
        return;
      }

      var xml = grunt.file.read(outFile);
      var parser = new xml2js.Parser();

      parser.parseString(xml, function (err, result) {
          if (err) {
            grunt.fail.warn('rat --> XML parse error: ' + err, 1); 
          }
          
          if (checkRatLogFile(result)) {
            grunt.fail.warn('rat --> check license error:  ' + 'Missing or Invalied license header detected ( see "'+outFile+'")', 1);
          }
          
          grunt.log.ok('rat --> check on ' + data.dir + ' ok -> see'  + outFile);
      });
      cb();
    };

    var checkRatLogFile = function(result) {
      var list = result['rat-report']['resource'];
      for (var i = 0; i < list.length; i++ ){
        var item = list[i];

        var headerType = list[i]['header-type'];
        var attr = headerType[0]['$'];
        if (attr.name.trim() !== 'AL') {
          return true;
        }
      }
      return false;
    };

    var captureOutput = function (child, output) {
      if (grunt.option('color') === false) {
        child.on('data', function (data) {
          output.write(chalk.stripColor(data));
        });
      } else {
        child.pipe(output);
      }
    };

    //files
    async.each(checkDirs,
      function (checkDir,cb) {
        processDirectory(checkDir,cb);
      },
      function(err) {
        grunt.log.ok('rat --> finished');
        globalCB();
      }
    );

    
  /*
    captureOutput(cp.stdout, process.stdout);
      captureOutput(cp.stderr, process.stderr);

    if (options.stdin) {
      process.stdin.resume();
      process.stdin.setEncoding('utf8');
      process.stdin.pipe(cp.stdin);
    }*/
  });
};