Class: Sbuilder::Controller

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Utils::MyLogger
Defined in:
lib/sbuilder/controller.rb

Constant Summary collapse

DEFAULT_PREFERENCES =
{
  "debug-output" => true,                     # print debug output e.g. in interface processes
}
PROGNAME =

mixer

"Controller"
@@validSetups_required =
[ "setupDirectory", ]
@@validSetups_allowed =
@@validSetups_required + [ 'extensions', "desc", "preferences", "possibilities", 'assumptions', 'configuration']
@@validSetupConfiguration_required =
[]
@@validSetupConfiguration_allowed =
['allow_domain_nil_values']
@@extensionLoaderDef_required =
[ ]
@@extensionLoaderDef_oneof =
["url", "file",]
@@extensionLoaderDef_defaults =
{
  'type' => Sbuilder::Constants::EXTENSION_LOADER_YAML
}
@@extensionLoaderDef_allowed =
@@extensionLoaderDef_required + @@extensionLoaderDef_oneof + ['type']
@@resolverLoader_required =
[ ]
@@resolverLoader_oneof =
["url", "file",]
@@resolverLoader_defaults =
{
  'type' => Sbuilder::Constants::MAPPER_YAML
}
@@resolverLoader_allowed =
@@resolverLoader_required + @@resolverLoader_oneof + ['type']
@@interfaceLoaderDef_required =
[ ]
@@interfaceLoaderDef_oneof =
[  'url', "file", ]
@@interfaceLoaderDef_oneof2 =
[  'type', "className", ]
@@interfaceLoaderDef_allowed =
@@interfaceLoaderDef_required + ["cache", "infrastructureServices", "namespace" ]  + @@interfaceLoaderDef_oneof  + @@interfaceLoaderDef_oneof2
@@validExtendLoader =
%w( gem className configuration )
@@validConfig =
%w( generate )
@@allowConfig =
@@validConfig + %w( extend extensions setups preferences resolvers interfaces invariants ) 
@@validGenerateConfigs =
["output", "inputs"]
@@allowedGenerateConfigs =
@@validGenerateConfigs + ['category']
@@validGenerateDef_required =
[ "template", "desc", "modelData" ]
@@validGenerateDef_allowed =
@@validGenerateDef_required + [ "templateParameters" ]

Constants included from Utils::MyLogger

Utils::MyLogger::LOGFILE

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Utils::MyLogger

#getLogger, #logfile

Constructor Details

#initialize(factory, options = {}) ⇒ Controller


constructore



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/sbuilder/controller.rb', line 76

def initialize( factory, options = {} )
  
  @logger = getLogger( PROGNAME, options )
  @logger.info( "#{__method__} initialized, options=#{options}" )

  # init configs
  @opts = { :gen_dir => options[:gen_dir] || Sbuilder::Constants::GEN_DIR,
            # :src_dir => options[:src_dir] || Sbuilder::Constants::SRC_DIR,
            :cnf_dir => options[:cnf_dir] || Sbuilder::Constants::CNF_DIR,
            :cache_dir => options[:cache_dir] || Sbuilder::Constants::CACHE_DIR,
            :cnf_file => options[:cnf_file] || Sbuilder::Constants::CNF_FILE,
            :verbosity => options[:verbosity].nil? ? Sbuilder::Constants::OPT_VERBOSITY : options[:verbosity],
            :filter_src => options[:filter_src] || false,
            :templates => options[:templates],
          } #.merge( options[PROGNAME] || {} )
  setFactory( factory )
  start
end

Instance Attribute Details

#factoryObject (readonly)

factory pattern



11
12
13
# File 'lib/sbuilder/controller.rb', line 11

def factory
  @factory
end

#mappersObject (readonly)

array of loader ‘Resolver’ objects



12
13
14
# File 'lib/sbuilder/controller.rb', line 12

def mappers
  @mappers
end

#modelObject (readonly)

model parts



15
16
17
# File 'lib/sbuilder/controller.rb', line 15

def model
  @model
end

Instance Method Details

#findResolver(name) ⇒ Object



185
186
187
# File 'lib/sbuilder/controller.rb', line 185

def findResolver( name )
  @mappers.select{  |mapper| mapper.name == name }.first
end

#findResolverForParameterSet(paramSet) ⇒ Object


resolve



368
369
370
371
372
373
374
375
# File 'lib/sbuilder/controller.rb', line 368

