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 });