source: branches/work_304/doc/DocActionSetFieldsHelper.cpp @ 405

Revision 405, 14.1 KB checked in by jls17, 6 years ago (diff)
  • changed some of the still existent calls to CARInside::GetSchemaInsideId? and replaced them by lookups via CARSchema
Line 
1//Copyright (C) 2009 John Luthgers | jls17
2//
3//This file is part of ARInside.
4//
5//    ARInside is free software: you can redistribute it and/or modify
6//    it under the terms of the GNU General Public License as published by
7//    the Free Software Foundation, version 2 of the License.
8//
9//    ARInside 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 Foobar.  If not, see <http://www.gnu.org/licenses/>.
16
17#include "stdafx.h"
18#include "DocActionSetFieldsHelper.h"
19#include "DocAllMatchingIdsTable.h"
20#include "../core/ARAssignHelper.h"
21
22CDocActionSetFieldsHelper::CDocActionSetFieldsHelper(CARInside &arInside, CARServerObject &arServerObject, const string& objAttachedToSchemaName, const ARSetFieldsActionStruct& sFieldStruct, int structItemType, IfElseState ifElseMode, int numAction, int rootLevel)
23: arIn(arInside), obj(arServerObject), attachedSchemaName(objAttachedToSchemaName), setFieldsStruct(sFieldStruct), ifElse(ifElseMode), rootLevel(rootLevel)
24{
25        arStructItemType = structItemType;
26        nAction = numAction;
27        showServerNameInOutput = false;
28        showFormNameInOutput = false;
29}
30
31CDocActionSetFieldsHelper::~CDocActionSetFieldsHelper(void)
32{
33}
34
35void CDocActionSetFieldsHelper::ShowActionWithServerName(bool showIt)
36{
37        showServerNameInOutput = showIt;
38}
39
40ostream& CDocActionSetFieldsHelper::ToStream(std::ostream &writer)
41{
42        stringstream strmSchemaDisplay;
43        stringstream strmServer;
44        stringstream strmQual;
45
46        bool useDefaultFieldMappingTable = true;
47        showFormNameInOutput = true;
48
49        CARSchema wfSchema(attachedSchemaName);
50        if (wfSchema.Exists())
51        {
52                CARSetFieldHelper sfh(*CARInside::GetInstance(), wfSchema, setFieldsStruct, ifElse, nAction);
53
54                writer << "Data Source: " << this->GetSetFieldsTypeName(sfh.GetType()) << "<br/>";
55
56                switch (sfh.GetType())
57                {
58                case SFT_CURRENT:
59                        strmServer << arIn.LinkToServerInfo(arIn.appConfig.serverName, rootLevel);
60                        schemaNameActionIsReadingFrom = sfh.GetSchemaName();
61                        showFormNameInOutput = false;
62                        break;
63                case SFT_SERVER:
64                case SFT_SAMPLEDATA:
65                        {
66                                int pFormId = wfSchema.GetInsideId();
67                                int sFormId = -1;
68                                string readServer = sfh.GetServerName();
69                                string readSchema = sfh.GetSchemaName();
70
71                                if (readSchema.compare("@") == 0)
72                                {
73                                        readSchema = attachedSchemaName;
74                                }
75
76                                if (sfh.GetType() == SFT_SAMPLEDATA)
77                                {
78                                        int fieldId = sfh.GetServerFieldId();
79                                        strmServer << "$" << (fieldId < 0 ? CAREnum::Keyword(abs(fieldId)) : arIn.LinkToField(wfSchema.GetInsideId(), fieldId, rootLevel)) << "$ (Sample Server: " << arIn.LinkToServerInfo(readServer, rootLevel) << ")";
80
81                                        CRefItem refItemServer(obj, ifElse, nAction, REFM_SETFIELDS_SERVER);
82                                        arIn.AddFieldReference(pFormId, fieldId, refItemServer);
83
84                                        fieldId = sfh.GetSchemaFieldId();
85                                        strmSchemaDisplay << "$" << (fieldId < 0 ? CAREnum::Keyword(abs(fieldId)) : arIn.LinkToField(wfSchema.GetInsideId(), fieldId, rootLevel)) << "$ (Sample Form: " << arIn.LinkToSchema(readSchema, rootLevel) << ")";
86                                        schemaNameActionIsReadingFrom = readSchema;
87
88                                        CRefItem refItemForm(obj, ifElse, nAction, REFM_SETFIELDS_FORM);
89                                        arIn.AddFieldReference(pFormId, fieldId, refItemForm);
90                                }
91                                else
92                                {
93                                        strmServer << arIn.LinkToServerInfo(readServer, rootLevel);
94
95                                        strmSchemaDisplay << readSchema;
96                                        schemaNameActionIsReadingFrom = readSchema;
97                                }
98
99                                // *************************************************************************
100
101                                CARSchema readFromSchemaObj(readSchema);
102                                sFormId = readFromSchemaObj.GetInsideId();
103
104                                strmQual << "<br/>Set Field If<br/>" << endl;
105                                stringstream strmTmpQual;
106                                CRefItem refItem(obj, ifElse, nAction, REFM_SETFIELDS_QUALIFICATION);
107
108                                CARQualification arQual(arIn);
109                                arQual.arsStructItemType = arStructItemType;
110                                arQual.CheckQuery(sfh.GetQualifier(), refItem, 0, pFormId, sFormId, strmTmpQual, rootLevel);
111
112                                if(strmTmpQual.str().length() > 0)
113                                {
114                                        strmQual << strmTmpQual.str() << "<br/><br/>" << endl;
115                                }
116                                else
117                                {
118                                        strmQual << EmptyValue << "<br/><br/>" << endl;
119                                }
120
121                                strmQual << "If No Requests Match: " << CAREnum::NoMatchRequest(sfh.GetNoMatchOption()) << "<br/>" << endl;
122                                strmQual << "If Multiple Requests Match: " << CAREnum::MultiMatchRequest(sfh.GetMultiMatchOption()) << "<br/><br/>" << endl;
123                        }
124                        break;
125                case SFT_SQL:
126                        {
127                                strmServer << arIn.LinkToServerInfo(sfh.GetServerName(), rootLevel);
128                                strmQual << "<br/>Query:<br/>" << endl;
129
130                                if(!sfh.GetSqlCommand().empty())
131                                {
132                                        CRefItem refItem(obj, ifElse, nAction, REFM_SETFIELDS_SQL_QUALIFICATION);
133                                        strmQual << arIn.TextFindFields(sfh.GetSqlCommand(), "$", wfSchema.GetInsideId(), rootLevel, true, &refItem) << "<br/><br/>" << endl;
134                                }
135                                else
136                                        strmQual << EmptyValue << "<br/><br/>" << endl;
137
138                                strmQual << "If No Requests Match: " << CAREnum::NoMatchRequest(sfh.GetNoMatchOption()) << "<br/>" << endl;
139                                strmQual << "If Multiple Requests Match: " << CAREnum::MultiMatchRequest(sfh.GetMultiMatchOption()) << "<br/><br/>" << endl;   
140
141                                showFormNameInOutput = false;
142                        }
143                        break;
144                case SFT_FILTERAPI:
145                        {
146                                string schemaName = sfh.GetSchemaName();
147                                schemaNameActionIsReadingFrom = sfh.GetSchemaName();
148
149                                if (schemaName.substr(0, 1) == "$")
150                                {
151                                        CRefItem refItem(obj, ifElse, nAction, REFM_SETFIELDS_FILTERAPI_PLUGINNAME);
152                                        schemaName = arIn.TextFindFields(sfh.GetSchemaName(), "$", wfSchema.GetInsideId(), rootLevel, true, &refItem);
153                                }
154
155                                // the html-documtation for this action is generated directly here
156                                writer << "Plugin-Name: " << schemaName << "<br/><br/>" << endl;
157
158                                writer << "Input-Mapping: " << "<br/>";
159                                CARAssignHelper docInput(arIn, rootLevel, obj, wfSchema, wfSchema);
160                                writer << docInput.FilterApiInputAssignment(sfh.GetFilterAPIInputs(), sfh.GetFilterAPINumItems(), nAction, ifElse);
161
162                                writer << "Output-Mapping: " << "<br/>";
163                                CARAssignHelper assignHelper(arIn, rootLevel, obj, wfSchema, wfSchema);
164                                writer << assignHelper.SetFieldsAssignment(setFieldsStruct, nAction, ifElse);
165                       
166                                // we've generated our own html-table with input/output mapping. So avoid default table.
167                                useDefaultFieldMappingTable = false;
168                        }
169                        break;
170                case SFT_WEBSERVICE:
171                        {
172                                //NumItems = action.fieldList.fieldAssignList[0].assignment.u.filterApi->numItems;
173                                //action.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[X].u.value
174                                //0 = Unknown
175                                //1 = Unknown
176                                //2 = Unknown
177                                //3 = Unknown
178                                //4 = WSDL Location
179                                //5 = Web Service
180                                //6 = Operation
181                                //7 = URI
182                                //8 = URN
183                                //9 = Input Mappings
184                                //10 = Output Mappings
185                                //11 = Port
186
187                                //populate operation string from input #6
188                                string operation = "";
189                                string form = "";
190
191                                TiXmlDocument operationXML;
192                                operationXML.Parse(setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[6].u.value.u.charVal, 0, TIXML_DEFAULT_ENCODING);
193                                TiXmlHandle opHandle(&operationXML);
194                                TiXmlElement *opElement = opHandle.FirstChild("operation").FirstChild("inputMapping").ToElement();
195                                if (opElement)
196                                        operation = opElement->Attribute("name");
197
198                                writer << "WSDL Location: " << (setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->numItems > 4 ? CARValue::ValueToString(setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[4].u.value) : "") << "<br/>"; 
199                                writer << "Web Service: " << (setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->numItems > 5 ? CARValue::ValueToString(setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[5].u.value) : "") << "<br/>"; 
200                                writer << "Port: " << (setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->numItems > 11 ? CARValue::ValueToString(setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[11].u.value) : "") << "<br/>"; 
201                                writer << "Operation: " << operation << "<br/>";
202                                writer << "URI: " << (setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->numItems > 7 ? CARValue::ValueToString(setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[7].u.value) : "") << "<br/>"; 
203                                writer << "URN: " << (setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->numItems > 8 ? CARValue::ValueToString(setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[8].u.value) : "") << "<br/>"; 
204
205                                //process input mapping
206                                if (setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->numItems > 9)
207                                {
208                                        stringstream input;
209                                        input.str("");
210
211                                        TiXmlDocument inputXML;
212                                        inputXML.Parse(setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[9].u.value.u.charVal, 0, TIXML_DEFAULT_ENCODING);
213                                        TiXmlHandle inputHandle(&inputXML);
214                                        TiXmlNode *element = inputHandle.FirstChild("arDocMapping").FirstChild("formMapping").ToNode();
215
216                                        CTable tblInputMappingList("pushFieldsList", "TblObjectList");
217                                        tblInputMappingList.AddColumn(30, "Element");
218                                        tblInputMappingList.AddColumn(70, "Field");
219                                        input << processMappingXML(element, "", tblInputMappingList, "", WMM_INPUT);
220                                        input << tblInputMappingList;
221                                        writer << "<BR/>";
222                                        writer << "Input Mapping: " << input.str() << "<BR/>";
223                                }
224
225                                //process output mapping
226                                if (setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->numItems > 10)
227                                {
228                                        stringstream output;
229                                        output.str("");
230
231                                        TiXmlDocument outputXML;
232                                        outputXML.Parse(setFieldsStruct.fieldList.fieldAssignList[0].assignment.u.filterApi->inputValues[10].u.value.u.charVal, 0, TIXML_DEFAULT_ENCODING);
233                                        TiXmlHandle outputHandle(&outputXML);
234                                        TiXmlNode *element = outputHandle.FirstChild("arDocMapping").FirstChild("formMapping").ToNode();
235
236                                        CTable tblOutputMappingList("pushFieldsList", "TblObjectList");
237                                        tblOutputMappingList.AddColumn(30, "Element");
238                                        tblOutputMappingList.AddColumn(70, "Field");
239
240                                        output << processMappingXML(element, "", tblOutputMappingList, "", WMM_OUTPUT);
241                                        output << tblOutputMappingList;
242                                        writer << "Output Mapping: " << output.str();
243                                }
244
245                                // we've generated our own html-table with input/output mapping. So avoid default table.
246                                useDefaultFieldMappingTable = false;
247                        }
248                        break;
249                case SFT_ATRIUM_ORCHESTRATOR:
250                        {
251                                // TODO: implement Atrium Orchestrator actions correctly
252                                strmServer << arIn.LinkToServerInfo(AR_CURRENT_SERVER_TAG, rootLevel);
253                                schemaNameActionIsReadingFrom = sfh.GetSchemaName();
254                                strmSchemaDisplay << sfh.GetSchemaName();
255
256                                useDefaultFieldMappingTable = false;
257                        }
258                        break;
259                }
260        }
261
262        if (useDefaultFieldMappingTable)
263        {
264                GenerateDefaultMappingTable(writer, strmSchemaDisplay, strmServer, strmQual);
265        }
266
267        return writer;
268}
269
270void CDocActionSetFieldsHelper::GenerateDefaultMappingTable(ostream &writer, stringstream &strmSchemaDisplay, stringstream &strmServer, stringstream &strmQual)
271{
272        string tmpDisplayName = strmSchemaDisplay.str();
273        if(tmpDisplayName.size()==0)
274                tmpDisplayName = schemaNameActionIsReadingFrom;
275
276        if (this->showServerNameInOutput)
277                writer << "Server: " << strmServer.str() << "<br/>" << endl;
278
279        if (this->showFormNameInOutput)
280                writer << "From: " << arIn.LinkToSchema(tmpDisplayName, rootLevel) << "<br/>" << endl;
281
282        //Qualification
283        writer << strmQual.str() << endl;
284
285        // set field mapping
286        writer << "Field Mapping:";
287        if (setFieldsStruct.fieldList.fieldAssignList[0].fieldId == AR_LIKE_ID)
288        {
289                writer << " All Matching Ids<br/>";
290                CDocAllMatchingIdsTable allMatchingFieldsTable(attachedSchemaName, schemaNameActionIsReadingFrom, obj, CDocAllMatchingIdsTable::AMM_SETFIELDS, nAction, ifElse, rootLevel);
291                allMatchingFieldsTable.ToStream(writer);
292        }
293        else
294        {
295                writer << "<br/>" << endl;
296                CARAssignHelper assignHelper(arIn, rootLevel, obj, attachedSchemaName, schemaNameActionIsReadingFrom);
297                writer << assignHelper.SetFieldsAssignment(setFieldsStruct, nAction, ifElse);
298        }
299}
300
301string CDocActionSetFieldsHelper::processMappingXML( TiXmlNode* pParent, string sParent, CTable &tblFieldList, string form, WebserviceMappingMode type)
302{
303        if ( !pParent )
304                return "";
305
306        stringstream strm;
307
308        TiXmlNode* pChild;
309        int t = pParent->Type();
310
311        switch ( t )
312        {
313        case TiXmlNode::ELEMENT:
314                if (strcmp("element",pParent->Value()) == 0)
315                {
316                        sParent = pParent->ToElement()->Attribute("name");
317                }
318                else if (strcmp("formMapping",pParent->Value()) == 0)
319                {
320                        form = pParent->FirstChild("form")->ToElement()->Attribute("formName");
321                }
322                else if (strcmp("fieldMapping",pParent->Value()) == 0)
323                {
324                        int fieldID = atoi(pParent->ToElement()->Attribute("arFieldId"));
325
326                        CTableRow row("cssStdRow");
327                        row.AddCell(CTableCell(sParent));
328                        row.AddCell(CTableCell(arIn.LinkToField(form, fieldID, rootLevel)));
329                        //row.AddCell(CTableCell(form + " - "+arIn->LinkToField(form, fieldID, rootLevel)));
330                        tblFieldList.AddRow(row);       
331
332                        int msgId = 0;
333                        switch (type)
334                        {
335                        case WMM_INPUT: msgId = REFM_SETFIELDS_WS_INPUT; break;
336                        case WMM_OUTPUT: msgId = REFM_SETFIELDS_WS_OUTPUT; break;
337                        }
338                        CRefItem refItem(this->obj, ifElse, 0, msgId);
339                        arIn.AddFieldReference(arIn.SchemaGetInsideId(form), fieldID, refItem);
340                }
341                break;
342        }
343        for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) 
344        {
345                strm << processMappingXML( pChild, sParent, tblFieldList, form, type);
346        }
347
348        return strm.str();
349}
350
351const char* CDocActionSetFieldsHelper::GetSetFieldsTypeName(SetFieldType type)
352{
353        switch (type)
354        {
355        case SFT_CURRENT: return "CURRENT SCREEN";
356        case SFT_SERVER: return "SERVER";
357        case SFT_SAMPLEDATA: return "SAMPLE DATA";
358        case SFT_SQL: return "SQL";
359        case SFT_FILTERAPI: return "FILTER API";
360        case SFT_WEBSERVICE: return "WEBSERVICE";
361        case SFT_ATRIUM_ORCHESTRATOR: return "BMC ATRIUM ORCHESTRATOR";
362        default: return EmptyValue;
363        }
364}
Note: See TracBrowser for help on using the repository browser.