lorj 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.gitreview +4 -0
  4. data/Gemfile +25 -0
  5. data/Gemfile.lock +34 -0
  6. data/LICENSE.txt +14 -0
  7. data/README.md +652 -0
  8. data/Rakefile +24 -0
  9. data/bin/cloud_test.rb +81 -0
  10. data/example/students_1/process/Students.rb +20 -0
  11. data/example/students_1/students.rb +16 -0
  12. data/example/students_2/process/Students.rb +27 -0
  13. data/example/students_2/students.rb +36 -0
  14. data/example/students_3/controller/yaml_students.rb +94 -0
  15. data/example/students_3/controller/yaml_students_controller.rb +123 -0
  16. data/example/students_3/process/students.rb +118 -0
  17. data/example/students_3/students.rb +93 -0
  18. data/example/students_4/controller/yaml_students.rb +82 -0
  19. data/example/students_4/controller/yaml_students_controller.rb +141 -0
  20. data/example/students_4/process/students.rb +112 -0
  21. data/example/students_4/students.rb +103 -0
  22. data/example/yaml_students/students.rb +78 -0
  23. data/example/yaml_students/yaml_students.rb +115 -0
  24. data/lib/concept.md +111 -0
  25. data/lib/core/core.rb +723 -0
  26. data/lib/core/definition.rb +505 -0
  27. data/lib/core/definition_internal.rb +338 -0
  28. data/lib/core/lorj-basecontroller.rb +90 -0
  29. data/lib/core/lorj-basedefinition.rb +1079 -0
  30. data/lib/core/lorj-baseprocess.rb +231 -0
  31. data/lib/core/lorj-data.rb +567 -0
  32. data/lib/core/lorj-keypath.rb +115 -0
  33. data/lib/core_process/CloudProcess.rb +334 -0
  34. data/lib/core_process/global_process.rb +406 -0
  35. data/lib/core_process/network_process.rb +603 -0
  36. data/lib/img/.directory +4 -0
  37. data/lib/img/account_data_access.png +0 -0
  38. data/lib/img/config_data_access.png +0 -0
  39. data/lib/img/forj-lib-concept.png +0 -0
  40. data/lib/lorj/version.rb +3 -0
  41. data/lib/lorj.rb +51 -0
  42. data/lib/prc-account.rb +339 -0
  43. data/lib/prc-config.rb +1023 -0
  44. data/lib/prc-logging.rb +183 -0
  45. data/lib/prc.rb +108 -0
  46. data/lib/providers/hpcloud/Hpcloud.rb +419 -0
  47. data/lib/providers/hpcloud/compute.rb +108 -0
  48. data/lib/providers/hpcloud/network.rb +117 -0
  49. data/lib/providers/hpcloud/security_groups.rb +67 -0
  50. data/lib/providers/mock/Mock.rb +141 -0
  51. data/lib/providers/openstack/Openstack.rb +47 -0
  52. data/lib/providers/templates/compute.rb +42 -0
  53. data/lib/providers/templates/core.rb +61 -0
  54. data/lib/providers/templates/network.rb +33 -0
  55. data/lorj-spec/defaults.yaml +26 -0
  56. data/lorj.gemspec +39 -0
  57. data/spec/forj-account_spec.rb +75 -0
  58. data/spec/forj-config_spec.rb +196 -0
  59. metadata +164 -0
