taverna-player 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (192) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +18 -0
  3. data/LICENCE.rdoc +29 -0
  4. data/README.rdoc +663 -0
  5. data/Rakefile +65 -0
  6. data/app/assets/javascripts/taverna_player/application.js +14 -0
  7. data/app/assets/javascripts/taverna_player/runs.js +42 -0
  8. data/app/assets/stylesheets/scaffold.css +56 -0
  9. data/app/assets/stylesheets/taverna_player/application.css +13 -0
  10. data/app/assets/stylesheets/taverna_player/coderay.css +120 -0
  11. data/app/controllers/taverna_player/application_controller.rb +16 -0
  12. data/app/controllers/taverna_player/runs_controller.rb +18 -0
  13. data/app/controllers/taverna_player/service_credentials_controller.rb +18 -0
  14. data/app/helpers/taverna_player/application_helper.rb +55 -0
  15. data/app/helpers/taverna_player/runs_helper.rb +84 -0
  16. data/app/models/taverna_player/interaction.rb +25 -0
  17. data/app/models/taverna_player/run.rb +117 -0
  18. data/app/models/taverna_player/run_port.rb +148 -0
  19. data/app/models/taverna_player/service_credential.rb +56 -0
  20. data/app/views/layouts/taverna_player/embedded.html.erb +27 -0
  21. data/app/views/taverna_player/runs/_button.html.erb +19 -0
  22. data/app/views/taverna_player/runs/_info.html.erb +56 -0
  23. data/app/views/taverna_player/runs/_info.json.jbuilder +2 -0
  24. data/app/views/taverna_player/runs/_inputs.html.erb +34 -0
  25. data/app/views/taverna_player/runs/_inputs.json.jbuilder +8 -0
  26. data/app/views/taverna_player/runs/_interaction.html.erb +68 -0
  27. data/app/views/taverna_player/runs/_outputs.html.erb +41 -0
  28. data/app/views/taverna_player/runs/_poll.html.erb +27 -0
  29. data/app/views/taverna_player/runs/create.json.jbuilder +3 -0
  30. data/app/views/taverna_player/runs/embedded/_button.html.erb +19 -0
  31. data/app/views/taverna_player/runs/embedded/_info.html.erb +25 -0
  32. data/app/views/taverna_player/runs/embedded/_inputs.html.erb +32 -0
  33. data/app/views/taverna_player/runs/embedded/_outputs.html.erb +32 -0
  34. data/app/views/taverna_player/runs/embedded/new.html.erb +58 -0
  35. data/app/views/taverna_player/runs/embedded/show.html.erb +39 -0
  36. data/app/views/taverna_player/runs/embedded/show.js.erb +35 -0
  37. data/app/views/taverna_player/runs/index.html.erb +40 -0
  38. data/app/views/taverna_player/runs/index.json.jbuilder +1 -0
  39. data/app/views/taverna_player/runs/new.html.erb +56 -0
  40. data/app/views/taverna_player/runs/new.json.jbuilder +1 -0
  41. data/app/views/taverna_player/runs/show.html.erb +29 -0
  42. data/app/views/taverna_player/runs/show.js.erb +25 -0
  43. data/app/views/taverna_player/runs/show.json.jbuilder +25 -0
  44. data/app/views/taverna_player/service_credentials/_form.html.erb +53 -0
  45. data/app/views/taverna_player/service_credentials/edit.html.erb +18 -0
  46. data/app/views/taverna_player/service_credentials/index.html.erb +41 -0
  47. data/app/views/taverna_player/service_credentials/new.html.erb +17 -0
  48. data/app/views/taverna_player/service_credentials/show.html.erb +36 -0
  49. data/config/routes.rb +34 -0
  50. data/db/migrate/20130313105546_create_taverna_player_runs.rb +16 -0
  51. data/db/migrate/20130315163019_create_taverna_player_run_ports.rb +15 -0
  52. data/db/migrate/20130318170744_add_attachment_file_to_taverna_player_run_ports.rb +6 -0
  53. data/db/migrate/20130319183634_create_delayed_jobs.rb +22 -0
  54. data/db/migrate/20130320102600_add_status_message_to_taverna_player_runs.rb +5 -0
  55. data/db/migrate/20130321100110_add_depth_and_metadata_to_taverna_player_run_ports.rb +6 -0
  56. data/db/migrate/20130704095504_add_attachment_results_to_taverna_player_runs.rb +5 -0
  57. data/db/migrate/20130705142704_add_embedded_to_taverna_player_runs.rb +5 -0
  58. data/db/migrate/20130714140911_create_taverna_player_interactions.rb +13 -0
  59. data/db/migrate/20130717083653_add_proxy_to_taverna_player_runs.rb +6 -0
  60. data/db/migrate/20130717155415_add_stop_to_taverna_player_runs.rb +5 -0
  61. data/db/migrate/20130811152840_add_attachment_log_to_taverna_player_runs.rb +5 -0
  62. data/db/migrate/20130811211725_change_taverna_player_runs_state_column.rb +5 -0
  63. data/db/migrate/20130812155839_add_name_to_taverna_player_runs.rb +5 -0
  64. data/db/migrate/20130918135348_create_taverna_player_service_credentials.rb +15 -0
  65. data/db/migrate/20130919154200_add_displayed_to_taverna_player_interactions.rb +5 -0
  66. data/db/migrate/20131007153209_add_job_ref_to_taverna_player_runs.rb +13 -0
  67. data/db/migrate/20131010094537_add_reply_caching_to_taverna_player_interactions.rb +19 -0
  68. data/db/migrate/20131017141514_add_failure_message_to_taverna_player_run.rb +5 -0
  69. data/db/migrate/20131018152940_add_serial_number_to_taverna_player_interactions.rb +5 -0
  70. data/db/migrate/20131018160715_add_parent_run_id_to_taverna_player_runs.rb +5 -0
  71. data/db/migrate/20131102113933_add_page_uri_to_taverna_player_interaction.rb +5 -0
  72. data/db/migrate/20131105115218_remove_proxy_from_taverna_player_runs.rb +11 -0
  73. data/db/migrate/20131105141934_change_taverna_player_interactions_output_value_column_name.rb +5 -0
  74. data/db/migrate/20131112165520_add_user_to_taverna_player_run.rb +5 -0
  75. data/lib/generators/taverna_player/callbacks_generator.rb +25 -0
  76. data/lib/generators/taverna_player/controllers_generator.rb +30 -0
  77. data/lib/generators/taverna_player/install_generator.rb +30 -0
  78. data/lib/generators/taverna_player/job_generator.rb +26 -0
  79. data/lib/generators/taverna_player/models_generator.rb +27 -0
  80. data/lib/generators/taverna_player/renderers_generator.rb +26 -0
  81. data/lib/generators/taverna_player/views_generator.rb +27 -0
  82. data/lib/generators/templates/ReadMe.txt +118 -0
  83. data/lib/generators/templates/callbacks/render_callbacks.rb +56 -0
  84. data/lib/generators/templates/callbacks/worker_callbacks.rb +31 -0
  85. data/lib/generators/templates/controllers/runs_controller.rb +20 -0
  86. data/lib/generators/templates/controllers/service_credentials_controller.rb +20 -0
  87. data/lib/generators/templates/initializer.rb +154 -0
  88. data/lib/generators/templates/models/run.rb +20 -0
  89. data/lib/tasks/delete-cancelled-runs.rake +26 -0
  90. data/lib/tasks/delete-old-embedded-runs.rake +26 -0
  91. data/lib/taverna-player.rb +139 -0
  92. data/lib/taverna_player/concerns/controllers/runs_controller.rb +281 -0
  93. data/lib/taverna_player/concerns/controllers/service_credentials_controller.rb +89 -0
  94. data/lib/taverna_player/concerns/models/run.rb +205 -0
  95. data/lib/taverna_player/engine.rb +23 -0
  96. data/lib/taverna_player/model_proxy.rb +51 -0
  97. data/lib/taverna_player/output_renderer.rb +96 -0
  98. data/lib/taverna_player/render_callbacks.rb +41 -0
  99. data/lib/taverna_player/version.rb +15 -0
  100. data/lib/taverna_player/worker.rb +325 -0
  101. data/script/delayed_job +5 -0
  102. data/script/rails +8 -0
  103. data/taverna_player.gemspec +46 -0
  104. data/test/dummy/Rakefile +7 -0
  105. data/test/dummy/app/assets/javascripts/application.js +16 -0
  106. data/test/dummy/app/assets/stylesheets/application.css +14 -0
  107. data/test/dummy/app/controllers/application_controller.rb +15 -0
  108. data/test/dummy/app/controllers/home_controller.rb +16 -0
  109. data/test/dummy/app/controllers/taverna_player/runs_controller.rb +25 -0
  110. data/test/dummy/app/controllers/taverna_player/service_credentials_controller.rb +25 -0
  111. data/test/dummy/app/controllers/workflows_controller.rb +17 -0
  112. data/test/dummy/app/models/user.rb +15 -0
  113. data/test/dummy/app/models/workflow.rb +32 -0
  114. data/test/dummy/app/views/home/index.html.erb +18 -0
  115. data/test/dummy/app/views/layouts/application.html.erb +43 -0
  116. data/test/dummy/app/views/workflows/index.html.erb +35 -0
  117. data/test/dummy/config.ru +4 -0
  118. data/test/dummy/config/application.rb +58 -0
  119. data/test/dummy/config/boot.rb +10 -0
  120. data/test/dummy/config/database.yml +25 -0
  121. data/test/dummy/config/environment.rb +5 -0
  122. data/test/dummy/config/environments/development.rb +37 -0
  123. data/test/dummy/config/environments/production.rb +67 -0
  124. data/test/dummy/config/environments/test.rb +37 -0
  125. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  126. data/test/dummy/config/initializers/inflections.rb +15 -0
  127. data/test/dummy/config/initializers/mime_types.rb +5 -0
  128. data/test/dummy/config/initializers/secret_token.rb +7 -0
  129. data/test/dummy/config/initializers/session_store.rb +8 -0
  130. data/test/dummy/config/initializers/taverna_player.example.rb +40 -0
  131. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  132. data/test/dummy/config/locales/en.yml +5 -0
  133. data/test/dummy/config/routes.rb +22 -0
  134. data/test/dummy/db/migrate/20130314103555_create_workflows.rb +12 -0
  135. data/test/dummy/db/migrate/20130318141557_create_taverna_player_runs.taverna_player.rb +17 -0
  136. data/test/dummy/db/migrate/20130318141558_create_taverna_player_run_ports.taverna_player.rb +16 -0
  137. data/test/dummy/db/migrate/20130318173013_add_attachment_file_to_taverna_player_run_ports.taverna_player.rb +7 -0
  138. data/test/dummy/db/migrate/20130319183816_create_delayed_jobs.taverna_player.rb +23 -0
  139. data/test/dummy/db/migrate/20130320102635_add_status_message_to_taverna_player_runs.taverna_player.rb +6 -0
  140. data/test/dummy/db/migrate/20130321161859_add_depth_and_metadata_to_taverna_player_run_ports.taverna_player.rb +7 -0
  141. data/test/dummy/db/migrate/20130704100146_add_attachment_results_to_taverna_player_runs.taverna_player.rb +6 -0
  142. data/test/dummy/db/migrate/20130705142816_add_embedded_to_taverna_player_runs.taverna_player.rb +6 -0
  143. data/test/dummy/db/migrate/20130714142144_create_taverna_player_interactions.taverna_player.rb +14 -0
  144. data/test/dummy/db/migrate/20130717084809_add_proxy_to_taverna_player_runs.taverna_player.rb +7 -0
  145. data/test/dummy/db/migrate/20130718102707_add_stop_to_taverna_player_runs.taverna_player.rb +6 -0
  146. data/test/dummy/db/migrate/20130811204449_add_attachment_log_to_taverna_player_runs.taverna_player.rb +6 -0
  147. data/test/dummy/db/migrate/20130811212709_change_taverna_player_runs_state_column.taverna_player.rb +6 -0
  148. data/test/dummy/db/migrate/20130812161152_add_name_to_taverna_player_runs.taverna_player.rb +6 -0
  149. data/test/dummy/db/migrate/20130918155525_create_taverna_player_service_credentials.taverna_player.rb +16 -0
  150. data/test/dummy/db/migrate/20130919155202_add_displayed_to_taverna_player_interactions.taverna_player.rb +6 -0
  151. data/test/dummy/db/migrate/20131007153659_add_job_ref_to_taverna_player_runs.taverna_player.rb +14 -0
  152. data/test/dummy/db/migrate/20131016123941_add_reply_caching_to_taverna_player_interactions.taverna_player.rb +20 -0
  153. data/test/dummy/db/migrate/20131017141614_add_failure_message_to_taverna_player_run.taverna_player.rb +6 -0
  154. data/test/dummy/db/migrate/20131018153316_add_serial_number_to_taverna_player_interactions.taverna_player.rb +6 -0
  155. data/test/dummy/db/migrate/20131018164614_add_parent_run_id_to_taverna_player_runs.taverna_player.rb +6 -0
  156. data/test/dummy/db/migrate/20131102114343_add_page_uri_to_taverna_player_interaction.taverna_player.rb +6 -0
  157. data/test/dummy/db/migrate/20131105115724_remove_proxy_from_taverna_player_runs.taverna_player.rb +12 -0
  158. data/test/dummy/db/migrate/20131105142417_change_taverna_player_interactions_output_value_column_name.taverna_player.rb +6 -0
  159. data/test/dummy/db/migrate/20131112165815_add_user_to_taverna_player_run.taverna_player.rb +6 -0
  160. data/test/dummy/db/migrate/20131114130937_create_users.rb +10 -0
  161. data/test/dummy/db/schema.rb +123 -0
  162. data/test/dummy/lib/callbacks.rb +35 -0
  163. data/test/dummy/log/.gitkeep +0 -0
  164. data/test/dummy/public/404.html +26 -0
  165. data/test/dummy/public/422.html +26 -0
  166. data/test/dummy/public/500.html +25 -0
  167. data/test/dummy/public/favicon.ico +0 -0
  168. data/test/dummy/script/delayed_job +5 -0
  169. data/test/dummy/script/rails +6 -0
  170. data/test/dummy/test/functional/home_controller_test.rb +28 -0
  171. data/test/dummy/test/functional/workflows_controller_test.rb +21 -0
  172. data/test/fixtures/files/crassostrea_gigas.csv +737 -0
  173. data/test/fixtures/taverna_player/interactions.yml +32 -0
  174. data/test/fixtures/taverna_player/run_ports.yml +54 -0
  175. data/test/fixtures/taverna_player/runs.yml +69 -0
  176. data/test/fixtures/taverna_player/service_credentials.yml +25 -0
  177. data/test/fixtures/users.yml +16 -0
  178. data/test/fixtures/workflows.yml +32 -0
  179. data/test/functional/taverna_player/runs_controller_test.rb +316 -0
  180. data/test/functional/taverna_player/service_credentials_controller_test.rb +99 -0
  181. data/test/taverna_player_test.rb +25 -0
  182. data/test/test_helper.rb +33 -0
  183. data/test/unit/helpers/taverna_player/application_helper_test.rb +70 -0
  184. data/test/unit/helpers/taverna_player/runs_helper_test.rb +45 -0
  185. data/test/unit/taverna_player/interaction_test.rb +47 -0
  186. data/test/unit/taverna_player/run_port_test.rb +309 -0
  187. data/test/unit/taverna_player/run_test.rb +196 -0
  188. data/test/unit/taverna_player/service_credential_test.rb +64 -0
  189. data/test/workflows/hello.t2flow +164 -0
  190. data/test/workflows/list_with_errors.t2flow +107 -0
  191. data/test/workflows/pass_through.t2flow +12 -0
  192. metadata +539 -0
