generator-alfresco-common
Version:
Common code for Alfresco yeoman generator
162 lines (149 loc) • 5.6 kB
JavaScript
'use strict';
var domutils = require('./xml-dom-utils.js');
var utils = require('./general-utils.js');
/*
* Provides helpers for consuming archetype-metadata.xml files.
*/
module.exports = function (archetypeMetadataString) {
var module = {};
var doc = domutils.parseFromString(archetypeMetadataString);
/**
* Read the @name text attribute from the root archetype-descriptor element.
*
* @returns {!string}
* @throws {TypeError} if name is not defined or XML is not an archetype-descriptor
*/
module.getName = function () {
var nameAttribute = domutils.getFirstNodeMatchingXPath('/desc:archetype-descriptor/@name', doc);
return nameAttribute.value;
};
/**
* Read the @parital boolean attribute from the root archetype-descriptor element.
*
* @returns {!boolean}
*/
module.isPartial = function () {
var partial = domutils.getFirstNodeMatchingXPath('/desc:archetype-descriptor/@partial', doc);
try {
return utils.toBoolean(partial.value, false);
} catch (err) {
return false;
}
};
/**
* Reads any requiredProperty elements and produces a map with the @key attribute mapped
* to any provided defaultValue (or undefined if no defaultValue is provided.)
*
* @returns {!Object}
*/
module.getRequiredProperties = function () {
var xp = '/desc:archetype-descriptor/desc:requiredProperties/desc:requiredProperty';
var elements = domutils.selectMatchingXPath(xp, doc);
var props = {};
var numProps = elements.length;
for (var propIdx = 0; propIdx < numProps; propIdx++) {
var prop = elements[propIdx];
var key = prop.getAttribute('key');
if (key !== undefined) {
var defaultValue;
var defaultValueElement = domutils.getChild(prop, 'desc', 'defaultValue');
if (defaultValueElement !== undefined) {
defaultValue = defaultValueElement.textContent;
} else {
defaultValue = undefined;
}
props[key] = defaultValue;
}
}
return props;
};
/**
* Reads any top level fileSet elements and produces an array of objects describing
* each such fileSet.
*
* @returns {!Array<Object>}
*/
module.getFileSets = function () {
var xp = '/desc:archetype-descriptor/desc:fileSets/desc:fileSet';
var elements = domutils.selectMatchingXPath(xp, doc);
var fileSets = [];
var numFileSets = elements.length;
for (var idx = 0; idx < numFileSets; idx++) {
fileSets.push(_getFileSet(elements[idx]));
}
return fileSets;
};
/**
* Produces a JavaScript object representing a fileSet.
*
* @param {Element} fileSetElement
* @returns {{filtered: (boolean|undefined), packaged: (boolean|undefined), encoding: (string|*), directory, includes: Array, excludes: Array}}
* @private
*/
function _getFileSet (fileSetElement) {
var filtered = utils.toBoolean(fileSetElement.getAttribute('filtered'), false);
var packaged = utils.toBoolean(fileSetElement.getAttribute('packaged'), false);
var encoding = fileSetElement.getAttribute('encoding');
var directory = domutils.getChild(fileSetElement, 'desc', 'directory').textContent;
var includes = domutils.selectMatchingXPath('desc:includes/desc:include', fileSetElement);
var excludes = domutils.selectMatchingXPath('desc:excludes/desc:exclude', fileSetElement);
var fileSet = {
filtered: filtered, packaged: packaged, encoding: encoding, directory: directory, includes: [], excludes: [],
};
includes.forEach(function (include) {
fileSet.includes.push(include.textContent);
});
excludes.forEach(function (exclude) {
fileSet.excludes.push(exclude.textContent);
});
return fileSet;
}
/**
* Reads any top level module elements and produces an array of objects describing
* each such module.
*
* @returns {!Array<object>}
*/
module.getModules = function () {
var xp = '/desc:archetype-descriptor/desc:modules/desc:module';
var elements = domutils.selectMatchingXPath(xp, doc);
var modules = [];
var numModules = elements.length;
for (var idx = 0; idx < numModules; idx++) {
modules.push(_getModule(elements[idx]));
}
return modules;
};
/**
* Produces a JavaScript object representing a module.
*
* @param {!Element} moduleElement
* @returns {{id: (string|*), dir: (string|*), name: (string|*), fileSets: Array, modules: Array}}
* @private
*/
function _getModule (moduleElement) {
var id = moduleElement.getAttribute('id');
var dir = moduleElement.getAttribute('dir');
var name = moduleElement.getAttribute('name');
var fileSets = domutils.getChild(moduleElement, 'desc', 'fileSets');
var modules = domutils.getChild(moduleElement, 'desc', 'modules');
var module = { id: id, dir: dir, name: name, fileSets: [], modules: [] };
if (fileSets !== undefined) {
var fileSetElements = domutils.selectMatchingXPath('desc:fileSet', fileSets);
var numFileSets = fileSetElements.length;
for (var fsIdx = 0; fsIdx < numFileSets; fsIdx++) {
module.fileSets.push(_getFileSet(fileSetElements[fsIdx]));
}
}
if (modules !== undefined) {
var moduleElements = domutils.selectMatchingXPath('desc:module', modules);
var numModules = moduleElements.length;
for (var mIdx = 0; mIdx < numModules; mIdx++) {
module.modules.push(_getModule(moduleElements[mIdx]));
}
}
return module;
}
return module;
};
// vim: autoindent expandtab tabstop=2 shiftwidth=2 softtabstop=2