PageRenderTime 60ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/libgebr/geoxml/flow.c

https://code.google.com/p/gebr/
C | 1259 lines | 976 code | 237 blank | 46 comment | 167 complexity | 8b45f36c2b483e178e055d7048e50d2d MD5 | raw file
Possible License(s): LGPL-2.1, GPL-2.0
  1. /* libgebr - GeBR Library
  2. * Copyright (C) 2007-2009 GeBR core team (http://www.gebrproject.com/)
  3. *
  4. * This program is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation, either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. #ifdef HAVE_CONFIG_H
  18. # include <config.h>
  19. #endif
  20. #include "../libgebr-gettext.h"
  21. #include <regex.h>
  22. #include <gdome.h>
  23. #include <string.h>
  24. #include <stdio.h>
  25. #include <glib/gi18n-lib.h>
  26. #include <stdlib.h>
  27. #include "../date.h"
  28. #include "document.h"
  29. #include "document_p.h"
  30. #include "error.h"
  31. #include "flow.h"
  32. #include "object.h"
  33. #include "parameter.h"
  34. #include "parameter_group.h"
  35. #include "parameters.h"
  36. #include "parameters_p.h"
  37. #include "program-parameter.h"
  38. #include "program.h"
  39. #include "sequence.h"
  40. #include "types.h"
  41. #include "value_sequence.h"
  42. #include "xml.h"
  43. /*
  44. * internal structures and functions
  45. */
  46. struct gebr_geoxml_flow {
  47. GebrGeoXmlDocument *document;
  48. };
  49. struct gebr_geoxml_category {
  50. GdomeElement *element;
  51. };
  52. struct gebr_geoxml_revision {
  53. GdomeElement *element;
  54. };
  55. /*
  56. * internal
  57. */
  58. static void
  59. set_flow_tag_property(GebrGeoXmlFlow *flow,
  60. const gchar *tag_element,
  61. const gchar *tag_name,
  62. const gchar *tag_value)
  63. {
  64. GdomeElement *root;
  65. GdomeElement *element;
  66. g_return_if_fail (flow != NULL);
  67. g_return_if_fail (tag_value != NULL);
  68. g_return_if_fail (tag_name != NULL);
  69. g_return_if_fail (tag_element != NULL);
  70. root = gebr_geoxml_document_root_element(GEBR_GEOXML_DOC(flow));
  71. element = __gebr_geoxml_get_first_element(root, tag_element);
  72. __gebr_geoxml_set_tag_value(element, tag_name, tag_value, __gebr_geoxml_create_TextNode);
  73. gdome_el_unref(root, &exception);
  74. gdome_el_unref(element, &exception);
  75. }
  76. static gchar *
  77. get_flow_tag_property(GebrGeoXmlFlow *flow,
  78. const gchar *tag_element,
  79. const gchar *tag_name)
  80. {
  81. gchar *prop_value;
  82. GdomeElement *root;
  83. GdomeElement *element;
  84. g_return_val_if_fail(flow != NULL, NULL);
  85. root = gebr_geoxml_document_root_element(GEBR_GEOXML_DOC(flow));
  86. element = __gebr_geoxml_get_first_element(root, tag_element);
  87. prop_value = __gebr_geoxml_get_tag_value(element, tag_name);
  88. gdome_el_unref(root, &exception);
  89. gdome_el_unref(element, &exception);
  90. return prop_value;
  91. }
  92. static void
  93. set_flow_attr_property(GebrGeoXmlFlow *flow,
  94. const gchar *tag_element,
  95. const gchar *tag_name,
  96. const gchar *tag_value)
  97. {
  98. GdomeElement *root;
  99. GdomeElement *element;
  100. g_return_if_fail (flow != NULL);
  101. g_return_if_fail (tag_value != NULL);
  102. g_return_if_fail (tag_name != NULL);
  103. g_return_if_fail (tag_element != NULL);
  104. root = gebr_geoxml_document_root_element(GEBR_GEOXML_DOC(flow));
  105. element = __gebr_geoxml_get_first_element(root, tag_element);
  106. __gebr_geoxml_set_attr_value(element, tag_name, tag_value);
  107. gdome_el_unref(root, &exception);
  108. gdome_el_unref(element, &exception);
  109. }
  110. static gchar *
  111. get_flow_attr_property(GebrGeoXmlFlow *flow,
  112. const gchar *tag_element,
  113. const gchar *tag_name)
  114. {
  115. gchar *prop_value;
  116. GdomeElement *root;
  117. GdomeElement *element;
  118. g_return_val_if_fail(flow != NULL, NULL);
  119. root = gebr_geoxml_document_root_element(GEBR_GEOXML_DOC(flow));
  120. element = __gebr_geoxml_get_first_element(root, tag_element);
  121. prop_value = __gebr_geoxml_get_attr_value((GdomeElement *) element, tag_name);
  122. gdome_el_unref(root, &exception);
  123. gdome_el_unref(element, &exception);
  124. return prop_value;
  125. }
  126. /*
  127. * library functions.
  128. */
  129. GebrGeoXmlFlow *gebr_geoxml_flow_new()
  130. {
  131. GebrGeoXmlDocument *document;
  132. GdomeElement *io;
  133. GdomeElement *root;
  134. GdomeElement *server;
  135. document = gebr_geoxml_document_new("flow", GEBR_GEOXML_FLOW_VERSION);
  136. root = gebr_geoxml_document_root_element(document);
  137. server = __gebr_geoxml_insert_new_element(root, "server", NULL);
  138. __gebr_geoxml_set_attr_value (server, "group-type", "group");
  139. __gebr_geoxml_set_attr_value (server, "group-name", "");
  140. io = __gebr_geoxml_insert_new_element(server, "io", NULL);
  141. gdome_el_unref(__gebr_geoxml_insert_new_element(io, "input", NULL), &exception);
  142. gdome_el_unref(__gebr_geoxml_insert_new_element(io, "output", NULL), &exception);
  143. gdome_el_unref(__gebr_geoxml_insert_new_element(io, "error", NULL), &exception);
  144. gdome_el_unref(__gebr_geoxml_insert_new_element(server, "lastrun", NULL), &exception);
  145. GdomeElement *date = __gebr_geoxml_get_first_element(root, "date");
  146. gdome_el_unref(__gebr_geoxml_insert_new_element(date, "lastrun", NULL), &exception);
  147. gdome_el_unref(server, &exception);
  148. gdome_el_unref(date, &exception);
  149. gdome_el_unref(root, &exception);
  150. gdome_el_unref(io, &exception);
  151. return GEBR_GEOXML_FLOW(document);
  152. }
  153. void gebr_geoxml_flow_add_flow(GebrGeoXmlFlow * flow, GebrGeoXmlFlow * flow2)
  154. {
  155. GebrGeoXmlSequence *category;
  156. GdomeNodeList *flow2_node_list;
  157. GdomeDOMString *string;
  158. gulong i, n;
  159. gboolean has_control1, has_control2;
  160. g_return_if_fail (flow != NULL);
  161. g_return_if_fail (flow2 != NULL);
  162. has_control1 = gebr_geoxml_flow_has_control_program (flow);
  163. has_control2 = gebr_geoxml_flow_has_control_program (flow2);
  164. /* import each program from flow2 */
  165. GdomeElement *root = gebr_geoxml_document_root_element(GEBR_GEOXML_DOC(flow2));
  166. string = gdome_str_mkref("program");
  167. flow2_node_list =
  168. gdome_el_getElementsByTagName(root, string,
  169. &exception);
  170. n = gdome_nl_length(flow2_node_list, &exception);
  171. gdome_el_unref(root, &exception);
  172. for (i = 0; i < n; ++i) {
  173. GdomeNode *node;
  174. GdomeNode *new_node;
  175. GdomeElement *revision;
  176. GdomeElement *root_element;
  177. node = gdome_nl_item(flow2_node_list, i, &exception);
  178. new_node = gdome_doc_importNode((GdomeDocument *) flow, node, TRUE, &exception);
  179. root_element = gebr_geoxml_document_root_element(GEBR_GEOXML_DOC(flow));
  180. revision = __gebr_geoxml_get_first_element(root_element, "revision");
  181. gdome_n_unref(gdome_el_insertBefore_protected(root_element, new_node, (GdomeNode *)revision, &exception), &exception);
  182. gdome_n_unref(node, &exception);
  183. gdome_n_unref(new_node, &exception);
  184. gdome_el_unref(revision, &exception);
  185. gdome_el_unref(root_element, &exception);
  186. }
  187. gebr_geoxml_flow_get_category (flow2, &category, 0);
  188. while (category) {
  189. gchar *name;
  190. name = gebr_geoxml_value_sequence_get (GEBR_GEOXML_VALUE_SEQUENCE (category));
  191. gebr_geoxml_object_unref(gebr_geoxml_flow_append_category (flow, name));
  192. gebr_geoxml_sequence_next (&category);
  193. g_free(name);
  194. }
  195. // We are adding a control menu into flow.
  196. // Append the `iter' dictionary keyword.
  197. if (!has_control1 && has_control2)
  198. {
  199. GebrGeoXmlProgram * loop = gebr_geoxml_flow_get_control_program(flow2);
  200. GebrGeoXmlProgramStatus status = gebr_geoxml_program_get_status(loop);
  201. if (status != GEBR_GEOXML_PROGRAM_STATUS_DISABLED)
  202. gebr_geoxml_flow_insert_iter_dict (flow);
  203. gebr_geoxml_object_unref(loop);
  204. }
  205. gdome_str_unref(string);
  206. gdome_nl_unref(flow2_node_list, &exception);
  207. }
  208. void gebr_geoxml_flow_foreach_parameter(GebrGeoXmlFlow * flow, GebrGeoXmlCallback callback, gpointer user_data)
  209. {
  210. if (flow == NULL)
  211. return;
  212. GebrGeoXmlSequence *program;
  213. gebr_geoxml_flow_get_program(flow, &program, 0);
  214. for (; program != NULL; gebr_geoxml_sequence_next(&program))
  215. gebr_geoxml_program_foreach_parameter(GEBR_GEOXML_PROGRAM(program), callback, user_data);
  216. }
  217. void gebr_geoxml_flow_set_date_last_run(GebrGeoXmlFlow * flow, const gchar * last_run)
  218. {
  219. set_flow_tag_property(flow, "date", "lastrun", last_run);
  220. }
  221. gchar *gebr_geoxml_flow_get_date_last_run(GebrGeoXmlFlow * flow)
  222. {
  223. return get_flow_tag_property(flow, "date", "lastrun");
  224. }
  225. void
  226. gebr_geoxml_flow_server_set_group(GebrGeoXmlFlow *flow,
  227. const gchar *type,
  228. const gchar *name)
  229. {
  230. set_flow_attr_property(flow, "server", "group-type", type);
  231. set_flow_attr_property(flow, "server", "group-name", name);
  232. }
  233. void
  234. gebr_geoxml_flow_server_get_group(GebrGeoXmlFlow *flow,
  235. gchar **type,
  236. gchar **name)
  237. {
  238. if (type)
  239. *type = get_flow_attr_property(flow, "server", "group-type");
  240. if (name)
  241. *name = get_flow_attr_property(flow, "server", "group-name");
  242. }
  243. void gebr_geoxml_flow_server_set_date_last_run(GebrGeoXmlFlow *flow, const gchar * date)
  244. {
  245. set_flow_tag_property(flow, "server", "lastrun", date);
  246. }
  247. gchar *gebr_geoxml_flow_server_get_date_last_run(GebrGeoXmlFlow *flow)
  248. {
  249. return get_flow_tag_property(flow, "server", "lastrun");
  250. }
  251. void gebr_geoxml_flow_io_set_input(GebrGeoXmlFlow *flow, const gchar *input)
  252. {
  253. set_flow_tag_property(flow, "io", "input", input);
  254. }
  255. void gebr_geoxml_flow_io_set_output(GebrGeoXmlFlow *flow, const gchar *output)
  256. {
  257. set_flow_tag_property(flow, "io", "output", output);
  258. }
  259. void gebr_geoxml_flow_io_set_error(GebrGeoXmlFlow *flow, const gchar *error)
  260. {
  261. set_flow_tag_property(flow, "io", "error", error);
  262. }
  263. gchar *gebr_geoxml_flow_io_get_input(GebrGeoXmlFlow *flow)
  264. {
  265. return get_flow_tag_property(flow, "io", "input");
  266. }
  267. gchar *gebr_geoxml_flow_io_get_output(GebrGeoXmlFlow * flow)
  268. {
  269. return get_flow_tag_property(flow, "io", "output");
  270. }
  271. gchar *gebr_geoxml_flow_io_get_error(GebrGeoXmlFlow * flow)
  272. {
  273. return get_flow_tag_property(flow, "io", "error");
  274. }
  275. GebrGeoXmlProgram *gebr_geoxml_flow_append_program(GebrGeoXmlFlow * flow)
  276. {
  277. GdomeElement *element;
  278. GdomeElement *root;
  279. GdomeElement *first_el;
  280. root = gebr_geoxml_document_root_element(GEBR_GEOXML_DOC(flow));
  281. first_el = __gebr_geoxml_get_first_element(root, "revision");
  282. element = __gebr_geoxml_insert_new_element(root, "program", first_el);
  283. /* elements/attibutes */
  284. gebr_geoxml_program_set_stdin((GebrGeoXmlProgram *) element, FALSE);
  285. gebr_geoxml_program_set_stdout((GebrGeoXmlProgram *) element, FALSE);
  286. gebr_geoxml_program_set_stderr((GebrGeoXmlProgram *) element, FALSE);
  287. gebr_geoxml_program_set_status((GebrGeoXmlProgram *) element, GEBR_GEOXML_PROGRAM_STATUS_UNCONFIGURED);
  288. gdome_el_unref(__gebr_geoxml_insert_new_element(element, "title", NULL), &exception);
  289. gdome_el_unref(__gebr_geoxml_insert_new_element(element, "binary", NULL), &exception);
  290. gdome_el_unref(__gebr_geoxml_insert_new_element(element, "description", NULL), &exception);
  291. gdome_el_unref(__gebr_geoxml_insert_new_element(element, "help", NULL), &exception);
  292. gdome_el_unref(__gebr_geoxml_insert_new_element(element, "url", NULL), &exception);
  293. gebr_geoxml_object_unref(__gebr_geoxml_parameters_append_new(element));
  294. gdome_el_unref(root, &exception);
  295. gdome_el_unref(first_el, &exception);
  296. return (GebrGeoXmlProgram *) element;
  297. }
  298. int gebr_geoxml_flow_get_program(GebrGeoXmlFlow * flow, GebrGeoXmlSequence ** program, gulong index)
  299. {
  300. GdomeElement *root;
  301. if (flow == NULL) {
  302. *program = NULL;
  303. return GEBR_GEOXML_RETV_NULL_PTR;
  304. }
  305. root = gebr_geoxml_document_root_element(GEBR_GEOXML_DOC(flow));
  306. *program = (GebrGeoXmlSequence *) __gebr_geoxml_get_element_at(root, "program", index, FALSE);
  307. gdome_el_unref(root, &exception);
  308. return (*program == NULL)
  309. ? GEBR_GEOXML_RETV_INVALID_INDEX : GEBR_GEOXML_RETV_SUCCESS;
  310. }
  311. glong gebr_geoxml_flow_get_programs_number(GebrGeoXmlFlow * flow)
  312. {
  313. if (flow == NULL)
  314. return -1;
  315. GdomeElement *root = gebr_geoxml_document_root_element(GEBR_GEOXML_DOC(flow));
  316. gulong retval = __gebr_geoxml_get_elements_number(root, "program");
  317. gdome_el_unref(root, &exception);
  318. return retval;
  319. }
  320. GebrGeoXmlProgram *gebr_geoxml_flow_get_first_mpi_program(GebrGeoXmlFlow * flow)
  321. {
  322. if (flow == NULL)
  323. return NULL;
  324. GebrGeoXmlSequence *program;
  325. gebr_geoxml_flow_get_program(flow, &program, 0);
  326. for (; program != NULL; gebr_geoxml_sequence_next(&program))
  327. if (strlen(gebr_geoxml_program_get_mpi(GEBR_GEOXML_PROGRAM(program))))
  328. return GEBR_GEOXML_PROGRAM(program);
  329. return NULL;
  330. }
  331. GebrGeoXmlCategory *gebr_geoxml_flow_append_category(GebrGeoXmlFlow * flow, const gchar * name)
  332. {
  333. GebrGeoXmlCategory *category;
  334. GebrGeoXmlSequence *sequence;
  335. g_return_val_if_fail (flow != NULL, NULL);
  336. g_return_val_if_fail (name != NULL, NULL);
  337. gebr_geoxml_flow_get_category (flow, &sequence, 0);
  338. while (sequence) {
  339. const gchar *catname;
  340. catname = gebr_geoxml_value_sequence_get (GEBR_GEOXML_VALUE_SEQUENCE (sequence));
  341. if (strcmp (catname, name) == 0)
  342. return (GebrGeoXmlCategory *)(sequence);
  343. gebr_geoxml_sequence_next (&sequence);
  344. }
  345. GdomeElement *root = gebr_geoxml_document_root_element(GEBR_GEOXML_DOC(flow));
  346. GdomeElement *element = __gebr_geoxml_get_first_element(root, "server");
  347. category = (GebrGeoXmlCategory *)__gebr_geoxml_insert_new_element(root, "category", element);
  348. gebr_geoxml_value_sequence_set(GEBR_GEOXML_VALUE_SEQUENCE(category), name);
  349. gdome_el_unref(root, &exception);
  350. gdome_el_unref(element, &exception);
  351. return category;
  352. }
  353. int gebr_geoxml_flow_get_category(GebrGeoXmlFlow * flow, GebrGeoXmlSequence ** category, gulong index)
  354. {
  355. if (flow == NULL) {
  356. *category = NULL;
  357. return GEBR_GEOXML_RETV_NULL_PTR;
  358. }
  359. GdomeElement *root = gebr_geoxml_document_root_element(GEBR_GEOXML_DOC(flow));
  360. *category = (GebrGeoXmlSequence *)__gebr_geoxml_get_element_at(root, "category", index, FALSE);
  361. gdome_el_unref(root, &exception);
  362. return (*category == NULL)
  363. ? GEBR_GEOXML_RETV_INVALID_INDEX : GEBR_GEOXML_RETV_SUCCESS;
  364. }
  365. glong
  366. gebr_geoxml_flow_get_categories_number(GebrGeoXmlFlow * flow)
  367. {
  368. if (flow == NULL)
  369. return -1;
  370. gulong retval = 0;
  371. GdomeElement * root = gebr_geoxml_document_root_element(GEBR_GEOXML_DOC(flow));
  372. retval = __gebr_geoxml_get_elements_number(root, "category");
  373. gdome_el_unref(root, &exception);
  374. return retval;
  375. }
  376. gboolean gebr_geoxml_flow_change_to_revision(GebrGeoXmlFlow * flow, GebrGeoXmlRevision * revision, gboolean * report_merged)
  377. {
  378. if (flow == NULL || revision == NULL)
  379. return FALSE;
  380. GString *merged_help;
  381. gchar *revision_help;
  382. gchar *flow_help;
  383. GebrGeoXmlDocument *revision_flow;
  384. GebrGeoXmlSequence *first_revision;
  385. GdomeElement *child;
  386. if(report_merged)
  387. *report_merged = FALSE;
  388. /* load document validating it */
  389. if (gebr_geoxml_document_load_buffer(&revision_flow,
  390. __gebr_geoxml_get_element_value((GdomeElement *) revision)))
  391. return FALSE;
  392. flow_help = gebr_geoxml_document_get_help (GEBR_GEOXML_DOCUMENT (flow));
  393. revision_help = gebr_geoxml_document_get_help (revision_flow);
  394. merged_help = g_string_new (flow_help);
  395. if (strlen (revision_help) > 1) {
  396. gchar *revision_xml;
  397. regex_t regexp;
  398. regmatch_t matchptr[2];
  399. gssize start = -1;
  400. gssize length = -1;
  401. gssize flow_i = -1;
  402. regcomp(&regexp, "<body[^>]*>\\(.*\\?\\)<\\/body>", REG_ICASE);
  403. if (!regexec(&regexp, revision_help, 2, matchptr, 0)) {
  404. start = matchptr[1].rm_so;
  405. length = matchptr[1].rm_eo - matchptr[1].rm_so;
  406. }
  407. regcomp (&regexp, "</body>", REG_NEWLINE | REG_ICASE);
  408. if (!regexec (&regexp, flow_help, 1, matchptr, 0)) {
  409. flow_i = matchptr[0].rm_so;
  410. }
  411. if (start != -1 && length != -1 && flow_i != -1){
  412. gchar * date = NULL;
  413. gchar * comment = NULL;
  414. GString * revision_data;
  415. revision_data = g_string_new(NULL);
  416. gebr_geoxml_flow_get_revision_data(revision, NULL, &date, &comment);
  417. g_string_append_printf (revision_data, "<hr /><p>%s</p><p>%s</p>",
  418. comment, date);
  419. g_string_insert (merged_help, flow_i, revision_data->str);
  420. g_string_insert_len (merged_help, flow_i + revision_data->len, revision_help + start, length);
  421. }
  422. gebr_geoxml_document_set_help (revision_flow, "");
  423. gebr_geoxml_document_to_string (revision_flow, &revision_xml);
  424. __gebr_geoxml_set_element_value((GdomeElement *) revision, revision_xml, __gebr_geoxml_create_CDATASection);
  425. g_free (revision_xml);
  426. if(report_merged)
  427. *report_merged = TRUE;
  428. }
  429. g_free(flow_help);
  430. g_free(revision_help);
  431. gebr_geoxml_flow_get_revision(flow, &first_revision, 0);
  432. /* remove all elements till first_revision
  433. * WARNING: for this implementation to work revision must be
  434. * the last child of flow. Be careful when changing the DTD!
  435. */
  436. child = __gebr_geoxml_get_first_element(gebr_geoxml_document_root_element(GEBR_GEOXML_DOCUMENT(flow)), "*");
  437. while (child != NULL) {
  438. GdomeElement *aux;
  439. if (child == (GdomeElement *) first_revision)
  440. break;
  441. aux = __gebr_geoxml_next_element(child);
  442. gdome_el_removeChild(gebr_geoxml_document_root_element(GEBR_GEOXML_DOCUMENT(flow)),
  443. (GdomeNode *) child, &exception);
  444. child = aux;
  445. }
  446. /* add all revision elements */
  447. child = __gebr_geoxml_get_first_element(gebr_geoxml_document_root_element(GEBR_GEOXML_DOCUMENT(revision_flow)),
  448. "*");
  449. for (; child != NULL; child = __gebr_geoxml_next_element(child)) {
  450. GdomeNode *new_node;
  451. new_node = gdome_doc_importNode((GdomeDocument *) flow, (GdomeNode *) child, TRUE, &exception);
  452. gdome_el_insertBefore_protected(gebr_geoxml_document_root_element(GEBR_GEOXML_DOCUMENT(flow)),
  453. (GdomeNode *) new_node, (GdomeNode *) first_revision, &exception);
  454. }
  455. gebr_geoxml_document_set_help (GEBR_GEOXML_DOCUMENT (flow), merged_help->str);
  456. g_string_free (merged_help, TRUE);
  457. return TRUE;
  458. }
  459. GebrGeoXmlRevision *
  460. gebr_geoxml_flow_append_revision(GebrGeoXmlFlow * flow,
  461. const gchar * comment)
  462. {
  463. GebrGeoXmlRevision *revision;
  464. GebrGeoXmlSequence *seq;
  465. GebrGeoXmlFlow *revision_flow;
  466. g_return_val_if_fail(flow != NULL, NULL);
  467. g_return_val_if_fail(comment != NULL, NULL);
  468. revision_flow = GEBR_GEOXML_FLOW(gebr_geoxml_document_clone(GEBR_GEOXML_DOCUMENT(flow)));
  469. gebr_geoxml_document_set_help (GEBR_GEOXML_DOCUMENT (revision_flow), "");
  470. GdomeElement * revision_root = gebr_geoxml_document_root_element(GEBR_GEOXML_DOCUMENT(revision_flow));
  471. /* remove revisions from the revision flow. */
  472. gebr_geoxml_flow_get_revision(revision_flow, &seq, 0);
  473. while (seq)
  474. {
  475. GebrGeoXmlSequence *aux = seq;
  476. gebr_geoxml_object_ref(aux);
  477. gebr_geoxml_sequence_next(&seq);
  478. gebr_geoxml_sequence_remove(aux);
  479. }
  480. gebr_geoxml_object_unref(revision_root);
  481. /* save to xml and free */
  482. gchar *revision_xml;
  483. gebr_geoxml_document_to_string(GEBR_GEOXML_DOCUMENT(revision_flow), &revision_xml);
  484. gebr_geoxml_document_free(GEBR_GEOXML_DOCUMENT(revision_flow));
  485. GebrGeoXmlSequence *first_revision;
  486. gebr_geoxml_flow_get_revision(flow, &first_revision, 0);
  487. GdomeElement * root = gebr_geoxml_document_root_element(GEBR_GEOXML_DOCUMENT(flow));
  488. revision = (GebrGeoXmlRevision *) __gebr_geoxml_insert_new_element(root, "revision", (GdomeElement *) first_revision);
  489. gebr_geoxml_object_unref(root);
  490. gebr_geoxml_object_unref(first_revision);
  491. gebr_geoxml_flow_set_revision_data(revision, revision_xml, gebr_iso_date(), comment);
  492. g_free(revision_xml);
  493. return revision;
  494. }
  495. void gebr_geoxml_flow_set_revision_data(GebrGeoXmlRevision * revision, const gchar * flow, const gchar * date, const gchar * comment)
  496. {
  497. g_return_if_fail(revision != NULL);
  498. if (flow != NULL)
  499. __gebr_geoxml_set_element_value((GdomeElement *) revision, flow, __gebr_geoxml_create_CDATASection);
  500. if (date != NULL)
  501. __gebr_geoxml_set_attr_value((GdomeElement *) revision, "date", date);
  502. if (comment != NULL)
  503. __gebr_geoxml_set_attr_value((GdomeElement *) revision, "comment", comment);
  504. }
  505. enum GEBR_GEOXML_RETV
  506. gebr_geoxml_flow_get_revision(GebrGeoXmlFlow * flow,
  507. GebrGeoXmlSequence ** revision,
  508. gulong index)
  509. {
  510. enum GEBR_GEOXML_RETV retval = GEBR_GEOXML_RETV_SUCCESS;
  511. if (flow == NULL)
  512. {
  513. *revision = NULL;
  514. g_return_val_if_fail(flow != NULL, GEBR_GEOXML_RETV_NULL_PTR);
  515. }
  516. GdomeElement * root = gebr_geoxml_document_root_element(GEBR_GEOXML_DOCUMENT(flow));
  517. *revision = (GebrGeoXmlSequence *) __gebr_geoxml_get_element_at(root, "revision", index, FALSE);
  518. gebr_geoxml_object_unref(root);
  519. retval = (*revision == NULL) ? GEBR_GEOXML_RETV_INVALID_INDEX : GEBR_GEOXML_RETV_SUCCESS;
  520. return retval;
  521. }
  522. void gebr_geoxml_flow_get_revision_data(GebrGeoXmlRevision * revision, gchar ** flow, gchar ** date, gchar ** comment)
  523. {
  524. g_return_if_fail(revision != NULL);
  525. if (flow)
  526. *flow = __gebr_geoxml_get_element_value((GdomeElement *) revision);
  527. if (date) {
  528. gchar *date_attr = __gebr_geoxml_get_attr_value((GdomeElement *) revision, "date");
  529. *date = g_strdup(gebr_localized_date(date_attr));
  530. g_free(date_attr);
  531. }
  532. if (comment)
  533. *comment = __gebr_geoxml_get_attr_value((GdomeElement *) revision, "comment");
  534. }
  535. glong gebr_geoxml_flow_get_revisions_number(GebrGeoXmlFlow * flow)
  536. {
  537. if (flow == NULL)
  538. return -1;
  539. return __gebr_geoxml_get_elements_number(gebr_geoxml_document_root_element(GEBR_GEOXML_DOC(flow)), "revision");
  540. }
  541. gboolean
  542. gebr_geoxml_flow_validate(GebrGeoXmlFlow *flow,
  543. GebrValidator *validator,
  544. GError **err)
  545. {
  546. GebrGeoXmlSequence *seq;
  547. gboolean first = TRUE;
  548. gboolean previous_stdout = FALSE;
  549. GebrGeoXmlProgram *last_configured = NULL;
  550. const gchar *program_title;
  551. const gchar *flow_title = gebr_geoxml_document_get_title(GEBR_GEOXML_DOCUMENT(flow));
  552. /* Checking if flow has only the for loop */
  553. if (gebr_geoxml_flow_get_programs_number(flow) == 1
  554. && gebr_geoxml_flow_has_control_program(flow))
  555. {
  556. g_set_error(err, GEBR_GEOXML_FLOW_ERROR,
  557. GEBR_GEOXML_FLOW_ERROR_NO_VALID_PROGRAMS,
  558. _("No configured or enabled Programs found in Flow \"%s\"."),
  559. flow_title);
  560. return FALSE;
  561. }
  562. const gchar *input = gebr_geoxml_flow_io_get_input(flow);
  563. /* Checking if the flow has at least one configured program */
  564. gebr_geoxml_flow_get_program(flow, &seq, 0);
  565. for (; seq; gebr_geoxml_sequence_next(&seq))
  566. {
  567. GebrGeoXmlProgram *prog = GEBR_GEOXML_PROGRAM(seq);
  568. GebrGeoXmlProgramStatus status = gebr_geoxml_program_get_status(prog);
  569. if (last_configured)
  570. gebr_geoxml_object_unref(last_configured);
  571. last_configured = prog;
  572. gebr_geoxml_object_ref(last_configured);
  573. if (status != GEBR_GEOXML_PROGRAM_STATUS_CONFIGURED
  574. || gebr_geoxml_program_get_control(prog) == GEBR_GEOXML_PROGRAM_CONTROL_FOR)
  575. continue;
  576. program_title = gebr_geoxml_program_get_title(prog);
  577. if (first && gebr_geoxml_program_get_stdin(prog)) {
  578. if (!input || !*input) {
  579. g_set_error(err, GEBR_GEOXML_FLOW_ERROR,
  580. GEBR_GEOXML_FLOW_ERROR_NO_INFILE,
  581. _("No input file was specified for the Program "
  582. "\"%s\" in Flow \"%s\"."),
  583. program_title, flow_title);
  584. gebr_geoxml_object_unref(seq);
  585. gebr_geoxml_object_unref(last_configured);
  586. return FALSE;
  587. }
  588. if (!gebr_validator_validate_expr(validator, input,
  589. GEBR_GEOXML_PARAMETER_TYPE_STRING,
  590. NULL)) {
  591. g_set_error(err, GEBR_GEOXML_FLOW_ERROR,
  592. GEBR_GEOXML_FLOW_ERROR_INVALID_INFILE,
  593. _("Invalid input file specified for the Program "
  594. "\"%s\" in Flow \"%s\"."),
  595. program_title, flow_title);
  596. gebr_geoxml_object_unref(seq);
  597. gebr_geoxml_object_unref(last_configured);
  598. return FALSE;
  599. }
  600. } else {
  601. /* Convenience variable to check if two programs can connect with each other. */
  602. int chain_option = (previous_stdout << 1) + gebr_geoxml_program_get_stdin(prog);
  603. switch (chain_option) {
  604. case 0: /* Neither output nor input */
  605. case 3: /* Both output and input */
  606. break;
  607. case 1: /* Previous does not write to stdin but current expect something */
  608. g_set_error(err, GEBR_GEOXML_FLOW_ERROR,
  609. GEBR_GEOXML_FLOW_ERROR_NO_INPUT,
  610. _("The Flow \"%s\" expects an input file."),
  611. flow_title);
  612. gebr_geoxml_object_unref(seq);
  613. gebr_geoxml_object_unref(last_configured);
  614. return FALSE;
  615. case 2: /* Previous does write to stdin but current does not care about */
  616. g_set_error(err, GEBR_GEOXML_FLOW_ERROR,
  617. GEBR_GEOXML_FLOW_ERROR_NO_OUTPUT,
  618. _("Unexpected output file for the Flow \"%s\"."),
  619. flow_title);
  620. gebr_geoxml_object_unref(seq);
  621. gebr_geoxml_object_unref(last_configured);
  622. return FALSE;
  623. default:
  624. g_warn_if_reached();
  625. }
  626. }
  627. previous_stdout = gebr_geoxml_program_get_stdout(prog);
  628. first = FALSE;
  629. }
  630. if (first) {
  631. g_set_error(err, GEBR_GEOXML_FLOW_ERROR,
  632. GEBR_GEOXML_FLOW_ERROR_NO_VALID_PROGRAMS,
  633. _("No configured or enabled Programs found in Flow \"%s\"."),
  634. flow_title);
  635. gebr_geoxml_object_unref(last_configured);
  636. return FALSE;
  637. }
  638. program_title = gebr_geoxml_program_get_title(last_configured);
  639. const gchar *output = gebr_geoxml_flow_io_get_output(flow);
  640. if (gebr_geoxml_program_get_stdout(last_configured)
  641. && !gebr_validator_validate_expr(validator, output,
  642. GEBR_GEOXML_PARAMETER_TYPE_STRING, NULL)) {
  643. g_set_error(err, GEBR_GEOXML_FLOW_ERROR,
  644. GEBR_GEOXML_FLOW_ERROR_INVALID_OUTFILE,
  645. _("Invalid output file file specified for"
  646. " the Program \"%s\" in Flow \"%s\"."),
  647. program_title, flow_title);
  648. gebr_geoxml_object_unref(last_configured);
  649. return FALSE;
  650. }
  651. const gchar *error = gebr_geoxml_flow_io_get_error(flow);
  652. if (gebr_geoxml_program_get_stderr(last_configured)
  653. && !gebr_validator_validate_expr(validator, error,
  654. GEBR_GEOXML_PARAMETER_TYPE_STRING, NULL))
  655. {
  656. g_set_error(err, GEBR_GEOXML_FLOW_ERROR,
  657. GEBR_GEOXML_FLOW_ERROR_INVALID_ERRORFILE,
  658. _("Invalid error file specified for the Program \"%s\" in Flow \"%s\"."),
  659. program_title, flow_title);
  660. gebr_geoxml_object_unref(last_configured);
  661. return FALSE;
  662. }
  663. gebr_geoxml_object_unref(last_configured);
  664. return TRUE;
  665. }
  666. gboolean gebr_geoxml_flow_has_control_program (GebrGeoXmlFlow *flow)
  667. {
  668. GebrGeoXmlProgram *control = gebr_geoxml_flow_get_control_program(flow);
  669. if (!control)
  670. return FALSE;
  671. gebr_geoxml_object_unref(control);
  672. return TRUE;
  673. }
  674. GebrGeoXmlProgram * gebr_geoxml_flow_get_control_program (GebrGeoXmlFlow *flow)
  675. {
  676. GebrGeoXmlSequence *seq;
  677. GebrGeoXmlProgramControl cont;
  678. gebr_geoxml_flow_get_program (flow, &seq, 0);
  679. while (seq) {
  680. cont = gebr_geoxml_program_get_control(GEBR_GEOXML_PROGRAM(seq));
  681. if (cont != GEBR_GEOXML_PROGRAM_CONTROL_ORDINARY
  682. && cont != GEBR_GEOXML_PROGRAM_CONTROL_UNKNOWN) {
  683. return GEBR_GEOXML_PROGRAM(seq);
  684. }
  685. gebr_geoxml_sequence_next(&seq);
  686. }
  687. return NULL;
  688. }
  689. gboolean gebr_geoxml_flow_insert_iter_dict (GebrGeoXmlFlow *flow)
  690. {
  691. GebrGeoXmlSequence *seq;
  692. GebrGeoXmlParameter *param;
  693. GebrGeoXmlParameters *dict;
  694. gchar *keyword;
  695. dict = gebr_geoxml_document_get_dict_parameters (GEBR_GEOXML_DOCUMENT (flow));
  696. seq = gebr_geoxml_parameters_get_first_parameter (dict);
  697. keyword = gebr_geoxml_program_parameter_get_keyword (GEBR_GEOXML_PROGRAM_PARAMETER (seq));
  698. if (g_strcmp0 (keyword, "iter") == 0) {
  699. gebr_geoxml_object_unref(dict);
  700. gebr_geoxml_object_unref(seq);
  701. g_free(keyword);
  702. return FALSE;
  703. }
  704. param = gebr_geoxml_parameters_append_parameter(dict, GEBR_GEOXML_PARAMETER_TYPE_FLOAT);
  705. gebr_geoxml_program_parameter_set_list_separator(GEBR_GEOXML_PROGRAM_PARAMETER (param), "|");
  706. gebr_geoxml_object_unref(dict);
  707. gebr_geoxml_object_unref(seq);
  708. g_free(keyword);
  709. // Append four values in iter parameter to represent the
  710. // current value and the 'ini', 'step' and 'n' values.
  711. gebr_geoxml_object_unref(gebr_geoxml_program_parameter_append_value(GEBR_GEOXML_PROGRAM_PARAMETER (param), FALSE));
  712. gebr_geoxml_object_unref(gebr_geoxml_program_parameter_append_value(GEBR_GEOXML_PROGRAM_PARAMETER (param), FALSE));
  713. gebr_geoxml_object_unref(gebr_geoxml_program_parameter_append_value(GEBR_GEOXML_PROGRAM_PARAMETER (param), FALSE));
  714. gebr_geoxml_program_parameter_set_keyword(GEBR_GEOXML_PROGRAM_PARAMETER (param), "iter");
  715. gebr_geoxml_parameter_set_label(param, _("Loop iteration counter"));
  716. gebr_geoxml_sequence_move_after(GEBR_GEOXML_SEQUENCE (param), NULL);
  717. gebr_geoxml_flow_update_iter_dict_value(flow);
  718. gebr_geoxml_object_unref(param);
  719. return TRUE;
  720. }
  721. void gebr_geoxml_flow_remove_iter_dict (GebrGeoXmlFlow *flow)
  722. {
  723. GebrGeoXmlSequence *seq;
  724. GebrGeoXmlParameters *dict;
  725. gchar *keyword;
  726. dict = gebr_geoxml_document_get_dict_parameters (GEBR_GEOXML_DOCUMENT (flow));
  727. seq = gebr_geoxml_parameters_get_first_parameter (dict);
  728. keyword = gebr_geoxml_program_parameter_get_keyword (GEBR_GEOXML_PROGRAM_PARAMETER (seq));
  729. if (g_strcmp0 (keyword, "iter") == 0)
  730. gebr_geoxml_sequence_remove(seq);
  731. gebr_geoxml_object_unref(dict);
  732. g_free(keyword);
  733. }
  734. void gebr_geoxml_flow_io_set_output_append(GebrGeoXmlFlow *flow, gboolean setting)
  735. {
  736. GdomeElement *root;
  737. GdomeElement *io;
  738. GdomeElement *output;
  739. g_return_if_fail (flow != NULL);
  740. root = gebr_geoxml_document_root_element (flow);
  741. io = __gebr_geoxml_get_first_element (root, "io");
  742. output = __gebr_geoxml_get_first_element (io, "output");
  743. __gebr_geoxml_set_attr_value (output, "append", setting? "yes":"no");
  744. }
  745. gboolean gebr_geoxml_flow_io_get_output_append(GebrGeoXmlFlow *flow)
  746. {
  747. GdomeElement *root;
  748. GdomeElement *io;
  749. GdomeElement *output;
  750. const gchar *setting;
  751. g_return_val_if_fail (flow != NULL, FALSE);
  752. root = gebr_geoxml_document_root_element (flow);
  753. io = __gebr_geoxml_get_first_element (root, "io");
  754. output = __gebr_geoxml_get_first_element (io, "output");
  755. setting = __gebr_geoxml_get_attr_value (output, "append");
  756. return g_strcmp0 (setting, "yes") == 0;
  757. }
  758. void gebr_geoxml_flow_io_set_error_append(GebrGeoXmlFlow *flow, gboolean setting)
  759. {
  760. GdomeElement *root;
  761. GdomeElement *io;
  762. GdomeElement *error;
  763. g_return_if_fail (flow != NULL);
  764. root = gebr_geoxml_document_root_element (flow);
  765. io = __gebr_geoxml_get_first_element (root, "io");
  766. error = __gebr_geoxml_get_first_element (io, "error");
  767. __gebr_geoxml_set_attr_value (error, "append", setting? "yes":"no");
  768. }
  769. gboolean gebr_geoxml_flow_io_get_error_append(GebrGeoXmlFlow *flow)
  770. {
  771. GdomeElement *root;
  772. GdomeElement *io;
  773. GdomeElement *error;
  774. const gchar *setting;
  775. g_return_val_if_fail (flow != NULL, FALSE);
  776. root = gebr_geoxml_document_root_element (flow);
  777. io = __gebr_geoxml_get_first_element (root, "io");
  778. error = __gebr_geoxml_get_first_element (io, "error");
  779. setting = __gebr_geoxml_get_attr_value (error, "append");
  780. return g_strcmp0 (setting, "no") != 0;
  781. }
  782. void gebr_geoxml_flow_update_iter_dict_value(GebrGeoXmlFlow *flow)
  783. {
  784. GebrGeoXmlDocument *doc;
  785. GebrGeoXmlSequence *seq;
  786. GebrGeoXmlProgramParameter *iter;
  787. GebrGeoXmlProgram *program;
  788. gchar *keyword;
  789. gchar *step;
  790. gchar *ini;
  791. gchar *n;
  792. gchar *current;
  793. doc = GEBR_GEOXML_DOCUMENT(flow);
  794. iter = GEBR_GEOXML_PROGRAM_PARAMETER(gebr_geoxml_document_get_dict_parameter(doc));
  795. keyword = gebr_geoxml_program_parameter_get_keyword(iter);
  796. if (g_strcmp0 (keyword, "iter") != 0) {
  797. gebr_geoxml_object_unref(iter);
  798. g_free(keyword);
  799. return;
  800. }
  801. g_free(keyword);
  802. program = gebr_geoxml_flow_get_control_program(flow);
  803. n = gebr_geoxml_program_control_get_n(program, &step, &ini);
  804. current = g_strdup_printf("(%s)+(%s)*((%s)-1)", ini, step, n);
  805. // Set the 'ini+step*(n-1)' value for 'current'
  806. gebr_geoxml_program_parameter_get_value(iter, FALSE, &seq, 0);
  807. gebr_geoxml_value_sequence_set(GEBR_GEOXML_VALUE_SEQUENCE(seq), current);
  808. // Set the 'ini' value for 'ini'
  809. gebr_geoxml_sequence_next(&seq);
  810. gebr_geoxml_value_sequence_set(GEBR_GEOXML_VALUE_SEQUENCE(seq), ini);
  811. g_free(ini);
  812. // Set 'step'
  813. gebr_geoxml_sequence_next(&seq);
  814. gebr_geoxml_value_sequence_set(GEBR_GEOXML_VALUE_SEQUENCE(seq), step);
  815. g_free(step);
  816. // Set 'n'
  817. gebr_geoxml_sequence_next(&seq);
  818. gebr_geoxml_value_sequence_set(GEBR_GEOXML_VALUE_SEQUENCE(seq), n);
  819. g_free(n);
  820. gebr_geoxml_object_unref(iter);
  821. gebr_geoxml_object_unref(program);
  822. if (seq)
  823. gebr_geoxml_object_unref(seq);
  824. g_free(current);
  825. }
  826. GQuark gebr_geoxml_flow_error_quark(void)
  827. {
  828. return g_quark_from_static_string("gebr-geoxml-flow-error-quark");
  829. }
  830. void
  831. gebr_geoxml_flow_revalidate(GebrGeoXmlFlow *flow, GebrValidator *validator)
  832. {
  833. GebrGeoXmlProgram *prog;
  834. GebrGeoXmlSequence *seq;
  835. gebr_geoxml_flow_get_program(flow, &seq, 0);
  836. for (; seq; gebr_geoxml_sequence_next(&seq)) {
  837. prog = GEBR_GEOXML_PROGRAM(seq);
  838. if (gebr_geoxml_program_get_status(prog) == GEBR_GEOXML_PROGRAM_STATUS_DISABLED)
  839. continue;
  840. if (!gebr_geoxml_program_is_valid(prog, validator, NULL))
  841. gebr_geoxml_program_set_status(prog, GEBR_GEOXML_PROGRAM_STATUS_UNCONFIGURED);
  842. else
  843. gebr_geoxml_program_set_status(prog, GEBR_GEOXML_PROGRAM_STATUS_CONFIGURED);
  844. }
  845. }
  846. gboolean
  847. gebr_geoxml_flow_is_parallelizable(GebrGeoXmlFlow *flow,
  848. GebrValidator *validator)
  849. {
  850. GebrGeoXmlProgram *prog = gebr_geoxml_flow_get_control_program(flow);
  851. if (!prog || (prog && gebr_geoxml_program_get_status(prog) != GEBR_GEOXML_PROGRAM_STATUS_CONFIGURED)) {
  852. gebr_geoxml_object_unref(prog);
  853. return FALSE;
  854. }
  855. gebr_geoxml_object_unref(prog);
  856. const gchar *output = gebr_geoxml_flow_io_get_output(flow);
  857. if (!strlen(output))
  858. return TRUE;
  859. GebrGeoXmlSequence *program;
  860. gboolean has_stdout = FALSE;
  861. gebr_geoxml_flow_get_program(flow, &program, 0);
  862. for (; program != NULL; gebr_geoxml_sequence_next(&program)) {
  863. GebrGeoXmlProgramControl control = gebr_geoxml_program_get_control (GEBR_GEOXML_PROGRAM (program));
  864. if (control != GEBR_GEOXML_PROGRAM_CONTROL_ORDINARY)
  865. continue;
  866. if (gebr_geoxml_program_get_status (GEBR_GEOXML_PROGRAM(program)) == GEBR_GEOXML_PROGRAM_STATUS_CONFIGURED)
  867. has_stdout = gebr_geoxml_program_get_stdout(GEBR_GEOXML_PROGRAM(program));
  868. }
  869. if (!has_stdout)
  870. return TRUE;
  871. if (gebr_validator_use_iter(validator, output, GEBR_GEOXML_PARAMETER_TYPE_STRING, GEBR_GEOXML_DOCUMENT_TYPE_FLOW))
  872. return TRUE;
  873. return FALSE;
  874. }
  875. gint *
  876. gebr_geoxml_flow_calculate_proportional_n(gint total_n,
  877. gdouble *weights,
  878. gint n_weights)
  879. {
  880. gint *distributed_n = g_new(int, n_weights);
  881. gint aux_total_n = total_n;
  882. for (gint i = 0; i < n_weights; i++)
  883. {
  884. gint partial_n;
  885. partial_n = total_n * weights[i];
  886. aux_total_n -= partial_n;
  887. distributed_n[i] = partial_n;
  888. }
  889. gint k;
  890. if (total_n <= n_weights)
  891. k = total_n-1;
  892. else
  893. k = n_weights-1;
  894. if (total_n <= n_weights)
  895. k = total_n-1;
  896. else
  897. k = n_weights-1;
  898. while (aux_total_n > 0)
  899. {
  900. distributed_n[k]++;
  901. aux_total_n--;
  902. if (k == 0)
  903. k = n_weights - 1;
  904. else
  905. k--;
  906. }
  907. for (gint i = 0; i < n_weights; i++)
  908. weights[i] = (gdouble)(distributed_n[i])/(gdouble)total_n;
  909. return distributed_n;
  910. }
  911. gdouble *gebr_geoxml_flow_calulate_weights(gint n_servers,
  912. gdouble *scores,
  913. gdouble acc_scores)
  914. {
  915. gdouble *weigths = g_new(double, n_servers);
  916. for (gint i = 0; i < n_servers; i++)
  917. {
  918. gdouble score = scores[i];
  919. weigths[i] = score/acc_scores;
  920. }
  921. return weigths;
  922. }
  923. GList *gebr_geoxml_flow_divide_flows(GebrGeoXmlFlow *flow,
  924. GebrValidator *validator,
  925. gint *distributed_n,
  926. gint distributed_n_len)
  927. {
  928. if (!gebr_geoxml_flow_is_parallelizable(flow, validator)) {
  929. GList *l = NULL;
  930. return g_list_prepend(l, gebr_geoxml_document_ref(GEBR_GEOXML_DOCUMENT(flow)));
  931. }
  932. GList *flows = NULL;
  933. GebrGeoXmlProgram *loop;
  934. gchar *n, *step, *ini;
  935. gchar *eval_step, *eval_ini;
  936. gint end, step_int, ini_int;
  937. loop = gebr_geoxml_flow_get_control_program(flow);
  938. n = gebr_geoxml_program_control_get_n(loop, &step, &ini);
  939. gebr_geoxml_object_unref(loop);
  940. g_free(n);
  941. gebr_validator_evaluate(validator, step, GEBR_GEOXML_PARAMETER_TYPE_INT, GEBR_GEOXML_DOCUMENT_TYPE_LINE, &eval_step, NULL);
  942. gebr_validator_evaluate(validator, ini, GEBR_GEOXML_PARAMETER_TYPE_INT, GEBR_GEOXML_DOCUMENT_TYPE_LINE, &eval_ini, NULL);
  943. step_int = (gint) g_strtod(eval_step, NULL);
  944. ini_int = (gint) g_strtod(eval_ini, NULL);
  945. for (gint i = 0; i < distributed_n_len; i++)
  946. {
  947. GebrGeoXmlFlow *div_flow;
  948. GebrGeoXmlProgram *div_loop;
  949. const gchar *div_n;
  950. if (distributed_n[i] <= 0)
  951. break;
  952. ini = g_strdup_printf("%d", ini_int);
  953. div_n = g_strdup_printf("%d", distributed_n[i]);
  954. div_flow = GEBR_GEOXML_FLOW(gebr_geoxml_document_clone(GEBR_GEOXML_DOCUMENT(flow)));
  955. div_loop = gebr_geoxml_flow_get_control_program(div_flow);
  956. gebr_geoxml_program_control_set_n(div_loop, eval_step, ini, div_n);
  957. flows = g_list_append(flows, div_flow);
  958. gebr_geoxml_object_unref(div_loop);
  959. end = distributed_n[i]*step_int+ini_int;
  960. ini_int = end;
  961. }
  962. g_free(ini);
  963. g_free(step);
  964. g_free(eval_ini);
  965. g_free(eval_step);
  966. return flows;
  967. }
  968. GList *
  969. gebr_geoxml_flow_get_mpi_flavors(GebrGeoXmlFlow *flow)
  970. {
  971. GList *list = NULL;
  972. GebrGeoXmlSequence *seq;
  973. gebr_geoxml_flow_get_program(flow, &seq, 0);
  974. for (; seq; gebr_geoxml_sequence_next(&seq)) {
  975. GebrGeoXmlProgram *prog = GEBR_GEOXML_PROGRAM(seq);
  976. const gchar *mpi = gebr_geoxml_program_get_mpi(prog);
  977. if (!*mpi)
  978. continue;
  979. if (!g_list_find_custom(list, mpi, (GCompareFunc)g_strcmp0))
  980. list = g_list_prepend(list, g_strdup(mpi));
  981. }
  982. return list;
  983. }
  984. gchar *
  985. gebr_geoxml_flow_io_get_input_real(GebrGeoXmlFlow *flow)
  986. {
  987. GebrGeoXmlSequence *seq;
  988. gebr_geoxml_flow_get_program(flow, &seq, 0);
  989. for (; seq; gebr_geoxml_sequence_next(&seq)) {
  990. GebrGeoXmlProgram *prog = GEBR_GEOXML_PROGRAM(seq);
  991. GebrGeoXmlProgramStatus status = gebr_geoxml_program_get_status(prog);
  992. if (status == GEBR_GEOXML_PROGRAM_STATUS_CONFIGURED && gebr_geoxml_program_get_stdin(prog))
  993. return gebr_geoxml_flow_io_get_input(flow);
  994. }
  995. return g_strdup("");
  996. }
  997. gchar *
  998. gebr_geoxml_flow_io_get_output_real(GebrGeoXmlFlow *flow)
  999. {
  1000. GebrGeoXmlSequence *seq;
  1001. glong num_progs = gebr_geoxml_flow_get_programs_number(flow);
  1002. gebr_geoxml_flow_get_program(flow, &seq, num_progs-1);
  1003. for (; seq; gebr_geoxml_sequence_previous(&seq)) {
  1004. GebrGeoXmlProgram *prog = GEBR_GEOXML_PROGRAM(seq);
  1005. GebrGeoXmlProgramStatus status = gebr_geoxml_program_get_status(prog);
  1006. if (status == GEBR_GEOXML_PROGRAM_STATUS_CONFIGURED && gebr_geoxml_program_get_stdout(prog))
  1007. return gebr_geoxml_flow_io_get_output(flow);
  1008. }
  1009. return g_strdup("");
  1010. }
  1011. gboolean
  1012. gebr_geoxml_flow_is_single_core(GebrGeoXmlFlow *flow,
  1013. GebrValidator *validator)
  1014. {
  1015. if (gebr_geoxml_flow_is_parallelizable(flow, validator))
  1016. return FALSE;
  1017. GebrGeoXmlProgram *prog = gebr_geoxml_flow_get_first_mpi_program(flow);
  1018. if (!prog)
  1019. return TRUE;
  1020. gebr_geoxml_object_unref(prog);
  1021. return FALSE;
  1022. }