Class OpenWFE::RestoreWorkItemExpression
In: lib/openwfe/expressions/fe_save.rb
Parent: FlowExpression

"restore" is often used in conjunction with "save" (SaveWorkItemExpression).

It can restore a workitem saved to a variable (it will actually restore the payload of that workitem) or transfer the content of a field as top attribute field.

    restore :from_variable => "freezed_workitem"
        #
        # takes the freezed payload at 'freezed_workitem' and makes it
        # the payload of the current workitem

    restore :from_field => "some_data"
        #
        # replaces the payload of the current workitem with the hash
        # found in the field "some_data"

    restore :from_variable => "v", :to_field => "f"
        #
        # will copy the payload saved under variable "v" as the value
        # of the field "f"

    restore :from_variable => "v", :merge_lead => :current
        #
        # will restore the payload of the workitem saved under v
        # but if fields of v are already present in the current workitem
        # the current values will be kept

    restore :from_variable => "v", :merge_lead => :restored
        #
        # will restore the payload of the workitem saved under v
        # but the workitem v payload will have priority.

Beware : you should not restore from a field that is not a hash. The top level attributes (payload) of a workitem should always be a hash.

Since OpenWFEru 0.9.17, the ‘set-fields’ alias can be used for restore.

    sequence do
        set_fields :value => {
            "customer" => { "name" => "Zigue", "age" => 34 },
            "approved" => false }
        _print "${f:customer.name} (${f:customer.age}) ${f:approved}"
    end

Along with this new alias, the expression now behave much like the ‘set’ expression, but still, targets the whole workitem payload.

Note that "set-fields" can be used outside of the body of a process definition (along with "set") to separate ‘data preparation’ from actual process definition.

    class Test44b6 < ProcessDefinition
        set_fields :value => {
            "customer" => { "name" => "Zigue", "age" => 34 },
            "approved" => false }
        sequence do
            _print "${f:customer.name} (${f:customer.age}) ${f:approved}"
        end
    end

Using set_fields at the beginning of a process can be useful for setting up forms (keys without values for now).

    set_fields :value => {
        "name" => "",
        "address" => "",
        "email" => ""
    }

Methods

Included Modules

MergeMixin ValueMixin

Public Instance methods

so that in can be placed outside of process definition bodies

[Source]

     # File lib/openwfe/expressions/fe_save.rb, line 175
175:         def reply (workitem)
176: 
177:             from_field = lookup_string_attribute :from_field, workitem
178:             from_variable = lookup_string_attribute :from_variable, workitem
179: 
180:             merge_lead = lookup_sym_attribute :merge_lead, workitem
181: 
182:             merge_lead = nil \
183:                 unless [ nil, :current, :restored ].include?(merge_lead)
184: 
185:             value = workitem.attributes[FIELD_RESULT]
186: 
187:             source = if from_field
188: 
189:                 att = workitem.lookup_attribute from_field
190: 
191:                 lwarn {
192:                     "apply() field '#{from_field}' is NOT a hash, " +
193:                     "restored anyway"
194:                 } unless att.kind_of?(Hash)
195: 
196:                 att
197: 
198:             elsif from_variable
199: 
200:                 lookup_variable from_variable
201: 
202:             elsif value
203: 
204:                 value
205: 
206:             else
207: 
208:                 nil
209:             end
210: 
211:             if source
212: 
213:                 workitem = if merge_lead
214:                     do_merge merge_lead, workitem, source
215:                 else
216:                     do_overwrite workitem, source
217:                 end
218:             end
219:             # else, don't restore anything
220: 
221:             reply_to_parent workitem
222:         end

Protected Instance methods

If the attribute ‘merge-lead’ (or ‘merge_lead’) is specified, the workitems get merged.

[Source]

     # File lib/openwfe/expressions/fe_save.rb, line 255
255:             def do_merge (merge_lead, workitem, source)
256: 
257:                 if source.kind_of?(Hash)
258:                     wi = InFlowWorkItem.new
259:                     wi.attributes = source
260:                     source = wi
261:                 end
262: 
263:                 wiTarget, wiSource = if merge_lead == :current
264:                     [ source, workitem ]
265:                 else
266:                     [ workitem, source ]
267:                 end
268: 
269:                 merge_workitems wiTarget, wiSource
270:             end

The default case, restored values simply overwrite current values.

[Source]

     # File lib/openwfe/expressions/fe_save.rb, line 230
230:             def do_overwrite (workitem, source)
231: 
232:                 return workitem unless source
233: 
234:                 attributes = if source.kind_of?(WorkItem)
235:                     OpenWFE::fulldup source.attributes
236:                 else
237:                     source
238:                 end
239: 
240:                 to_field = lookup_string_attribute :to_field, workitem
241: 
242:                 if to_field
243:                     workitem.set_attribute to_field, attributes
244:                 else
245:                     workitem.attributes = attributes
246:                 end
247: 
248:                 workitem
249:             end

[Validate]