@@ -0,0 +1,196 @@
1
+ #------------------------------------------------------------------------------
2
+ # Copyright (c) 2013 The University of Manchester, UK.
3
+ #
4
+ # BSD Licenced. See LICENCE.rdoc for details.
5
+ #
6
+ # Taverna Player was developed in the BioVeL project, funded by the European
7
+ # Commission 7th Framework Programme (FP7), through grant agreement
8
+ # number 283359.
9
+ #
10
+ # Author: Robert Haines
11
+ #------------------------------------------------------------------------------
12
+
13
+ require 'test_helper'
14
+
15
+ module TavernaPlayer
16
+ class RunTest < ActiveSupport::TestCase
17
+ test "should not save run with an illegal state" do
18
+ run = Run.new
19
+ run.workflow = workflows(:one)
20
+ run.state = :not_a_state
21
+ assert !run.save, "Saved the run with an illegal state"
22
+ end
23
+
24
+ test "should not save run with no workflow" do
25
+ run = Run.new
26
+ run.state = :pending
27
+ assert !run.save, "Saved the run without a workflow id"
28
+ end
29
+
30
+ test "should not be able to set state to cancelled if run not stopped" do
31
+ run = Run.new
32
+ run.state = :cancelled
33
+ assert_not_equal :cancelled, run.state, "The run status was set to "\
34
+ "cancelled without being marked as stopped first. See the note in "\
35
+ "the run model file for why this is not allowed."
36
+ end
37
+
38
+ test "should not save run with cancelled state if not marked as stopped" do
39
+ run = Run.new
40
+ run.workflow = workflows(:one)
41
+ run.saved_state = "cancelled"
42
+ run.stop = false
43
+ refute run.save, "Saved run with cancelled state when not stopped first"
44
+ end
45
+
46
+ test "should cancel run if run set to stop first" do
47
+ run = Run.new
48
+ run.workflow = workflows(:one)
49
+ refute run.stop, "Run's stop flag was set upon creation"
50
+ run.cancel
51
+ run.state = :cancelled
52
+ assert run.cancelled?, "Run was not cancelled"
53
+ assert run.complete?, "Run not showing as complete when cancelled"
54
+ assert_equal :cancelled, run.state, "Run's state was not cancelled"
55
+ end
56
+
57
+ test "should not be able to set state to cancelling directly" do
58
+ run = Run.new
59
+ run.workflow = workflows(:one)
60
+ assert run.save, "Could not save run initially"
61
+
62
+ run.state = :cancelling
63
+ refute run.save, "Saved the run with the cancelling state."
64
+ end
65
+
66
+ test "should be in cancelling state after being cancelled" do
67
+ run = Run.new
68
+ run.workflow = workflows(:one)
69
+ run.state = :running
70
+ assert run.save, "Could not save run initially."
71
+ run.delayed_job_id = nil # Remove delayed job to pretend it is running.
72
+ assert_equal :running, run.state, "Run is not in running state."
73
+
74
+ run.cancel
75
+ assert run.stop, "Run was not stopped."
76
+ assert run.cancelling?, "Run did not move into cancelling state"
77
+ end
78
+
79
+ test "should create run with a default name" do
80
+ run = Run.new
81
+ assert_not_nil run.name, "Default run name is not set."
82
+ assert_not_equal "", run.name, "Default run name is blank ('')."
83
+ assert_equal "None", run.name, "Default run name is not 'None'."
84
+ end
85
+
86
+ test "should not save run with nil name" do
87
+ run = Run.new
88
+ run.name = nil
89
+ refute run.save, "Saved the run with a nil name."
90
+ end
91
+
92
+ test "should not save run with an empty name" do
93
+ run = Run.new
94
+ run.name = ""
95
+ refute run.save, "Saved the run with an empty name."
96
+ end
97
+
98
+ test "complete run states" do
99
+ refute taverna_player_runs(:one).complete?, "Run not complete"
100
+ refute taverna_player_runs(:two).complete?, "Run not complete"
101
+ assert taverna_player_runs(:three).complete?, "Run is complete"
102
+ refute taverna_player_runs(:four).complete?, "Run not complete"
103
+ refute taverna_player_runs(:five).complete?, "Run not complete"
104
+ assert taverna_player_runs(:six).complete?, "Run is complete"
105
+ end
106
+
107
+ test "a parent cannot be younger than its child" do
108
+ older = Run.create(:workflow_id => 1)
109
+ young = Run.create(:workflow_id => 1)
110
+ older.parent = young
111
+ refute older.save, "Run saved with a younger parent"
112
+ end
113
+
114
+ test "parent/child graph should be acyclic" do
115
+ parent = Run.create(:workflow_id => 1)
116
+ child = Run.create(:workflow_id => 1)
117
+ parent.children << child
118
+ parent.parent = child
119
+ refute parent.save, "Run saved with child as its parent"
120
+ end
121
+
122
+ test "finding root ancestor of a run" do
123
+ one = Run.create(:workflow_id => 1)
124
+ assert_same one, one.root_ancestor, "Single run is not its own root"
125
+ assert_equal 0, one.children.count, "Not a parent, should not have children"
126
+
127
+ two = Run.create(:workflow_id => 1)
128
+ assert_same two, two.root_ancestor, "Single run is not its own root"
129
+
130
+ two.parent = one
131
+ two.save
132
+ assert_same one, one.root_ancestor, "Parent run is not its own root"
133
+ assert_same one, two.root_ancestor, "Child run does not have parent as its root"
134
+ assert_equal 1, one.children.count, "Parent should have one child"
135
+
136
+ three = Run.create(:workflow_id => 1)
137
+ assert_same three, three.root_ancestor, "Single run is not its own root"
138
+
139
+ three.parent = two
140
+ three.save
141
+ assert_same one, one.root_ancestor, "Parent run is not its own root"
142
+ assert_same one, two.root_ancestor, "Child run does not have parent as its root"
143
+ assert_same one, three.root_ancestor, "Grandchild run does not have grandparent as its root"
144
+ assert_equal 1, two.children.count, "Parent should have one child"
145
+ assert_equal 1, one.children.count, "Grandparent should have one child"
146
+
147
+ four = Run.create(:workflow_id => 1)
148
+ assert_same four, four.root_ancestor, "Single run is not its own root"
149
+
150
+ four.parent = one
151
+ four.save
152
+ assert_same one, four.root_ancestor, "Child run does not have parent as its root"
153
+ assert_equal 2, one.children.count, "Parent should have two children"
154
+ end
155
+
156
+ test "create run from another run" do
157
+ assert_difference(["Run.count", "RunPort::Input.count"]) do
158
+ parent = taverna_player_runs(:three)
159
+ run = Run.create(:parent_id => parent.id)
160
+ assert run.valid?, "Run is invalid"
161
+ refute run.new_record?, "Run was not saved"
162
+ assert run.has_parent?, "Run should have a parent"
163
+ assert_equal 1, run.inputs.count, "Run should have 1 input"
164
+ refute_same parent.inputs.first, run.inputs.first, "Input was linked, not copied"
165
+ end
166
+ end
167
+
168
+ test "new run from another run" do
169
+ assert_difference(["Run.count", "RunPort::Input.count"]) do
170
+ parent = taverna_player_runs(:three)
171
+ run = Run.new(:parent_id => parent.id)
172
+ assert run.save, "Run was not saved"
173
+ assert run.has_parent?, "Run should have a parent"
174
+ assert_equal 1, run.inputs.count, "Run should have 1 input"
175
+ refute_same parent.inputs.first, run.inputs.first, "Input was linked, not copied"
176
+ end
177
+ end
178
+
179
+ test "killing parent should orphan child" do
180
+ parent = taverna_player_runs(:three)
181
+ run = Run.create(:parent_id => parent.id)
182
+ assert run.valid?, "Child run is invalid"
183
+ assert_not_nil run.parent_id, "Child run has no parent"
184
+
185
+ parent.state = :finished # Fake it.
186
+ parent.save
187
+ assert_difference(["Run.count", "RunPort::Input.count"], -1) do
188
+ parent.destroy
189
+ end
190
+
191
+ # Reload child state
192
+ run.reload
193
+ assert_nil run.parent_id, "Child run still has a parent"
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,64 @@
1
+ #------------------------------------------------------------------------------
2
+ # Copyright (c) 2013 The University of Manchester, UK.
3
+ #
4
+ # BSD Licenced. See LICENCE.rdoc for details.
5
+ #
6
+ # Taverna Player was developed in the BioVeL project, funded by the European
7
+ # Commission 7th Framework Programme (FP7), through grant agreement
8
+ # number 283359.
9
+ #
10
+ # Author: Robert Haines
11
+ #------------------------------------------------------------------------------
12
+
13
+ require 'test_helper'
14
+
15
+ module TavernaPlayer
16
+ class ServiceCredentialTest < ActiveSupport::TestCase
17
+ test "should not save credential without a uri" do
18
+ cred = ServiceCredential.new
19
+ cred.login = "test"
20
+ cred.password = "test"
21
+ cred.password_confirmation = "test"
22
+
23
+ refute cred.save, "Saved the credential without a URI"
24
+ end
25
+
26
+ test "should not save credential without a login" do
27
+ cred = ServiceCredential.new
28
+ cred.uri = "test"
29
+ cred.password = "test"
30
+ cred.password_confirmation = "test"
31
+
32
+ refute cred.save, "Saved the credential without a login"
33
+ end
34
+
35
+ test "should not save credential without a password" do
36
+ cred = ServiceCredential.new
37
+ cred.uri = "test"
38
+ cred.login = "test"
39
+ cred.password_confirmation = "test"
40
+
41
+ refute cred.save, "Saved the credential without a password"
42
+ end
43
+
44
+ test "should not save credential without a password confirmation" do
45
+ cred = ServiceCredential.new
46
+ cred.uri = "test"
47
+ cred.login = "test"
48
+ cred.password = "test"
49
+
50
+ refute cred.save, "Saved the credential without a password confirmation"
51
+ end
52
+
53
+ test "should not save credential without a confirmed password" do
54
+ cred = ServiceCredential.new
55
+ cred.uri = "test"
56
+ cred.login = "test"
57
+ cred.password = "test"
58
+ cred.password_confirmation = "TEST"
59
+
60
+ refute cred.save, "Saved the credential without a confirmed password"
61
+ end
62
+
63
+ end
64
+ end
@@ -0,0 +1,164 @@
1
+ <workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3.0"><dataflow id="a9108c6d-85ad-4fc3-9f53-6ef747c2f8ab" role="top"><name>Hello__World_</name><inputPorts /><outputPorts><port><name>Message</name><annotations><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
2
+ <annotationAssertions>
3
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
4
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.FreeTextDescription">
5
+ <text>A friendly message.</text>
6
+ </annotationBean>
7
+ <date>2012-03-14 15:13:31.514 GMT</date>
8
+ <creators />
9
+ <curationEventList />
10
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
11
+ </annotationAssertions>
12
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain></annotations></port></outputPorts><processors><processor><name>Hello</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
13
+ <annotationAssertions>
14
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
15
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.FreeTextDescription">
16
+ <text>A hard-coded value to output as the message.</text>
17
+ </annotationBean>
18
+ <date>2012-03-14 17:14:31.154 GMT</date>
19
+ <creators />
20
+ <curationEventList />
21
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
22
+ </annotationAssertions>
23
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain></annotations><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">
24
+ <value>Hello, World!</value>
25
+ </net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">
26
+ <maxJobs>1</maxJobs>
27
+ </net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">
28
+ <backoffFactor>1.0</backoffFactor>
29
+ <initialDelay>1000</initialDelay>
30
+ <maxDelay>5000</maxDelay>
31
+ <maxRetries>0</maxRetries>
32
+ </net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="dataflow"><port>Message</port></sink><source type="processor"><processor>Hello</processor><port>value</port></source></datalink></datalinks><annotations><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
33
+ <annotationAssertions>
34
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
35
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.FreeTextDescription">
36
+ <text>A simple workflow that just says "Hello, World!"</text>
37
+ </annotationBean>
38
+ <date>2012-02-29 16:37:51.43 GMT</date>
39
+ <creators />
40
+ <curationEventList />
41
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
42
+ </annotationAssertions>
43
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
44
+ <annotationAssertions>
45
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
46
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
47
+ <identification>1f0f1c4f-2aff-4918-8659-d0e6dfa6f0d3</identification>
48
+ </annotationBean>
49
+ <date>2012-03-14 13:53:52.624 GMT</date>
50
+ <creators />
51
+ <curationEventList />
52
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
53
+ </annotationAssertions>
54
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
55
+ <annotationAssertions>
56
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
57
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
58
+ <identification>b9556b39-8656-4a17-bf5c-37de30fe7df3</identification>
59
+ </annotationBean>
60
+ <date>2010-07-09 15:01:39.283 BST</date>
61
+ <creators />
62
+ <curationEventList />
63
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
64
+ </annotationAssertions>
65
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
66
+ <annotationAssertions>
67
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
68
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
69
+ <identification>7b430693-1b07-4fb3-a779-0718ac2d2fd5</identification>
70
+ </annotationBean>
71
+ <date>2012-02-29 16:44:22.750 GMT</date>
72
+ <creators />
73
+ <curationEventList />
74
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
75
+ </annotationAssertions>
76
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
77
+ <annotationAssertions>
78
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
79
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.Author">
80
+ <text>Robert Haines</text>
81
+ </annotationBean>
82
+ <date>2012-02-29 16:45:13.479 GMT</date>
83
+ <creators />
84
+ <curationEventList />
85
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
86
+ </annotationAssertions>
87
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
88
+ <annotationAssertions>
89
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
90
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
91
+ <identification>8e8d3bab-3125-423d-a6de-4e0e510b00cd</identification>
92
+ </annotationBean>
93
+ <date>2012-02-29 16:45:16.175 GMT</date>
94
+ <creators />
95
+ <curationEventList />
96
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
97
+ </annotationAssertions>
98
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
99
+ <annotationAssertions>
100
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
101
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.DescriptiveTitle">
102
+ <text>Hello, World!</text>
103
+ </annotationBean>
104
+ <date>2012-02-29 16:37:10.698 GMT</date>
105
+ <creators />
106
+ <curationEventList />
107
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
108
+ </annotationAssertions>
109
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
110
+ <annotationAssertions>
111
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
112
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
113
+ <identification>a9108c6d-85ad-4fc3-9f53-6ef747c2f8ab</identification>
114
+ </annotationBean>
115
+ <date>2012-03-14 17:14:37.989 GMT</date>
116
+ <creators />
117
+ <curationEventList />
118
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
119
+ </annotationAssertions>
120
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
121
+ <annotationAssertions>
122
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
123
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
124
+ <identification>0d4d84d5-23d7-437c-baf7-167fbb1ddfb1</identification>
125
+ </annotationBean>
126
+ <date>2012-03-14 14:03:09.577 GMT</date>
127
+ <creators />
128
+ <curationEventList />
129
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
130
+ </annotationAssertions>
131
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
132
+ <annotationAssertions>
133
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
134
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
135
+ <identification>3fb92eb6-fb45-41e0-9103-37a93b9e82a6</identification>
136
+ </annotationBean>
137
+ <date>2012-03-14 15:14:13.900 GMT</date>
138
+ <creators />
139
+ <curationEventList />
140
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
141
+ </annotationAssertions>
142
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
143
+ <annotationAssertions>
144
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
145
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
146
+ <identification>db4d63ef-b02e-426d-b5ef-3d62a33aac51</identification>
147
+ </annotationBean>
148
+ <date>2012-02-29 16:38:47.341 GMT</date>
149
+ <creators />
150
+ <curationEventList />
151
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
152
+ </annotationAssertions>
153
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
154
+ <annotationAssertions>
155
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
156
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
157
+ <identification>a2234413-7ae7-4380-8881-b79eb13a3c2a</identification>
158
+ </annotationBean>
159
+ <date>2012-03-14 15:13:36.473 GMT</date>
160
+ <creators />
161
+ <curationEventList />
162
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
163
+ </annotationAssertions>
164
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
@@ -0,0 +1,107 @@
1
+ <workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3.0"><dataflow id="dd8e0c1c-588f-4a11-a2c7-f0415625cd93" role="top"><name>Workflow11</name><inputPorts /><outputPorts><port><name>OUT</name><annotations /></port></outputPorts><processors><processor><name>Sometimes_Fails</name><inputPorts><port><name>in</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>localworker-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.localworker.LocalworkerActivity</class><inputMap><map from="in" to="in" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.localworker.LocalworkerActivityConfigurationBean xmlns="">
2
+ <inputs>
3
+ <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>
4
+ <name>in</name>
5
+ <depth>0</depth>
6
+ <mimeTypes>
7
+ <string>'text/plain'</string>
8
+ </mimeTypes>
9
+ <handledReferenceSchemes />
10
+ <translatedElementType>java.lang.String</translatedElementType>
11
+ <allowsLiteralValues>true</allowsLiteralValues>
12
+ </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>
13
+ </inputs>
14
+ <outputs>
15
+ <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>
16
+ <name>out</name>
17
+ <depth>0</depth>
18
+ <mimeTypes>
19
+ <string>'text/plain'</string>
20
+ </mimeTypes>
21
+ <granularDepth>0</granularDepth>
22
+ </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>
23
+ </outputs>
24
+ <classLoaderSharing>workflow</classLoaderSharing>
25
+ <localDependencies />
26
+ <artifactDependencies />
27
+ <script>import java.util.Random;
28
+
29
+ Random r = new Random();
30
+
31
+ if ((r.nextInt() % 4) == 0) {
32
+ throw new RuntimeException("Fails every four runs!");
33
+ }
34
+
35
+ out = in;</script>
36
+ <dependencies />
37
+ <localworkerName>org.embl.ebi.escience.scuflworkers.java.TestSometimesFails</localworkerName>
38
+ </net.sf.taverna.t2.activities.localworker.LocalworkerActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">
39
+ <maxJobs>1</maxJobs>
40
+ </net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">
41
+ <backoffFactor>1.0</backoffFactor>
42
+ <initialDelay>1000</initialDelay>
43
+ <maxDelay>5000</maxDelay>
44
+ <maxRetries>0</maxRetries>
45
+ </net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>Create_Lots_Of_Strings</name><inputPorts /><outputPorts><port><name>strings</name><depth>1</depth><granularDepth>1</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>localworker-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.localworker.LocalworkerActivity</class><inputMap /><outputMap><map from="strings" to="strings" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.localworker.LocalworkerActivityConfigurationBean xmlns="">
46
+ <inputs />
47
+ <outputs>
48
+ <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>
49
+ <name>strings</name>
50
+ <depth>1</depth>
51
+ <mimeTypes>
52
+ <string>l('text/plain')</string>
53
+ </mimeTypes>
54
+ <granularDepth>1</granularDepth>
55
+ </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>
56
+ </outputs>
57
+ <classLoaderSharing>workflow</classLoaderSharing>
58
+ <localDependencies />
59
+ <artifactDependencies />
60
+ <script>List strings = new ArrayList();
61
+ for (int i = 0; i &lt; 40; i++) {
62
+ strings.add("String" + i);
63
+ }
64
+ </script>
65
+ <dependencies />
66
+ <localworkerName>org.embl.ebi.escience.scuflworkers.java.EmitLotsOfStrings</localworkerName>
67
+ </net.sf.taverna.t2.activities.localworker.LocalworkerActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">
68
+ <maxJobs>1</maxJobs>
69
+ </net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">
70
+ <backoffFactor>1.0</backoffFactor>
71
+ <initialDelay>1000</initialDelay>
72
+ <maxDelay>5000</maxDelay>
73
+ <maxRetries>0</maxRetries>
74
+ </net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="processor"><processor>Sometimes_Fails</processor><port>in</port></sink><source type="processor"><processor>Create_Lots_Of_Strings</processor><port>strings</port></source></datalink><datalink><sink type="dataflow"><port>OUT</port></sink><source type="processor"><processor>Sometimes_Fails</processor><port>out</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
75
+ <annotationAssertions>
76
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
77
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
78
+ <identification>dd8e0c1c-588f-4a11-a2c7-f0415625cd93</identification>
79
+ </annotationBean>
80
+ <date>2011-08-11 17:56:40.226 BST</date>
81
+ <creators />
82
+ <curationEventList />
83
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
84
+ </annotationAssertions>
85
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
86
+ <annotationAssertions>
87
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
88
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
89
+ <identification>22d97b56-800c-4a76-b3ec-c9e26298cda6</identification>
90
+ </annotationBean>
91
+ <date>2011-08-01 14:43:36.713 BST</date>
92
+ <creators />
93
+ <curationEventList />
94
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
95
+ </annotationAssertions>
96
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">
97
+ <annotationAssertions>
98
+ <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
99
+ <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">
100
+ <identification>e365424c-f8a1-4ddf-9d00-b7a5e4733c10</identification>
101
+ </annotationBean>
102
+ <date>2011-08-01 14:43:11.545 BST</date>
103
+ <creators />
104
+ <curationEventList />
105
+ </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>
106
+ </annotationAssertions>
107
+ </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>