def findResolverForParameterSet( paramSet )
  mappers.each do |mapper|
    if paramSet.matchesWithParamSet( mapper.matcher ) then
      return mapper
    end
  end
  return nil
end

#generate(setupName = "default", extensionDirectory = "default") ⇒ Object


start, load, resolve, extend && output



415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
# File 'lib/sbuilder/controller.rb', line 415

def generate( setupName="default", extensionDirectory="default" )
  @logger.info( "#{__method__} setupName=#{setupName}, extensionDirectory=#{extensionDirectory}" )

  processSetup( setupName )  do |name, setupConf, possibilities|
  
    # config && get renderes
    mustache = prepareRender( setupName )

    # path to directory where setup output is done
    directoryPath = prepareSetupDir( extensionDirectory )
    
    # output 'normal templates' - one generate def/one output
    generateCase( setupName, directoryPath, nil, mustache )

    # For 'possibities': map array of possibilities to array
    # of filenames created using an output -property on
    # 'generate' definition
    possibilities && possibilities.any? && generateCase( setupName, directoryPath, 'possibility', mustache ) do |output|
      # use output as template rendering
      possibilities.map do |p|
        {
          :possibility => p,
          :outputFile => mustache.render_str( output, { "possibility" =>  p } ),
        }
      end # map
    end
  
  end
  
end

#generateCase(setupName, directoryPath, generateCategory, mustache, &blk) ⇒ Object

Output setup for ‘setupName’ to ‘extensionDirectory’.

outputting files

‘generateCategory’, Nil = no category defined. Intended usage for to generate possibitilies



528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
# File 'lib/sbuilder/controller.rb', line 528

def generateCase( setupName, directoryPath, generateCategory, mustache, &blk )
  
  @logger.info( "#{__method__} directoryPath=#{directoryPath}" )

  # configs in 'generate' -property with correct 'category'
  generateConfigs = getGenerateConfig( generateCategory )

  # create all files defined in 'generateConfigs'
  generateConfigs.each do |generateFile|

    # validate generate configuration 
    validateProperties( generateFile, @@validGenerateConfigs, @@allowedGenerateConfigs )

    # use 'output' config or indirection using blk
    outputDefinitions = blk ?
                         yield(  generateFile['output'] ) :
                         [
                           {
                             :possibility => nil,
                             :outputFile => generateFile['output'],
                           }
                         ]
    @logger.debug( "#{__method__}: outputDefinitions=#{outputDefinitions}" )

    # one config in 'generateFile['output']' may result to sevaral files (possiblity)
    outputDefinitions.each do |outputDefinition|

      # set model data - to be able to access in template
      model.setPossibility( outputDefinition[:possibility] )
      
      # Ensure directory for 'outputFile' exists
      outputFile = outputDefinition[:outputFile]
      outputPath = "#{directoryPath}/#{outputFile}"
      # create sub directory for output if it does not exist
      outputDirectory = File.dirname( outputPath )
      Dir.mkdir( outputDirectory ) unless File.exist?( outputDirectory )

      # header for file
      output( 2, "--> generate: #{outputPath}" )
      
      # open file and output in 'generateTemplate'
      f = File.open( outputPath, "w" )
      begin
        # one output file get generates using multiple 'inputs'
        generateFile['inputs'].each do |generateDef|
          generateTemplate( setupName, outputPath, f, generateDef, mustache )
        end
      ensure
        f.close
      end
      output( 3, "\n" )
    end # each outputFiles

  end
  
end

#generateTemplate(setupName, outputPath, fileHandle, generateDef, mustache) ⇒ Object

Expand template ‘generateDef’ using ‘templateData’

Create templateData to pass to rendering: (CONFIG,META, PARAMETERS,PREFERENCES, filter), render template(s) named in ‘generateDef.template’, output to ‘fileHandle’.

:template,:desc,:modelData,:templateParameters controlling output



601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
# File 'lib/sbuilder/controller.rb', line 601

