Class: Ruote::Workitem

Inherits:
Object
  • Object
show all
Defined in:
lib/ruote/workitem.rb

Overview

A workitem can be thought of an “execution token”, but with a payload (fields).

The payload/fields MUST be JSONifiable.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(h) ⇒ Workitem

Returns a new instance of Workitem.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/ruote/workitem.rb', line 42

def initialize(h)

  @h = h
  class << @h; include Ruote::HashDot; end

  #class << @h['fields']
  #  alias_method :__get, :[]
  #  alias_method :__set, :[]=
  #  def [](key)
  #    __get(key.to_s)
  #  end
  #  def []=(key, value)
  #    __set(key.to_s, value)
  #  end
  #end
    # indifferent access, not activated for now
end

Instance Attribute Details

#hObject (readonly)

Returns the value of attribute h.



40
41
42
# File 'lib/ruote/workitem.rb', line 40

def h
  @h
end

Class Method Details

.add_tag(hworkitem, tag) ⇒ Object

Used by FlowExpression when entering a tag.



350
351
352
353
# File 'lib/ruote/workitem.rb', line 350

def self.add_tag(hworkitem, tag)

  (hworkitem['fields']['__tags__'] ||= []) << tag
end

.from_json(json) ⇒ Object

Given a JSON String, decodes and returns a Ruote::Workitem instance.3 If the decode thing is not an object/hash, will raise an ArgumentError.



382
383
384
385
386
387
388
389
390
391
# File 'lib/ruote/workitem.rb', line 382

def self.from_json(json)

  h = Rufus::Json.decode(json)

  raise ArgumentError(
    "Arg not a JSON hash/object, but a #{h.class}. Cannot create workitem"
  ) unless h.is_a?(Hash)

  self.new(h)
end

.remove_tag(hworkitem, tag) ⇒ Object

Used by FlowExpression when leaving a tag.



357
358
359
360
361
362
363
364
365
366
367
368
369
# File 'lib/ruote/workitem.rb', line 357

def self.remove_tag(hworkitem, tag)

  # it's a bit convoluted... trying to cope with potential inconsistencies
  #
  # normally, it should only be a tags.pop(), but since user have
  # access to the workitem and its fields... better be safe than sorry

  tags = (hworkitem['fields']['__tags__'] || [])

  if index = tags.rindex(tag)
    tags.delete_at(index)
  end
end

Instance Method Details

#==(other) ⇒ Object Also known as: eql?

Warning : equality is based on fei and not on payload !



173
174
175
176
177
# File 'lib/ruote/workitem.rb', line 173

def ==(other)

  return false if other.class != self.class
  self.h['fei'] == other.h['fei']
end

#as_json(pretty = false) ⇒ Object

Encodes this workitem as JSON. If pretty is set to true, will output prettified JSON.



374
375
376
377
# File 'lib/ruote/workitem.rb', line 374

def as_json(pretty=false)

  pretty ? Rufus::Json.pretty_encode(@h) : Rufus::Json.encode(@h)
end

#command=(com) ⇒ Object

(advanced)

Shortcut for wi.fields = x

__command__ is read by the ‘cursor’ and the ‘iterator’ expressions when a workitem reaches it (apply and reply).



332
333
334
335
336
337
338
339
# File 'lib/ruote/workitem.rb', line 332

def command=(com)

  com = com.is_a?(Array) ? com : com.split(' ')
  com = [ com.first, com.last ]
  com[1] = com[1].to_i if com[1] and com[0] != 'jump'

  @h['fields']['__command__'] = com
end

#commmandObject

(advanced)

Shortcut for wi.fields

__command__ is read by the ‘cursor’ and the ‘iterator’ expressions when a workitem reaches it (apply and reply).



320
321
322
323
# File 'lib/ruote/workitem.rb', line 320

def commmand

  @h['fields']['__command__']
end

#dispatched_atObject

When was this workitem dispatched ?



166
167
168
169
# File 'lib/ruote/workitem.rb', line 166

def dispatched_at

  fields['dispatched_at']
end

#dupObject

Returns a complete copy of this workitem.



96
97
98
99
# File 'lib/ruote/workitem.rb', line 96

def dup

  Workitem.new(Rufus::Json.dup(@h))
end

#errorObject

Shortcut for wi.fields



236
237
238
239
# File 'lib/ruote/workitem.rb', line 236

def error

  @h['fields']['__error__']
end

#feiObject

Returns a Ruote::FlowExpressionId instance.



89
90
91
92
# File 'lib/ruote/workitem.rb', line 89

def fei

  FlowExpressionId.new(@h['fei'])
end

#field_or_param(key) ⇒ Object

Like #param_or_field, but priority is given to the field.



298
299
300
301
302
303
# File 'lib/ruote/workitem.rb', line 298

def field_or_param(key)

  key = key.to_s

  @h['fields'][key] || (@h['fields']['params'] || {})[key]
end

#fieldsObject

Returns the payload, ie the fields hash.



131
132
133
134
# File 'lib/ruote/workitem.rb', line 131

def fields

  @h['fields']
end

#fields=(fields) ⇒ Object

Sets all the fields in one sweep.

Remember : the fields must be a JSONifiable hash.



