From 0dc4b133fb0795b9c55f8a9fc95b55bc4df7ebf2 Mon Sep 17 00:00:00 2001 From: Petr Vobornik Date: May 06 2013 14:22:24 +0000 Subject: Builder: return object when it's already built https://fedorahosted.org/freeipa/ticket/3235 --- diff --git a/install/ui/src/freeipa/_base/Builder.js b/install/ui/src/freeipa/_base/Builder.js index 0eb76c4..d01f86f 100644 --- a/install/ui/src/freeipa/_base/Builder.js +++ b/install/ui/src/freeipa/_base/Builder.js @@ -84,6 +84,7 @@ define(['dojo/_base/declare', var f,c; if (spec === undefined || spec === null) return null; + if (!construct.is_spec(spec)) return spec; context = context || {}; diff --git a/install/ui/src/freeipa/_base/construct.js b/install/ui/src/freeipa/_base/construct.js index bc017ad..e44c66b 100644 --- a/install/ui/src/freeipa/_base/construct.js +++ b/install/ui/src/freeipa/_base/construct.js @@ -34,12 +34,28 @@ define(['dojo/_base/declare', */ is_ctor: function(obj) { - // TODO: Find better method. Check by extend might not be very - // reliable. return typeof obj === 'function' && typeof obj.extend === 'function'; }, /** + * Finds out if object is a spec object. + * + * Object is not a spec object when any of following applies: + * * has __fw_obj === true + * * has isInstanceOf function - basically tells if it's a instance of + * dojo-based class + * + */ + is_spec: function(obj) { + var ret = false; + if (typeof obj === 'object') { + ret = obj.__fw_obj === true || + typeof obj.isInstanceOf === 'function'; + } + return !ret; + }, + + /** * Creates copy of construction specification * * It makes sure that pre_ops, post_ops and spec are new Arrays/Object diff --git a/install/ui/src/freeipa/ipa.js b/install/ui/src/freeipa/ipa.js index e252a78..c8bf4da 100644 --- a/install/ui/src/freeipa/ipa.js +++ b/install/ui/src/freeipa/ipa.js @@ -293,9 +293,26 @@ var IPA = function() { } }; + that.obj_cls = function() {}; + that.obj_cls.prototype.__fw_obj = true; + return that; }(); +/** + * Basic object + * + * Framework objects created by factories should use this instead of {} when + * creating base objects. As an alternative they can just set __fw_obj + * property. + * + * __fw_obj property serves for telling the framework that it's instantiated + * object and not an object specification (spec). + */ +IPA.object = function() { + return new IPA.obj_cls(); +}; + IPA.get_credentials = function() { var status; diff --git a/install/ui/test/build_tests.js b/install/ui/test/build_tests.js index fec8717..603f41f 100644 --- a/install/ui/test/build_tests.js +++ b/install/ui/test/build_tests.js @@ -59,6 +59,7 @@ test('Testing builder', function() { var o2 = b2.build({}); var o21 = b2.build({ foo: 'baz'}); + var o22 = b2.build(o21); var r1 = { foo: 'bar' }; var r11 = { foo: 'baz' }; @@ -71,6 +72,8 @@ test('Testing builder', function() { deepEqual(o2, r2, 'Constructor, default'); deepEqual(o21, r21, 'Constructor, spec use'); + strictEqual(o21, o22, 'Don\'t build built object'); + }); test('Testing Spec_mod', function() {