def generateTemplate( setupName, outputPath, fileHandle, generateDef, mustache )

  # validate configuration
  validateProperties( generateDef, @@validGenerateDef_required, @@validGenerateDef_allowed )

  # access data to output - and filter it
  renderData = templateData( generateDef['modelData'] )
  # e.g. prune interfaces not used in setup
  renderData = setupFilter( generateDef['modelData'], renderData )
  
  # Iterate each 'template' in one 'generateDef' array (most often just one template)
  templates = generateDef['template'].is_a?( Array ) ? generateDef['template'] : [ generateDef['template'] ]

  # Support paramters to template
  templateParameters = generateDef['templateParameters'].nil? ? {} : generateDef['templateParameters']
  
  # optional parameters added in generate -section
  renderData['PARAMETERS'] = templateParameters

  # META-data added to data to render
  templates.each do |template|

    renderData['CONFIG'] = @opts

    renderData['META'] =
      {
        :desc => generateDef['desc'],
        :modelData => generateDef['modelData'],
        :template => template,
        :version => Sbuilder::version,
        :model_version => Sbuilder::model_version,            
        :timestamp => Time.new.strftime( "%Y-%m-%d %H:%M:%S" ),
        :setup => setupName,
        :outputDirectory => File.dirname( outputPath ),            
        :outputFile => File.basename( outputPath ),
        :outputModule => File.basename( outputPath, ".*" ),
      }

    renderData['ACTIONS'] = {
      :cat => lambda do |path_template|
        path = mustache.render_str( path_template, renderData )
        File.readlines( path.strip ).join('')
      end
    }

    # support 'PREFERENCES'
    renderData.merge!( getPreferencesData(setupName ))

    # finally render i.e. create string to output
    str = mustache.to_str( template, renderData )
    
    # output to file
    @logger.info( "#{__method__} templateName=#{template}" )
    output( 3, "    ---> #{generateDef['desc']} (#{template})" )
    fileHandle.puts str
    
  end # templates.each

end

#getCodeRepositoryString

Currently uses first element in template as code repostirory



858
859
860
# File 'lib/sbuilder/controller.rb', line 858

def getCodeRepository
  getOpt( :templates ).first
end

#getConfigObject

cache ‘@controller_config’ read ‘getConfigFilePath’ and ‘getInternalConfigFilePath’, merge ‘generate’



774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
# File 'lib/sbuilder/controller.rb', line 774

def getConfig

  return @controller_config if @controller_config
  
  @logger.info( "#{__method__} loading config from #{getConfigFilePath}" )
  yaml_lines = Sbuilder::Utils::NetIo.read_lines( getConfigFilePath )
  @controller_config = YAML.load( yaml_lines )
  # allow empty generate section
  @controller_config = {} if @controller_config.nil?
  @controller_config['generate'] = [] unless @controller_config['generate']
  @logger.debug( "#{__method__} config in #{getConfigFilePath} controller_config= #{@controller_config.to_yaml}" )

  yaml_lines = Sbuilder::Utils::NetIo.read_lines( getInternalConfigFilePath )
  internal_config = YAML.load( yaml_lines )
  internal_config['generate'] = [] unless internal_config['generate']
  @logger.debug( "#{__method__} internal_config= #{internal_config.to_yaml}" )      

  @logger.debug( "#{__method__} config in #{getInternalConfigFilePath} internal_config= #{internal_config.to_yaml}" )      
  @controller_config['generate'] = @controller_config['generate'] + internal_config['generate']
  @logger.debug( "#{__method__} @controller_config=#{@controller_config.to_yaml}" )
  validateProperties( @controller_config, @@validConfig, @@allowConfig  )
  @controller_config
end

#getEntryPointsString:Array

Return entry_points such that interfaces[steps.interface_operation == intertafaces.interface_operation].implementation



725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
# File 'lib/sbuilder/controller.rb', line 725

def getEntryPoints
  setup_operations = {}
  
  steps = model.templateData( "steps" )['steps']
  interfaces = model.templateData( "interfaces" )['interfaces']
  
  steps.each { |s| setup_operations[s[:interface_operation]] = true }
  @logger.debug( "#{__method__}:  setup_operations= #{setup_operations}" )
  entry_points = interfaces.
                  select {|i| setup_operations[i[:interface_operation]] }.
                  map { |i|  i[:implementation] }
  @logger.info( "#{__method__}:  entry_points= #{entry_points}" )      
  entry_points
  
end

#getModelInvariantsString:Array

Return model invariant defined in sbuilder



755
756
757
758
759
760
# File 'lib/sbuilder/controller.rb', line 755

def getModelInvariants
  names = []
  getInvariantConfig.each { |invariant| names += invariant.keys }
  @logger.info "#{__method__} invariants=#{names.join(',')}"
  return names
end

#getModelNamesString:Array

Return names defined in mode (definitions)



