1
0
Fork 0

Now allows to configure an App during runtime and get its configuration options. Configure will trigger reload routing.

This commit is contained in:
Michael Hackstein 2015-01-21 09:54:22 +01:00
parent 802167cea7
commit c9b92ecf23
4 changed files with 91 additions and 2 deletions

View File

@ -391,6 +391,17 @@ function updateApp (mount, update) {
return tmp_getStorage().updateByExample({mount: mount}, update);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief define regex for parameter types
////////////////////////////////////////////////////////////////////////////////
var typeToRegex = {
"int": /[0-9]+/,
"integer": /[0-9]+/,
"boolean": /(true)|(false)/,
"bool": /(true)|(false)/,
"string": /[\w\W]*/
};
////////////////////////////////////////////////////////////////////////////////
/// @brief Exports
////////////////////////////////////////////////////////////////////////////////
@ -406,6 +417,7 @@ exports.repackZipFile = repackZipFile;
exports.processDirectory = processDirectory;
exports.processGithubRepository = processGithubRepository;
exports.validateAppName = validateAppName;
exports.typeToRegex = typeToRegex;
exports.tmp_getStorage = tmp_getStorage;

View File

@ -40,6 +40,8 @@
var internal = require("internal");
var db = internal.db;
var _= require("underscore");
var utils = require("org/arangodb/foxx/manager-utils");
// -----------------------------------------------------------------------------
// --SECTION-- constructors and destructors
// -----------------------------------------------------------------------------
@ -187,6 +189,56 @@ var ArangoApp = function (config) {
return this._appContext;
};
////////////////////////////////////////////////////////////////////////////////
/// @brief set app configuration
////////////////////////////////////////////////////////////////////////////////
ArangoApp.prototype.configure = function(config) {
var expected = this._manifest.configuration;
var attr;
var type;
var invalid = [];
this._options.configuration = this._options.configuration || {};
for (attr in config) {
if (config.hasOwnProperty(attr)) {
if (!expected.hasOwnProperty(attr)) {
invalid.push("Unexpected Attribute " + attr);
} else {
type = expected[attr].type;
if (!(utils.typeToRegex[type]).test(config[attr])) {
invalid.push("Attribute " + attr + " has wrong type, expected: " + type);
} else {
this._options.configuration[attr] = config[attr];
}
}
}
}
return invalid;
};
////////////////////////////////////////////////////////////////////////////////
/// @brief get app configuration
////////////////////////////////////////////////////////////////////////////////
ArangoApp.prototype.getConfiguration = function() {
if (!this._manifest.hasOwnProperty("configuration")) {
return {};
}
// Make sure originial is unmodified
var config = JSON.parse(JSON.stringify(this._manifest.configuration));
var setting = this._options.configuration || {};
var attr;
for (attr in config) {
if (config.hasOwnProperty(attr)) {
if (setting.hasOwnProperty(attr)) {
config[attr].current = setting[attr];
} else if (config[attr].hasOwnProperty("default")) {
config[attr].current = config[attr].default;
}
}
}
return config;
};
////////////////////////////////////////////////////////////////////////////////
/// @brief loadAppScript

View File

@ -1274,6 +1274,7 @@ exports.initializeFoxx = function () {
////////////////////////////////////////////////////////////////////////////////
var lookupApp = function(mount) {
require("console").log(Object.keys(appCache));
if (!appCache.hasOwnProperty(mount)) {
throw "App not found";
}
@ -1784,8 +1785,6 @@ exports.initializeFoxx = function () {
executeGlobalContextFunction("reloadRouting");
};
////////////////////////////////////////////////////////////////////////////////
/// @brief Internal install function. Check install.
/// Does not check parameters and throws errors.
@ -1949,6 +1948,29 @@ exports.initializeFoxx = function () {
_toggleDevelopment(mount, false);
};
var configure = function(mount, options) {
checkParameter(
"mount(<mount>)",
[ [ "Mount path", "string" ] ],
[ mount ] );
var app = lookupApp(mount);
var invalid = app.configure(options);
if (invalid.length > 0) {
require("console").log(invalid);
}
utils.updateApp(mount, app.toJSON());
executeGlobalContextFunction("reloadRouting");
};
var configuration = function(mount) {
checkParameter(
"mount(<mount>)",
[ [ "Mount path", "string" ] ],
[ mount ] );
var app = lookupApp(mount);
return app.getConfiguration();
};
// -----------------------------------------------------------------------------
// --SECTION-- exports
// -----------------------------------------------------------------------------
@ -1967,6 +1989,8 @@ exports.initializeFoxx = function () {
exports.appRoutes = appRoutes;
exports.development = setDevelopment;
exports.production = setProduction;
exports.configure = configure;
exports.configuration = configuration;
////////////////////////////////////////////////////////////////////////////////
/// @brief Exports from foxx utils module.

View File

@ -24,6 +24,7 @@
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Lucas Dohmen
/// @author Michael Hackstein
/// @author Copyright 2013, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////