@@ -0,0 +1,505 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ # (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ # Module Lorj which contains several classes.
19
+ #
20
+ # Those classes describes :
21
+ # - processes (BaseProcess) : How to create/delete/edit/query object.
22
+ # - controler (BaseControler) : If a provider is defined, define how will do object creation/etc...
23
+ # - definition(BaseDefinition): Functions to declare objects, query/data mapping and setup
24
+ # this task to make it to work.
25
+ module Lorj
26
+ class BaseDefinition
27
+
28
+ private
29
+
30
+ ###################################################
31
+ # Class management Section
32
+ ###################################################
33
+
34
+ # Meta Object declaration structure
35
+ # <Object>
36
+ # :query_mapping List of keypath mapped.
37
+ # <keypath> = <keypath mapped>
38
+ # :lambdas:
39
+ # :create_e: function to call at 'Create' task
40
+ # :delete_e: function to call at 'Delete' task
41
+ # :update_e: function to call at 'Update' task
42
+ # :get_e: function to call at 'Get' task
43
+ # :query_e: function to call at 'Query' task
44
+ # :value_mapping: Define list of Object's key values mapping.
45
+ # <keypath> key value mapping lists
46
+ # <value> = <map> Define the value mapping.
47
+ # :returns
48
+ # <keypath> key value to extract from controller object.
49
+ # :params: Defines CloudData (:data) or CloudObj (:CloudObj) needs by the <Object>
50
+ # :keys: Contains keys in a tree of hash.
51
+ # <keypath>: String. One element (string with : and /) of :list defining the key
52
+ # :type: :data or :CloudObj
53
+ # :for: Array of events which requires the data or CloudObj to work.
54
+ # :mapping: To automatically create a provider hash data mapped (hdata).
55
+ # :required: True if this parameter is required.
56
+ # :extract_from: Array. Build the keypath value from another hParams value.
57
+ # Ex: This example will extract :id from :security_groups object
58
+ # :extract_from => [:security_groups, :id]
59
+ #
60
+ @@meta_obj = {}
61
+
62
+ # meta data are defined in defaults.yaml and loaded in Lorj::Default class definition
63
+ # Cloud provider can redefine ForjData defaults and add some extra parameters.
64
+ # To get Application defaults, read defaults.yaml, under :sections:
65
+ # <Section>:
66
+ # <Data>: Required. Symbol/String. default: nil
67
+ # => Data name. This symbol must be unique, across sections.
68
+ # :desc: Required. String. default: nil
69
+ # => Description
70
+ # :readonly: Optional. true/false. Default: false
71
+ # => oForjConfig.set() will fail if readonly is true.
72
+ # Can be set, only thanks to oForjConfig.setup()
73
+ # or using private oForjConfig._set()
74
+ # :account_exclusive: Optional. true/false. Default: false
75
+ # => Only oConfig.account_get/set() can handle the value
76
+ # oConfig.set/get cannot.
77
+ # :account: Optional. default: False
78
+ # => setup will configure the account with this <Data>
79
+ # :ask_sort: Number which represents the ask order in the step group. (See /:setup/:ask_step for details)
80
+ # :after: <Data> Name of the previous <Data> to ask before the current one.
81
+ # :depends_on:
82
+ # => Identify :data type required to be set before the current one.
83
+ # :default_value: Default value at setup time. This is not necessarily the Application default value (See /:default)
84
+ # :validate: Regular expression to validate end user input during setup.
85
+ # :value_mapping: list of values to map as defined by the controller
86
+ # :controller: mapping for get controller value from process values
87
+ # <value> : <map> value map equivalence. See data_value_mapping function
88
+ # :process: mapping for get process value from controller values
89
+ # <value> : <map> value map equivalence. See data_value_mapping function
90
+ # :defaut: Default value
91
+ # :list_values: Defines a list of valid values for the current data.
92
+ # :query_type :controller_call to execute a function defined in the controller object.
93
+ # :process_call to execute a function defined in the process object.
94
+ # :values to get list of values from :values.
95
+ # :object Object to load before calling the function. Only :query_type = :*_call
96
+ # :query_call Symbol. function name to call. Only :query_type = :*_call
97
+ # function must return an Array.
98
+ # :query_params Hash. Controler function parameters. Only :query_type = :*_call
99
+ # :validate :list_strict. valid only if value is one of those listed.
100
+ # :values:
101
+ # to retrieve from.
102
+ # otherwise define simply a list of possible values.
103
+ # :ask_step: Step number. By default, setup will determine the step, thanks to meta lorj object dependencies tree.
104
+ # This number start at 0. Each step can be defined by /:setup/:ask_step/<steps> list.
105
+ #
106
+ # :setup: This section describes group of fields to ask, step by step.
107
+ # :ask_step: Define an Array of setup steps to ask to the end user. The step order is respected, and start at 0
108
+ # - :desc: Define the step description
109
+ # :explanation: |- Define a multiline explanation. This is printed out in brown color.
110
+ # :add: Define a list of additionnal fields to ask.
111
+ # - <Data> Data to ask.
112
+ #
113
+ # :default: List of <Data> application default values.
114
+ # <Data> : Value to use at the config application level.
115
+ @@meta_data = {}
116
+
117
+ # The Generic Process can pre-define some data and value (function predefine_data)
118
+ # The Generic Process (and external framework call) only knows about Generic data.
119
+ # information used
120
+ #
121
+ @@meta_predefined_values = {}
122
+
123
+ # <Data>: Data name
124
+ # :values: List of possible values
125
+ # <Value>: Value Name attached to the data
126
+ # options: Options
127
+ # :desc: Description of that predefine value.
128
+
129
+ @@Context = {
130
+ :oCurrentObj => nil, # Defines the Current Object to manipulate
131
+ :needs_optional => nil, # set optional to true for any next needs declaration
132
+ :ClassProcess => nil # Current Process Class declaration
133
+ }
134
+
135
+ # Available functions for:
136
+ # - BaseDefinition class declaration
137
+ # - Controler (derived from BaseDefinition) class declaration
138
+
139
+ @@query_auto_map = false
140
+
141
+ def self.current_process (cProcessClass)
142
+ @@Context[:ClassProcess] = cProcessClass
143
+ end
144
+
145
+ def self.obj_needs_optional
146
+ @@Context[:needs_optional] = true
147
+ end
148
+
149
+ def self.obj_needs_requires
150
+ @@Context[:needs_optional] = false
151
+ end
152
+
153
+ def self.process_default(hOptions)
154
+ aSupportedOptions = [:use_controller]
155
+ unless hOptions.nil?
156
+ hOptions.each_key { | key |
157
+ case key
158
+ when :use_controller
159
+ value = Lorj::rhGet(hOptions, :use_controller)
160
+ next unless value.is_a?(TrueClass) or value.is_a?(FalseClass)
161
+ Lorj::rhSet(@@Context, hOptions[key], :options, key)
162
+ else
163
+ raise Lorj::PrcError.new, "Unknown default process options '%s'. Supported are '%s'" % [key, aSupportedOptions.join(',')]
164
+ end
165
+ }
166
+ end
167
+
168
+ end
169
+
170
+ # Defines Object and connect to functions events
171
+ def self.define_obj(sCloudObj, hParam = nil)
172
+ return nil if not sCloudObj
173
+ return nil if not [String, Symbol].include?(sCloudObj.class)
174
+
175
+ aCaller = caller
176
+ aCaller.pop
177
+
178
+ sCloudObj = sCloudObj.to_sym if sCloudObj.class == String
179
+ @@Context[:oCurrentObj] = sCloudObj
180
+ @@Context[:needs_optional] = false
181
+ @@Context[:needs_setup] = false
182
+ bController = Lorj::rhGet(@@Context, :options, :use_controller)
183
+ bController = true if bController.nil?
184
+
185
+ if not [Hash].include?(hParam.class)
186
+ if Lorj::rhExist?(@@meta_obj, sCloudObj) != 1
187
+ raise Lorj::PrcError.new(), "New undefined object '%s' requires at least one handler. Ex: define_obj :%s, :create_e => myhandler " % [sCloudObj, sCloudObj]
188
+ end
189
+ hParam = {}
190
+ end
191
+
192
+ oCloudObj = Lorj::rhGet(@@meta_obj, sCloudObj)
193
+ if not oCloudObj
194
+ oCloudObj = {
195
+ :lambdas => {:create_e => nil, :delete_e => nil, :update_e => nil, :get_e => nil, :query_e => nil, :get_attr_e => nil},
196
+ :params => {},
197
+ :options => {:controller => bController },
198
+ :query_mapping => { ":id" => ":id", ":name" => ":name"},
199
+ :returns => {":id" => ":id", ":name" => ":name"}
200
+ }
201
+ msg = nil
202
+ else
203
+ msg = ""
204
+ end
205
+
206
+ sObjectName = "'%s.%s'" % [self.class, sCloudObj]
207
+
208
+ # Checking hParam data
209
+ if not Lorj::rhGet(hParam, :nohandler)
210
+ hParam.each_key do | key |
211
+ raise Lorj::PrcError.new(), "'%s' parameter is invalid. Use '%s'" % [key, oCloudObj[:lambdas].keys.join(', ')], aCaller if Lorj::rhExist?(oCloudObj, :lambdas, key)!= 2
212
+ end
213
+ msg = "%-28s object declared." % [sObjectName] if not msg
214
+ else
215
+ msg = "%-28s meta object declared." % [sObjectName] if not msg
216
+ end
217
+ Lorj.debug(2, msg) if msg != ""
218
+
219
+ # Setting procs
220
+ Lorj::rhGet(oCloudObj, :lambdas).each_key { |key|
221
+ next if not hParam.key?(key)
222
+
223
+ if not @@Context[:ClassProcess].instance_methods.include?(hParam[key])
224
+ raise Lorj::PrcError.new(), "'%s' parameter requires a valid instance method '%s' in the process '%s'." % [key, hParam[key], @@Context[:ClassProcess]], aCaller
225
+ end
226
+ if hParam[key] == :default
227
+ # By default, we use the event name as default function to call.
228
+ # Those function are predefined in ForjController
229
+ # The Provider needs to derive from ForjController and redefine those functions.
230
+ oCloudObj[:lambdas][key] = key
231
+ else
232
+ # If needed, ForjProviver redefined can contains some additionnal functions
233
+ # to call.
234
+ oCloudObj[:lambdas][key] = hParam[key]
235
+ end
236
+ }
237
+ Lorj::rhSet(@@meta_obj, oCloudObj, sCloudObj)
238
+ end
239
+
240
+ def self.def_query_attribute(key)
241
+ self.query_mapping(key, key)
242
+ end
243
+
244
+ def self.query_mapping(key, map)
245
+ return nil if not [String, Symbol].include?(key.class)
246
+ return nil if not [NilClass, Symbol, String].include?(map.class)
247
+
248
+ aCaller = caller
249
+ aCaller.pop
250
+
251
+ raise Lorj::PrcError.new(), "%s: No Object defined. Missing define_obj?" % [ self.class], aCaller if @@Context[:oCurrentObj].nil?
252
+
253
+ sCloudObj = @@Context[:oCurrentObj]
254
+ oKeyPath = KeyPath.new(key)
255
+ oMapPath = KeyPath.new(map)
256
+
257
+ @@Context[:oCurrentKey] = oKeyPath
258
+
259
+ Lorj::rhSet(@@meta_obj, oMapPath.sFullPath, sCloudObj, :query_mapping, oKeyPath.sFullPath)
260
+ end
261
+
262
+ # Available functions exclusively for Controler (derived from BaseDefinition) class declaration
263
+
264
+ # Following functions are related to Object Attributes
265
+ # ----------------------------------------------------
266
+
267
+ # Defines Object CloudData/CloudObj dependency
268
+ def self.obj_needs(sType, sParam, hParams = {})
269
+ return nil if not [String, Symbol].include?(sType.class)
270
+ return nil if not [String, Symbol, Array].include?(sParam.class)
271
+
272
+ hParams = {} if not hParams
273
+
274
+ hParams[:required] = not(@@Context[:needs_optional]) if Lorj::rhExist?(hParams, :required) != 1
275
+
276
+ aCaller = caller
277
+ aCaller.pop
278
+
279
+ raise Lorj::PrcError.new(), "%s: No Object defined. Missing define_obj?" % [ self.class], aCaller if @@Context[:oCurrentObj].nil?
280
+
281
+ sCloudObj = @@Context[:oCurrentObj]
282
+
283
+ aForEvents = Lorj::rhGet(@@meta_obj, sCloudObj, :lambdas).keys
284
+ hParams = hParams.merge({ :for => aForEvents}) if not hParams.key?(:for)
285
+ sType = sType.to_sym if sType.class == String
286
+
287
+
288
+ raise Lorj::PrcError.new(), "%s: '%s' not declared. Missing define_obj(%s)?" % [ self.class, sCloudObj, sCloudObj], aCaller if Lorj::rhExist?(@@meta_obj, sCloudObj) != 1
289
+
290
+ oObjTopParam = Lorj::rhGet(@@meta_obj, sCloudObj, :params)
291
+ if not oObjTopParam.key?(:keys)
292
+ # Initialize top structure
293
+
294
+ oObjTopParam.merge!({ :keys => {} })
295
+ end
296
+
297
+ oKeyPath = KeyPath.new(sParam)
298
+ sKeyAccess = oKeyPath.sFullPath
299
+
300
+ @@Context[:oCurrentKey] = oKeyPath
301
+
302
+ oCloudObjParam = Lorj::rhGet(oObjTopParam, :keys, sKeyAccess)
303
+ if oCloudObjParam.nil?
304
+ sMsgAction = "New"
305
+ oObjTopParam[:keys][sKeyAccess] = {}
306
+ oCloudObjParam = oObjTopParam[:keys][sKeyAccess]
307
+ else
308
+ sMsgAction = "Upd"
309
+ end
310
+ sObjectName = "'%s.%s'" % [self.class, sCloudObj]
311
+ case sType
312
+ when :data
313
+ if Lorj::Default.meta_exist?(sParam)
314
+ Lorj.debug(2, "%-28s: %s predefined config '%s'." % [sObjectName, sMsgAction, sParam])
315
+ else
316
+ Lorj.debug(2, "%-28s: %s runtime config '%s'." % [sObjectName, sMsgAction, sParam])
317
+ end
318
+ oCloudObjParam.merge!( hParams.merge({:type => sType}) ) # Merge from predefined params, but ensure type is never updated.
319
+ when :CloudObject
320
+ raise Lorj::PrcError.new(), "%s: '%s' not declared. Missing define_obj(%s)?" % [self.class, sParam, sParam], aCaller if not @@meta_obj.key?(sParam)
321
+ oCloudObjParam.merge!( hParams.merge({:type => sType}) ) # Merge from predefined params, but ensure type is never updated.
322
+ else
323
+ raise Lorj::PrcError.new(), "%s: Object parameter type '%s' unknown." % [ self.class, sType ], aCaller
324
+ end
325
+ end
326
+
327
+ # Define the hdata values to build for the controller automatically
328
+ # Input:
329
+ # - sParam: Data name to add in hdata controller.
330
+ # - hParams: supports following hash values:
331
+ # - :mapping (merged in @@meta_obj://<Object>/:params/:keys/<keypath>/:mapping)
332
+ #
333
+
334
+ def self.set_hdata(sParam, hParams = {})
335
+ return nil if not [String, Symbol, Array].include?(sParam.class)
336
+
337
+ hParams = {} if not hParams
338
+
339
+ aCaller = caller
340
+ aCaller.pop
341
+
342
+ raise Lorj::PrcError.new(), "%s: No Object defined. Missing define_obj?" % [ self.class], aCaller if @@Context[:oCurrentObj].nil?
343
+ sCloudObj = @@Context[:oCurrentObj]
344
+
345
+ raise Lorj::PrcError.new(), "%s: '%s' not declared. Missing define_obj(%s)?" % [ self.class, sCloudObj, sCloudObj], aCaller if Lorj::rhExist?(@@meta_obj, sCloudObj) != 1
346
+
347
+ oKeyPath = KeyPath.new(sParam)
348
+ sKeyAccess = oKeyPath.sFullPath
349
+
350
+ # @@meta_obj://<Object>/:params/:keys/<keypath> must exist.
351
+ oCloudObjParam = Lorj::rhGet(@@meta_obj, sCloudObj, :params, :keys, sKeyAccess)
352
+
353
+ sMapping = sParam
354
+ sMapping = hParams[:mapping] unless hParams[:mapping].nil?
355
+ oCloudObjParam[:mapping] = sMapping
356
+
357
+ sObjectName = "'%s.%s'" % [self.class, sCloudObj]
358
+ Lorj.debug(2, "%-28s: hdata set '%s' => '%s'" % [sObjectName, sParam, sMapping])
359
+ end
360
+
361
+
362
+ def self.attr_value_mapping(value, map)
363
+ return nil if not [String, Symbol].include?(value.class)
364
+ return nil if not [NilClass, Symbol, String].include?(map.class)
365
+
366
+ aCaller = caller
367
+ aCaller.pop
368
+
369
+ sCloudObj = @@Context[:oCurrentObj]
370
+ raise Lorj::PrcError.new, "attr_value_mapping: mapping '%s' needs object context definition. You need to call define_obj to get the context." % value if sCloudObj.nil?
371
+
372
+ oKeypath = @@Context[:oCurrentKey]
373
+ raise Lorj::PrcError.new, "attr_value_mapping: mapping '%s' needs object data context definition. You need to call define_obj, then obj_needs to get the context." % value if oKeypath.nil?
374
+
375
+ keypath = oKeypath.sFullPath
376
+ Lorj.debug(2, "%s-%s: Value mapping definition '%s' => '%s'" % [sCloudObj, oKeypath.to_s, value, map])
377
+ Lorj::rhSet(@@meta_obj, map, sCloudObj, :value_mapping, keypath, value)
378
+ end
379
+
380
+ def self.def_attribute(key, options = nil)
381
+ self.get_attr_mapping(key, options)
382
+ #~ self.def_query_attribute(key) unless options and options.key?(:not_queriable) and options[:not_queriable]== true
383
+ end
384
+
385
+ # Function used by the controler to define mapping.
386
+ # By default, any attributes are queriable as well. No need to call
387
+ # query_mapping
388
+ def self.get_attr_mapping(key, map = nil, options = nil)
389
+ return nil if not [String, Symbol].include?(key.class)
390
+ return nil if not [NilClass, Symbol, String, Array].include?(map.class)
391
+
392
+ aCaller = caller
393
+ aCaller.pop
394
+
395
+ raise Lorj::PrcError.new(), "%s: No Object defined. Missing define_obj?" % [ self.class], aCaller if @@Context[:oCurrentObj].nil?
396
+
397
+ sCloudObj = @@Context[:oCurrentObj]
398
+ oKeyPath = KeyPath.new(key)
399
+
400
+ if map.nil?
401
+ oMapPath = oKeyPath
402
+ map = oMapPath.sKey
403
+ else
404
+ oMapPath = KeyPath.new(map)
405
+ end
406
+
407
+ Lorj::rhSet(@@meta_obj, oMapPath.sFullPath, sCloudObj, :returns, oKeyPath.sFullPath)
408
+ @@Context[:oCurrentKey] = oKeyPath
409
+ if oMapPath == oKeyPath
410
+ Lorj::debug(4, "%s: Defining object attribute '%s'" % [sCloudObj, oKeyPath.sFullPath])
411
+ else
412
+ Lorj::debug(4, "%s: Defining object attribute mapping '%s' => '%s'" % [sCloudObj, oKeyPath.sFullPath, oMapPath.sFullPath])
413
+ end
414
+
415
+ self.query_mapping(key, map) unless options and options.key?(:not_queriable) and options[:not_queriable]== true
416
+ end
417
+
418
+ def self.undefine_attribute(key)
419
+ return nil if not [String, Symbol].include?(key.class)
420
+
421
+ aCaller = caller
422
+ aCaller.pop
423
+
424
+ raise Lorj::PrcError.new(), "%s: No Object defined. Missing define_obj?" % [ self.class], aCaller if @@Context[:oCurrentObj].nil?
425
+
426
+ sCloudObj = @@Context[:oCurrentObj]
427
+ oKeyPath = KeyPath.new(key)
428
+
429
+ Lorj::rhSet(@@meta_obj, nil, sCloudObj, :returns, oKeyPath.sFullPath)
430
+ @@Context[:oCurrentKey] = oKeyPath
431
+ Lorj::debug(4, "%s: Undefining attribute mapping '%s'" % [sCloudObj, oKeyPath.sFullPath])
432
+
433
+ self.query_mapping(key, nil)
434
+ end
435
+
436
+ # Defines/update CloudData parameters
437
+ def self.define_data(sData, hMeta)
438
+ return nil if not sData or not hMeta
439
+ return nil if not [String, Symbol].include?(sData.class)
440
+ return nil if hMeta.class != Hash
441
+
442
+ aCaller = caller
443
+ aCaller.pop
444
+
445
+ sData = sData.to_sym if sData.class == String
446
+ raise Lorj::PrcError.new(), "%s: Config data '%s' unknown" % [self.class, sData], aCaller if not Lorj::Default.meta_exist?(sData)
447
+
448
+ @@Context[:oCurrentData] = sData
449
+
450
+ section = Lorj::Default.get_meta_section(sData)
451
+ section = :runtime if section.nil?
452
+
453
+ if Lorj::rhExist?(@@meta_data, section, sData) == 2
454
+ Lorj::rhGet(@@meta_data, section, sData).merge!(hMeta)
455
+ else
456
+ Lorj::rhSet(@@meta_data, hMeta, section, sData)
457
+ end
458
+
459
+ end
460
+
461
+ def self.data_value_mapping(value, map)
462
+ return nil if not [String, Symbol].include?(value.class)
463
+ return nil if not [NilClass, Symbol, String].include?(map.class)
464
+
465
+ aCaller = caller
466
+ aCaller.pop
467
+ sData = @@Context[:oCurrentData]
468
+ raise Lorj::PrcError.new, "Config data context not set. at least, you need to call define_data before." if sData.nil?
469
+
470
+ section = Lorj::Default.get_meta_section(sData)
471
+ section = :runtime if section.nil?
472
+
473
+ Lorj.debug(2, "%s/%s: Define config data value mapping: '%s' => '%s'" % [section, sData, value, map])
474
+ Lorj::rhSet(@@meta_data, map, section, sData, :value_mapping, :controller, value)
475
+ Lorj::rhSet(@@meta_data, value, section, sData, :value_mapping, :process, map)
476
+ end
477
+
478
+ def self.provides(aObjType)
479
+ @aObjType = aObjType
480
+ end
481
+
482
+ def self.defined?(objType)
483
+ @aObjType.include?(objType)
484
+ end
485
+
486
+ # Internal BaseDefinition function
487
+
488
+ def self.predefine_data_value(data, hOptions)
489
+ return nil if self.class != BaseDefinition # Refuse to run if not a BaseDefinition call
490
+ return nil if not [String, Symbol].include?(value.class)
491
+ return nil if not [NilClass, Symbol, String].include?(map.class)
492
+
493
+ aCaller = caller
494
+ aCaller.pop
495
+
496
+ oKeyPath = @@Context[:oCurrentKey]
497
+
498
+ value = {data => {:options => hOptions} }
499
+
500
+ Lorj::rhSet(@@predefine_data_value, value, oKeyPath.sFullPath, :values)
501
+ end
502
+
503
+
504
+ end
505
+ end