706
707
708
709
710
711
712
713
714
715
716
717
# File 'lib/sbuilder/controller.rb', line 706

def getModelNames
  ret = []
  
  # definition map to types 't_:defintion_name'
  ret += templateData( "definitions" )['definitions'].map { |d| "t_#{d[:definition_name]}"}

  # domain --> 'd_:domain_name'
  ret += templateData( "domains" )['domains'].map { |d| "d_#{d[:domain_name]}"}      
  
  @logger.debug( "#{__method__} ret=#{ret.join(',')}" )
  ret
end

#getPreferencesObject

Access preferences in main configuration file ‘sbuilder.yaml’

non-nil)



846
847
848
# File 'lib/sbuilder/controller.rb', line 846

def getPreferences
  getConfig()['preferences'] || {}
end

#getPreferencesData(setupName) ⇒ Object



830
831
832
833
834
# File 'lib/sbuilder/controller.rb', line 830

def getPreferencesData( setupName )
  renderData = {}
  renderData['PREFERENCES'] = getPreferencesWithDefaults( setupName )
  return renderData
end

#getPreferencesWithDefaults(setupName) ⇒ Object

Get prefecnces with default setttings



838
839
840
# File 'lib/sbuilder/controller.rb', line 838

def getPreferencesWithDefaults( setupName )
  DEFAULT_PREFERENCES.merge( getPreferences ).merge( getSetupPrefences( setupName ))
end

#getSetup(setupName) ⇒ Hash



804
805
806
807
808
# File 'lib/sbuilder/controller.rb', line 804

def getSetup( setupName )
  setup = getSetups.select { |setup| setup['setupDirectory'] == setupName }.first
  @logger.debug( "#{__method__} setupName=#{setupName}, setup=#{setup} " )      
  setup
end

#getSetupAssumesString:Array

‘setups.supet.assumptions’ property



765
766
767
# File 'lib/sbuilder/controller.rb', line 765

def getSetupAssumes
  model.assumptions.map{|a| a[:name] }
end

#getSetupAssumptionList(setupDef) ⇒ String:Array



824
825
826
# File 'lib/sbuilder/controller.rb', line 824

def getSetupAssumptionList( setupDef )
  return setupDef['assumptions'] || []
end

#getSetupExtensions(setupName) ⇒ Hash:Array



811
812
813
814
# File 'lib/sbuilder/controller.rb', line 811

def getSetupExtensions( setupName )
  @logger.debug( "#{__method__} setupName=#{setupName}" )            
  getSetup( setupName )['extensions'] || []
end

#getSetupPossibilitiesString:Array

Return possibilities for current setup.



744
745
746
747
748
# File 'lib/sbuilder/controller.rb', line 744

def getSetupPossibilities
  setupPossis = model.possibilities
  @logger.info( "#{__method__}:  setupPossis= #{setupPossis}" )
  return setupPossis
end

#getSetupPossibilitiesList(setupName) ⇒ String:Array



817
818
819
820
# File 'lib/sbuilder/controller.rb', line 817

def getSetupPossibilitiesList( setupName )
  @logger.debug( "#{__method__} setupName=#{setupName}" )            
  getSetup( setupName )['possibilities'] || []
end

#getSetupPrefences(setupName) ⇒ Hash



852
853
854
# File 'lib/sbuilder/controller.rb', line 852

def getSetupPrefences( setupName )
  getSetup(setupName)['preferences'] || {}
end

#getSetupsObject



798
799
800
# File 'lib/sbuilder/controller.rb', line 798

def getSetups
  getConfig()['setups']
end

#getSetupStepInterfaceOperationsString:Array

Read model#templateData(‘steps’) and return array interface operations reference in model steps.



695
696
697
698
699
700
701
# File 'lib/sbuilder/controller.rb', line 695

def getSetupStepInterfaceOperations
  interface_operations = {}
  model.templateData( "steps" )['steps'].each  {|s| interface_operations[s[:interface_operation]] = true }
  ret = interface_operations.keys
  @logger.info( "#{__method__}: interface_operations=#{ret}" )
  return ret
end

#loadObject

load paremSets and mappers



312
313
314
315
316
317
# File 'lib/sbuilder/controller.rb', line 312

def load
  @logger.info( "#{__method__} load started" )      
  loadResolvers( getResolversConfig )
  loadInterfaces( getInterfaceConfig   )
  loadInvariants( getInvariantConfig )
