Mercurial > pub > ImplabJs
comparison src/implab/di/ActivationContext.js @ 24:f750c89976d3
Added trace tools, implab/log/trace!<channel-name>, <channel-name> is optional
| author | cin |
|---|---|
| date | Thu, 07 Dec 2017 19:19:29 +0300 |
| parents | 00779cb63b12 |
| children |
comparison
equal
deleted
inserted
replaced
| 23:1d72fddc319a | 24:f750c89976d3 |
|---|---|
| 1 define([ | 1 define([ |
| 2 "../declare", | 2 "../declare", |
| 3 "../safe", | 3 "../safe", |
| 4 "./Descriptor", | 4 "./Descriptor", |
| 5 "./ValueDescriptor" | 5 "./ValueDescriptor", |
| 6 ], | 6 "../log/trace!" |
| 7 ], function (declare, safe, Descriptor, Value, trace) { | |
| 8 var Context = declare(null, { | |
| 7 | 9 |
| 8 function (declare, safe, Descriptor, Value) { | 10 _cache: null, |
| 9 var Context = declare(null, { | |
| 10 | 11 |
| 11 _cache: null, | 12 _services: null, |
| 12 | 13 |
| 13 _services: null, | 14 _stack: null, |
| 14 | 15 |
| 15 _stack: null, | 16 _visited: null, |
| 16 | 17 |
| 17 _visited: null, | 18 container: null, |
| 18 | 19 |
| 19 container: null, | 20 _trace: true, |
| 20 | 21 |
| 21 _trace: false, | 22 constructor: function (container, services, cache, visited) { |
| 23 safe.argumentNotNull(container, "container"); | |
| 24 safe.argumentNotNull(services, "services"); | |
| 22 | 25 |
| 23 constructor: function (container, services, cache, visited) { | 26 this._visited = visited || {}; |
| 24 safe.argumentNotNull(container, "container"); | 27 this._stack = []; |
| 25 safe.argumentNotNull(services, "services"); | 28 this._cache = cache || {}; |
| 29 this._services = services; | |
| 30 this.container = container; | |
| 31 }, | |
| 26 | 32 |
| 27 this._visited = visited || {}; | 33 getService: function (name, def) { |
| 28 this._stack = []; | 34 var d = this._services[name]; |
| 29 this._cache = cache || {}; | |
| 30 this._services = services; | |
| 31 this.container = container; | |
| 32 }, | |
| 33 | 35 |
| 34 getService: function (name, def) { | 36 if (!d) |
| 35 var d = this._services[name]; | 37 if (arguments.length > 1) |
| 38 return def; | |
| 39 else | |
| 40 throw new Error("Service '" + name + "' not found"); | |
| 36 | 41 |
| 37 if (!d) | 42 return d.activate(this, name); |
| 38 if (arguments.length > 1) | 43 }, |
| 39 return def; | |
| 40 else | |
| 41 throw new Error("Service '" + name + "' not found"); | |
| 42 | 44 |
| 43 return d.activate(this, name); | 45 /** |
| 44 }, | 46 * registers services local to the the activation context |
| 47 * | |
| 48 * @name{string} the name of the service | |
| 49 * @service{string} the service descriptor to register | |
| 50 */ | |
| 51 register: function (name, service) { | |
| 52 safe.argumentNotEmptyString(name, "name"); | |
| 45 | 53 |
| 46 /** | 54 if (!(service instanceof Descriptor)) |
| 47 * registers services local to the the activation context | 55 service = new Value(service, true); |
| 48 * | 56 this._services[name] = service; |
| 49 * @name{string} the name of the service | 57 }, |
| 50 * @service{string} the service descriptor to register | |
| 51 */ | |
| 52 register: function (name, service) { | |
| 53 safe.argumentNotEmptyString(name, "name"); | |
| 54 | 58 |
| 55 if (!(service instanceof Descriptor)) | 59 clone: function () { |
| 56 service = new Value(service, true); | 60 return new Context( |
| 57 this._services[name] = service; | 61 this.container, |
| 58 }, | 62 Object.create(this._services), |
| 63 this._cache, | |
| 64 this._visited | |
| 65 ); | |
| 59 | 66 |
| 60 clone: function () { | 67 }, |
| 61 return new Context( | |
| 62 this.container, | |
| 63 Object.create(this._services), | |
| 64 this._cache, | |
| 65 this._visited | |
| 66 ); | |
| 67 | 68 |
| 68 }, | 69 has: function (id) { |
| 70 return id in this._cache; | |
| 71 }, | |
| 69 | 72 |
| 70 has: function (id) { | 73 get: function (id) { |
| 71 return id in this._cache; | 74 return this._cache[id]; |
| 72 }, | 75 }, |
| 73 | 76 |
| 74 get: function (id) { | 77 store: function (id, value) { |
| 75 return this._cache[id]; | 78 return (this._cache[id] = value); |
| 76 }, | 79 }, |
| 77 | 80 |
| 78 store: function (id, value) { | 81 parse: function (data, name) { |
| 79 return (this._cache[id] = value); | 82 var me = this; |
| 80 }, | 83 if (safe.isPrimitive(data)) |
| 84 return data; | |
| 81 | 85 |
| 82 parse: function (data, name) { | 86 if (data instanceof Descriptor) { |
| 83 var me = this; | 87 return data.activate(this, name); |
| 84 if (safe.isPrimitive(data)) | 88 } else if (data instanceof Array) { |
| 85 return data; | 89 me.enter(name); |
| 90 var v = data.map(function (x, i) { | |
| 91 return me.parse(x, "." + i); | |
| 92 }); | |
| 93 me.leave(); | |
| 94 return v; | |
| 95 } else { | |
| 96 me.enter(name); | |
| 97 var result = {}; | |
| 98 for (var p in data) | |
| 99 result[p] = me.parse(data[p], "." + p); | |
| 100 me.leave(); | |
| 101 return result; | |
| 102 } | |
| 103 }, | |
| 86 | 104 |
| 87 if (data instanceof Descriptor) { | 105 visit: function (id) { |
| 88 return data.activate(this, name); | 106 var count = this._visited[id] || 0; |
| 89 } else if (data instanceof Array) { | 107 this._visited[id] = count + 1; |
| 90 me.enter(name); | 108 return count; |
| 91 var v = data.map(function (x, i) { | 109 }, |
| 92 return me.parse(x, "." + i); | |
| 93 }); | |
| 94 me.leave(); | |
| 95 return v; | |
| 96 } else { | |
| 97 me.enter(name); | |
| 98 var result = {}; | |
| 99 for (var p in data) | |
| 100 result[p] = me.parse(data[p], "." + p); | |
| 101 me.leave(); | |
| 102 return result; | |
| 103 } | |
| 104 }, | |
| 105 | 110 |
| 106 visit: function (id) { | 111 getStack: function () { |
| 107 var count = this._visited[id] || 0; | 112 return this._stack.slice().reverse(); |
| 108 this._visited[id] = count + 1; | 113 }, |
| 109 return count; | |
| 110 }, | |
| 111 | 114 |
| 112 getStack: function () { | 115 enter: function (name, d, localize) { |
| 113 return this._stack.slice().reverse(); | 116 if (this._trace) |
| 114 }, | 117 trace.log("enter " + name + " " + (d || "") + |
| 118 (localize ? " localize" : "")); | |
| 119 this._stack.push({ | |
| 120 name: name, | |
| 121 service: d, | |
| 122 scope: this._services | |
| 123 }); | |
| 124 if (localize) | |
| 125 this._services = Object.create(this._services); | |
| 126 }, | |
| 115 | 127 |
| 116 enter: function (name, d, localize) { | 128 leave: function () { |
| 117 if (this._trace) | 129 var ctx = this._stack.pop(); |
| 118 console.log("enter " + name + " " + (d || "") + | 130 this._services = ctx.scope; |
| 119 (localize ? " localize" : "")); | |
| 120 this._stack.push({ | |
| 121 name: name, | |
| 122 service: d, | |
| 123 scope: this._services | |
| 124 }); | |
| 125 if (localize) | |
| 126 this._services = Object.create(this._services); | |
| 127 }, | |
| 128 | 131 |
| 129 leave: function () { | 132 if (this._trace) |
| 130 var ctx = this._stack.pop(); | 133 trace.log("leave " + ctx.name + " " + (ctx.service || "")); |
| 131 this._services = ctx.scope; | 134 } |
| 135 }); | |
| 132 | 136 |
| 133 if (this._trace) | 137 return Context; |
| 134 console.log("leave " + ctx.name + " " + (ctx.service || "")); | 138 }); |
| 135 } | |
| 136 }); | |
| 137 | |
| 138 return Context; | |
| 139 }); |
