Class: Taskinator::Persistence::XmlSerializationVisitor

Inherits:
Visitor::Base
  • Object
show all
Defined in:
lib/taskinator/persistence.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(builder, instance, base_visitor = self) ⇒ XmlSerializationVisitor

Returns a new instance of XmlSerializationVisitor.



351
352
353
354
355
356
357
358
# File 'lib/taskinator/persistence.rb', line 351

def initialize(builder, instance, base_visitor=self)
  @builder      = builder
  @instance     = instance
  @key          = instance.key
  @root         = base_visitor.instance
  @base_visitor = base_visitor
  @task_count   = 0
end

Instance Attribute Details

#builderObject (readonly)

the redis connection is passed in since it is in the multi statement mode in order to produce one roundtrip to the redis server



348
349
350
# File 'lib/taskinator/persistence.rb', line 348

def builder
  @builder
end

#instanceObject (readonly)

Returns the value of attribute instance.



349
350
351
# File 'lib/taskinator/persistence.rb', line 349

def instance
  @instance
end

Instance Method Details

#incr_task_countObject



447
448
449
# File 'lib/taskinator/persistence.rb', line 447

def incr_task_count
  @task_count += 1
end

#task_countObject



443
444
445
# File 'lib/taskinator/persistence.rb', line 443

def task_count
  @task_count
end

#visitObject

the starting point for serializing the instance



361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
# File 'lib/taskinator/persistence.rb', line 361

def visit
  @attributes = []
  @attributes << [:type, @instance.class.name]
  @attributes << [:process_uuid, @root.uuid]
  @attributes << [:state, :initial]

  @instance.accept(self)

  @attributes << [:task_count, @task_count]

  @attributes.each do |(name, value)|
    builder.tag!('attribute', name => value)
  end

  self
end

#visit_args(attribute) ⇒ Object



431
432
433
434
435
436
437
438
439
440
441
# File 'lib/taskinator/persistence.rb', line 431

def visit_args(attribute)
  values = @instance.send(attribute)
  yaml = Taskinator::Persistence.serialize(values)

  # greater than 2 MB?
  if (yaml.bytesize / (1024.0**2)) > 2
    Taskinator.logger.warn("Large argument data detected for '#{self.to_s}'. Consider using intrinsic types instead, or try to reduce the amount of data provided.")
  end

  @attributes << [attribute, yaml]
end

#visit_attribute(attribute) ⇒ Object



403
404
405
406
# File 'lib/taskinator/persistence.rb', line 403

def visit_attribute(attribute)
  value = @instance.send(attribute)
  @attributes << [attribute, value] if value
end

#visit_attribute_enum(attribute, type) ⇒ Object



412
413
414
# File 'lib/taskinator/persistence.rb', line 412

def visit_attribute_enum(attribute, type)
  visit_attribute(attribute)
end

#visit_attribute_time(attribute) ⇒ Object



408
409
410
# File 'lib/taskinator/persistence.rb', line 408

def visit_attribute_time(attribute)
  visit_attribute(attribute)
end

#visit_process(attribute) ⇒ Object



378
379
380
381
382
383
384
385
386
387
# File 'lib/taskinator/persistence.rb', line 378

def visit_process(attribute)
  process = @instance.send(attribute)
  if process
    @attributes << [attribute, process.uuid]

    builder.tag!('process', :key => process.key) do |xml|
      XmlSerializationVisitor.new(xml, process, @base_visitor).visit
    end
  end
end

#visit_process_reference(attribute) ⇒ Object



416
417
418
419
# File 'lib/taskinator/persistence.rb', line 416

def visit_process_reference(attribute)
  process = @instance.send(attribute)
  @attributes << [attribute, process.uuid] if process
end

#visit_task_reference(attribute) ⇒ Object



421
422
423
424
# File 'lib/taskinator/persistence.rb', line 421

def visit_task_reference(attribute)
  task = @instance.send(attribute)
  @attributes << [attribute, task.uuid] if task
end

#visit_tasks(tasks) ⇒ Object



389
390
391
392
393
394
395
396
397
398
399
400
401
# File 'lib/taskinator/persistence.rb', line 389

def visit_tasks(tasks)
  builder.tag!('tasks', :count => tasks.count) do |xml|
    tasks.each do |task|
      xml.tag!('task', :key => task.key) do |xml2|
        XmlSerializationVisitor.new(xml2, task, @base_visitor).visit
        unless task.is_a?(Task::SubProcess)
          incr_task_count unless self == @base_visitor
          @base_visitor.incr_task_count
        end
      end
    end
  end
end

#visit_type(attribute) ⇒ Object



426
427
428
429
# File 'lib/taskinator/persistence.rb', line 426

def visit_type(attribute)
  type = @instance.send(attribute)
  @attributes << [attribute, type.name] if type
end