end

#loadAssumptions(assumptions) ⇒ Object



116
117
118
119
120
121
122
# File 'lib/sbuilder/controller.rb', line 116

def loadAssumptions( assumptions )

  @logger.info "#{__method__}: assumptions=#{assumptions}"
  assumptions.each do |assumption|
    model.addAssumption( { :name => assumption, :desc => "Assume #{assumption}" } ) 
  end # else - not nil
end

#loadExtensions(setupName) ⇒ Object

Load exntesion for setup

def loadExtensions( arrayOfExtensionDefs )



196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
# File 'lib/sbuilder/controller.rb', line 196

def loadExtensions( setupName )

  # access sbuilder.yaml configuration
  arrayOfExtensionDefs = getSetupExtensions( setupName )

  # iteratio
  arrayOfExtensionDefs && arrayOfExtensionDefs.each do |extensionLoaderDef|
    validateProperties( extensionLoaderDef, @@extensionLoaderDef_required, @@extensionLoaderDef_allowed )
    validateOne( extensionLoaderDef, @@extensionLoaderDef_oneof )
    # ensure defaults in properties
    extensionLoaderDef = defaultProps( extensionLoaderDef, @@extensionLoaderDef_defaults )
    

    @logger.info( "#{__method__} extensionLoaderDef=#{extensionLoaderDef}" )
    loader = factory.getExtensionLoader( extensionLoaderDef['type'] )
    begin
      loader.load( getFileUrlOrPath( extensionLoaderDef ), self  )
    rescue Exception => ee
      msg = "Error #{ee} caused by #{ee.backtrace.join("\n")} when loading '#{extensionLoaderDef['url']}'\n\n"
      @logger.error( "#{__method__} #{msg}" )        
      raise ControllerException.new,  msg, ee.backtrace
    end
  end
  # domainLoader = factory.get
end

#loadInterfaces(arrOfparamsetTypePath) ⇒ Object



227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
# File 'lib/sbuilder/controller.rb', line 227

def loadInterfaces( arrOfparamsetTypePath )
  !arrOfparamsetTypePath.nil? && arrOfparamsetTypePath.each do |interfaceParamsetDef|

    begin 
      validateProperties( interfaceParamsetDef, @@interfaceLoaderDef_required, @@interfaceLoaderDef_allowed )
      validateOne( interfaceParamsetDef, @@interfaceLoaderDef_oneof )
      validateOne( interfaceParamsetDef, @@interfaceLoaderDef_oneof2 )
    rescue ControllerException => e
      msg = <<-EOS
      Error:

      #{e} 

      in

      #{interfaceParamsetDef.to_yaml}


      EOS
      @logger.error( "#{__method__} #{msg}" )                    
      raise ControllerException.new,  msg, e.backtrace
    end
    warn <<-EOS if interfaceParamsetDef['type']
    Interface loader configuration 

    #{interfaceParamsetDef.to_yaml}

    uses property 'type', which is depracted.



    Use property 'className' instead.

    Particularly 

       type: #{Sbuilder::Constants::LOADER_SWAGGER}

    should be replaced with

       className: Sbuilder::ParamSetLoaderSwagger

    EOS
    
    # find correct loader based on type & configure it
    loader = factory.getParamSetLoader( getParamsetType( interfaceParamsetDef ))

    # configure facade && pass it to loader
    facade = factory.getFacade(self)
    # facada loading instrcture services
    facade.configureInfrastructureService( interfaceParamsetDef['infrastructureServices'] == true )
    # facade creates definitions in 'namespace' (default nil = no group)
    facade.configureNamespace( interfaceParamsetDef['namespace'] ) 
    facade.setInterfaceCacheFilePath(getParamsetCacheFilePath(interfaceParamsetDef))
    loader.setFacade( facade )
    
    # load an put array
    loader.load( getFileUrlOrPath( interfaceParamsetDef ),  )
    # @paramSets = paramSets.concat( loaded ) if loaded && loaded.any?
  end
end

#loadInvariants(invariants) ⇒ Object

Iterate ‘invariants’ and add to model invariant descritptions. Isse a warning if invarients not defined



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/sbuilder/controller.rb', line 129

