UNPKG

21.3 kBJavaScriptView Raw
1'use strict';
2
3var define = define ? define : require('amdefine')(module);
4
5var utils,
6 ClassesHandler,
7 ClassesRegistry,
8 InterfacesRegistry,
9 Interfacer,
10 ExtenderClassProcessor,
11 InterfacerClassProcessor,
12 ServicesContainer,
13 AbstractServiceBuilder,
14 AliasServiceBuilder,
15 ChildrenServiceBuilder,
16 ClassServiceBuilder,
17 DeclinationsServiceBuilder,
18 FactoriesServiceBuilder,
19 ParentServiceBuilder,
20 PropertiesServiceBuilder,
21 TagsServiceBuilder,
22 ParametersConfigurationSectionProcessor,
23 ServicesConfigurationSectionProcessor,
24 DataResolver,
25 DefaultDataInterpreter,
26 RequiredDataInterpreter,
27 ReferencesDataInterpreter,
28 NamespacesDataInterpreter,
29 Namespacer,
30 TypeDataInterpreter,
31 ReferenceResolver,
32 ReferenceType
33;
34
35if (!module.isClient) {
36 utils = require('./utils');
37 ClassesHandler = require('./object/classes-handler');
38 ClassesRegistry = require('./object/classes-registry');
39 InterfacesRegistry = require('./object/interfaces-registry');
40 Interfacer = require('./object/interfacer');
41 ExtenderClassProcessor = require('./object/class-processor/extender');
42 InterfacerClassProcessor = require('./object/class-processor/interfacer');
43 ServicesContainer = require('./dependency-injection/services-container');
44 AbstractServiceBuilder = require('./dependency-injection/service-builder/abstract');
45 AliasServiceBuilder = require('./dependency-injection/service-builder/alias');
46 ChildrenServiceBuilder = require('./dependency-injection/service-builder/children');
47 ClassServiceBuilder = require('./dependency-injection/service-builder/class');
48 DeclinationsServiceBuilder = require('./dependency-injection/service-builder/declinations');
49 FactoriesServiceBuilder = require('./dependency-injection/service-builder/factories');
50 ParentServiceBuilder = require('./dependency-injection/service-builder/parent');
51 PropertiesServiceBuilder = require('./dependency-injection/service-builder/properties');
52 TagsServiceBuilder = require('./dependency-injection/service-builder/tags');
53 ParametersConfigurationSectionProcessor = require('./configuration/configuration-section/parameters');
54 ServicesConfigurationSectionProcessor = require('./dependency-injection/configuration-section/services');
55 DataResolver = require('./manipulation/data-resolver');
56 DefaultDataInterpreter = require('./manipulation/data-interpreter/default');
57 RequiredDataInterpreter = require('./manipulation/data-interpreter/required');
58 ReferencesDataInterpreter = require('./configuration/data-interpreter/references');
59 NamespacesDataInterpreter = require('./configuration/data-interpreter/namespaces');
60 Namespacer = require('./configuration/namespacer');
61 TypeDataInterpreter = require('./manipulation/data-interpreter/type');
62 ReferenceResolver = require('./manipulation/reference-resolver');
63 ReferenceType = require('./manipulation/reference-type');
64}
65
66define(function(require) {
67 /**
68 * Module dependencies.
69 */
70 if (module.isClient) {
71 utils = require('danf/utils');
72 ClassesHandler = require('danf/object/classes-handler');
73 ClassesRegistry = require('danf/object/classes-registry');
74 InterfacesRegistry = require('danf/object/interfaces-registry');
75 Interfacer = require('danf/object/interfacer');
76 ExtenderClassProcessor = require('danf/object/class-processor/extender');
77 InterfacerClassProcessor = require('danf/object/class-processor/interfacer');
78 ServicesContainer = require('danf/dependency-injection/services-container');
79 AbstractServiceBuilder = require('danf/dependency-injection/service-builder/abstract');
80 AliasServiceBuilder = require('danf/dependency-injection/service-builder/alias');
81 ChildrenServiceBuilder = require('danf/dependency-injection/service-builder/children');
82 ClassServiceBuilder = require('danf/dependency-injection/service-builder/class');
83 DeclinationsServiceBuilder = require('danf/dependency-injection/service-builder/declinations');
84 FactoriesServiceBuilder = require('danf/dependency-injection/service-builder/factories');
85 ParentServiceBuilder = require('danf/dependency-injection/service-builder/parent');
86 PropertiesServiceBuilder = require('danf/dependency-injection/service-builder/properties');
87 TagsServiceBuilder = require('danf/dependency-injection/service-builder/tags');
88 ParametersConfigurationSectionProcessor = require('danf/configuration/configuration-section/parameters');
89 ServicesConfigurationSectionProcessor = require('danf/dependency-injection/configuration-section/services');
90 DataResolver = require('danf/manipulation/data-resolver');
91 DefaultDataInterpreter = require('danf/manipulation/data-interpreter/default');
92 RequiredDataInterpreter = require('danf/manipulation/data-interpreter/required');
93 ReferencesDataInterpreter = require('danf/configuration/data-interpreter/references');
94 NamespacesDataInterpreter = require('danf/configuration/data-interpreter/namespaces');
95 Namespacer = require('danf/configuration/namespacer');
96 TypeDataInterpreter = require('danf/manipulation/data-interpreter/type');
97 ReferenceResolver = require('danf/manipulation/reference-resolver');
98 ReferenceType = require('danf/manipulation/reference-type');
99 }
100
101 /**
102 * Initialize a new framework.
103 */
104 function Initializer() {
105 }
106
107 /**
108 * Instantiate objects.
109 *
110 * @param {object} framework The framework.
111 * @api public
112 */
113 Initializer.prototype.instantiate = function(framework) {
114 framework.set('danf:manipulation.referenceResolver', new ReferenceResolver());
115 var parameterType = new ReferenceType();
116 parameterType.name = '%';
117 parameterType.delimiter = '%';
118 framework.set('danf:manipulation.referenceType.parameter', parameterType);
119 var contextType = new ReferenceType();
120 contextType.name = '@';
121 contextType.delimiter = '@';
122 framework.set('danf:manipulation.referenceType.context', contextType);
123
124 framework.set('danf:configuration.namespacer', new Namespacer());
125 framework.set('danf:configuration.configurationResolver', new DataResolver());
126 framework.set('danf:configuration.configurationInterpreter.default', new DefaultDataInterpreter());
127 framework.set('danf:configuration.configurationInterpreter.required', new RequiredDataInterpreter());
128 framework.set('danf:configuration.configurationInterpreter.type', new TypeDataInterpreter());
129 framework.set('danf:configuration.configurationInterpreter.references', new ReferencesDataInterpreter());
130 framework.set('danf:configuration.configurationInterpreter.namespaces', new NamespacesDataInterpreter());
131 framework.set('danf:configuration.configurationSection.parameters', new ParametersConfigurationSectionProcessor('parameters'));
132 var configType = new ReferenceType();
133 configType.name = '$';
134 configType.delimiter = '$';
135 framework.set('danf:configuration.referenceType.config', configType);
136
137 framework.set('danf:object.classesHandler', new ClassesHandler());
138 framework.set('danf:object.interfacer', new Interfacer());
139 framework.set('danf:object.classesRegistry', new ClassesRegistry());
140 framework.set('danf:object.interfacesRegistry', new InterfacesRegistry());
141 framework.set('danf:object.classProcessor.interfacer', new InterfacerClassProcessor());
142 framework.set('danf:object.classProcessor.extender', new ExtenderClassProcessor());
143
144 framework.set('danf:dependencyInjection.servicesContainer', new ServicesContainer());
145 framework.set('danf:dependencyInjection.configurationSection.services', new ServicesConfigurationSectionProcessor('services'));
146 framework.set('danf:dependencyInjection.serviceBuilder.abstract', new AbstractServiceBuilder());
147 framework.set('danf:dependencyInjection.serviceBuilder.alias', new AliasServiceBuilder());
148 framework.set('danf:dependencyInjection.serviceBuilder.children', new ChildrenServiceBuilder());
149 framework.set('danf:dependencyInjection.serviceBuilder.class', new ClassServiceBuilder());
150 framework.set('danf:dependencyInjection.serviceBuilder.declination', new DeclinationsServiceBuilder());
151 framework.set('danf:dependencyInjection.serviceBuilder.factories', new FactoriesServiceBuilder());
152 framework.set('danf:dependencyInjection.serviceBuilder.parent', new ParentServiceBuilder());
153 framework.set('danf:dependencyInjection.serviceBuilder.properties', new PropertiesServiceBuilder());
154 framework.set('danf:dependencyInjection.serviceBuilder.tags', new TagsServiceBuilder());
155 var serviceType = new ReferenceType();
156 serviceType.name = '#';
157 serviceType.delimiter = '#';
158 serviceType.allowsConcatenation = false;
159 framework.set('danf:dependencyInjection.referenceType.service', serviceType);
160 var serviceTagType = new ReferenceType();
161 serviceTagType.name = '&';
162 serviceTagType.delimiter = '&';
163 serviceTagType.allowsConcatenation = false;
164 framework.set('danf:dependencyInjection.referenceType.serviceTag', serviceTagType);
165 var serviceFactoryType = new ReferenceType();
166 serviceFactoryType.name = '>';
167 serviceFactoryType.delimiter = '>';
168 serviceFactoryType.size = 3;
169 serviceFactoryType.allowsConcatenation = false;
170 framework.set('danf:dependencyInjection.referenceType.serviceFactory', serviceFactoryType);
171 }
172
173 /**
174 * Inject dependencies between objects.
175 *
176 * @param {object} framework The framework.
177 * @api public
178 */
179 Initializer.prototype.inject = function(framework) {
180 var classesHandler = framework.get('danf:object.classesHandler'),
181 interfacer = framework.get('danf:object.interfacer'),
182 classesRegistry = framework.get('danf:object.classesRegistry'),
183 interfacesRegistry = framework.get('danf:object.interfacesRegistry'),
184 interfacerClassProcessor = framework.get('danf:object.classProcessor.interfacer'),
185 extenderClassProcessor = framework.get('danf:object.classProcessor.extender')
186 ;
187 classesHandler.classesRegistry = classesRegistry;
188 interfacer.interfacesRegistry = interfacesRegistry;
189 interfacerClassProcessor.interfacesRegistry = interfacesRegistry;
190 extenderClassProcessor.classesRegistry = classesRegistry;
191 classesHandler.addClassProcessor(extenderClassProcessor);
192 classesHandler.addClassProcessor(interfacerClassProcessor);
193
194 var referenceResolver = framework.get('danf:manipulation.referenceResolver'),
195 parameterType = framework.get('danf:manipulation.referenceType.parameter'),
196 contextType = framework.get('danf:manipulation.referenceType.context'),
197 configType = framework.get('danf:configuration.referenceType.config'),
198 serviceType = framework.get('danf:dependencyInjection.referenceType.service'),
199 serviceTagType = framework.get('danf:dependencyInjection.referenceType.serviceTag'),
200 serviceFactoryType = framework.get('danf:dependencyInjection.referenceType.serviceFactory')
201 ;
202 referenceResolver.addReferenceType(parameterType);
203 referenceResolver.addReferenceType(contextType);
204 referenceResolver.addReferenceType(configType);
205 referenceResolver.addReferenceType(serviceType);
206 referenceResolver.addReferenceType(serviceTagType);
207 referenceResolver.addReferenceType(serviceFactoryType);
208
209 var namespacer = framework.get('danf:configuration.namespacer'),
210 configurationResolver = framework.get('danf:configuration.configurationResolver'),
211 defaultConfigurationInterpreter = framework.get('danf:configuration.configurationInterpreter.default'),
212 requiredConfigurationInterpreter = framework.get('danf:configuration.configurationInterpreter.required'),
213 typeConfigurationInterpreter = framework.get('danf:configuration.configurationInterpreter.type'),
214 referencesConfigurationInterpreter = framework.get('danf:configuration.configurationInterpreter.references'),
215 namespacesConfigurationInterpreter = framework.get('danf:configuration.configurationInterpreter.namespaces'),
216 parametersProcessor = framework.get('danf:configuration.configurationSection.parameters')
217 ;
218 namespacer.addReferenceType(parameterType);
219 namespacer.addReferenceType(contextType);
220 namespacer.addReferenceType(configType);
221 namespacer.addReferenceType(serviceType);
222 namespacer.addReferenceType(serviceTagType);
223 namespacer.addReferenceType(serviceFactoryType);
224 referencesConfigurationInterpreter.namespacer = namespacer;
225 namespacesConfigurationInterpreter.namespacer = namespacer;
226 configurationResolver.addDataInterpreter(defaultConfigurationInterpreter);
227 configurationResolver.addDataInterpreter(requiredConfigurationInterpreter);
228 configurationResolver.addDataInterpreter(typeConfigurationInterpreter);
229 configurationResolver.addDataInterpreter(referencesConfigurationInterpreter);
230 configurationResolver.addDataInterpreter(namespacesConfigurationInterpreter);
231 parametersProcessor.configurationResolver = configurationResolver;
232 parametersProcessor.referenceResolver = referenceResolver;
233 parametersProcessor.namespacer = namespacer;
234
235 var servicesContainer = framework.get('danf:dependencyInjection.servicesContainer'),
236 servicesProcessor = framework.get('danf:dependencyInjection.configurationSection.services'),
237 abstractServiceBuilder = framework.get('danf:dependencyInjection.serviceBuilder.abstract'),
238 aliasServiceBuilder = framework.get('danf:dependencyInjection.serviceBuilder.alias'),
239 childrenServiceBuilder = framework.get('danf:dependencyInjection.serviceBuilder.children'),
240 classServiceBuilder = framework.get('danf:dependencyInjection.serviceBuilder.class'),
241 declinationServiceBuilder = framework.get('danf:dependencyInjection.serviceBuilder.declination'),
242 factoriesServiceBuilder = framework.get('danf:dependencyInjection.serviceBuilder.factories'),
243 parentServiceBuilder = framework.get('danf:dependencyInjection.serviceBuilder.parent'),
244 propertiesServiceBuilder = framework.get('danf:dependencyInjection.serviceBuilder.properties'),
245 tagsServiceBuilder = framework.get('danf:dependencyInjection.serviceBuilder.tags')
246 ;
247 servicesContainer.referenceResolver = referenceResolver;
248 servicesContainer.interfacer = interfacer;
249 servicesProcessor.configurationResolver = configurationResolver;
250 servicesProcessor.referenceResolver = referenceResolver;
251 servicesProcessor.namespacer = namespacer;
252 servicesProcessor.servicesContainer = servicesContainer;
253 abstractServiceBuilder.servicesContainer = servicesContainer;
254 abstractServiceBuilder.referenceResolver = referenceResolver;
255 aliasServiceBuilder.servicesContainer = servicesContainer;
256 aliasServiceBuilder.referenceResolver = referenceResolver;
257 childrenServiceBuilder.servicesContainer = servicesContainer;
258 childrenServiceBuilder.referenceResolver = referenceResolver;
259 classServiceBuilder.servicesContainer = servicesContainer;
260 classServiceBuilder.referenceResolver = referenceResolver;
261 declinationServiceBuilder.servicesContainer = servicesContainer;
262 declinationServiceBuilder.referenceResolver = referenceResolver;
263 factoriesServiceBuilder.servicesContainer = servicesContainer;
264 factoriesServiceBuilder.referenceResolver = referenceResolver;
265 parentServiceBuilder.servicesContainer = servicesContainer;
266 parentServiceBuilder.referenceResolver = referenceResolver;
267 propertiesServiceBuilder.servicesContainer = servicesContainer;
268 propertiesServiceBuilder.referenceResolver = referenceResolver;
269 propertiesServiceBuilder.interfacer = interfacer;
270 tagsServiceBuilder.servicesContainer = servicesContainer;
271 tagsServiceBuilder.referenceResolver = referenceResolver;
272 servicesContainer.addServiceBuilder(abstractServiceBuilder);
273 servicesContainer.addServiceBuilder(aliasServiceBuilder);
274 servicesContainer.addServiceBuilder(childrenServiceBuilder);
275 servicesContainer.addServiceBuilder(classServiceBuilder);
276 servicesContainer.addServiceBuilder(declinationServiceBuilder);
277 servicesContainer.addServiceBuilder(factoriesServiceBuilder);
278 servicesContainer.addServiceBuilder(parentServiceBuilder);
279 servicesContainer.addServiceBuilder(propertiesServiceBuilder);
280 servicesContainer.addServiceBuilder(tagsServiceBuilder);
281
282 // Replace framework objects container.
283 for (var id in framework.objectsContainer.objects) {
284 servicesContainer.set(id, framework.objectsContainer.objects[id]);
285 }
286 framework.objectsContainer = servicesContainer;
287 }
288
289 /**
290 * Process.
291 *
292 * @param {object} framework The framework.
293 * @param {object} parameters The application parameters.
294 * @param {object} danf The danf config.
295 * @param {object} configuration The application danf configuration.
296 * @api public
297 */
298 Initializer.prototype.process = function(framework, parameters, danf, configuration) {
299 var app = framework.get('danf:app');
300
301 // Process danf module.
302 var servicesContainer = framework.get('danf:dependencyInjection.servicesContainer'),
303 classesHandler = framework.get('danf:object.classesHandler'),
304 classesRegistry = framework.get('danf:object.classesRegistry'),
305 interfacesRegistry = framework.get('danf:object.interfacesRegistry'),
306 interfacerClassProcessor = framework.get('danf:object.classProcessor.interfacer')
307 ;
308
309 classesRegistry.processConfiguration(danf.classes);
310 interfacesRegistry.processConfiguration(danf.interfaces);
311
312 interfacerClassProcessor.process(ServicesContainer);
313 interfacerClassProcessor.process(AbstractServiceBuilder);
314 interfacerClassProcessor.process(AliasServiceBuilder);
315 interfacerClassProcessor.process(ChildrenServiceBuilder);
316 interfacerClassProcessor.process(ClassServiceBuilder);
317 interfacerClassProcessor.process(DeclinationsServiceBuilder);
318 interfacerClassProcessor.process(FactoriesServiceBuilder);
319 interfacerClassProcessor.process(ParentServiceBuilder);
320 interfacerClassProcessor.process(PropertiesServiceBuilder);
321 interfacerClassProcessor.process(TagsServiceBuilder);
322
323 classesHandler.process();
324 servicesContainer.processConfiguration(danf.services, danf.config);
325
326 // Process configuration for new instantiated services.
327 classesRegistry = servicesContainer.get('danf:object.classesRegistry');
328 classesRegistry.processConfiguration(danf.classes);
329 interfacesRegistry = servicesContainer.get('danf:object.interfacesRegistry');
330 interfacesRegistry.processConfiguration(danf.interfaces);
331 classesHandler = servicesContainer.get('danf:object.classesHandler');
332 classesHandler.process();
333
334 // Process the configuration.
335 var modulesTree = framework.get('danf:configuration.modulesTree'),
336 configurationProcessor = framework.get('danf:configuration.processor')
337 ;
338 modulesTree.build(configuration, danf);
339
340 var config = configurationProcessor.process(modulesTree);
341 parameters['config'] = config;
342 parameters['flattenConfig'] = utils.flatten(config, 1, ':');
343
344 // Process classes config.
345 classesRegistry.processConfiguration(config.classes || {});
346 interfacesRegistry.processConfiguration(config.interfaces || {});
347 classesHandler.process();
348
349 // Process services config.
350 servicesContainer.processConfiguration(config.services || {}, parameters['flattenConfig'], true);
351
352 // Process events.
353 var sequenceBuilder = framework.get('danf:event.sequenceBuilder'),
354 eventsHandler = framework.get('danf:event.eventsHandler')
355 ;
356 sequenceBuilder.processConfiguration(config.sequences || {}, parameters['flattenConfig']);
357 eventsHandler.processConfiguration(config.events || {});
358 }
359
360 /**
361 * Expose `Initializer`.
362 */
363 return Initializer;
364});
\No newline at end of file