taverna-player 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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>