Source: provider/convention/responseProviderByDirectory.js

/**
 * @author Sloan Seaman 
 * @copyright 2016 and on
 * @version .1
 * @license https://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
 */

/** @private */
var AbstractProviderByAsyncDirectory = require('../abstractProviderByAsyncDirectory.js');
var DefaultResponseBuilder = require ('../../response/defaultResponseBuilder.js');
var fs = require('fs');
var path = require('path');
var log = require('winston-simple').getLogger('ResponseProviderByDirectory');

/**
 * Provides responses by loading all of the files in a directory as responses
 * 
 * Responses are loaded asynchronously but if a response is requested before being loaded 
 * it will be immediately loaded and then skipped by the asynchronous processing.
 *
 * @param {String} directory The directory to read all responses from
 * @param {Object} options Options for the was the directory is process
 * @param {String} [options.fileEncoding=utf8] The encoding of the files.
 * @param {FileNameFormatter} [options.filenameFormatter=DefaultJSONFilenameFormatter] The FilenameFormmatter to use to parse the 
 *     filenames to determine response name as well as how to format the responseId to become a filename. This object will only 
 *     load files that match the formatters isValid() method
 * @param {ResponseBuilder} [options.responseBuilder=DefaultResponseBuilder] The ResponseBuilder to use when building responses. Defaults to DefaultResponseBuilder
 *
 * @constructor
 * @implements {Provider}
 * @implements {ItemProcessor}
 * @see {@link DefaultResponseBuilder}
 * @see {@link DefaultJSONFilenameFormatter}
 */
function ResponseProviderByDirectory(directory, options) {
	if (!directory) throw Error('directory required');

	this._responseBuilder = (options && options.responseBuilder) 
		? options.responseBuilder
		: new DefaultResponseBuilder();

	AbstractProviderByAsyncDirectory.apply(this, [
		directory, 
		options]);
}

ResponseProviderByDirectory.prototype = Object.create(AbstractProviderByAsyncDirectory.prototype);
ResponseProviderByDirectory.prototype.constructor = ResponseProviderByDirectory;

/**
 *
 * @function
 * @param {Map} items Map of the items being processed
 * @param {String} itemId The Id of the item to process
 * @param {String} fileName The name of the file being processed
 * @param {Object} options Any options that are being passed to the ItemProcessor (can be null)
 */
ResponseProviderByDirectory.prototype.processItem = function(items, itemId, fileName, options) {
	/*eslint no-unused-vars: ["error", { "args": "none" }]*/
	this.processItems(items, fileName, options);
};

/**
 * Synchronously reads a file and, using the ResponseBuilder from the constructor, builds a response for the
 * use in {@link AbstractProviderByDictionary}
 * 
 * @function
 * @param {Map} items Map of the items being processed
 * @param {String} fileName The name of the file being processed
 * @param {Object} options Any options that are being passed to the ItemProcessor (can be null)
 */
ResponseProviderByDirectory.prototype.processItems = function(items, fileName, options) {
	/*eslint no-unused-vars: ["error", { "args": "none" }]*/
	var contents = fs.readFileSync(fileName, this._fileEncoding);
	if (contents) {
		var parsedFileName = path.parse(fileName);
		var itemId = parsedFileName.name;
		items[itemId] = this._responseBuilder.withResponseId(itemId).withString(contents).build();
		log.info('Loaded response '+parsedFileName.base+' as id '+parsedFileName.name);
	}
};

module.exports = ResponseProviderByDirectory;