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