public
Description: RESTful workflow / bpm engine based on Rack and OpenWFEru
Homepage: http://openwferu.rubyforge.org
Clone URL: git://github.com/jmettraux/ruote-rest.git
jmettraux (author)
Wed Apr 30 05:36:42 -0700 2008
commit  af7ddf7fab42628970e5a0e2bbdbe554b2318a2f
tree    8fce5f2ab986f57cde671899f0f3fcbdf130a4a0
parent  39355a5997775c41c51db22abfe1043afc9a2c99
ruote-rest / lib / patching.rb
100644 159 lines (127 sloc) 3.967 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#
#--
# Copyright (c) 2008, John Mettraux, OpenWFE.org
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# . Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# . Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# . Neither the name of the "OpenWFE" nor the names of its contributors may be
# used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#++
#
 
#
# "made in Japan"
#
# John Mettraux at openwfe.org
#
 
 
#
# Reopening Rack::Request to add some convenience methods
#
class Rack::Request
 
    #
    # request.link(:expressions, "abc", "0_0_1")
    # #=> "http://example.org:4567/expressions/abc/0_0_1"
    #
    def link (*args)
 
        base = "#{scheme}://#{host}"
 
        if (scheme == 'https' && port != 443) ||
           (scheme == 'http' && port != 80)
 
           base << ":#{port}"
        end
 
        base + "/" + args.collect {|a| a.to_s }.join("/")
    end
end
 
#
# reopening some OpenWFE classes to add some link magic
#
 
class OpenWFE::FlowExpressionId
 
    #
    # Returns the relative link to the expression pointed at by this
    # FlowExpressionId.
    #
    # fei.link
    # # => "/expressions/{wfid}/{expid}"
    #
    # fei.link(request)
    # # => "http://host:port/expressions/{wfid}/{expid}"
    #
    # fei.link(request, 'smurfs')
    # # => "http://host:port/smurfs/{wfid}/{expid}"
    #
    # fei.link(nil, 'smurfs')
    # # => "smurfs/{wfid}/{expid}"
    #
    def link (req=nil, resource_name='expressions')
 
        ei = swapdots self.expid
 
        return req.link(resource_name, wfid, ei) if req
 
        env = self.expname == "environment" ? "e" : ""
 
        "/#{resource_name}/#{wfid}/#{ei}#{env}"
    end
end
 
class OpenWFE::FlowExpression
 
    #
    # a shortcut for
    #
    # self.fei.link(req)
    #
    def link (req=nil)
 
        self.fei.link(req)
    end
end
 
module OpenWFE::Participant
 
    #
    # adding an 'index' field
    #
    attr_accessor :index
 
    #
    # Returns the ruote-rest link for this participant.
    # If a request is passed, the link will be absolute.
    #
    def link (request=nil)
 
        return request.link(:participants, index) if request
 
        "/participants/#{index}"
    end
end
 
class OpenWFE::Engine
 
    #
    # Making sure that each participant has an index field
    #
    def participant_list
 
        l = []
        self.list_participants.each_with_index do |part, i|
            part[1].index = i
            l << part
        end
        l
    end
end
 
class OpenWFE::InFlowWorkItem
 
    #
    # Returns the 'ruote-rest' link for this workitem
    #
    def link (request=nil)
 
        return request.link(:workitems, db_id) if request
 
        "/workitems/#{db_id}"
    end
end