def loadInvariants( invariants )

  if invariants.nil? then
    msg = <<-EOS
    No invariants section defined in #{getConfigFilePath}. 

    Suggestion add section 'invariants' defining invariants.
    For example:

    invariants:
    - MustNotHappen: Invariant 'MustNotHappen' verified in the model
  
    EOS
    warn msg
  else
    @logger.info "#{__method__}: invariants=#{invariants}"
    invariants = [invariants] if invariants.is_a?( Hash )
    invariants.each do |invariant|
      invariant.each do |k,v|
        model.addInvariant( { :name => k, :desc => v } ) 
      end
    end
  end # else - not nil
end

#loadResolvers(arrOfmappersTypePath) ⇒ Object


build controller: load (domain) resolvers



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/sbuilder/controller.rb', line 158

def loadResolvers( arrOfmappersTypePath )
  !arrOfmappersTypePath.nil? && arrOfmappersTypePath.each do |mapperDef|
    # add defaults to 'mapperDef'
    mapperDef = defaultProps( mapperDef, @@resolverLoader_defaults )
    validateProperties( mapperDef, @@resolverLoader_required, @@resolverLoader_allowed )
    validateOne( mapperDef, @@resolverLoader_oneof )
    
    
    @logger.debug( "#{__method__} mapperDef=#{mapperDef} " )      
    
    # find correct loader based on type
    loader  = factory.getResolverLoader( getResolverDefType( mapperDef ) )
    
    # load an put array
    loaded = loader.load( getFileUrlOrPath( mapperDef ), self )        
    # @mappers= mappers.concat(loaded) if loaded && loaded.any?
    @logger.info( "#{__method__} @mappers.length=#{@mappers.length}" )              
    @logger.debug( "mappers=#{mappers.map { |mapper| mapper.name }}")
  end
  @logger.info( "#{__method__} loaded #{mappers.size} mappers" )
end

#mapperCreated(mapper) ⇒ Object

controllers gets informed that mapper is created



181
182
183
# File 'lib/sbuilder/controller.rb', line 181

def mapperCreated( mapper )
  @mappers << mapper
end

#prepareRender(setupName) ⇒ Sbuilder::Template



501
502
503
504
505
506
507
508
509
510
511
# File 'lib/sbuilder/controller.rb', line 501

def prepareRender( setupName )
  
  # access template generator from factory
  reader = factory.getTemplateReader( self )
  # configure reader if it is ready to accept 'setupName'
  reader.setSetupName( setupName ) if reader.respond_to?( :setSetupName )
  # pass reader to template generator
  mustache = factory.getTemplate( reader )

  return mustache
end

#prepareSetupDir(extensionDirectory) ⇒ String

Ensure that directory ‘extensionDirectory’ exists under ‘getGenerateDir’



490
491
492
493
494
495
496
497
498
# File 'lib/sbuilder/controller.rb', line 490

def  prepareSetupDir( extensionDirectory )
  # Ensure that 'extensionDirectory' exists
  raise ControllerException.new "Directory #{getGenerateDir} does not exist"  unless File.exist?( getGenerateDir )
  # directory for setupName create automatically
  directoryPath = "#{getGenerateDir}/#{extensionDirectory}"
  Dir.mkdir( directoryPath ) unless File.exist?( directoryPath )
  return directoryPath  

end

#processSetup(setupName) {|setupName, setupConf, possibilities| ... } ⇒ Object

Yields:

  • (setupName, setupConf, possibilities)


455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
# File 'lib/sbuilder/controller.rb', line 455

def processSetup( setupName, &blk )

  # init state
  start

  # load configs
  load

  # resolve domain
  resolve

  # access config && put to model
  setupConf = getSetup( setupName )
  defineSetup( setupConf )

  # add assumptions to model
  loadAssumptions( getSetupAssumptionList( setupConf ) )

  # extensions
  loadExtensions( setupName )      

  # config model - before config rendering
  possibilities= getSetupPossibilitiesList( setupName )      
  model.setPossibilities( possibilities )

  yield setupName, setupConf, possibilities
  
end

#processSetups(chosenSetup = nil, &blk) ⇒ Object



447
448
449
450
451
452
453
# File 'lib/sbuilder/controller.rb', line 447

def processSetups(chosenSetup=nil, &blk )
  setups = Marshal.load( Marshal.dump( getSetups ) || [] ).select { |s| chosenSetup.nil? || s['setupDirectory'] == chosenSetup }
  setups.each do |setup|
    setupName = setup['setupDirectory']
    processSetup( setupName, &blk )
  end
end

#resolveObject



