You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
382 lines
10 KiB
382 lines
10 KiB
#include "handlers.h"
|
|
#include "string_utils.h"
|
|
#include <tccore\aom.h>
|
|
#include <tccore\aom_prop.h>
|
|
#include <user_exits/epm_toolkit_utils.h>
|
|
#include <tccore/item.h>
|
|
|
|
string prop(tag_t comp, const char *prop) {
|
|
char **value = NULL;
|
|
int vcnt = 0;
|
|
string val;
|
|
if (strcmp(prop, "status") == 0) {
|
|
ITKCALL(AOM_ask_displayable_values(comp, "release_status_list", &vcnt, &value));
|
|
}
|
|
else {
|
|
ITKCALL(AOM_ask_displayable_values(comp, prop, &vcnt, &value));
|
|
}
|
|
if (vcnt == 0) {
|
|
val = "";
|
|
}
|
|
else if (vcnt == 1) {
|
|
val = value[0];
|
|
}
|
|
else if (strcmp(prop, "status") == 0) {
|
|
val = value[vcnt - 1];
|
|
}
|
|
else {
|
|
for (int i = 0; i < vcnt; i++) {
|
|
if (i > 0) {
|
|
val.append("&");
|
|
}
|
|
val.append(value[i]);
|
|
}
|
|
}
|
|
printf("prop: %s = [%s]\n", prop, val.c_str());
|
|
return val;
|
|
}
|
|
|
|
int JD_Check_StatusAndProp(EPM_rule_message_t msg){
|
|
printf("*******************************************************************************\n");
|
|
printf("* JD_Check_StatusAndProp is comming £¡ *\n");
|
|
printf("*******************************************************************************\n");
|
|
tag_t task = NULLTAG, job = NULLTAG, *attachments = NULL;
|
|
int ifail = ITK_ok, cnt = 0, tcnt = 0, pcnt = 0, rcnt = 0, ccnt = 0;
|
|
char **types = NULL, **props = NULL, **rels = NULL, *childs = NULL;
|
|
string mes = "";
|
|
|
|
cnt = TC_number_of_arguments(msg.arguments);
|
|
TC_init_argument_list(msg.arguments);
|
|
for (int ix = 0; ix < cnt; ix++)
|
|
{
|
|
char *trans_args_value = TC_next_argument(msg.arguments);
|
|
char *para_flag = NULL, *para_value = NULL;
|
|
|
|
ITKCALL(ITK_ask_argument_named_value(trans_args_value, ¶_flag, ¶_value));
|
|
|
|
if (tc_strcmp(para_flag, "type") == 0)
|
|
{
|
|
ITKCALL(EPM__parse_string(para_value, ",", &tcnt, &types));
|
|
//tc_strcpy(approver_attr, para_value);
|
|
}
|
|
else if (tc_strcmp(para_flag, "prop") == 0)
|
|
{
|
|
ITKCALL(EPM__parse_string(para_value, ";", &pcnt, &props));
|
|
//approvedate_attr = (char*)MEM_alloc((strlen(para_value) + 1) * sizeof(char*));
|
|
//tc_strcpy(approvedate_attr, para_value);
|
|
}
|
|
else if (tc_strcmp(para_flag, "relation") == 0)
|
|
{
|
|
ITKCALL(EPM__parse_string(para_value, ";", &rcnt, &rels));
|
|
}
|
|
else if (tc_strcmp(para_flag, "child") == 0)
|
|
{
|
|
//ITKCALL(EPM__parse_string(para_value, ";", &pcnt, &props));
|
|
childs = (char*)MEM_alloc((strlen(para_value) + 1) * sizeof(char*));
|
|
tc_strcpy(childs, para_value);
|
|
ccnt = 1;
|
|
}
|
|
else if (tc_strcmp(para_flag, "message") == 0)
|
|
{
|
|
mes = para_value;
|
|
}
|
|
|
|
if (para_flag) { MEM_free(para_flag); para_flag = NULL; }
|
|
if (para_value) { MEM_free(para_value); para_value = NULL; }
|
|
}
|
|
|
|
//task = msg.task;
|
|
cnt = 0;
|
|
ITKCALL(EPM_ask_job(msg.task, &job));
|
|
ITKCALL(EPM_ask_root_task(job, &task));
|
|
ITKCALL(ifail = EPM_ask_attachments(task, EPM_target_attachment, &cnt, &attachments));
|
|
printf("attachments:%d\n", cnt);
|
|
string message = "";
|
|
for (int t = 0; t < cnt; t++) {
|
|
char *type = NULL;
|
|
bool check = true;
|
|
ITKCALL(WSOM_ask_object_type2(attachments[t], &type));
|
|
printf("type:%s\n", type);
|
|
for (int i = 0; i < tcnt; i++) {
|
|
if (strcmp(types[i], type) == 0) {
|
|
check = false;
|
|
break;
|
|
}
|
|
}
|
|
if (check)
|
|
continue;
|
|
tag_t item = NULLTAG;
|
|
ITKCALL(ITEM_ask_item_of_rev(attachments[t], &item));
|
|
check = true;
|
|
for (int p = 0; p < pcnt; p++) {
|
|
vector<string> andv;
|
|
Split(props[p], ",", andv);
|
|
bool next = false;
|
|
for (int a = 0; a < andv.size(); a++) {
|
|
vector<string> propv, pv;
|
|
//char *value = NULL;
|
|
string val;
|
|
//if (andv[a].find("\^") > 0) {
|
|
if (contains(andv[a].c_str(), '^') > 0) {
|
|
Split(andv[a], "^", propv);
|
|
Split(propv[0], ".", pv);
|
|
/*if (strcmp(pv[0].c_str(), "item") == 0) {
|
|
ITKCALL(AOM_ask_value_string(item, pv[1].c_str(), &value));
|
|
}
|
|
else if (strcmp(pv[0].c_str(), "rev") == 0) {
|
|
ITKCALL(AOM_ask_value_string(attachments[t], pv[1].c_str(), &value));
|
|
}*/
|
|
if (strcmp(pv[0].c_str(), "item") == 0) {
|
|
val = prop(item, pv[1].c_str());
|
|
}
|
|
else if (strcmp(pv[0].c_str(), "rev") == 0) {
|
|
val = prop(attachments[t], pv[1].c_str());
|
|
}
|
|
if (val.find(propv[1]) == andv[a].npos) {
|
|
next = true;
|
|
break;
|
|
}
|
|
}
|
|
else if (andv[a].find("!=") != andv[a].npos) {
|
|
Split(andv[a], "!=", propv);
|
|
Split(propv[0], ".", pv);
|
|
if (strcmp(pv[0].c_str(), "item") == 0) {
|
|
val = prop(item, pv[1].c_str());
|
|
}
|
|
else if (strcmp(pv[0].c_str(), "rev") == 0) {
|
|
val = prop(attachments[t], pv[1].c_str());
|
|
}
|
|
if (strcmp(propv[1].c_str(), "NULL") == 0) {
|
|
printf("size: %zd\n", val.size());
|
|
if (val.size() == 0) {
|
|
next = true;
|
|
break;
|
|
}
|
|
}
|
|
else if (strcmp(propv[1].c_str(), val.c_str()) == 0) {
|
|
next = true;
|
|
break;
|
|
}
|
|
}
|
|
else if (andv[a].find("=") != andv[a].npos) {
|
|
Split(andv[a], "=", propv);
|
|
Split(propv[0], ".", pv);
|
|
if (strcmp(pv[0].c_str(), "item") == 0) {
|
|
val = prop(item, pv[1].c_str());
|
|
}
|
|
else if (strcmp(pv[0].c_str(), "rev") == 0) {
|
|
val = prop(attachments[t], pv[1].c_str());
|
|
}
|
|
if (strcmp(propv[1].c_str(), "NULL") == 0) {
|
|
printf("size: %zd\n", val.size());
|
|
if (val.size() != 0) {
|
|
next = true;
|
|
break;
|
|
}
|
|
}
|
|
else if (strcmp(propv[1].c_str(), val.c_str()) != 0) {
|
|
next = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (next) {
|
|
continue;
|
|
}
|
|
check = false;
|
|
break;
|
|
}
|
|
if (check) {
|
|
if (rcnt == 0 && ccnt == 0) {
|
|
char *os = NULL;
|
|
ITKCALL(AOM_ask_value_string(attachments[t], "object_string", &os));
|
|
if (mes.size() == 0) {
|
|
message = "0";
|
|
continue;
|
|
}
|
|
string m = replace(mes, "%s", os);
|
|
m = replace(m, "%d", "²ÎÊý2");
|
|
message.append(m).append("\n");
|
|
}
|
|
continue;
|
|
}
|
|
//²ÎÊý3
|
|
check = true;
|
|
for (int i = 0; i < rcnt; i++) {
|
|
vector<string> andv;
|
|
Split(rels[i], ",", andv);
|
|
bool next = false;
|
|
for (int a = 0; a < andv.size(); a++) {
|
|
vector<string> propv;
|
|
int rc = 0;
|
|
tag_t *value = NULL;
|
|
if (andv[a].find("!=") != andv[a].npos) {
|
|
Split(andv[a], "!=", propv);
|
|
ITKCALL(AOM_ask_value_tags(attachments[t], propv[0].c_str(), &rc, &value));
|
|
if (rc == 0) {
|
|
next = true;
|
|
break;
|
|
}
|
|
}
|
|
else if (andv[a].find("=") != andv[a].npos) {
|
|
Split(andv[a], "=", propv);
|
|
ITKCALL(AOM_ask_value_tags(attachments[t], propv[0].c_str(), &rc, &value));
|
|
if (rc > 0) {
|
|
next = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (next)
|
|
continue;
|
|
check = false;
|
|
break;
|
|
}
|
|
if (rcnt > 0 && check) {
|
|
char *os = NULL;
|
|
ITKCALL(AOM_ask_value_string(attachments[t], "object_string", &os));
|
|
if (mes.size() == 0) {
|
|
message = "0";
|
|
continue;
|
|
}
|
|
string m = replace(mes, "%s", os);
|
|
m = replace(m, "%d", "²ÎÊý3");
|
|
message.append(m).append("\n");
|
|
continue;
|
|
}
|
|
//²ÎÊý4
|
|
if (ccnt > 0) {
|
|
vector<string> tpv, orv;
|
|
tag_t *child = NULL;
|
|
int rc = 0;
|
|
Split(childs, "@", tpv);
|
|
Split(tpv[2], ";", orv);
|
|
ITKCALL(AOM_ask_value_tags(attachments[t], tpv[0].c_str(), &rc, &child));
|
|
int c4 = 0;
|
|
if (rc == 0) {
|
|
char *os = NULL;
|
|
ITKCALL(AOM_ask_value_string(attachments[t], "object_string", &os));
|
|
if (mes.size() == 0) {
|
|
message = "0";
|
|
continue;
|
|
}
|
|
string m = replace(mes, "%s", os);
|
|
m = replace(m, "%d", "²ÎÊý4");
|
|
message.append(m).append("\n");
|
|
continue;
|
|
}
|
|
for (int i = 0; i < rc; i++) {
|
|
char *ctp = NULL;
|
|
ITKCALL(WSOM_ask_object_type2(child[i], &ctp));
|
|
if (strcmp(tpv[1].c_str(), ctp) != 0) {
|
|
continue;
|
|
}
|
|
bool checkc = true;
|
|
tag_t citem = NULLTAG;
|
|
ITKCALL(ITEM_ask_item_of_rev(child[i], &citem));
|
|
for (int o = 0; o < orv.size(); o++) {
|
|
vector<string> andv;
|
|
Split(orv[o], ",", andv);
|
|
bool next = false;
|
|
for (int a = 0; a < andv.size(); a++) {
|
|
vector<string> propv, pv;
|
|
char **value = NULL;
|
|
int vcnt = 0;
|
|
string val;
|
|
if (contains(andv[a].c_str(), '^') > 0) {
|
|
Split(andv[a], "^", propv);
|
|
Split(propv[0], ".", pv);
|
|
if (strcmp(pv[0].c_str(), "item") == 0) {
|
|
//ITKCALL(AOM_ask_value_string(citem, pv[1].c_str(), &value));
|
|
val = prop(citem, pv[1].c_str());
|
|
}
|
|
else if (strcmp(pv[0].c_str(), "rev") == 0) {
|
|
//ITKCALL(AOM_ask_value_string(child[i], pv[1].c_str(), &value));
|
|
val = prop(child[i], pv[1].c_str());
|
|
}
|
|
if (val.find(propv[1]) == andv[a].npos) {
|
|
next = true;
|
|
break;
|
|
}
|
|
}
|
|
else if (andv[a].find("!=") != andv[a].npos) {
|
|
Split(andv[a], "!=", propv);
|
|
Split(propv[0], ".", pv);
|
|
if (strcmp(pv[0].c_str(), "item") == 0) {
|
|
val = prop(citem, pv[1].c_str());
|
|
}
|
|
else if (strcmp(pv[0].c_str(), "rev") == 0) {
|
|
val = prop(child[i], pv[1].c_str());
|
|
}
|
|
if (strcmp(propv[1].c_str(), "NULL") == 0) {
|
|
printf("size: %zd\n", val.size());
|
|
if (val.size() == 0) {
|
|
next = true;
|
|
break;
|
|
}
|
|
}
|
|
else if (strcmp(propv[1].c_str(), val.c_str()) == 0) {
|
|
next = true;
|
|
break;
|
|
}
|
|
}
|
|
else if (andv[a].find("=") != andv[a].npos) {
|
|
Split(andv[a], "=", propv);
|
|
Split(propv[0], ".", pv);
|
|
if (strcmp(pv[0].c_str(), "item") == 0) {
|
|
val = prop(citem, pv[1].c_str());
|
|
}
|
|
else if (strcmp(pv[0].c_str(), "rev") == 0) {
|
|
val = prop(child[i], pv[1].c_str());
|
|
}
|
|
if (strcmp(propv[1].c_str(), "NULL") == 0) {
|
|
printf("size: %zd\n", val.size());
|
|
if (val.size() != 0) {
|
|
next = true;
|
|
break;
|
|
}
|
|
}
|
|
else if (strcmp(propv[1].c_str(), val.c_str()) != 0) {
|
|
next = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (next)
|
|
continue;
|
|
checkc = false;
|
|
if (c4 == 0)
|
|
c4 = 2;
|
|
break;
|
|
}
|
|
if (checkc) {
|
|
c4 = 1;
|
|
break;
|
|
}
|
|
}
|
|
if (c4 < 2) {
|
|
char *os = NULL;
|
|
ITKCALL(AOM_ask_value_string(attachments[t], "object_string", &os));
|
|
if (mes.size() == 0) {
|
|
message = "0";
|
|
continue;
|
|
}
|
|
string m = replace(mes, "%s", os);
|
|
m = replace(m, "%d", "²ÎÊý4");
|
|
message.append(m).append("\n");
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
printf("message:%s\n", message.c_str());
|
|
if (message.size() > 0) {
|
|
if (strcmp(message.c_str(), "0") == 0) {
|
|
ITKCALL(EMH_store_error(EMH_severity_user_error, 919821));
|
|
return EPM_nogo;
|
|
}
|
|
ITKCALL(EMH_store_error_s1(EMH_severity_user_error, 919821, message.c_str()));
|
|
return EPM_nogo;
|
|
}
|
|
|
|
return EPM_go;
|
|
} |