From 849ece00e32747238c819eb7d3ac70f0bdc90833 Mon Sep 17 00:00:00 2001 From: Petr Vobornik Date: Mon, 15 Apr 2013 19:20:56 +0200 Subject: Builder: global builder and registry https://fedorahosted.org/freeipa/ticket/3235 --- install/ui/src/freeipa/builder.js | 76 +++++++++++++++++++++++++++++++++++ install/ui/src/freeipa/ipa.js | 8 ++-- install/ui/src/freeipa/reg.js | 83 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 162 insertions(+), 5 deletions(-) create mode 100644 install/ui/src/freeipa/builder.js create mode 100644 install/ui/src/freeipa/reg.js diff --git a/install/ui/src/freeipa/builder.js b/install/ui/src/freeipa/builder.js new file mode 100644 index 000000000..0a8c39921 --- /dev/null +++ b/install/ui/src/freeipa/builder.js @@ -0,0 +1,76 @@ +/* Authors: + * Petr Vobornik + * + * Copyright (C) 2013 Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +/** + * Global builder interface. + * + * Contains a map of builders for a specific object type. + * + */ +define(['dojo/_base/declare', + 'dojo/_base/array', + 'dojo/_base/lang', + './_base/Builder', + './_base/Singleton_registry' + ], function(declare, array, lang, Builder, Singleton_registry) { + + var builder_registry = new Singleton_registry(); + builder_registry.builder.ctor = Builder; + + var exp = { + builders: builder_registry, + + /** + * Get builder for object type + * + * @param {String} object type + */ + get: function(obj_type) { + return this.builders.get(obj_type); + }, + + /** + * Set builder for object type. + * + * @param {String} object type + * @param {Builder} builder + */ + set: function(obj_type, builder) { + this.builders.set(obj_type, builder); + }, + + /** + * Build object by builder for given object type. + * + * @param {String} object type. Uses generic builder if empty string. + * @param {String|Object|Function} spec + * @param {Object|null} context + * @param {Object|null} build overrides + */ + build: function(obj_type, spec, context, overrides) { + + obj_type = obj_type || 'generic'; + var builder = this.builders.get(obj_type); + return builder.build(spec, context, overrides); + } + }; + + return exp; +}); \ No newline at end of file diff --git a/install/ui/src/freeipa/ipa.js b/install/ui/src/freeipa/ipa.js index 1bcee8391..06172bb0b 100644 --- a/install/ui/src/freeipa/ipa.js +++ b/install/ui/src/freeipa/ipa.js @@ -24,12 +24,12 @@ define(['./jquery', './json2', - './_base/Builder', './_base/i18n', './_base/metadata_provider', + './builder', './entities', './text'], - function($, JSON, Builder, i18n, metadata_provider, entities, text) { + function($, JSON, i18n, metadata_provider, builder, entities, text) { var IPA = function() { @@ -1119,11 +1119,9 @@ IPA.concurrent_command = function(spec) { return that; }; -IPA.builder = new Builder(); - IPA.build = function(spec, context, overrides) { - return IPA.builder.build(spec, context, overrides); + return builder.build(null, spec, context, overrides); }; IPA.default_factory = function(spec) { diff --git a/install/ui/src/freeipa/reg.js b/install/ui/src/freeipa/reg.js new file mode 100644 index 000000000..3d2079fee --- /dev/null +++ b/install/ui/src/freeipa/reg.js @@ -0,0 +1,83 @@ +/* Authors: + * Petr Vobornik + * + * Copyright (C) 2013 Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +/** + * Registry-like object which serves as a registry of registries. + * + * Registry object should implement `register` and `get; method as Singleton or + * Construct registry do. It's expected that there will be different types of + * registries for various object types. + * + * Existing registries can be access directly by properties. + * + * Use set method for setting new registry. + * Use get/registry method for getting/registering of object in a registry. + * + * Registries should be named by their object type in singular form. + * I.e.: + * * entity + * * widget + * * action + * * formatter + * * facet + * * dialog + */ +define(['dojo/_base/declare', + 'dojo/_base/array', + 'dojo/_base/lang', + './_base/Singleton_registry' + ], function(declare, array, lang, Singleton_registry) { + + var Registries_registry = declare([Singleton_registry], { + + get: function(object_type, type) { + + var registry = this.inherited([object_type]); + return registry.get(type); + }, + + register: function(object_type, type, func, default_spec) { + var registry = this.inherited([object_type]); + return registry.get(type, func, default_spec); + } + }); + + var reg = new Singleton_registry(); + reg.builder.ctor = Singleton_registry; + + var exp = reg._map; + exp.get = function(object_type, type) { + + var registry = reg.get(object_type); + return registry.get(type); + }; + + exp.register = function(object_type, type, func, default_spec) { + var registry = reg.get(object_type); + registry.register(type, func, default_spec); + }; + + exp.set = function(object_type, registry) { + reg.set(object_type, registry); + }; + + + return exp; +}); \ No newline at end of file -- cgit