405
406
407
# File 'lib/sbuilder/controller.rb', line 405

def resolve
  resolveDomains
end

#resolveDomainsObject



377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
# File 'lib/sbuilder/controller.rb', line 377

def resolveDomains
  @logger.info( "#{__method__} resolve started" )      
  model.paramSets.each do |paramSet|
    # @logger.info( "#{__method__} paramSet id=#{paramSet.getId}" )      
    resolver = findResolverForParameterSet( paramSet )
    if resolver.nil? then
      msg = "Could not locate resolver for paramSet #{paramSet.getId}"
      @logger.error( "#{__method__} #{msg}" )        
      raise msg
    end
    @logger.info( "#{__method__} resolved resolver.matcher #{resolver.matcher} for paramset id #{paramSet.getId}" )
    # delegate action
    begin
      resolver.resolveDomains( paramSet, model )
      
      # resolve also response
      resolver.resolveDomains( paramSet.response, model ) if  paramSet.respond_to?( :response )
      
     rescue ResolverException => e
      msg = "Error '#{e}' when mapping domains for parameter set '#{paramSet.getId}'"
      puts msg
      @logger.error( "#{__method__} #{msg}" )        
      raise
    end
  end
  
end

#setFactory(factory) ⇒ Object



96
97
98
99
100
# File 'lib/sbuilder/controller.rb', line 96

def setFactory( factory )
  @factory = factory
  # add loaders configured in 'sbuilder.yaml'
  factory.addLoaders( getConfiguredLoaders )
end

#setup(setupDirectory = nil) ⇒ Object


iterate setups



327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
# File 'lib/sbuilder/controller.rb', line 327

def setup( setupDirectory=nil )

  @logger.info( "#{__method__} getSetups=#{getSetups.join( " ------------  " )}, #{getSetups.length}" )                    
  generated=false

  # deep down makes a new call to getSetups --> interation fails
  setups = Marshal.load( Marshal.dump( getSetups ))
  setups.each_with_index do |setupDef,i|
    
    validateProperties( setupDef, @@validSetups_required, @@validSetups_allowed )
    @logger.info( "#{__method__} -->next" ) if setupDirectory && (setupDef['setupDirectory'] != setupDirectory)
    next if setupDirectory && setupDef['setupDirectory'] != setupDirectory
    validateProperties( setupDef['configuration'], @@validSetupConfiguration_required, @@validSetupConfiguration_allowed ) if setupDef['configuration']
      
    # process one setupDirectory
    @logger.info( "#{__method__} start to generate setupDirectory=#{setupDirectory} for #{setupDef}" )

    output( 1, "------------------------------------------------------------------" ) if isOptFilterSrc
    output( 1, "generate setup: #{setupDef['setupDirectory']}" )
    generate( setupDef['setupDirectory'], setupDef['setupDirectory'] )
    @logger.info( "#{__method__} done to generate setupDirectory=#{setupDirectory} for #{setupDef}" )                      
    output( 2, "\n" ) 
    
    generated=true

  end
  
  raise ControllerException.new <<-EOS if !generated && setupDirectory

  Setup #{setupDirectory} not found - Nothing generated

  Valid setups: #{getSetups.map {|setupDef| setupDef['setupDirectory']}.join(',')}

  EOS

  
end

#setupFilter(modelData, renderData) ⇒ Boolean

Decide whether ‘dataElement’ should be passed to template rendering.

Implementation: Default ‘true’, however when ‘options’ && ‘modelData’ == “interface” show only if included in ‘getSetupStepInterfaceOperations’



676
677
678
679
680
681
682
683
684
685
686
687
688
689
# File 'lib/sbuilder/controller.rb', line 676

def setupFilter( modelData, renderData )
case modelData
when "interfaces"
  return renderData unless isOptFilterSrc
  # show only interfaces_operations referenced in 'steps'
  interface_operations = getSetupStepInterfaceOperations
  renderData['interfaces'] = renderData['interfaces'].select{ |d| interface_operations.include?( d[:interface_operation] ) }
  @logger.info( "#{__method__}: filtered renderData['interfaces']=#{renderData['interfaces'].map{|i| i[:interface_operation]}}" )
  return renderData
else
  # default is to show all
  renderData
end
end

#startObject



103
104
105
106
107
108
# File 'lib/sbuilder/controller.rb', line 103

def start
  # init state
  @mappers = []
  @model = factory.createModel()

end