140
141
142
143
# File 'lib/ruote/workitem.rb', line 140

def fields=(fields)

  @h['fields'] = fields
end

#hashObject

Warning : hash is fei’s hash.



183
184
185
186
# File 'lib/ruote/workitem.rb', line 183

def hash

  self.h['fei'].hash
end

#lookup(key, container_lookup = false) ⇒ Object Also known as: lf

For a simple key

workitem.lookup('toto')

is equivalent to

workitem.fields['toto']

but for a complex key

workitem.lookup('toto.address')

is equivalent to

workitem.fields['toto']['address']


204
205
206
207
# File 'lib/ruote/workitem.rb', line 204

def lookup(key, container_lookup=false)

  Ruote.lookup(@h['fields'], key, container_lookup)
end

#param_or_field(key) ⇒ Object

Sometimes a value is passed as a[n expression] parameter or as a workitem field, with priority to the parameter.

sequence do
  set 'f:country' => 'uruguay'
  participant 'toto'
    # in toto, workitem.param_or_field(:country) will yield 'uruguay'
  participant 'toto', :country => 'argentina'
    # workitem.param_or_field(:country) will yield 'argentina'
end


289
290
291
292
293
294
# File 'lib/ruote/workitem.rb', line 289

def param_or_field(key)

  key = key.to_s

  (@h['fields']['params'] || {})[key] || @h['fields'][key]
end

#param_textObject

When a participant is invoked like in

accounting 'do_invoice', :customer => 'acme corp'

then

p workitem.params
  # => { 'ref' => 'accounting', 'do_invoice' => nil, 'customer' => 'acme corp' }

and

p workitem.param_text
  # => 'do_invoice'

It returns nil when there is no text passed directly.



273
274
275
276
# File 'lib/ruote/workitem.rb', line 273

def param_text

  (params.find { |k, v| v.nil? } || []).first
end

#paramsObject

Shortcut for wi.fields

When a participant is invoked like in

participant :ref => 'toto', :task => 'x"

then

p workitem.params
  # => { 'ref' => 'toto', 'task' => 'x' }


252
253
254
255
# File 'lib/ruote/workitem.rb', line 252

def params

  @h['fields']['params'] || {}
end

#participant_nameObject

The participant for which this item is destined. Will be nil when the workitem is transiting inside of its process instance (as opposed to when it’s being delivered outside of the engine).



105
106
107
108
# File 'lib/ruote/workitem.rb', line 105

def participant_name

  @h['participant_name']
end

#resultObject

A shortcut to the value in the field named __result__

This field is used by the if expression for instance to determine if it should branch to its ‘then’ or its ‘else’.



150
151
152
153
# File 'lib/ruote/workitem.rb', line 150

def result

  fields['__result__']
end

#result=(r) ⇒ Object

Sets the value of the ‘special’ field __result__

See #result



159
160
161
162
# File 'lib/ruote/workitem.rb', line 159

def result=(r)

  fields['__result__'] = r
end

#set_field(key, value) ⇒ Object

Like #lookup allows for nested lookups, #set_field can be used to set sub fields directly.

workitem.set_field('customer.address.city', 'Pleasantville')

Warning : if the customer and address field and subfield are not present or are not hashes, set_field will simply create a “customer.address.city” field and set its value to “Pleasantville”.



222
223
224
225
# File 'lib/ruote/workitem.rb', line 222

def set_field(key, value)

  Ruote.set(@h['fields'], key, value)
end

#sidObject

Returns the String id for this workitem (something like “0_0!!20100507-wagamama”).

It’s in fact a shortcut for

Ruote::FlowExpressionId.to_storage_id(h.fei)


74
75
76
77
# File 'lib/ruote/workitem.rb', line 74

def sid

  Ruote::FlowExpressionId.to_storage_id(h.fei)
end

#tObject



309
310
311
# File 'lib/ruote/workitem.rb', line 309

def t
  @h['fields']['t'] ||= {}
end

#tagsObject

Shortcut for wi.fields



343
344
345
346
# File 'lib/ruote/workitem.rb', line 343

def tags

  @h['fields']['__tags__'] || []
end

#timed_outObject

Shortcut for wi.fields[‘timed_out’]



229
230
231
232
# File 'lib/ruote/workitem.rb', line 229

def timed_out

  @h['fields']['__timed_out__']
end

#to_hObject

Returns the underlying Hash instance.



62
63
64
65
# File 'lib/ruote/workitem.rb', line 62

def to_h

  @h
end

#wf_nameObject Also known as: definition_name

Returns the name of the workflow to which this workitem belongs, or nil.



112
113
114
115
# File 'lib/ruote/workitem.rb', line 112

def wf_name

  @h['wf_name']
end

#wf_revisionObject Also known as: definition_revision

Returns the revision of the workflow to which this workitem belongs, or nil.



122
123
124
125
# File 'lib/ruote/workitem.rb', line 122

def wf_revision

  @h['wf_revision']
end

#wfidObject

Returns the “workflow instance id” (unique process instance id) of the process instance which issued this workitem.



82
83
84
85
# File 'lib/ruote/workitem.rb', line 82

def wfid

  h.fei['wfid']
end